123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- package ganserv
- import (
- "fmt"
- "math/rand"
- "net"
- "time"
- )
- //Generate all ip address from a CIDR
- func GetAllAddressFromCIDR(cidr string) ([]string, error) {
- ip, ipnet, err := net.ParseCIDR(cidr)
- if err != nil {
- return nil, err
- }
- var ips []string
- for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {
- ips = append(ips, ip.String())
- }
- // remove network address and broadcast address
- return ips[1 : len(ips)-1], nil
- }
- func inc(ip net.IP) {
- for j := len(ip) - 1; j >= 0; j-- {
- ip[j]++
- if ip[j] > 0 {
- break
- }
- }
- }
- //Validate if a network struct is correct
- func validateNetwork(n *Network) error {
- // Check if UID is a valid 16 char random ASCII string
- if len(n.UID) != 16 {
- return fmt.Errorf("UID must be 16 characters long")
- }
- for _, r := range n.UID {
- if r < '0' || ('9' < r && r < 'A') || ('Z' < r && r < 'a') || r > 'z' {
- return fmt.Errorf("UID must be a 16 char random ASCII string")
- }
- }
- // Check if Name is ASCII only
- if !isASCII(n.Name) {
- return fmt.Errorf("Name must be ASCII only")
- }
- // Check if Subnet is valid
- if n.CIDR == "" {
- return fmt.Errorf("Subnet is not set")
- }
- _, _, err := net.ParseCIDR(n.CIDR)
- if err != nil {
- //This is not a valid CIDR
- return fmt.Errorf("CIDR is not valid")
- }
- return nil
- }
- //Check if a string is ascii
- func isASCII(s string) bool {
- for _, r := range s {
- if r > 127 {
- return false
- }
- }
- return true
- }
- //Generate a new random network ID
- func newNetworkID() string {
- rand.Seed(time.Now().UnixNano())
- const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
- const length = 16
- var result string
- for i := 0; i < length; i++ {
- result += string(chars[rand.Intn(len(chars))])
- }
- return result
- }
|