network.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package logic
  2. import (
  3. "net"
  4. "os/exec"
  5. "strings"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/gravitl/netmaker/netclient/ncutils"
  8. )
  9. // GetLocalIP - gets the local ip
  10. func GetLocalIP(node models.Node) string {
  11. var local string
  12. ifaces, err := net.Interfaces()
  13. if err != nil {
  14. return local
  15. }
  16. _, localrange, err := net.ParseCIDR(node.LocalRange)
  17. if err != nil {
  18. return local
  19. }
  20. found := false
  21. for _, i := range ifaces {
  22. if i.Flags&net.FlagUp == 0 {
  23. continue // interface down
  24. }
  25. if i.Flags&net.FlagLoopback != 0 {
  26. continue // loopback interface
  27. }
  28. addrs, err := i.Addrs()
  29. if err != nil {
  30. return local
  31. }
  32. for _, addr := range addrs {
  33. var ip net.IP
  34. switch v := addr.(type) {
  35. case *net.IPNet:
  36. if !found {
  37. ip = v.IP
  38. local = ip.String()
  39. if node.IsLocal == "yes" {
  40. found = localrange.Contains(ip)
  41. } else {
  42. found = true
  43. }
  44. }
  45. case *net.IPAddr:
  46. if !found {
  47. ip = v.IP
  48. local = ip.String()
  49. if node.IsLocal == "yes" {
  50. found = localrange.Contains(ip)
  51. } else {
  52. found = true
  53. }
  54. }
  55. }
  56. }
  57. }
  58. return local
  59. }
  60. // == Private ==
  61. func deleteInterface(ifacename string, postdown string) error {
  62. var err error
  63. if !ncutils.IsKernel() {
  64. err = RemoveConf(ifacename, true)
  65. } else {
  66. ipExec, errN := exec.LookPath("ip")
  67. err = errN
  68. if err != nil {
  69. ncutils.PrintLog(err.Error(), 1)
  70. }
  71. _, err = ncutils.RunCmd(ipExec+" link del "+ifacename, false)
  72. if postdown != "" {
  73. runcmds := strings.Split(postdown, "; ")
  74. err = ncutils.RunCmds(runcmds, true)
  75. }
  76. }
  77. return err
  78. }
  79. func isInterfacePresent(iface string, address string) (string, bool) {
  80. var interfaces []net.Interface
  81. var err error
  82. interfaces, err = net.Interfaces()
  83. if err != nil {
  84. Log("ERROR: could not read interfaces", 0)
  85. return "", true
  86. }
  87. for _, currIface := range interfaces {
  88. var currAddrs []net.Addr
  89. currAddrs, err = currIface.Addrs()
  90. if err != nil || len(currAddrs) == 0 {
  91. continue
  92. }
  93. for _, addr := range currAddrs {
  94. if strings.Contains(addr.String(), address) && currIface.Name != iface {
  95. return currIface.Name, false
  96. }
  97. }
  98. }
  99. return "", true
  100. }