Browse Source

refactored delete, pull nil pointer and logging

0xdcarns 3 years ago
parent
commit
39cea2da6c

+ 7 - 2
controllers/node.go

@@ -599,7 +599,12 @@ func deleteNode(w http.ResponseWriter, r *http.Request) {
 	}
 	//send update to node to be deleted before deleting on server otherwise message cannot be sent
 	node.Action = models.NODE_DELETE
-	runUpdates(&node, true)
+	if err := mq.NodeUpdate(&node); err != nil {
+		logger.Log(1, "error publishing node update", err.Error())
+		returnErrorResponse(w, r, formatError(err, "internal"))
+		return
+	}
+
 	err = logic.DeleteNodeByID(&node, false)
 	if err != nil {
 		returnErrorResponse(w, r, formatError(err, "internal"))
@@ -611,8 +616,8 @@ func deleteNode(w http.ResponseWriter, r *http.Request) {
 		return
 	}
 	logger.Log(1, r.Header.Get("user"), "Deleted node", nodeid, "from network", params["network"])
+	runUpdates(&node, false)
 	returnSuccessResponse(w, r, nodeid+" deleted.")
-
 }
 
 func runUpdates(node *models.Node, nodeUpdate bool) error {

+ 21 - 0
netclient/daemon/common.go

@@ -31,6 +31,7 @@ func InstallDaemon(cfg config.ClientConfig) error {
 	return err
 }
 
+// Restart - restarts a system daemon
 func Restart() error {
 	os := runtime.GOOS
 	var err error
@@ -49,3 +50,23 @@ func Restart() error {
 	}
 	return err
 }
+
+// Stop - stops a system daemon
+func Stop() error {
+	os := runtime.GOOS
+	var err error
+
+	time.Sleep(time.Second)
+
+	switch os {
+	case "windows":
+		StopWindowsDaemon()
+	case "darwin":
+		StopLaunchD()
+	case "linux":
+		StopSystemD()
+	default:
+		err = errors.New("no OS daemon to stop")
+	}
+	return err
+}

+ 6 - 0
netclient/daemon/macos.go

@@ -56,12 +56,18 @@ func CleanupMac() {
 	os.Remove(MAC_EXEC_DIR + "netclient")
 }
 
+// RestartLaunchD - restart launch daemon
 func RestartLaunchD() {
 	ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
 	time.Sleep(time.Second >> 2)
 	ncutils.RunCmd("launchctl load /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
 }
 
+// StopLaunchD - stop launch daemon
+func StopLaunchD() {
+	ncutils.RunCmd("launchctl unload  /System/Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true)
+}
+
 // CreateMacService - Creates the mac service file for LaunchDaemons
 func CreateMacService(servicename string, interval string) error {
 	_, err := os.Stat("/Library/LaunchDaemons")

+ 7 - 0
netclient/daemon/systemd.go

@@ -74,12 +74,14 @@ WantedBy=multi-user.target
 	return nil
 }
 
+// RestartSystemD - restarts systemd service
 func RestartSystemD() {
 	ncutils.PrintLog("restarting netclient.service", 1)
 	time.Sleep(time.Second)
 	_, _ = ncutils.RunCmd("systemctl restart netclient.service", true)
 }
 
+// CleanupLinux - cleans up neclient configs
 func CleanupLinux() {
 	if err := os.RemoveAll(ncutils.GetNetclientPath()); err != nil {
 		ncutils.PrintLog("Removing netclient configs: "+err.Error(), 1)
@@ -89,6 +91,11 @@ func CleanupLinux() {
 	}
 }
 
+// StopSystemD - tells system to stop systemd
+func StopSystemD() {
+	ncutils.RunCmd("systemctl stop netclient.service", false)
+}
+
 // RemoveSystemDServices - removes the systemd services on a machine
 func RemoveSystemDServices() error {
 	//sysExec, err := exec.LookPath("systemctl")

+ 0 - 3
netclient/functions/checkin.go

@@ -248,9 +248,6 @@ func Pull(network string, manual bool) (*models.Node, error) {
 			}
 		}
 	}
-	//if ncutils.IsLinux() {
-	//	setDNS(&resNode, servercfg, &cfg.Node)
-	//}
 	var bkupErr = config.SaveBackup(network)
 	if bkupErr != nil {
 		ncutils.Log("unable to update backup file")

+ 1 - 0
netclient/functions/common.go

@@ -219,6 +219,7 @@ func LeaveNetwork(network string) error {
 
 	currentNets, err := ncutils.GetSystemNetworks()
 	if err != nil || len(currentNets) <= 1 {
+		daemon.Stop() // stop system daemon if last network
 		return RemoveLocalInstance(cfg, network)
 	}
 	return daemon.Restart()

+ 9 - 17
netclient/functions/daemon.go

@@ -105,17 +105,16 @@ func SetupMQTT(cfg *config.ClientConfig) mqtt.Client {
 				ncutils.Log("could not run pull, exiting " + cfg.Node.Network + " setup: " + err.Error())
 				return client
 			}
-			time.Sleep(2 * time.Second)
+			time.Sleep(time.Second)
 		}
 		if token := client.Connect(); token.Wait() && token.Error() != nil {
 			ncutils.Log("unable to connect to broker, retrying ...")
 			if time.Now().After(tperiod) {
 				ncutils.Log("could not connect to broker, exiting " + cfg.Node.Network + " setup: " + token.Error().Error())
-				if strings.Contains(token.Error().Error(), "connectex") {
-					ncutils.PrintLog("connection issue detected.. restarting daemon", 0)
+				if strings.Contains(token.Error().Error(), "connectex") || strings.Contains(token.Error().Error(), "i/o timeout") {
+					ncutils.PrintLog("connection issue detected.. pulling and restarting daemon", 0)
 					Pull(cfg.Node.Network, true)
 					daemon.Restart()
-					os.Exit(2)
 				}
 				return client
 			}
@@ -273,30 +272,23 @@ func NodeUpdate(client mqtt.Client, msg mqtt.Message) {
 			} 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)
-			}
-			currNets, err := ncutils.GetSystemNetworks()
-			if err == nil && len(currNets) == 0 {
-				if err = RemoveLocalInstance(&cfg, cfg.Network); err != nil {
-					ncutils.PrintLog("Please perform manual clean up", 1)
+			ncutils.PrintLog(fmt.Sprintf("received delete request for %s", cfg.Node.Name), 1)
+			if err = LeaveNetwork(cfg.Node.Network); err != nil {
+				if !strings.Contains("rpc error", err.Error()) {
+					ncutils.PrintLog(fmt.Sprintf("failed to leave, please check that local files for network %s were removed", cfg.Node.Network), 1)
 				}
-				os.Exit(0)
 			}
+			ncutils.PrintLog(fmt.Sprintf("%s was removed", cfg.Node.Name), 1)
 			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
+		// Save new config
 		cfg.Node.Action = models.NODE_NOOP
 		if err := config.Write(&cfg, cfg.Network); err != nil {
 			ncutils.PrintLog("error updating node configuration: "+err.Error(), 1)

+ 6 - 5
netclient/wireguard/common.go

@@ -165,10 +165,11 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 	// ensure you clear any existing interface first
 	d, _ := wgclient.Device(deviceiface)
 	for d != nil && d.Name == deviceiface {
-		err = RemoveConf(deviceiface, false) // remove interface first
-		if strings.Contains(err.Error(), "does not exist") {
-			err = nil
-			break
+		if err = RemoveConf(deviceiface, false); err != nil { // remove interface first
+			if strings.Contains(err.Error(), "does not exist") {
+				err = nil
+				break
+			}
 		}
 		time.Sleep(time.Second >> 2)
 		d, _ = wgclient.Device(deviceiface)
@@ -201,7 +202,7 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
 			return fmt.Errorf("could not reliably create interface, please check wg installation and retry")
 		}
 	}
-	ncutils.PrintLog("interface ready - netclient engage", 1)
+	ncutils.PrintLog("interface ready - netclient.. ENGAGE", 1)
 	if syncconf { // should never be called really.
 		err = SyncWGQuickConf(ifacename, confPath)
 	}