mirror of
https://github.com/gravitl/netmaker.git
synced 2025-02-27 09:36:08 +08:00
110 lines
2.1 KiB
Go
110 lines
2.1 KiB
Go
package logic
|
|
|
|
import (
|
|
"net"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/gravitl/netmaker/models"
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
)
|
|
|
|
// GetLocalIP - gets the local ip
|
|
func GetLocalIP(node models.Node) string {
|
|
|
|
var local string
|
|
|
|
ifaces, err := net.Interfaces()
|
|
if err != nil {
|
|
return local
|
|
}
|
|
_, localrange, err := net.ParseCIDR(node.LocalRange)
|
|
if err != nil {
|
|
return local
|
|
}
|
|
|
|
found := false
|
|
for _, i := range ifaces {
|
|
if i.Flags&net.FlagUp == 0 {
|
|
continue // interface down
|
|
}
|
|
if i.Flags&net.FlagLoopback != 0 {
|
|
continue // loopback interface
|
|
}
|
|
addrs, err := i.Addrs()
|
|
if err != nil {
|
|
return local
|
|
}
|
|
for _, addr := range addrs {
|
|
var ip net.IP
|
|
switch v := addr.(type) {
|
|
case *net.IPNet:
|
|
if !found {
|
|
ip = v.IP
|
|
local = ip.String()
|
|
if node.IsLocal == "yes" {
|
|
found = localrange.Contains(ip)
|
|
} else {
|
|
found = true
|
|
}
|
|
}
|
|
case *net.IPAddr:
|
|
if !found {
|
|
ip = v.IP
|
|
local = ip.String()
|
|
if node.IsLocal == "yes" {
|
|
found = localrange.Contains(ip)
|
|
|
|
} else {
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return local
|
|
}
|
|
|
|
// == Private ==
|
|
|
|
func deleteInterface(ifacename string, postdown string) error {
|
|
var err error
|
|
if !ncutils.IsKernel() {
|
|
err = RemoveConf(ifacename, true)
|
|
} else {
|
|
ipExec, errN := exec.LookPath("ip")
|
|
err = errN
|
|
if err != nil {
|
|
ncutils.PrintLog(err.Error(), 1)
|
|
}
|
|
_, err = ncutils.RunCmd(ipExec+" link del "+ifacename, false)
|
|
if postdown != "" {
|
|
runcmds := strings.Split(postdown, "; ")
|
|
err = ncutils.RunCmds(runcmds, true)
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func isInterfacePresent(iface string, address string) (string, bool) {
|
|
var interfaces []net.Interface
|
|
var err error
|
|
interfaces, err = net.Interfaces()
|
|
if err != nil {
|
|
Log("ERROR: could not read interfaces", 0)
|
|
return "", true
|
|
}
|
|
for _, currIface := range interfaces {
|
|
var currAddrs []net.Addr
|
|
currAddrs, err = currIface.Addrs()
|
|
if err != nil || len(currAddrs) == 0 {
|
|
continue
|
|
}
|
|
for _, addr := range currAddrs {
|
|
if strings.Contains(addr.String(), address) && currIface.Name != iface {
|
|
return currIface.Name, false
|
|
}
|
|
}
|
|
}
|
|
return "", true
|
|
}
|