From 5c3bcbc32a5d156af3a677848f6b046e6f2fe5df Mon Sep 17 00:00:00 2001 From: afeiszli Date: Fri, 17 Sep 2021 13:28:32 -0400 Subject: [PATCH] added verbose command logs --- main.go | 2 +- netclient/command/commands.go | 2 +- netclient/config/config.go | 2 +- netclient/functions/common.go | 13 ++--- netclient/local/dns.go | 9 ++-- netclient/local/local.go | 95 +++++++++++------------------------ netclient/local/windows.go | 14 +++--- netclient/main.go | 2 +- netclient/wireguard/kernel.go | 63 +++++++---------------- serverctl/serverctl.go | 2 + 10 files changed, 68 insertions(+), 136 deletions(-) diff --git a/main.go b/main.go index 5b911230..e5449f1a 100644 --- a/main.go +++ b/main.go @@ -38,7 +38,7 @@ func initialize() { // Client Mode Prereq Check } log.Println("database successfully connected.") if servercfg.IsClientMode() { - output, err := local.RunCmd("id -u") + output, err := local.RunCmd("id -u", true) if err != nil { log.Println("Error running 'id -u' for prereq check. Please investigate or disable client mode.") log.Fatal(output, err) diff --git a/netclient/command/commands.go b/netclient/command/commands.go index 5c12f6fa..fe8570cb 100644 --- a/netclient/command/commands.go +++ b/netclient/command/commands.go @@ -26,7 +26,7 @@ func Join(cfg config.ClientConfig, privateKey string) error { err := functions.JoinNetwork(cfg, privateKey) - if err != nil { + if err != nil && !cfg.DebugJoin { if !strings.Contains(err.Error(), "ALREADY_INSTALLED") { log.Println("Error installing: ", err) err = functions.LeaveNetwork(cfg.Network) diff --git a/netclient/config/config.go b/netclient/config/config.go index 61254a51..e28f84a9 100644 --- a/netclient/config/config.go +++ b/netclient/config/config.go @@ -8,7 +8,6 @@ import ( "fmt" "log" "os" - "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/netclientutils" "github.com/urfave/cli/v2" @@ -26,6 +25,7 @@ type ClientConfig struct { Network string `yaml:"network"` Daemon string `yaml:"daemon"` OperatingSystem string `yaml:"operatingsystem"` + DebugJoin bool `yaml:"debugjoin"` } type ServerConfig struct { CoreDNSAddr string `yaml:"corednsaddr"` diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 291873ac..1484ceda 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -178,20 +178,15 @@ func DeleteInterface(ifacename string, postdown string) error { if netclientutils.IsWindows() { err = local.RemoveWindowsConf(ifacename) } else { - ipExec, err := exec.LookPath("ip") + ipExec, errN := exec.LookPath("ip") + err = errN if err != nil { log.Println(err) } - out, err := local.RunCmd(ipExec + " link del " + ifacename) - if err != nil { - log.Println(out, err) - } + _, err = local.RunCmd(ipExec + " link del " + ifacename, false) if postdown != "" { runcmds := strings.Split(postdown, "; ") - err = local.RunCmds(runcmds) - if err != nil { - log.Println("Error encountered running PostDown: " + err.Error()) - } + err = local.RunCmds(runcmds, true) } } return err diff --git a/netclient/local/dns.go b/netclient/local/dns.go index 11e81c1a..16519238 100644 --- a/netclient/local/dns.go +++ b/netclient/local/dns.go @@ -42,20 +42,17 @@ func UpdateDNS(ifacename string, network string, nameserver string) error { log.Println(err) log.Println("WARNING: resolvectl not present. Unable to set dns. Install resolvectl or run manually.") } else { - _, err = RunCmd("resolvectl domain " + ifacename + " ~" + network) + _, err = RunCmd("resolvectl domain " + ifacename + " ~" + network, true) if err != nil { - log.Println(err) log.Println("WARNING: Error encountered setting domain on dns. Aborted setting dns.") } else { - _, err = RunCmd("resolvectl default-route " + ifacename + " false") + _, err = RunCmd("resolvectl default-route " + ifacename + " false", true) if err != nil { - log.Println(err) log.Println("WARNING: Error encountered setting default-route on dns. Aborted setting dns.") } else { - _, err = RunCmd("resolvectl dns " + ifacename + " " + nameserver) + _, err = RunCmd("resolvectl dns " + ifacename + " " + nameserver, true) if err != nil { log.Println("WARNING: Error encountered running resolvectl dns " + ifacename + " " + nameserver) - log.Println(err) } } } diff --git a/netclient/local/local.go b/netclient/local/local.go index 4878842b..349e7fcc 100644 --- a/netclient/local/local.go +++ b/netclient/local/local.go @@ -29,17 +29,15 @@ func SetIPForwarding() error { } func SetIPForwardingLinux() error { - out, err := RunCmd("sysctl net.ipv4.ip_forward") + out, err := RunCmd("sysctl net.ipv4.ip_forward", true) if err != nil { - log.Println(err) log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.") return err } else { s := strings.Fields(string(out)) if s[2] != "1" { - _, err = RunCmd("sysctl -w net.ipv4.ip_forward=1") + _, err = RunCmd("sysctl -w net.ipv4.ip_forward=1", true) if err != nil { - log.Println(err) log.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.") return err } @@ -48,23 +46,25 @@ func SetIPForwardingLinux() error { return nil } -func RunCmd(command string) (string, error) { +func RunCmd(command string, printerr bool) (string, error) { args := strings.Fields(command) - out, err := exec.Command(args[0], args[1:]...).Output() + out, err := exec.Command(args[0], args[1:]...).CombinedOutput() + if err != nil && printerr { + log.Println("error running command:",command) + log.Println(string(out)) + } return string(out), err } -func RunCmds(commands []string) error { +func RunCmds(commands []string, printerr bool) error { var err error for _, command := range commands { args := strings.Fields(command) - out, err := exec.Command(args[0], args[1:]...).Output() - if string(out) != "" { + out, err := exec.Command(args[0], args[1:]...).CombinedOutput() + if err != nil && printerr { + log.Println("error running command:",command) log.Println(string(out)) } - if err != nil { - return err - } } return err } @@ -175,26 +175,10 @@ WantedBy=timers.target } } - _, err = RunCmd("systemctl enable netclient@.service") - if err != nil { - log.Println("Error enabling netclient@.service. Please investigate.") - log.Println(err) - } - _, err = RunCmd("systemctl daemon-reload") - if err != nil { - log.Println("Error reloading system daemons. Please investigate.") - log.Println(err) - } - _, err = RunCmd("systemctl enable netclient-" + network + ".timer") - if err != nil { - log.Println("Error enabling netclient.timer. Please investigate.") - log.Println(err) - } - _, err = RunCmd("systemctl start netclient-" + network + ".timer") - if err != nil { - log.Println("Error starting netclient-" + network + ".timer. Please investigate.") - log.Println(err) - } + _, _ = RunCmd("systemctl enable netclient@.service", true) + _, _ = RunCmd("systemctl daemon-reload", true) + _, _ = RunCmd("systemctl enable netclient-" + network + ".timer", true) + _, _ = RunCmd("systemctl start netclient-" + network + ".timer", true) return nil } @@ -221,21 +205,12 @@ func RemoveSystemDServices(network string) error { } if fullremove { - _, err = RunCmd("systemctl disable netclient@.service") - if err != nil { - log.Println("Error disabling netclient@.service. Please investigate.") - log.Println(err) - } + _, err = RunCmd("systemctl disable netclient@.service", true) } - _, err = RunCmd("systemctl daemon-reload") - if err != nil { - log.Println("Error stopping netclient-" + network + ".timer. Please investigate.") - log.Println(err) - } - _, err = RunCmd("systemctl disable netclient-" + network + ".timer") - if err != nil { - log.Println("Error disabling netclient-" + network + ".timer. Please investigate.") - log.Println(err) + _, _ = RunCmd("systemctl daemon-reload", true) + + if FileExists("/etc/systemd/system/netclient-" + network + ".timer") { + _, _ = RunCmd("systemctl disable netclient-" + network + ".timer", true) } if fullremove { if FileExists("/etc/systemd/system/netclient@.service") { @@ -249,17 +224,8 @@ func RemoveSystemDServices(network string) error { log.Println("Error removing file. Please investigate.") log.Println(err) } - _, err = RunCmd("systemctl daemon-reload") - if err != nil { - log.Println("Error reloading system daemons. Please investigate.") - log.Println(err) - } - _, err = RunCmd("systemctl reset-failed") - if err != nil { - log.Println("Error reseting failed system services. Please investigate.") - log.Println(err) - } - return err + _, _ = RunCmd("systemctl daemon-reload", true) + _, _ = RunCmd("systemctl reset-failed", true) } return nil } @@ -291,7 +257,7 @@ func WipeLocal(network string) error { if ifacename != "" { if netclientutils.IsWindows() { - if err := RemoveWindowsConf(ifacename); err == nil { + if err = RemoveWindowsConf(ifacename); err == nil { log.Println("removed Windows interface", ifacename) } } else { @@ -299,16 +265,15 @@ func WipeLocal(network string) error { if err != nil { return err } - out, err := RunCmd(ipExec + " link del " + ifacename) - if err != nil { - log.Println(out, err) + out, err := RunCmd(ipExec + " link del " + ifacename, false) + dontprint := strings.Contains(out, "does not exist") || strings.Contains(out, "Cannot find device") + if err != nil && !dontprint { + log.Println("error running command:",ipExec + " link del " + ifacename) + log.Println(out) } if nodecfg.PostDown != "" { runcmds := strings.Split(nodecfg.PostDown, "; ") - err = RunCmds(runcmds) - if err != nil { - log.Println("Error encountered running PostDown: " + err.Error()) - } + _ = RunCmds(runcmds, false) } } } diff --git a/netclient/local/windows.go b/netclient/local/windows.go index 99b59fc3..8b951269 100644 --- a/netclient/local/windows.go +++ b/netclient/local/windows.go @@ -13,7 +13,7 @@ import ( ) func IsWindowsWGInstalled() bool { - out, err := RunCmd("wg help") + out, err := RunCmd("wg help", true) if err != nil { return false } @@ -21,14 +21,14 @@ func IsWindowsWGInstalled() bool { } func ApplyWindowsConf(confPath string) error { - if _, err := RunCmd("wireguard.exe /installtunnelservice " + confPath); err != nil { + if _, err := RunCmd("wireguard.exe /installtunnelservice " + confPath, true); err != nil { return err } return nil } func RemoveWindowsConf(ifacename string) error { - if _, err := RunCmd("wireguard.exe /uninstalltunnelservice " + ifacename); err != nil { + if _, err := RunCmd("wireguard.exe /uninstalltunnelservice " + ifacename, true); err != nil { return err } return nil @@ -58,12 +58,12 @@ func writeServiceConfig() error { func StopWindowsDaemon() { netclientutils.Log("no networks detected, stopping Windows, Netclient daemon") // stop daemon, will not overwrite - RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe stop`) + RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe stop`, true) } func RemoveWindowsDaemon() { // uninstall daemon, will not restart or start another - RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe uninstall`) + RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe uninstall`, true) netclientutils.Log("uninstalled Windows, Netclient daemon") } @@ -144,9 +144,9 @@ func CreateAndRunWindowsDaemon() error { netclientutils.Log("finished daemon setup") } // install daemon, will not overwrite - RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe install`) + RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe install`, true) // start daemon, will not restart or start another - RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe start`) + RunCmd(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe start`, true) netclientutils.Log(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe start`) return nil } diff --git a/netclient/main.go b/netclient/main.go index 3b5688ce..69b26000 100644 --- a/netclient/main.go +++ b/netclient/main.go @@ -324,7 +324,7 @@ func main() { ncwindows.InitWindows() } else { // start our application - out, err := local.RunCmd("id -u") + out, err := local.RunCmd("id -u", true) if err != nil { log.Fatal(out, err) diff --git a/netclient/wireguard/kernel.go b/netclient/wireguard/kernel.go index 55b30139..cd7d1cbf 100644 --- a/netclient/wireguard/kernel.go +++ b/netclient/wireguard/kernel.go @@ -68,19 +68,9 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig return err } - _, delErr := local.RunCmd("ip link delete dev " + ifacename) - addLinkOut, addLinkErr := local.RunCmd(ipExec + " link add dev " + ifacename + " type wireguard") - addOut, addErr := local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address + "/24") - if delErr != nil { - // not displaying error - // log.Println(delOut, delErr) - } - if addLinkErr != nil { - log.Println(addLinkOut, addLinkErr) - } - if addErr != nil { - log.Println(addOut, addErr) - } + _, _ = local.RunCmd("ip link delete dev " + ifacename, false) + _, _ = local.RunCmd(ipExec + " link add dev " + ifacename + " type wireguard", true) + _, _ = local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address + "/24", true) } var nodeport int nodeport = int(node.ListenPort) @@ -151,47 +141,33 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig _ = local.UpdateDNS(ifacename, network, nameserver) } //=========End DNS Setup=======\\ - if _, err := local.RunCmd(ipExec + " link set down dev " + ifacename); err != nil { + if _, err := local.RunCmd(ipExec + " link set down dev " + ifacename, false); err != nil { netclientutils.Log("attempted to remove interface before editing") return err } if nodecfg.PostDown != "" { runcmds := strings.Split(nodecfg.PostDown, "; ") - err = local.RunCmds(runcmds) - if err != nil { - fmt.Println("Error encountered running PostDown: " + err.Error()) - } + err = local.RunCmds(runcmds, true) } // set MTU of node interface - if _, err := local.RunCmd(ipExec + " link set mtu " + strconv.Itoa(int(nodecfg.MTU)) + " up dev " + ifacename); err != nil { + if _, err := local.RunCmd(ipExec + " link set mtu " + strconv.Itoa(int(nodecfg.MTU)) + " up dev " + ifacename, true); err != nil { netclientutils.Log("failed to create interface with mtu " + ifacename) return err } if nodecfg.PostUp != "" { runcmds := strings.Split(nodecfg.PostUp, "; ") - err = local.RunCmds(runcmds) - if err != nil { - fmt.Println("Error encountered running PostUp: " + err.Error()) - } + err = local.RunCmds(runcmds, true) } if hasGateway { for _, gateway := range gateways { - out, err := local.RunCmd(ipExec + " -4 route add " + gateway + " dev " + ifacename) - fmt.Println(string(out)) - if err != nil { - fmt.Println("error encountered adding gateway: " + err.Error()) - } + _, _ = local.RunCmd(ipExec + " -4 route add " + gateway + " dev " + ifacename, true) } } if node.Address6 != "" && node.IsDualStack == "yes" { - fmt.Println("adding address: " + node.Address6) - out, err := local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address6 + "/64") - if err != nil { - fmt.Println(out) - fmt.Println("error encountered adding ipv6: " + err.Error()) - } + log.Println("[netclient] adding address: " + node.Address6, 1) + _, _ = local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address6 + "/64", true) } } return err @@ -287,9 +263,9 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { for _, currentPeer := range devicePeers { if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() && currentPeer.PublicKey.String() != peer.PublicKey.String() { - output, err := local.RunCmd("wg set " + iface + " peer " + currentPeer.PublicKey.String() + " remove") + _, err := local.RunCmd("wg set " + iface + " peer " + currentPeer.PublicKey.String() + " remove", true) if err != nil { - log.Println(output, "error removing peer", peer.Endpoint.String()) + log.Println("error removing peer", peer.Endpoint.String()) } } } @@ -304,19 +280,18 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { if keepAliveString == "0" { keepAliveString = "5" } - var output string if peer.Endpoint != nil { - output, err = local.RunCmd("wg set " + iface + " peer " + peer.PublicKey.String() + + _, err = local.RunCmd("wg set " + iface + " peer " + peer.PublicKey.String() + " endpoint " + udpendpoint + " persistent-keepalive " + keepAliveString + - " allowed-ips " + allowedips) + " allowed-ips " + allowedips, true) } else { - output, err = local.RunCmd("wg set " + iface + " peer " + peer.PublicKey.String() + + _, err = local.RunCmd("wg set " + iface + " peer " + peer.PublicKey.String() + " persistent-keepalive " + keepAliveString + - " allowed-ips " + allowedips) + " allowed-ips " + allowedips, true) } if err != nil { - log.Println(output, "error setting peer", peer.PublicKey.String(), err) + log.Println("error setting peer", peer.PublicKey.String()) } } @@ -328,11 +303,9 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error { } } if shouldDelete { - output, err := local.RunCmd("wg set " + iface + " peer " + currentPeer.PublicKey.String() + " remove") + output, err := local.RunCmd("wg set " + iface + " peer " + currentPeer.PublicKey.String() + " remove", true) if err != nil { log.Println(output, "error removing peer", currentPeer.PublicKey.String()) - } else { - log.Println("removed peer " + currentPeer.PublicKey.String()) } } } diff --git a/serverctl/serverctl.go b/serverctl/serverctl.go index 474d27c0..a26d1967 100644 --- a/serverctl/serverctl.go +++ b/serverctl/serverctl.go @@ -138,6 +138,8 @@ func AddNetwork(network string) (bool, error) { functions.PrintUserLog(models.NODE_SERVER_NAME, "executing network join: "+netclientPath+"netclient "+"join "+"-t "+token+" -name "+models.NODE_SERVER_NAME+" -endpoint "+pubip, 0) joinCMD := exec.Command(netclientPath+"netclient", "join", "-t", token, "-name", models.NODE_SERVER_NAME, "-endpoint", pubip) + joinCMD.Stdout = os.Stdout + joinCMD.Stderr = os.Stderr err = joinCMD.Start() if err != nil {