Browse Source

fixed netclient

afeiszli 4 years ago
parent
commit
2a42bb23a3
1 changed files with 32 additions and 3 deletions
  1. 32 3
      netclient/wireguard/kernel.go

+ 32 - 3
netclient/wireguard/kernel.go

@@ -403,7 +403,7 @@ func SetWGConfig(network string, peerupdate bool) error {
 		return err
 		return err
 	}
 	}
 	if peerupdate && node.Name != "netmaker" {
 	if peerupdate && node.Name != "netmaker" {
-		SetPeers(node.Interface, peers)
+		SetPeers(node.Interface, node.Keepalive, peers)
 	} else {
 	} else {
 		err = InitWireguard(&node, privkey, peers, hasGateway, gateways)
 		err = InitWireguard(&node, privkey, peers, hasGateway, gateways)
 	}
 	}
@@ -414,10 +414,39 @@ func SetWGConfig(network string, peerupdate bool) error {
 	return err
 	return err
 }
 }
 
 
-func SetPeers(iface string, peers []wgtypes.PeerConfig) {
+func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) {
+	client, err := wgctrl.New()
+	if err != nil {
+		log.Println("failed to start wgctrl")
+		return
+	}
+	device, err := client.Device(iface)
+	if err != nil {
+		log.Println("failed to parse interface")
+		return
+	}
 	for _, peer := range peers {
 	for _, peer := range peers {
+		
+		for _, currentPeer := range device.Peers {
+			if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() && 
+			   currentPeer.PublicKey.String() == peer.PublicKey.String() {
+					err := exec.Command("wg","set",iface,"peer",currentPeer.PublicKey.String(),"delete").Run()
+					if err != nil {
+						log.Println("error setting peer",peer.Endpoint.String(),)
+					}		
+			}
+		}		
 		udpendpoint := peer.Endpoint.IP.String()+":"+peer.Endpoint.IP.String()
 		udpendpoint := peer.Endpoint.IP.String()+":"+peer.Endpoint.IP.String()
-		err := exec.Command("wg","set",iface,"peer",peer.PublicKey.String(),"endpoint",udpendpoint,"allowed-ips",peer.AllowedIPs[0].String()).Run()
+		var allowedips string
+		var iparr []string
+		for _, ipaddr := range peer.AllowedIPs {
+			iparr = append(iparr,ipaddr.String())
+		}
+		allowedips = strings.Join(iparr,",")
+		err := exec.Command("wg","set",iface,"peer",peer.PublicKey.String(),
+							"endpoint",udpendpoint,
+							"persistent-keepalive",string(keepalive),
+							"allowed-ips",allowedips)
 		if err != nil {
 		if err != nil {
 			log.Println("error setting peer",peer.Endpoint.String(),)
 			log.Println("error setting peer",peer.Endpoint.String(),)
 		}
 		}