localport.go 1.9 KB

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