|
@@ -0,0 +1,96 @@
|
|
|
|
+package wireguard
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "fmt"
|
|
|
|
+ "io/ioutil"
|
|
|
|
+ "log"
|
|
|
|
+ "os"
|
|
|
|
+ "os/exec"
|
|
|
|
+ "runtime"
|
|
|
|
+ "strconv"
|
|
|
|
+ "strings"
|
|
|
|
+ "time"
|
|
|
|
+
|
|
|
|
+ "github.com/gravitl/netmaker/models"
|
|
|
|
+ "github.com/gravitl/netmaker/netclient/config"
|
|
|
|
+ "github.com/gravitl/netmaker/netclient/local"
|
|
|
|
+ "github.com/gravitl/netmaker/netclient/ncutils"
|
|
|
|
+ "github.com/gravitl/netmaker/netclient/server"
|
|
|
|
+ "golang.zx2c4.com/wireguard/wgctrl/internal/wguser"
|
|
|
|
+ "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+// SetPeers - sets peers on a given WireGuard interface
|
|
|
|
+func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
|
|
|
|
+
|
|
|
|
+ client, err := wguser.New()
|
|
|
|
+ if err != nil {
|
|
|
|
+ ncutils.PrintLog("failed to start wgctrl", 0)
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ device, err := client.Device(iface)
|
|
|
|
+ if err != nil {
|
|
|
|
+ ncutils.PrintLog("failed to parse interface", 0)
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ devicePeers := device.Peers
|
|
|
|
+ if len(devicePeers) > 1 && len(peers) == 0 {
|
|
|
|
+ ncutils.PrintLog("no peers pulled", 1)
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, peer := range peers {
|
|
|
|
+
|
|
|
|
+ for _, currentPeer := range devicePeers {
|
|
|
|
+ if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() &&
|
|
|
|
+ currentPeer.PublicKey.String() != peer.PublicKey.String() {
|
|
|
|
+ _, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println("error removing peer", peer.Endpoint.String())
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ udpendpoint := peer.Endpoint.String()
|
|
|
|
+ var allowedips string
|
|
|
|
+ var iparr []string
|
|
|
|
+ for _, ipaddr := range peer.AllowedIPs {
|
|
|
|
+ iparr = append(iparr, ipaddr.String())
|
|
|
|
+ }
|
|
|
|
+ allowedips = strings.Join(iparr, ",")
|
|
|
|
+ keepAliveString := strconv.Itoa(int(keepalive))
|
|
|
|
+ if keepAliveString == "0" {
|
|
|
|
+ keepAliveString = "5"
|
|
|
|
+ }
|
|
|
|
+ if peer.Endpoint != nil {
|
|
|
|
+ _, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
|
|
|
|
+ " endpoint "+udpendpoint+
|
|
|
|
+ " persistent-keepalive "+keepAliveString+
|
|
|
|
+ " allowed-ips "+allowedips, true)
|
|
|
|
+ } else {
|
|
|
|
+ _, err = ncutils.RunCmd("wg set "+iface+" peer "+peer.PublicKey.String()+
|
|
|
|
+ " persistent-keepalive "+keepAliveString+
|
|
|
|
+ " allowed-ips "+allowedips, true)
|
|
|
|
+ }
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println("error setting peer", peer.PublicKey.String())
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for _, currentPeer := range devicePeers {
|
|
|
|
+ shouldDelete := true
|
|
|
|
+ for _, peer := range peers {
|
|
|
|
+ if peer.AllowedIPs[0].String() == currentPeer.AllowedIPs[0].String() {
|
|
|
|
+ shouldDelete = false
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if shouldDelete {
|
|
|
|
+ output, err := ncutils.RunCmd("wg set "+iface+" peer "+currentPeer.PublicKey.String()+" remove", true)
|
|
|
|
+ if err != nil {
|
|
|
|
+ log.Println(output, "error removing peer", currentPeer.PublicKey.String())
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|