localport.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //go:build !freebsd
  2. package functions
  3. import (
  4. "strconv"
  5. "golang.zx2c4.com/wireguard/wgctrl"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/netclient/config"
  8. "github.com/gravitl/netmaker/netclient/local"
  9. "github.com/gravitl/netmaker/netclient/ncutils"
  10. )
  11. // GetLocalListenPort - Gets the port running on the local interface
  12. func GetLocalListenPort(ifacename string) (int32, error) {
  13. client, err := wgctrl.New()
  14. if err != nil {
  15. logger.Log(0, "failed to start wgctrl")
  16. return 0, err
  17. }
  18. defer client.Close()
  19. device, err := client.Device(ifacename)
  20. if err != nil {
  21. logger.Log(0, "failed to parse interface", ifacename)
  22. return 0, err
  23. }
  24. return int32(device.ListenPort), nil
  25. }
  26. // UpdateLocalListenPort - check local port, if different, mod config and publish
  27. func UpdateLocalListenPort(nodeCfg *config.ClientConfig) error {
  28. var err error
  29. ifacename := getRealIface(nodeCfg.Node.Interface, nodeCfg.Node.Address)
  30. localPort, err := GetLocalListenPort(ifacename)
  31. if err != nil {
  32. logger.Log(1, "network:", nodeCfg.Node.Network, "error encountered checking local listen port: ", ifacename, err.Error())
  33. } else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 {
  34. logger.Log(1, "network:", nodeCfg.Node.Network, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort)))
  35. nodeCfg.Node.LocalListenPort = localPort
  36. err = config.ModNodeConfig(&nodeCfg.Node)
  37. if err != nil {
  38. return err
  39. }
  40. if err := PublishNodeUpdate(nodeCfg); err != nil {
  41. logger.Log(0, "could not publish local port change", err.Error())
  42. }
  43. }
  44. return err
  45. }
  46. func getRealIface(ifacename string, address string) string {
  47. var deviceiface = ifacename
  48. var err error
  49. if ncutils.IsMac() { // if node is Mac (Darwin) get the tunnel name first
  50. deviceiface, err = local.GetMacIface(address)
  51. if err != nil || deviceiface == "" {
  52. deviceiface = ifacename
  53. }
  54. }
  55. return deviceiface
  56. }