Przeglądaj źródła

adding wg logic for freebsd to avoid wg-quick

afeiszli 3 lat temu
rodzic
commit
05a70c70b5

+ 4 - 0
logic/wireguard.go

@@ -3,6 +3,7 @@ package logic
 import (
 	"errors"
 	"fmt"
+	"log"
 	"os"
 	"os/exec"
 	"strconv"
@@ -236,11 +237,14 @@ func initWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 		}
 		if hasGateway {
 			for _, gateway := range gateways {
+				log.Println("DELETE ME: running command " + ipExec + " -4 route add " + gateway + " dev " + ifacename)
 				_, _ = ncutils.RunCmd(ipExec+" -4 route add "+gateway+" dev "+ifacename, true)
 			}
 		}
 		if node.Address6 != "" && node.IsDualStack == "yes" {
 			logger.Log(1, "adding address:", node.Address6)
+
+			log.Println("DELETE ME: running command " + ipExec + " address add dev " + ifacename + " " + node.Address6 + "/64")
 			_, _ = ncutils.RunCmd(ipExec+" address add dev "+ifacename+" "+node.Address6+"/64", true)
 		}
 	}

+ 5 - 0
netclient/local/routes.go

@@ -1,6 +1,7 @@
 package local
 
 import (
+	"log"
 	"net"
 
 	"github.com/gravitl/netmaker/netclient/ncutils"
@@ -51,6 +52,10 @@ func SetPeerRoutes(iface, currentNodeAddr string, oldPeers map[string][]net.IPNe
 
 // SetCurrentPeerRoutes - sets all the current peers
 func SetCurrentPeerRoutes(iface, currentAddr string, peers []wgtypes.PeerConfig) {
+	if ncutils.IsFreeBSD() {
+		log.Println("DELETE ME: save me from this madness")
+		return
+	}
 	for _, peer := range peers {
 		for _, allowedIP := range peer.AllowedIPs {
 			setRoute(iface, &allowedIP, currentAddr)

+ 6 - 2
netclient/local/routes_freebsd.go

@@ -1,27 +1,31 @@
 package local
 
 import (
-	"net"
-
 	"github.com/gravitl/netmaker/netclient/ncutils"
+	"log"
+	"net"
 )
 
 func setRoute(iface string, addr *net.IPNet, address string) error {
 	var err error
+	log.Println("DELETE ME: running command route add -net " + addr.String() + " -interface " + iface)
 	_, _ = ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, false)
 	return err
 }
 
 func deleteRoute(iface string, addr *net.IPNet, address string) error {
 	var err error
+	log.Println("DELETE ME: running command route delete -net " + addr.String() + " -interface " + iface)
 	_, _ = ncutils.RunCmd("route delete -net "+addr.String()+" -interface "+iface, false)
 	return err
 }
 
 func setCidr(iface, address string, addr *net.IPNet) {
+	log.Println("DELETE ME: running command route add -net " + addr.String() + " -interface " + iface)
 	ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, false)
 }
 
 func removeCidr(iface string, addr *net.IPNet, address string) {
+	log.Println("DELETE ME: running command route delete -net " + addr.String() + " -interface " + iface)
 	ncutils.RunCmd("route delete -net "+addr.String()+" -interface "+iface, false)
 }

+ 3 - 0
netclient/wireguard/common.go

@@ -114,6 +114,7 @@ func SetPeers(iface string, node *models.Node, peers []wgtypes.PeerConfig) error
 		err = SetMacPeerRoutes(iface)
 		return err
 	} else if ncutils.IsLinux() {
+		log.Println("running SetPeerRoutes: " + runtime.GOOS)
 		local.SetPeerRoutes(iface, currentNodeAddr, oldPeerAllowedIps, peers)
 	}
 
@@ -297,6 +298,8 @@ func ApplyConf(node *models.Node, ifacename string, confPath string) error {
 	switch os {
 	case "nowgquick":
 		ApplyWithoutWGQuick(node, ifacename, confPath)
+	case "freebsd":
+		ApplyWithoutWGQuickFreeBSD(node, ifacename, confPath)
 	case "windows":
 		ApplyWindowsConf(confPath)
 	case "darwin":

+ 118 - 0
netclient/wireguard/freebsd.go

@@ -0,0 +1,118 @@
+package wireguard
+
+import (
+	"os"
+	"regexp"
+	"strconv"
+	"strings"
+	"time"
+
+	"github.com/gravitl/netmaker/logger"
+	"github.com/gravitl/netmaker/models"
+	"github.com/gravitl/netmaker/netclient/config"
+	"github.com/gravitl/netmaker/netclient/ncutils"
+)
+
+// ApplyWithoutWGQuick - Function for running the equivalent of "wg-quick up" for linux if wg-quick is missing
+func ApplyWithoutWGQuickFreeBSD(node *models.Node, ifacename string, confPath string) error {
+
+	netmaskArr := strings.Split(node.NetworkSettings.AddressRange, "/")
+	var netmask = "32"
+	if len(netmaskArr) == 2 {
+		netmask = netmaskArr[1]
+	}
+	setKernelDeviceFreeBSD(ifacename, node.Address, netmask)
+	setConfFreeBSD(ifacename, confPath)
+	addAddressFreeBSD(ifacename, node.Address6+"/64", node.Address+"/"+netmask)
+	if _, err := ncutils.RunCmd("ifconfig "+ifacename+" mtu "+strconv.Itoa(int(node.MTU))+" up", true); err != nil {
+		logger.Log(2, "failed to create interface with mtu", strconv.Itoa(int(node.MTU)), "-", ifacename)
+		return err
+	}
+	if node.PostUp != "" {
+		runcmds := strings.Split(node.PostUp, "; ")
+		_ = ncutils.RunCmds(runcmds, true)
+	}
+	return nil
+}
+
+// RemoveWithoutWGQuickFreeBSD - Function for running the equivalent of "wg-quick down" for linux if wg-quick is missing
+func RemoveWithoutWGQuickFreeBSD(ifacename string) error {
+	delInterface(ifacename)
+	network := strings.ReplaceAll(ifacename, "nm-", "")
+	nodeconf, err := config.ReadConfig(network)
+	if nodeconf != nil && err == nil {
+		if nodeconf.Node.PostDown != "" {
+			runcmds := strings.Split(nodeconf.Node.PostDown, "; ")
+			_ = ncutils.RunCmds(runcmds, false)
+		}
+	} else if err != nil {
+		ncutils.PrintLog("error retrieving config: "+err.Error(), 1)
+	}
+	return err
+}
+
+func setKernelDeviceFreeBSD(ifacename, address, mask string) error {
+	// == best effort ==
+	delInterface(ifacename)
+	addInterfaceFreeBSD(ifacename)
+	return nil
+}
+
+func delInterface(ifacename string) {
+	ncutils.RunCmd("rm -f /var/run/wireguard/"+ifacename+".sock", false)
+	ncutils.RunCmd("ifconfig "+ifacename+" destroy", false)
+	output, _ := ncutils.RunCmd("wg", false)
+	starttime := time.Now()
+	ifaceGone := !strings.Contains(output, ifacename)
+	for !ifaceGone && !(time.Now().After(starttime.Add(time.Second << 4))) {
+		output, _ = ncutils.RunCmd("wg", false)
+		time.Sleep(time.Second)
+		ifaceGone = !strings.Contains(output, ifacename)
+	}
+}
+
+func addInterfaceFreeBSD(ifacename string) {
+	ncutils.RunCmd("ifconfig wg create name "+ifacename, false)
+	output, _ := ncutils.RunCmd("wg", false)
+	starttime := time.Now()
+	ifaceReady := strings.Contains(output, ifacename)
+	for !ifaceReady && !(time.Now().After(starttime.Add(time.Second << 4))) {
+		output, _ = ncutils.RunCmd("wg", false)
+		time.Sleep(time.Second)
+		ifaceReady = strings.Contains(output, ifacename)
+	}
+}
+
+func addAddressFreeBSD(ifacename, inet6, inet string) {
+	if inet6 != "" && inet6[0:1] != "/" {
+		ncutils.RunCmd("ifconfig "+ifacename+" inet6 "+inet6+" alias", false)
+	}
+	if inet != "" && inet[0:1] != "/" {
+		ncutils.RunCmd("ifconfig "+ifacename+" inet "+inet+" alias", false)
+
+	}
+}
+
+func setConfFreeBSD(iface string, confPath string) error {
+	var tmpConf = confPath + ".sync.tmp"
+	var confCmd = "wg-quick strip "
+	if ncutils.IsMac() {
+		confCmd = "grep -v -e Address -e MTU -e PostUp -e PostDown "
+	}
+	confRaw, err := ncutils.RunCmd(confCmd+confPath, false)
+	if err != nil {
+		return err
+	}
+	regex := regexp.MustCompile(".*Warning.*\n")
+	conf := regex.ReplaceAllString(confRaw, "")
+	err = os.WriteFile(tmpConf, []byte(conf), 0600)
+	if err != nil {
+		return err
+	}
+	_, err = ncutils.RunCmd("wg setconf "+iface+" "+tmpConf, true)
+	errN := os.Remove(tmpConf)
+	if errN != nil {
+		ncutils.Log(errN.Error())
+	}
+	return err
+}