diff --git a/netclient/functions/localport.go b/netclient/functions/localport.go index 81d2b8b7..2ee23acf 100644 --- a/netclient/functions/localport.go +++ b/netclient/functions/localport.go @@ -1,30 +1,32 @@ +//go:build !freebsd +// +build !freebsd + package functions import ( - "errors" "strconv" - "strings" "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) { - portstring, err := ncutils.RunCmd("wg show "+ifacename+" listen-port", false) + client, err := wgctrl.New() if err != nil { + logger.Log(0, "failed to start wgctrl") return 0, err } - portstring = strings.TrimSuffix(portstring, "\n") - i, err := strconv.ParseInt(portstring, 10, 32) + defer client.Close() + device, err := client.Device(ifacename) if err != nil { + logger.Log(0, "failed to parse interface") return 0, err - } else if i == 0 { - return 0, errors.New("parsed port is unset or invalid") } - return int32(i), nil + return int32(device.ListenPort), nil } // UpdateLocalListenPort - check local port, if different, mod config and publish diff --git a/netclient/functions/localport_freebsd.go b/netclient/functions/localport_freebsd.go new file mode 100644 index 00000000..8fd8a972 --- /dev/null +++ b/netclient/functions/localport_freebsd.go @@ -0,0 +1,50 @@ +//go:build freebsd +// +build freebsd + +package functions + +import ( + "errors" + "strconv" + "strings" + + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/netclient/config" + "github.com/gravitl/netmaker/netclient/ncutils" +) + +// GetLocalListenPort - Gets the port running on the local interface +func GetLocalListenPort(ifacename string) (int32, error) { + portstring, err := ncutils.RunCmd("wg show "+ifacename+" listen-port", false) + if err != nil { + return 0, err + } + portstring = strings.TrimSuffix(portstring, "\n") + i, err := strconv.ParseInt(portstring, 10, 32) + if err != nil { + return 0, err + } else if i == 0 { + return 0, errors.New("parsed port is unset or invalid") + } + return int32(i), nil +} + +// UpdateLocalListenPort - check local port, if different, mod config and publish +func UpdateLocalListenPort(nodeCfg *config.ClientConfig) error { + var err error + localPort, err := GetLocalListenPort(nodeCfg.Node.Interface) + if err != nil { + logger.Log(1, "error encountered checking local listen port: ", err.Error()) + } else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 { + logger.Log(1, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort))) + nodeCfg.Node.LocalListenPort = localPort + err = config.ModConfig(&nodeCfg.Node) + if err != nil { + return err + } + if err := PublishNodeUpdate(nodeCfg); err != nil { + logger.Log(0, "could not publish local port change") + } + } + return err +}