added verbose command logs

This commit is contained in:
afeiszli 2021-09-17 13:28:32 -04:00
parent 31ea969e3d
commit 5c3bcbc32a
10 changed files with 68 additions and 136 deletions

View file

@ -38,7 +38,7 @@ func initialize() { // Client Mode Prereq Check
} }
log.Println("database successfully connected.") log.Println("database successfully connected.")
if servercfg.IsClientMode() { if servercfg.IsClientMode() {
output, err := local.RunCmd("id -u") output, err := local.RunCmd("id -u", true)
if err != nil { if err != nil {
log.Println("Error running 'id -u' for prereq check. Please investigate or disable client mode.") log.Println("Error running 'id -u' for prereq check. Please investigate or disable client mode.")
log.Fatal(output, err) log.Fatal(output, err)

View file

@ -26,7 +26,7 @@ func Join(cfg config.ClientConfig, privateKey string) error {
err := functions.JoinNetwork(cfg, privateKey) err := functions.JoinNetwork(cfg, privateKey)
if err != nil { if err != nil && !cfg.DebugJoin {
if !strings.Contains(err.Error(), "ALREADY_INSTALLED") { if !strings.Contains(err.Error(), "ALREADY_INSTALLED") {
log.Println("Error installing: ", err) log.Println("Error installing: ", err)
err = functions.LeaveNetwork(cfg.Network) err = functions.LeaveNetwork(cfg.Network)

View file

@ -8,7 +8,6 @@ import (
"fmt" "fmt"
"log" "log"
"os" "os"
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/netclient/netclientutils" "github.com/gravitl/netmaker/netclient/netclientutils"
"github.com/urfave/cli/v2" "github.com/urfave/cli/v2"
@ -26,6 +25,7 @@ type ClientConfig struct {
Network string `yaml:"network"` Network string `yaml:"network"`
Daemon string `yaml:"daemon"` Daemon string `yaml:"daemon"`
OperatingSystem string `yaml:"operatingsystem"` OperatingSystem string `yaml:"operatingsystem"`
DebugJoin bool `yaml:"debugjoin"`
} }
type ServerConfig struct { type ServerConfig struct {
CoreDNSAddr string `yaml:"corednsaddr"` CoreDNSAddr string `yaml:"corednsaddr"`

View file

@ -178,20 +178,15 @@ func DeleteInterface(ifacename string, postdown string) error {
if netclientutils.IsWindows() { if netclientutils.IsWindows() {
err = local.RemoveWindowsConf(ifacename) err = local.RemoveWindowsConf(ifacename)
} else { } else {
ipExec, err := exec.LookPath("ip") ipExec, errN := exec.LookPath("ip")
err = errN
if err != nil { if err != nil {
log.Println(err) log.Println(err)
} }
out, err := local.RunCmd(ipExec + " link del " + ifacename) _, err = local.RunCmd(ipExec + " link del " + ifacename, false)
if err != nil {
log.Println(out, err)
}
if postdown != "" { if postdown != "" {
runcmds := strings.Split(postdown, "; ") runcmds := strings.Split(postdown, "; ")
err = local.RunCmds(runcmds) err = local.RunCmds(runcmds, true)
if err != nil {
log.Println("Error encountered running PostDown: " + err.Error())
}
} }
} }
return err return err

View file

@ -42,20 +42,17 @@ func UpdateDNS(ifacename string, network string, nameserver string) error {
log.Println(err) log.Println(err)
log.Println("WARNING: resolvectl not present. Unable to set dns. Install resolvectl or run manually.") log.Println("WARNING: resolvectl not present. Unable to set dns. Install resolvectl or run manually.")
} else { } else {
_, err = RunCmd("resolvectl domain " + ifacename + " ~" + network) _, err = RunCmd("resolvectl domain " + ifacename + " ~" + network, true)
if err != nil { if err != nil {
log.Println(err)
log.Println("WARNING: Error encountered setting domain on dns. Aborted setting dns.") log.Println("WARNING: Error encountered setting domain on dns. Aborted setting dns.")
} else { } else {
_, err = RunCmd("resolvectl default-route " + ifacename + " false") _, err = RunCmd("resolvectl default-route " + ifacename + " false", true)
if err != nil { if err != nil {
log.Println(err)
log.Println("WARNING: Error encountered setting default-route on dns. Aborted setting dns.") log.Println("WARNING: Error encountered setting default-route on dns. Aborted setting dns.")
} else { } else {
_, err = RunCmd("resolvectl dns " + ifacename + " " + nameserver) _, err = RunCmd("resolvectl dns " + ifacename + " " + nameserver, true)
if err != nil { if err != nil {
log.Println("WARNING: Error encountered running resolvectl dns " + ifacename + " " + nameserver) log.Println("WARNING: Error encountered running resolvectl dns " + ifacename + " " + nameserver)
log.Println(err)
} }
} }
} }

View file

@ -29,17 +29,15 @@ func SetIPForwarding() error {
} }
func SetIPForwardingLinux() error { func SetIPForwardingLinux() error {
out, err := RunCmd("sysctl net.ipv4.ip_forward") out, err := RunCmd("sysctl net.ipv4.ip_forward", true)
if err != nil { if err != nil {
log.Println(err)
log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.") log.Println("WARNING: Error encountered setting ip forwarding. This can break functionality.")
return err return err
} else { } else {
s := strings.Fields(string(out)) s := strings.Fields(string(out))
if s[2] != "1" { 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 { if err != nil {
log.Println(err)
log.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.") log.Println("WARNING: Error encountered setting ip forwarding. You may want to investigate this.")
return err return err
} }
@ -48,23 +46,25 @@ func SetIPForwardingLinux() error {
return nil return nil
} }
func RunCmd(command string) (string, error) { func RunCmd(command string, printerr bool) (string, error) {
args := strings.Fields(command) 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 return string(out), err
} }
func RunCmds(commands []string) error { func RunCmds(commands []string, printerr bool) error {
var err error var err error
for _, command := range commands { for _, command := range commands {
args := strings.Fields(command) args := strings.Fields(command)
out, err := exec.Command(args[0], args[1:]...).Output() out, err := exec.Command(args[0], args[1:]...).CombinedOutput()
if string(out) != "" { if err != nil && printerr {
log.Println("error running command:",command)
log.Println(string(out)) log.Println(string(out))
} }
if err != nil {
return err
}
} }
return err return err
} }
@ -175,26 +175,10 @@ WantedBy=timers.target
} }
} }
_, err = RunCmd("systemctl enable netclient@.service") _, _ = RunCmd("systemctl enable netclient@.service", true)
if err != nil { _, _ = RunCmd("systemctl daemon-reload", true)
log.Println("Error enabling netclient@.service. Please investigate.") _, _ = RunCmd("systemctl enable netclient-" + network + ".timer", true)
log.Println(err) _, _ = RunCmd("systemctl start netclient-" + network + ".timer", true)
}
_, 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)
}
return nil return nil
} }
@ -221,21 +205,12 @@ func RemoveSystemDServices(network string) error {
} }
if fullremove { if fullremove {
_, err = RunCmd("systemctl disable netclient@.service") _, err = RunCmd("systemctl disable netclient@.service", true)
if err != nil {
log.Println("Error disabling netclient@.service. Please investigate.")
log.Println(err)
}
} }
_, err = RunCmd("systemctl daemon-reload") _, _ = RunCmd("systemctl daemon-reload", true)
if err != nil {
log.Println("Error stopping netclient-" + network + ".timer. Please investigate.") if FileExists("/etc/systemd/system/netclient-" + network + ".timer") {
log.Println(err) _, _ = RunCmd("systemctl disable netclient-" + network + ".timer", true)
}
_, err = RunCmd("systemctl disable netclient-" + network + ".timer")
if err != nil {
log.Println("Error disabling netclient-" + network + ".timer. Please investigate.")
log.Println(err)
} }
if fullremove { if fullremove {
if FileExists("/etc/systemd/system/netclient@.service") { 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("Error removing file. Please investigate.")
log.Println(err) log.Println(err)
} }
_, err = RunCmd("systemctl daemon-reload") _, _ = RunCmd("systemctl daemon-reload", true)
if err != nil { _, _ = RunCmd("systemctl reset-failed", true)
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
} }
return nil return nil
} }
@ -291,7 +257,7 @@ func WipeLocal(network string) error {
if ifacename != "" { if ifacename != "" {
if netclientutils.IsWindows() { if netclientutils.IsWindows() {
if err := RemoveWindowsConf(ifacename); err == nil { if err = RemoveWindowsConf(ifacename); err == nil {
log.Println("removed Windows interface", ifacename) log.Println("removed Windows interface", ifacename)
} }
} else { } else {
@ -299,16 +265,15 @@ func WipeLocal(network string) error {
if err != nil { if err != nil {
return err return err
} }
out, err := RunCmd(ipExec + " link del " + ifacename) out, err := RunCmd(ipExec + " link del " + ifacename, false)
if err != nil { dontprint := strings.Contains(out, "does not exist") || strings.Contains(out, "Cannot find device")
log.Println(out, err) if err != nil && !dontprint {
log.Println("error running command:",ipExec + " link del " + ifacename)
log.Println(out)
} }
if nodecfg.PostDown != "" { if nodecfg.PostDown != "" {
runcmds := strings.Split(nodecfg.PostDown, "; ") runcmds := strings.Split(nodecfg.PostDown, "; ")
err = RunCmds(runcmds) _ = RunCmds(runcmds, false)
if err != nil {
log.Println("Error encountered running PostDown: " + err.Error())
}
} }
} }
} }

View file

@ -13,7 +13,7 @@ import (
) )
func IsWindowsWGInstalled() bool { func IsWindowsWGInstalled() bool {
out, err := RunCmd("wg help") out, err := RunCmd("wg help", true)
if err != nil { if err != nil {
return false return false
} }
@ -21,14 +21,14 @@ func IsWindowsWGInstalled() bool {
} }
func ApplyWindowsConf(confPath string) error { 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 err
} }
return nil return nil
} }
func RemoveWindowsConf(ifacename string) error { 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 err
} }
return nil return nil
@ -58,12 +58,12 @@ func writeServiceConfig() error {
func StopWindowsDaemon() { func StopWindowsDaemon() {
netclientutils.Log("no networks detected, stopping Windows, Netclient daemon") netclientutils.Log("no networks detected, stopping Windows, Netclient daemon")
// stop daemon, will not overwrite // 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() { func RemoveWindowsDaemon() {
// uninstall daemon, will not restart or start another // 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") netclientutils.Log("uninstalled Windows, Netclient daemon")
} }
@ -144,9 +144,9 @@ func CreateAndRunWindowsDaemon() error {
netclientutils.Log("finished daemon setup") netclientutils.Log("finished daemon setup")
} }
// install daemon, will not overwrite // 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 // 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`) netclientutils.Log(strings.Replace(netclientutils.GetNetclientPathSpecific(), `\\`, `\`, -1) + `winsw.exe start`)
return nil return nil
} }

View file

@ -324,7 +324,7 @@ func main() {
ncwindows.InitWindows() ncwindows.InitWindows()
} else { } else {
// start our application // start our application
out, err := local.RunCmd("id -u") out, err := local.RunCmd("id -u", true)
if err != nil { if err != nil {
log.Fatal(out, err) log.Fatal(out, err)

View file

@ -68,19 +68,9 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
return err return err
} }
_, delErr := local.RunCmd("ip link delete dev " + ifacename) _, _ = local.RunCmd("ip link delete dev " + ifacename, false)
addLinkOut, addLinkErr := local.RunCmd(ipExec + " link add dev " + ifacename + " type wireguard") _, _ = local.RunCmd(ipExec + " link add dev " + ifacename + " type wireguard", true)
addOut, addErr := local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address + "/24") _, _ = local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address + "/24", true)
if delErr != nil {
// not displaying error
// log.Println(delOut, delErr)
}
if addLinkErr != nil {
log.Println(addLinkOut, addLinkErr)
}
if addErr != nil {
log.Println(addOut, addErr)
}
} }
var nodeport int var nodeport int
nodeport = int(node.ListenPort) nodeport = int(node.ListenPort)
@ -151,47 +141,33 @@ func InitWireguard(node *models.Node, privkey string, peers []wgtypes.PeerConfig
_ = local.UpdateDNS(ifacename, network, nameserver) _ = local.UpdateDNS(ifacename, network, nameserver)
} }
//=========End DNS Setup=======\\ //=========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") netclientutils.Log("attempted to remove interface before editing")
return err return err
} }
if nodecfg.PostDown != "" { if nodecfg.PostDown != "" {
runcmds := strings.Split(nodecfg.PostDown, "; ") runcmds := strings.Split(nodecfg.PostDown, "; ")
err = local.RunCmds(runcmds) err = local.RunCmds(runcmds, true)
if err != nil {
fmt.Println("Error encountered running PostDown: " + err.Error())
}
} }
// set MTU of node interface // 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) netclientutils.Log("failed to create interface with mtu " + ifacename)
return err return err
} }
if nodecfg.PostUp != "" { if nodecfg.PostUp != "" {
runcmds := strings.Split(nodecfg.PostUp, "; ") runcmds := strings.Split(nodecfg.PostUp, "; ")
err = local.RunCmds(runcmds) err = local.RunCmds(runcmds, true)
if err != nil {
fmt.Println("Error encountered running PostUp: " + err.Error())
}
} }
if hasGateway { if hasGateway {
for _, gateway := range gateways { for _, gateway := range gateways {
out, err := local.RunCmd(ipExec + " -4 route add " + gateway + " dev " + ifacename) _, _ = local.RunCmd(ipExec + " -4 route add " + gateway + " dev " + ifacename, true)
fmt.Println(string(out))
if err != nil {
fmt.Println("error encountered adding gateway: " + err.Error())
}
} }
} }
if node.Address6 != "" && node.IsDualStack == "yes" { if node.Address6 != "" && node.IsDualStack == "yes" {
fmt.Println("adding address: " + node.Address6) log.Println("[netclient] adding address: " + node.Address6, 1)
out, err := local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address6 + "/64") _, _ = local.RunCmd(ipExec + " address add dev " + ifacename + " " + node.Address6 + "/64", true)
if err != nil {
fmt.Println(out)
fmt.Println("error encountered adding ipv6: " + err.Error())
}
} }
} }
return err return err
@ -287,9 +263,9 @@ func SetPeers(iface string, keepalive int32, peers []wgtypes.PeerConfig) error {
for _, currentPeer := range devicePeers { for _, currentPeer := range devicePeers {
if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() && if currentPeer.AllowedIPs[0].String() == peer.AllowedIPs[0].String() &&
currentPeer.PublicKey.String() != peer.PublicKey.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 { 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" { if keepAliveString == "0" {
keepAliveString = "5" keepAliveString = "5"
} }
var output string
if peer.Endpoint != nil { 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 + " endpoint " + udpendpoint +
" persistent-keepalive " + keepAliveString + " persistent-keepalive " + keepAliveString +
" allowed-ips " + allowedips) " allowed-ips " + allowedips, true)
} else { } 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 + " persistent-keepalive " + keepAliveString +
" allowed-ips " + allowedips) " allowed-ips " + allowedips, true)
} }
if err != nil { 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 { 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 { if err != nil {
log.Println(output, "error removing peer", currentPeer.PublicKey.String()) log.Println(output, "error removing peer", currentPeer.PublicKey.String())
} else {
log.Println("removed peer " + currentPeer.PublicKey.String())
} }
} }
} }

View file

@ -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) 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 := 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() err = joinCMD.Start()
if err != nil { if err != nil {