joinutils.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package functions
  2. import (
  3. "github.com/gravitl/netmaker/models"
  4. "net"
  5. )
  6. func getLocalIP(node models.Node) string{
  7. var local string
  8. ifaces, err := net.Interfaces()
  9. if err != nil {
  10. return local
  11. }
  12. _, localrange, err := net.ParseCIDR(node.LocalRange)
  13. if err != nil {
  14. return local
  15. }
  16. found := false
  17. for _, i := range ifaces {
  18. if i.Flags&net.FlagUp == 0 {
  19. continue // interface down
  20. }
  21. if i.Flags&net.FlagLoopback != 0 {
  22. continue // loopback interface
  23. }
  24. addrs, err := i.Addrs()
  25. if err != nil {
  26. return local
  27. }
  28. for _, addr := range addrs {
  29. var ip net.IP
  30. switch v := addr.(type) {
  31. case *net.IPNet:
  32. if !found {
  33. ip = v.IP
  34. local = ip.String()
  35. if node.IsLocal == "yes" {
  36. found = localrange.Contains(ip)
  37. } else {
  38. found = true
  39. }
  40. }
  41. case *net.IPAddr:
  42. if !found {
  43. ip = v.IP
  44. local = ip.String()
  45. if node.IsLocal == "yes" {
  46. found = localrange.Contains(ip)
  47. } else {
  48. found = true
  49. }
  50. }
  51. }
  52. }
  53. }
  54. return local
  55. }