sync peers updates with proxy

This commit is contained in:
Abhishek Kondur 2022-11-02 15:33:42 +05:30
parent 474bd14e36
commit 17e05d430b
6 changed files with 75 additions and 22 deletions

View file

@ -3,6 +3,7 @@ package controller
import (
"encoding/json"
"fmt"
"net"
"net/http"
"strings"
@ -14,8 +15,10 @@ import (
"github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/models/promodels"
"github.com/gravitl/netmaker/mq"
"github.com/gravitl/netmaker/nm-proxy/manager"
"github.com/gravitl/netmaker/servercfg"
"golang.org/x/crypto/bcrypt"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
func nodeHandlers(r *mux.Router) {
@ -1012,6 +1015,24 @@ func updateNode(w http.ResponseWriter, r *http.Request) {
if servercfg.IsDNSMode() {
logic.SetDNS()
}
wgPubKey, wgErr := wgtypes.ParseKey(newNode.PublicKey)
nodeEndpoint, udpErr := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", newNode.Endpoint, newNode.LocalListenPort))
if wgErr == nil && udpErr == nil {
logic.ProxyMgmChan <- &manager.ManagerAction{
Action: manager.UpdatePeer,
Payload: manager.ManagerPayload{
InterfaceName: newNode.Interface,
Peers: []wgtypes.PeerConfig{
{
PublicKey: wgPubKey,
Endpoint: nodeEndpoint,
},
},
},
}
} else {
logger.Log(1, fmt.Sprintf("failed to send node update to proxy, wgErr: %v, udpErr: %v", wgErr, udpErr))
}
logger.Log(1, r.Header.Get("user"), "updated node", node.ID, "on network", node.Network)
w.WriteHeader(http.StatusOK)
@ -1100,7 +1121,20 @@ func deleteNode(w http.ResponseWriter, r *http.Request) {
logger.Log(0, "failed to reset failover lists during node delete for node", node.Name, node.Network)
}
}
wgKey, _ := wgtypes.ParseKey(node.PublicKey)
endpoint, _ := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", node.Endpoint, node.LocalListenPort))
logic.ProxyMgmChan <- &manager.ManagerAction{
Action: manager.DeletePeer,
Payload: manager.ManagerPayload{
InterfaceName: node.Interface,
Peers: []wgtypes.PeerConfig{
{
PublicKey: wgKey,
Endpoint: endpoint,
},
},
},
}
logic.ReturnSuccessResponse(w, r, nodeid+" deleted.")
logger.Log(1, r.Header.Get("user"), "Deleted node", nodeid, "from network", params["network"])
runUpdates(&node, false)

View file

@ -3,6 +3,7 @@ package logic
import (
"errors"
"fmt"
"log"
"net"
"strconv"
"strings"
@ -31,6 +32,7 @@ func GetPeersForProxy(node *models.Node) ([]wgtypes.PeerConfig, error) {
//skip yourself
continue
}
log.Printf("----------> PEER: %s, Endpoint: %s, LocalPort: %d", peer.ID, peer.Endpoint, peer.LocalListenPort)
pubkey, err := wgtypes.ParseKey(peer.PublicKey)
if err != nil {
logger.Log(1, "failed to parse node pub key: ", peer.ID)
@ -47,6 +49,7 @@ func GetPeersForProxy(node *models.Node) ([]wgtypes.PeerConfig, error) {
// set_keepalive
keepalive, _ = time.ParseDuration(strconv.FormatInt(int64(node.PersistentKeepalive), 10) + "s")
}
log.Printf("---------->##### PEER: %s, Endpoint: %s, LocalPort: %d", peer.ID, endpoint, peer.LocalListenPort)
peers = append(peers, wgtypes.PeerConfig{
PublicKey: pubkey,
Endpoint: endpoint,

View file

@ -19,7 +19,6 @@ import (
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
)
var ProxyStatus = "OFF"
var ProxyMgmChan = make(chan *manager.ManagerAction, 100)
// EnterpriseCheckFuncs - can be set to run functions for EE
@ -176,7 +175,7 @@ func ServerJoin(networkSettings *models.Network) (models.Node, error) {
if err != nil {
return returnNode, err
}
logger.Log(0, "--------> Hereeeeeee23333")
ProxyMgmChan <- &manager.ManagerAction{
Action: manager.AddInterface,
Payload: manager.ManagerPayload{

View file

@ -139,22 +139,41 @@ func setWGConfig(node *models.Node, peerupdate bool) error {
if peerupdate {
if err := wireguard.SetPeers(node.Interface, node, peers.Peers); err != nil {
logger.Log(0, "error updating peers", err.Error())
return err
}
// logger.Log(0, "--------> UPDATE PEERS IN PROXY.....")
// ProxyMgmChan <- &manager.ManagerAction{
// Action: manager.UpdatePeer,
// Payload: manager.ManagerPayload{
// InterfaceName: node.Interface,
// Peers: peers.Peers,
// },
// }
logger.Log(2, "updated peers on server", node.Name)
} else {
err = wireguard.InitWireguard(node, privkey, peers.Peers)
if err != nil {
logger.Log(0, "failed to set wg config on server: ", node.Name, err.Error())
return err
}
logger.Log(3, "finished setting wg config on server", node.Name)
}
if ProxyStatus == "ON" {
logger.Log(0, "--------> ADD INTERFACE TO PROXY.....")
peersP, err := GetPeersForProxy(node)
if err != nil {
logger.Log(0, "failed to get peers for proxy: ", err.Error())
} else {
ProxyMgmChan <- &manager.ManagerAction{
Action: manager.AddInterface,
Payload: manager.ManagerPayload{
InterfaceName: node.Interface,
Peers: peers.Peers,
Peers: peersP,
},
}
}
return err
return nil
}
func setWGKeyConfig(node *models.Node) error {

View file

@ -104,27 +104,24 @@ func UpdateNode(client mqtt.Client, msg mqtt.Message) {
if err = PublishPeerUpdate(&currentNode, true); err != nil {
logger.Log(0, "error updating peers when node", currentNode.Name, currentNode.ID, "informed the server of an interface change", err.Error())
}
pubKey, err := wgtypes.ParseKey(newNode.PublicKey)
if err == nil {
endpoint, err := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", newNode.Endpoint, newNode.LocalListenPort))
if err == nil {
logic.ProxyMgmChan <- &manager.ManagerAction{
Action: manager.UpdatePeer,
Payload: manager.ManagerPayload{
InterfaceName: newNode.Interface,
Peers: []wgtypes.PeerConfig{
{
PublicKey: pubKey,
Endpoint: endpoint,
},
pubKey, wgErr := wgtypes.ParseKey(newNode.PublicKey)
endpoint, udpErr := net.ResolveUDPAddr("udp", fmt.Sprintf("%s:%d", newNode.Endpoint, newNode.LocalListenPort))
if wgErr == nil && udpErr == nil {
logic.ProxyMgmChan <- &manager.ManagerAction{
Action: manager.UpdatePeer,
Payload: manager.ManagerPayload{
InterfaceName: newNode.Interface,
Peers: []wgtypes.PeerConfig{
{
PublicKey: pubKey,
Endpoint: endpoint,
},
},
}
},
}
}
}
logger.Log(1, "updated node", id, newNode.Name)
}()
}

View file

@ -87,6 +87,7 @@ func SyncServerNetworkWithProxy() error {
logger.Log(1, "failed to retrieve peers for server node: ", serverNode.ID)
continue
}
logger.Log(0, "----> HEREEEEEEEE1")
logic.ProxyMgmChan <- &manager.ManagerAction{
Action: manager.AddInterface,
Payload: manager.ManagerPayload{