manager.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package manager
  2. import (
  3. "errors"
  4. "log"
  5. "runtime"
  6. "github.com/gravitl/netmaker/netclient/wireguard"
  7. "github.com/gravitl/netmaker/nm-proxy/common"
  8. peerpkg "github.com/gravitl/netmaker/nm-proxy/peer"
  9. "github.com/gravitl/netmaker/nm-proxy/wg"
  10. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  11. )
  12. type ProxyAction string
  13. type ManagerPayload struct {
  14. InterfaceName string
  15. Peers []wgtypes.PeerConfig
  16. }
  17. const (
  18. AddInterface ProxyAction = "ADD_INTERFACE"
  19. DeleteInterface ProxyAction = "DELETE_INTERFACE"
  20. )
  21. type ManagerAction struct {
  22. Action ProxyAction
  23. Payload ManagerPayload
  24. }
  25. func StartProxyManager(manageChan chan *ManagerAction) {
  26. for {
  27. select {
  28. case mI := <-manageChan:
  29. log.Printf("-------> PROXY-MANAGER: %+v\n", mI)
  30. switch mI.Action {
  31. case AddInterface:
  32. mI.AddInterfaceToProxy()
  33. }
  34. }
  35. }
  36. }
  37. func cleanUp(iface string) {
  38. if peers, ok := common.WgIFaceMap[iface]; ok {
  39. log.Println("########------------> CLEANING UP: ", iface)
  40. for _, peerI := range peers {
  41. peerI.Proxy.Cancel()
  42. }
  43. }
  44. delete(common.WgIFaceMap, iface)
  45. }
  46. func (m *ManagerAction) AddInterfaceToProxy() error {
  47. var err error
  48. if m.Payload.InterfaceName == "" {
  49. return errors.New("interface cannot be empty")
  50. }
  51. if len(m.Payload.Peers) == 0 {
  52. log.Println("No Peers to add...")
  53. return nil
  54. }
  55. ifaceName := m.Payload.InterfaceName
  56. log.Println("--------> IFACE: ", ifaceName)
  57. if runtime.GOOS == "darwin" {
  58. ifaceName, err = wireguard.GetRealIface(ifaceName)
  59. if err != nil {
  60. log.Println("failed to get real iface: ", err)
  61. }
  62. }
  63. cleanUp(ifaceName)
  64. wgInterface, err := wg.NewWGIFace(ifaceName, "127.0.0.1/32", wg.DefaultMTU)
  65. if err != nil {
  66. log.Fatal("Failed init new interface: ", err)
  67. }
  68. log.Printf("wg: %+v\n", wgInterface)
  69. for _, peerI := range m.Payload.Peers {
  70. peerpkg.AddNewPeer(wgInterface, &peerI)
  71. if val, ok := common.RemoteEndpointsMap[peerI.Endpoint.IP.String()]; ok {
  72. val = append(val, common.RemotePeer{
  73. Interface: ifaceName,
  74. PeerKey: peerI.PublicKey.String(),
  75. })
  76. common.RemoteEndpointsMap[peerI.Endpoint.IP.String()] = val
  77. } else {
  78. common.RemoteEndpointsMap[peerI.Endpoint.IP.String()] = []common.RemotePeer{{
  79. Interface: ifaceName,
  80. PeerKey: peerI.PublicKey.String(),
  81. }}
  82. }
  83. }
  84. return nil
  85. }