utils.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package ganserv
  2. import (
  3. "fmt"
  4. "math/rand"
  5. "net"
  6. "time"
  7. )
  8. //Generate all ip address from a CIDR
  9. func GetAllAddressFromCIDR(cidr string) ([]string, error) {
  10. ip, ipnet, err := net.ParseCIDR(cidr)
  11. if err != nil {
  12. return nil, err
  13. }
  14. var ips []string
  15. for ip := ip.Mask(ipnet.Mask); ipnet.Contains(ip); inc(ip) {
  16. ips = append(ips, ip.String())
  17. }
  18. // remove network address and broadcast address
  19. return ips[1 : len(ips)-1], nil
  20. }
  21. func inc(ip net.IP) {
  22. for j := len(ip) - 1; j >= 0; j-- {
  23. ip[j]++
  24. if ip[j] > 0 {
  25. break
  26. }
  27. }
  28. }
  29. //Validate if a network struct is correct
  30. func validateNetwork(n *Network) error {
  31. // Check if UID is a valid 16 char random ASCII string
  32. if len(n.UID) != 16 {
  33. return fmt.Errorf("UID must be 16 characters long")
  34. }
  35. for _, r := range n.UID {
  36. if r < '0' || ('9' < r && r < 'A') || ('Z' < r && r < 'a') || r > 'z' {
  37. return fmt.Errorf("UID must be a 16 char random ASCII string")
  38. }
  39. }
  40. // Check if Name is ASCII only
  41. if !isASCII(n.Name) {
  42. return fmt.Errorf("Name must be ASCII only")
  43. }
  44. // Check if Subnet is valid
  45. if n.CIDR == "" {
  46. return fmt.Errorf("Subnet is not set")
  47. }
  48. _, _, err := net.ParseCIDR(n.CIDR)
  49. if err != nil {
  50. //This is not a valid CIDR
  51. return fmt.Errorf("CIDR is not valid")
  52. }
  53. return nil
  54. }
  55. //Check if a string is ascii
  56. func isASCII(s string) bool {
  57. for _, r := range s {
  58. if r > 127 {
  59. return false
  60. }
  61. }
  62. return true
  63. }
  64. //Generate a new random network ID
  65. func newNetworkID() string {
  66. rand.Seed(time.Now().UnixNano())
  67. const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  68. const length = 16
  69. var result string
  70. for i := 0; i < length; i++ {
  71. result += string(chars[rand.Intn(len(chars))])
  72. }
  73. return result
  74. }