From 51c1973b211d6926eb0e97a4e4cda4f6641b712e Mon Sep 17 00:00:00 2001 From: 0xdcarns Date: Wed, 20 Oct 2021 09:22:05 -0400 Subject: [PATCH] added ability to remove local instance of netmaker --- controllers/networkHttpController.go | 8 ++--- functions/helpers.go | 2 +- logic/nodes.go | 2 +- logic/server.go | 5 ++-- logic/util.go | 8 +++-- logic/wireguard.go | 44 ++++++++++++++++++++++++++++ netclient/functions/common.go | 8 ----- 7 files changed, 58 insertions(+), 19 deletions(-) diff --git a/controllers/networkHttpController.go b/controllers/networkHttpController.go index a307ccc6..7542507b 100644 --- a/controllers/networkHttpController.go +++ b/controllers/networkHttpController.go @@ -344,14 +344,14 @@ func DeleteNetwork(network string) error { servers, err := logic.GetSortedNetworkServerNodes(network) if err == nil { for _, s := range servers { - if err = logic.DeleteNode(s.ID, true); err != nil { - functions.PrintUserLog("[netmaker]", "could not removed server "+s.Name+" before deleting network "+network, 2) + if err = logic.DeleteNode(&s, true); err != nil { + functions.PrintUserLog("", "could not removed server "+s.Name+" before deleting network "+network, 2) } else { - functions.PrintUserLog("[netmaker]", "removed server "+s.Name+" before deleting network "+network, 2) + functions.PrintUserLog("", "removed server "+s.Name+" before deleting network "+network, 2) } } } else { - functions.PrintUserLog("[netmaker]", "could not remove servers before deleting network "+network, 1) + functions.PrintUserLog("", "could not remove servers before deleting network "+network, 1) } return database.DeleteRecord(database.NETWORKS_TABLE_NAME, network) } diff --git a/functions/helpers.go b/functions/helpers.go index 3a815c30..6ddf921b 100644 --- a/functions/helpers.go +++ b/functions/helpers.go @@ -24,7 +24,7 @@ import ( func PrintUserLog(username string, message string, loglevel int) { log.SetFlags(log.Flags() &^ (log.Llongfile | log.Lshortfile)) if int32(loglevel) <= servercfg.GetVerbose() && servercfg.GetVerbose() != 0 { - log.Println(username, message) + log.Println("[netmaker]", username, message) } } diff --git a/logic/nodes.go b/logic/nodes.go index 3ab24a7b..78ca94e8 100644 --- a/logic/nodes.go +++ b/logic/nodes.go @@ -80,7 +80,7 @@ func GetPeers(node models.Node) ([]models.Node, error) { func IsLeader(node *models.Node) bool { nodes, err := GetSortedNetworkServerNodes(node.Network) if err != nil { - functions.PrintUserLog("[netmaker]", "ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.", 0) + functions.PrintUserLog("", "ERROR: COULD NOT RETRIEVE SERVER NODES. THIS WILL BREAK HOLE PUNCHING.", 0) return false } for _, n := range nodes { diff --git a/logic/server.go b/logic/server.go index 21f91da4..d57f1999 100644 --- a/logic/server.go +++ b/logic/server.go @@ -8,9 +8,10 @@ import ( "strconv" "strings" "time" - "github.com/gravitl/netmaker/servercfg" + "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/ncutils" + "github.com/gravitl/netmaker/servercfg" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" ) @@ -239,7 +240,7 @@ func ServerLeave(mac string, network string) error { return err } serverNode.SetID() - return DeleteNode(serverNode.ID, true) + return DeleteNode(&serverNode, true) } // GetServerPeers - gets peers of server diff --git a/logic/util.go b/logic/util.go index fcd6e5d3..a949d58c 100644 --- a/logic/util.go +++ b/logic/util.go @@ -45,8 +45,10 @@ func SetNetworkServerPeers(node *models.Node) { } // DeleteNode - deletes a node from database or moves into delete nodes table -func DeleteNode(key string, exterminate bool) error { +func DeleteNode(node *models.Node, exterminate bool) error { var err error + node.SetID() + var key = node.ID if !exterminate { args := strings.Split(key, "###") node, err := GetNode(args[0], args[1]) @@ -67,13 +69,13 @@ func DeleteNode(key string, exterminate bool) error { Log(err.Error(), 2) } } - if err := database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil { + if err = database.DeleteRecord(database.NODES_TABLE_NAME, key); err != nil { return err } if servercfg.IsDNSMode() { err = dnslogic.SetDNS() } - return err + return removeLocalServer(node) } // CreateNode - creates a node in database diff --git a/logic/wireguard.go b/logic/wireguard.go index 2d417301..45191fbc 100644 --- a/logic/wireguard.go +++ b/logic/wireguard.go @@ -313,3 +313,47 @@ func setWGKeyConfig(node models.Node) error { return setWGConfig(node, node.Network, false) } + +func removeLocalServer(node *models.Node) error { + var ifacename = node.Interface + var err error + if ifacename != "" { + if !ncutils.IsKernel() { + if err = RemoveConf(ifacename, true); err == nil { + Log("removed WireGuard interface: "+ifacename, 1) + } + } else { + ipExec, err := exec.LookPath("ip") + if err != nil { + return err + } + out, err := ncutils.RunCmd(ipExec+" link del "+ifacename, false) + dontprint := strings.Contains(out, "does not exist") || strings.Contains(out, "Cannot find device") + if err != nil && !dontprint { + Log("error running command: "+ipExec+" link del "+ifacename, 1) + Log(out, 1) + } + if node.PostDown != "" { + runcmds := strings.Split(node.PostDown, "; ") + _ = ncutils.RunCmds(runcmds, false) + } + } + } + home := ncutils.GetNetclientPathSpecific() + if ncutils.FileExists(home + "netconfig-" + node.Network) { + _ = os.Remove(home + "netconfig-" + node.Network) + } + if ncutils.FileExists(home + "nettoken-" + node.Network) { + _ = os.Remove(home + "nettoken-" + node.Network) + } + if ncutils.FileExists(home + "secret-" + node.Network) { + _ = os.Remove(home + "secret-" + node.Network) + } + if ncutils.FileExists(home + "wgkey-" + node.Network) { + _ = os.Remove(home + "wgkey-" + node.Network) + } + if ncutils.FileExists(home + "nm-" + node.Network + ".conf") { + _ = os.Remove(home + "nm-" + node.Network + ".conf") + } + return err +} diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 7982b02b..f99b8ec9 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -12,7 +12,6 @@ import ( "strings" nodepb "github.com/gravitl/netmaker/grpc" - "github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/auth" "github.com/gravitl/netmaker/netclient/config" @@ -206,13 +205,6 @@ func LeaveNetwork(network string) error { ncutils.PrintLog("removed machine from "+node.Network+" network on remote server", 1) } } - } else { // handle server side - node.SetID() - if err = logic.DeleteNode(node.ID, true); err != nil { - ncutils.PrintLog("error removing server on network "+node.Network, 1) - } else { - ncutils.PrintLog("removed netmaker server instance on "+node.Network, 1) - } } return RemoveLocalInstance(cfg, network) }