Browse Source

saving current logic

afeiszli 3 years ago
parent
commit
e336d62321

+ 0 - 12
netclient/functions/daemon.go

@@ -558,18 +558,6 @@ func decryptMsg(cfg *config.ClientConfig, msg []byte) ([]byte, error) {
 	return ncutils.BoxDecrypt(msg, serverPubKey, diskKey)
 }
 
-func shouldResub(currentServers, newServers []models.ServerAddr) bool {
-	if len(currentServers) != len(newServers) {
-		return true
-	}
-	for _, srv := range currentServers {
-		if !ncutils.ServerAddrSliceContains(newServers, srv) {
-			return true
-		}
-	}
-	return false
-}
-
 func setDNS(iface, network, address string) {
 	var reachable bool
 	for counter := 0; !reachable && counter < 5; counter++ {

+ 118 - 0
netclient/local/routes_linux.go

@@ -0,0 +1,118 @@
+//go:build linux
+// +build linux
+
+package local
+
+import (
+	//"github.com/davecgh/go-spew/spew"
+
+	"net"
+
+	"github.com/gravitl/netmaker/netclient/ncutils"
+	"golang.zx2c4.com/wireguard/wgctrl"
+	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
+)
+
+func routeExists(iface, address, mask string) bool {
+	return false
+}
+
+func setRoute(iface, address, mask string) error {
+	_, err := ncutils.RunCmd("ip route add", true)
+	return err
+}
+
+func DeleteRoute(iface, address string) error {
+	var err error
+	return err
+}
+
+func ApplyRoutesFromConf(confPath string) error {
+	var err error
+	return err
+}
+
+//func SetLinuxPeerRoutes(currentPeers []wgtypes.PeerConfig, newPeers []wgtypes.PeerConfig) {
+func SetLinuxPeerRoutes(iface string, oldPeers map[string][]net.IP, newPeers []wgtypes.PeerConfig) {
+
+	// traverse through all recieved peers
+	for _, peer := range newPeers {
+		// if pubkey found in existing peers, check against existing peer
+		currPeerAllowedIPs := oldPeers[peer.PublicKey.String()]
+		if currPeerAllowedIPs != nil {
+			// traverse IPs, check to see if old peer contains each IP
+			for _, allowedIP := range peer.AllowedIPs {
+				if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP.IP.String()) {
+					if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
+						ncutils.PrintLog(err.Error(), 1)
+					}
+				}
+			}
+			for _, allowedIP := range currPeerAllowedIPs {
+				if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP) {
+					if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
+						ncutils.PrintLog(err.Error(), 1)
+					}
+				}
+			}
+			delete(oldPeers, peer.PublicKey.String())
+		} else {
+			for _, allowedIP := range peer.AllowedIPs {
+				if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
+					ncutils.PrintLog(err.Error(), 1)
+				}
+			}
+		}
+	}
+
+	// traverse through all existing peers
+	for _, peer := range oldPeers {
+		// if pubkey found in existing peers, check against existing peer
+		currPeerAllowedIPs := oldPeers[peer.PublicKey.String()]
+		if currPeerAllowedIPs != nil {
+			// traverse IPs, check to see if old peer contains each IP
+			for _, allowedIP := range peer.AllowedIPs {
+				if !ncutils.StringSliceContains(currPeerAllowedIPs, allowedIP.IP.String()) {
+					if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
+						ncutils.PrintLog(err.Error(), 1)
+					}
+				}
+			}
+		} else {
+			for _, allowedIP := range peer.AllowedIPs {
+				if err := setRoute(iface, allowedIP.IP.String(), allowedIP.Mask.String()); err != nil {
+					ncutils.PrintLog(err.Error(), 1)
+				}
+			}
+		}
+	}
+
+	// delete removed AllowedIPs
+	/*
+		for _, currentPeer := range currentPeers {
+			for _, oldIP := range currentPeer.AllowedIPs {
+				found := true
+				for _, newPeer := range newPeers {
+					for _, newIP := range newPeer.AllowedIPs {
+						if
+					}
+				}
+			}
+		}
+	*/
+}
+
+func GetCurrentIPs() []string {
+	client, err := wgctrl.New()
+	if err != nil {
+		ncutils.PrintLog("failed to start wgctrl", 0)
+		return err
+	}
+	defer client.Close()
+	device, err := client.Device(iface)
+	if err != nil {
+		ncutils.PrintLog("failed to parse interface", 0)
+		return err
+	}
+	devicePeers = device.Peers
+}

+ 24 - 0
netclient/local/routes_other.go

@@ -0,0 +1,24 @@
+//go:build !linux
+// +build !linux
+
+package local
+
+//"github.com/davecgh/go-spew/spew"
+
+/*
+
+These functions are not used. These should only be called by Linux (see routes_linux.go). These routes return nothing if called.
+
+*/
+
+func routeExists(iface, address, mask string) bool {
+	return false
+}
+
+func SetRoute(iface, newAddress, oldAddress, mask string) error {
+	return nil
+}
+
+func DeleteRoute(iface, address) error {
+	return nil
+}

+ 12 - 1
netclient/wireguard/common.go

@@ -25,7 +25,8 @@ const (
 
 // SetPeers - sets peers on a given WireGuard interface
 func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
-
+	var oldIPList []string
+	var newIPList []string
 	var devicePeers []wgtypes.Peer
 	var err error
 	if ncutils.IsFreeBSD() {
@@ -58,6 +59,12 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
 				_, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
 				if err != nil {
 					log.Println("error removing peer", peer.Endpoint.String())
+				} else {
+					for _, address := range currentPeer.AllowedIPs {
+						if err = local.DeleteRoute(iface, address.String()); err != nil {
+							ncutils.PrintLog(err.Error(), 1)
+						}
+					}
 				}
 			}
 		}
@@ -84,6 +91,8 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
 		}
 		if err != nil {
 			log.Println("error setting peer", peer.PublicKey.String())
+		} else {
+
 		}
 	}
 
@@ -104,6 +113,8 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
 	if ncutils.IsMac() {
 		err = SetMacPeerRoutes(iface)
 		return err
+	} else if ncutils.IsLinux() {
+		err = local.SetLinuxPeerRoutes(devicePeers, peers)
 	}
 
 	return nil

+ 7 - 0
netclient/wireguard/unix.go

@@ -8,6 +8,7 @@ import (
 
 	"github.com/gravitl/netmaker/models"
 	"github.com/gravitl/netmaker/netclient/config"
+	"github.com/gravitl/netmaker/netclient/local"
 	"github.com/gravitl/netmaker/netclient/ncutils"
 	"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
 )
@@ -65,6 +66,12 @@ func ApplyWGQuickConf(confPath string, ifacename string) error {
 			ncutils.RunCmd("wg-quick down "+confPath, true)
 		}
 		_, err = ncutils.RunCmd("wg-quick up "+confPath, true)
+		if err != nil {
+			return err
+		}
+		if ncutils.IsLinux() {
+			err = local.ApplyRoutesFromConf(confPath)
+		}
 		return err
 	}
 }