mirror of
https://github.com/gravitl/netmaker.git
synced 2024-11-12 04:01:33 +08:00
63 lines
1.9 KiB
Go
63 lines
1.9 KiB
Go
//go:build !freebsd
|
|
// +build !freebsd
|
|
|
|
package functions
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/gravitl/netmaker/logger"
|
|
"github.com/gravitl/netmaker/netclient/config"
|
|
"github.com/gravitl/netmaker/netclient/local"
|
|
"github.com/gravitl/netmaker/netclient/ncutils"
|
|
"golang.zx2c4.com/wireguard/wgctrl"
|
|
)
|
|
|
|
// GetLocalListenPort - Gets the port running on the local interface
|
|
func GetLocalListenPort(ifacename string) (int32, error) {
|
|
client, err := wgctrl.New()
|
|
if err != nil {
|
|
logger.Log(0, "failed to start wgctrl")
|
|
return 0, err
|
|
}
|
|
defer client.Close()
|
|
device, err := client.Device(ifacename)
|
|
if err != nil {
|
|
logger.Log(0, "failed to parse interface", ifacename)
|
|
return 0, err
|
|
}
|
|
return int32(device.ListenPort), nil
|
|
}
|
|
|
|
// UpdateLocalListenPort - check local port, if different, mod config and publish
|
|
func UpdateLocalListenPort(nodeCfg *config.ClientConfig) error {
|
|
var err error
|
|
ifacename := getRealIface(nodeCfg.Node.Interface, nodeCfg.Node.Address)
|
|
localPort, err := GetLocalListenPort(ifacename)
|
|
if err != nil {
|
|
logger.Log(1, "network:", nodeCfg.Node.Network, "error encountered checking local listen port: ", ifacename, err.Error())
|
|
} else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 {
|
|
logger.Log(1, "network:", nodeCfg.Node.Network, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort)))
|
|
nodeCfg.Node.LocalListenPort = localPort
|
|
err = config.ModNodeConfig(&nodeCfg.Node)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := PublishNodeUpdate(nodeCfg); err != nil {
|
|
logger.Log(0, "could not publish local port change")
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func getRealIface(ifacename string, address string) string {
|
|
var deviceiface = ifacename
|
|
var err error
|
|
if ncutils.IsMac() { // if node is Mac (Darwin) get the tunnel name first
|
|
deviceiface, err = local.GetMacIface(address)
|
|
if err != nil || deviceiface == "" {
|
|
deviceiface = ifacename
|
|
}
|
|
}
|
|
return deviceiface
|
|
}
|