localport.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package functions
  2. import (
  3. "errors"
  4. "strconv"
  5. "strings"
  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. // Get LocalListenPort - Gets the port running on the local interface
  12. func GetLocalListenPort(ifacename string) (int32, error) {
  13. portstring, err := ncutils.RunCmd("wg show "+ifacename+" listen-port", false)
  14. if err != nil {
  15. return 0, err
  16. }
  17. portstring = strings.TrimSuffix(portstring, "\n")
  18. i, err := strconv.ParseInt(portstring, 10, 32)
  19. if err != nil {
  20. return 0, err
  21. } else if i == 0 {
  22. return 0, errors.New("parsed port is unset or invalid")
  23. }
  24. return int32(i), 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, "error encountered checking local listen port: ", err.Error())
  33. } else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 {
  34. logger.Log(1, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort)))
  35. nodeCfg.Node.LocalListenPort = localPort
  36. err = config.ModConfig(&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")
  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. }