Browse Source

Merge pull request #929 from gravitl/bugfix_v0.12.0_keepalive

keepalive handling updates
dcarns 3 years ago
parent
commit
9efb15e688
3 changed files with 29 additions and 1 deletions
  1. 1 1
      models/node.go
  2. 4 0
      netclient/functions/mqhandlers.go
  3. 24 0
      netclient/wireguard/common.go

+ 1 - 1
models/node.go

@@ -283,7 +283,7 @@ func (newNode *Node) Fill(currentNode *Node) {
 	if newNode.AllowedIPs == nil {
 		newNode.AllowedIPs = currentNode.AllowedIPs
 	}
-	if newNode.PersistentKeepalive == 0 {
+	if newNode.PersistentKeepalive < 0 {
 		newNode.PersistentKeepalive = currentNode.PersistentKeepalive
 	}
 	if newNode.AccessKey == "" {

+ 4 - 0
netclient/functions/mqhandlers.go

@@ -59,6 +59,7 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 	ifaceDelta := ncutils.IfaceDelta(&nodeCfg.Node, &newNode)
 	shouldDNSChange := nodeCfg.Node.DNSOn != newNode.DNSOn
 	hubChange := nodeCfg.Node.IsHub != newNode.IsHub
+	keepaliveChange := nodeCfg.Node.PersistentKeepalive != newNode.PersistentKeepalive
 
 	nodeCfg.Node = newNode
 	switch newNode.Action {
@@ -107,6 +108,9 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 		ncutils.Log("error updating wireguard config " + err.Error())
 		return
 	}
+	if keepaliveChange {
+		wireguard.UpdateKeepAlive(file, newNode.PersistentKeepalive)
+	}
 	if ifaceDelta { // if a change caused an ifacedelta we need to notify the server to update the peers
 		ncutils.Log("applying WG conf to " + file)
 		if ncutils.IsWindows() {

+ 24 - 0
netclient/wireguard/common.go

@@ -466,6 +466,30 @@ func UpdatePrivateKey(file, privateKey string) error {
 	return nil
 }
 
+// UpdateKeepAlive - updates the persistentkeepalive of all peers
+func UpdateKeepAlive(file string, keepalive int32) error {
+	options := ini.LoadOptions{
+		AllowNonUniqueSections: true,
+		AllowShadows:           true,
+	}
+	wireguard, err := ini.LoadSources(options, file)
+	if err != nil {
+		return err
+	}
+	peers, err := wireguard.SectionsByName(section_peers)
+	if err != nil {
+		return err
+	}
+	newvalue := strconv.Itoa(int(keepalive))
+	for i := range peers {
+		wireguard.SectionWithIndex(section_peers, i).Key("PersistentKeepALive").SetValue(newvalue)
+	}
+	if err := wireguard.SaveTo(file); err != nil {
+		return err
+	}
+	return nil
+}
+
 // RemoveConfGraceful - Run remove conf and wait for it to actually be gone before proceeding
 func RemoveConfGraceful(ifacename string) {
 	// ensure you clear any existing interface first