refactored delete, pull nil pointer and logging

This commit is contained in:
0xdcarns
2022-02-08 10:43:46 -05:00
parent a85a888251
commit 39cea2da6c
8 changed files with 57 additions and 27 deletions

View File

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

View File

@@ -31,6 +31,7 @@ func InstallDaemon(cfg config.ClientConfig) error {
return err return err
} }
// Restart - restarts a system daemon
func Restart() error { func Restart() error {
os := runtime.GOOS os := runtime.GOOS
var err error var err error
@@ -49,3 +50,23 @@ func Restart() error {
} }
return err 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
}

View File

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

View File

@@ -74,12 +74,14 @@ WantedBy=multi-user.target
return nil return nil
} }
// RestartSystemD - restarts systemd service
func RestartSystemD() { func RestartSystemD() {
ncutils.PrintLog("restarting netclient.service", 1) ncutils.PrintLog("restarting netclient.service", 1)
time.Sleep(time.Second) time.Sleep(time.Second)
_, _ = ncutils.RunCmd("systemctl restart netclient.service", true) _, _ = ncutils.RunCmd("systemctl restart netclient.service", true)
} }
// CleanupLinux - cleans up neclient configs
func CleanupLinux() { func CleanupLinux() {
if err := os.RemoveAll(ncutils.GetNetclientPath()); err != nil { if err := os.RemoveAll(ncutils.GetNetclientPath()); err != nil {
ncutils.PrintLog("Removing netclient configs: "+err.Error(), 1) 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 // RemoveSystemDServices - removes the systemd services on a machine
func RemoveSystemDServices() error { func RemoveSystemDServices() error {
//sysExec, err := exec.LookPath("systemctl") //sysExec, err := exec.LookPath("systemctl")

View File

@@ -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) var bkupErr = config.SaveBackup(network)
if bkupErr != nil { if bkupErr != nil {
ncutils.Log("unable to update backup file") ncutils.Log("unable to update backup file")

View File

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

View File

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

View File

@@ -165,10 +165,11 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
// ensure you clear any existing interface first // ensure you clear any existing interface first
d, _ := wgclient.Device(deviceiface) d, _ := wgclient.Device(deviceiface)
for d != nil && d.Name == deviceiface { for d != nil && d.Name == deviceiface {
err = RemoveConf(deviceiface, false) // remove interface first if err = RemoveConf(deviceiface, false); err != nil { // remove interface first
if strings.Contains(err.Error(), "does not exist") { if strings.Contains(err.Error(), "does not exist") {
err = nil err = nil
break break
}
} }
time.Sleep(time.Second >> 2) time.Sleep(time.Second >> 2)
d, _ = wgclient.Device(deviceiface) 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") 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. if syncconf { // should never be called really.
err = SyncWGQuickConf(ifacename, confPath) err = SyncWGQuickConf(ifacename, confPath)
} }