Browse Source

Merge pull request #700 from gravitl/bugfix_v0.10.0_NodeUpdate-delete

Bugfix v0.10.0 node update delete
dcarns 3 years ago
parent
commit
fafe5c6f8b
2 changed files with 70 additions and 20 deletions
  1. 36 8
      netclient/functions/common.go
  2. 34 12
      netclient/functions/daemon.go

+ 36 - 8
netclient/functions/common.go

@@ -262,25 +262,53 @@ func WipeLocal(network string) error {
 
 	home := ncutils.GetNetclientPathSpecific()
 	if ncutils.FileExists(home + "netconfig-" + network) {
-		_ = os.Remove(home + "netconfig-" + network)
+		err = os.Remove(home + "netconfig-" + network)
+		if err != nil {
+			log.Println("error removing netconfig:")
+			log.Println(err.Error())
+		}
 	}
 	if ncutils.FileExists(home + "backup.netconfig-" + network) {
-		_ = os.Remove(home + "backup.netconfig-" + network)
+		err = os.Remove(home + "backup.netconfig-" + network)
+		if err != nil {
+			log.Println("error removing backup netconfig:")
+			log.Println(err.Error())
+		}
 	}
 	if ncutils.FileExists(home + "nettoken-" + network) {
-		_ = os.Remove(home + "nettoken-" + network)
+		err = os.Remove(home + "nettoken-" + network)
+		if err != nil {
+			log.Println("error removing nettoken:")
+			log.Println(err.Error())
+		}
 	}
 	if ncutils.FileExists(home + "secret-" + network) {
-		_ = os.Remove(home + "secret-" + network)
+		err = os.Remove(home + "secret-" + network)
+		if err != nil {
+			log.Println("error removing secret:")
+			log.Println(err.Error())
+		}
 	}
 	if ncutils.FileExists(home + "traffic-" + network) {
-		_ = os.Remove(home + "traffic-" + network)
+		err = os.Remove(home + "traffic-" + network)
+		if err != nil {
+			log.Println("error removing traffic key:")
+			log.Println(err.Error())
+		}
 	}
 	if ncutils.FileExists(home + "wgkey-" + network) {
-		_ = os.Remove(home + "wgkey-" + network)
+		err = os.Remove(home + "wgkey-" + network)
+		if err != nil {
+			log.Println("error removing wgkey:")
+			log.Println(err.Error())
+		}
 	}
-	if ncutils.FileExists(home + "nm-" + network + ".conf") {
-		_ = os.Remove(home + "nm-" + network + ".conf")
+	if ncutils.FileExists(home + ifacename + ".conf") {
+		err = os.Remove(home + ifacename + ".conf")
+		if err != nil {
+			log.Println("error removing .conf:")
+			log.Println(err.Error())
+		}
 	}
 	return err
 }

+ 34 - 12
netclient/functions/daemon.go

@@ -28,6 +28,7 @@ import (
 // == Message Caches ==
 var keepalive = new(sync.Map)
 var messageCache = new(sync.Map)
+var networkcontext = new(sync.Map)
 
 const lastNodeUpdate = "lnu"
 const lastPeerUpdate = "lpu"
@@ -65,21 +66,26 @@ func read(network, which string) string {
 
 // Daemon runs netclient daemon from command line
 func Daemon() error {
-	ctx, cancel := context.WithCancel(context.Background())
 	networks, err := ncutils.GetSystemNetworks()
 	if err != nil {
-		cancel()
 		return err
 	}
 	for _, network := range networks {
+		ctx, cancel := context.WithCancel(context.Background())
+		networkcontext.Store(network, cancel)
 		go MessageQueue(ctx, network)
 	}
 	quit := make(chan os.Signal, 1)
 	signal.Notify(quit, syscall.SIGTERM, os.Interrupt)
 	<-quit
-	cancel()
+	for _, network := range networks {
+		if cancel, ok := networkcontext.Load(network); ok {
+			cancel.(context.CancelFunc)()
+		}
+	}
 	ncutils.Log("all done")
 	return nil
+
 }
 
 // SetupMQTT creates a connection to broker and return client
@@ -87,7 +93,6 @@ func SetupMQTT(cfg *config.ClientConfig) mqtt.Client {
 	opts := mqtt.NewClientOptions()
 	server := getServerAddress(cfg)
 	opts.AddBroker(server + ":1883")
-
 	opts.SetDefaultPublishHandler(All)
 	client := mqtt.NewClient(opts)
 	tperiod := time.Now().Add(12 * time.Second)
@@ -197,10 +202,18 @@ func MessageQueue(ctx context.Context, network string) {
 		ncutils.Log("leader not defined for network " + cfg.Node.Network)
 	}
 	defer client.Disconnect(250)
-	go MonitorKeepalive(ctx, client, &cfg)
-	go Checkin(ctx, &cfg, network)
+	wg := &sync.WaitGroup{}
+	wg.Add(2)
+	keepalivectx, keepalivecancel := context.WithCancel(context.Background())
+	go MonitorKeepalive(keepalivectx, wg, client, &cfg)
+	checkinctx, checkincancel := context.WithCancel(context.Background())
+	go Checkin(checkinctx, wg, &cfg, network)
 	<-ctx.Done()
-	ncutils.Log("shutting down daemon")
+	keepalivecancel()
+	checkincancel()
+	ncutils.Log("shutting down message queue for network " + network)
+	wg.Wait()
+	ncutils.Log("shutdown complete")
 }
 
 // All -- mqtt message hander for all ('#') topics
@@ -254,9 +267,13 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 		cfg.Node = newNode
 		switch newNode.Action {
 		case models.NODE_DELETE:
-			if token := client.Unsubscribe(fmt.Sprintf("update/%s/%s", newNode.Network, newNode.ID), fmt.Sprintf("peers/%s/%s", newNode.Network, newNode.ID)); token.Wait() && token.Error() != nil {
-				ncutils.PrintLog("error unsubscribing during node deletion", 1)
+			if cancel, ok := networkcontext.Load(newNode.Network); ok {
+				ncutils.Log("cancelling message queue context for " + newNode.Network)
+				cancel.(context.CancelFunc)()
+			} else {
+				ncutils.Log("failed to kill go routines for network " + newNode.Network)
 			}
+			ncutils.Log("deleting configuration files")
 			if err := WipeLocal(cfg.Network); err != nil {
 				ncutils.PrintLog("error deleting local instance: "+err.Error(), 1)
 				ncutils.PrintLog("Please perform manual clean up", 1)
@@ -270,11 +287,13 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 			}
 			return
 		case models.NODE_UPDATE_KEY:
+			ncutils.Log("delete recieved")
 			if err := UpdateKeys(&cfg, client); err != nil {
 				ncutils.PrintLog("err updating wireguard keys: "+err.Error(), 1)
 			}
 			ifaceDelta = true
 		case models.NODE_NOOP:
+			ncutils.Log("noop recieved")
 		default:
 		}
 		//Save new config
@@ -295,7 +314,7 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 		}
 		if ifaceDelta {
 			ncutils.Log("applying WG conf to " + file)
-			err = wireguard.ApplyWGQuickConf(file, cfg.Node.Interface)
+			err = wireguard.ApplyConf(&cfg.Node, cfg.Node.Interface, file)
 			if err != nil {
 				ncutils.Log("error restarting wg after node update " + err.Error())
 				return
@@ -367,10 +386,12 @@ func UpdatePeers(client mqtt.Client, msg mqtt.Message) {
 }
 
 // MonitorKeepalive - checks time last server keepalive received.  If more than 3+ minutes, notify and resubscribe
-func MonitorKeepalive(ctx context.Context, client mqtt.Client, cfg *config.ClientConfig) {
+func MonitorKeepalive(ctx context.Context, wg *sync.WaitGroup, client mqtt.Client, cfg *config.ClientConfig) {
+	defer wg.Done()
 	for {
 		select {
 		case <-ctx.Done():
+			ncutils.Log("cancel recieved, monitor keepalive exiting")
 			return
 		case <-time.After(time.Second * 150):
 			var keepalivetime time.Time
@@ -464,7 +485,8 @@ func UpdateKeys(cfg *config.ClientConfig, client mqtt.Client) error {
 
 // Checkin  -- go routine that checks for public or local ip changes, publishes changes
 //   if there are no updates, simply "pings" the server as a checkin
-func Checkin(ctx context.Context, cfg *config.ClientConfig, network string) {
+func Checkin(ctx context.Context, wg *sync.WaitGroup, cfg *config.ClientConfig, network string) {
+	defer wg.Done()
 	for {
 		select {
 		case <-ctx.Done():