diff --git a/models/node.go b/models/node.go index ba94d6de..cc1dffe5 100644 --- a/models/node.go +++ b/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 == "" { diff --git a/netclient/functions/mqhandlers.go b/netclient/functions/mqhandlers.go index 87c37e0f..354089f6 100644 --- a/netclient/functions/mqhandlers.go +++ b/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() { diff --git a/netclient/wireguard/common.go b/netclient/wireguard/common.go index 5208697c..a214d137 100644 --- a/netclient/wireguard/common.go +++ b/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