diff --git a/go.mod b/go.mod index f76fcb54..0b02a82c 100644 --- a/go.mod +++ b/go.mod @@ -31,7 +31,10 @@ require ( gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) -require github.com/posthog/posthog-go v0.0.0-20211028072449-93c17c49e2b0 +require ( + github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534 + github.com/posthog/posthog-go v0.0.0-20211028072449-93c17c49e2b0 +) require ( cloud.google.com/go v0.34.0 // indirect @@ -50,5 +53,6 @@ require ( github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect google.golang.org/appengine v1.4.0 // indirect ) diff --git a/go.sum b/go.sum index da361ebe..84e4257b 100644 --- a/go.sum +++ b/go.sum @@ -36,6 +36,8 @@ github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8S github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534 h1:dhy9OQKGBh4zVXbjwbxxHjRxMJtLXj3zfgpBYQaR4Q4= +github.com/go-ping/ping v0.0.0-20211130115550-779d1e919534/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= @@ -72,6 +74,7 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= @@ -198,6 +201,7 @@ golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210504132125-bbd867fde50d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -208,6 +212,8 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -229,6 +235,7 @@ golang.org/x/sys v0.0.0-20210123111255-9b0068b26619/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210216163648-f7da38b97c65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309040221-94ec62e08169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/mq/util.go b/mq/util.go index 24f49173..ac83e0db 100644 --- a/mq/util.go +++ b/mq/util.go @@ -50,7 +50,7 @@ func publish(node *models.Node, dest string, msg []byte) error { if encryptErr != nil { return encryptErr } - if token := client.Publish(dest, 0, false, encrypted); token.Wait() && token.Error() != nil { + if token := client.Publish(dest, 0, true, encrypted); token.Wait() && token.Error() != nil { return token.Error() } return nil diff --git a/netclient/functions/common.go b/netclient/functions/common.go index 9d455e28..f49e9262 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -14,6 +14,7 @@ import ( "github.com/gravitl/netmaker/netclient/auth" "github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/daemon" + "github.com/gravitl/netmaker/netclient/local" "github.com/gravitl/netmaker/netclient/ncutils" "github.com/gravitl/netmaker/netclient/wireguard" "golang.zx2c4.com/wireguard/wgctrl" @@ -185,17 +186,19 @@ func LeaveNetwork(network string) error { } } } - // extra network route setting required for freebsd and windows, TODO mac?? - if ncutils.IsWindows() { - ip, mask, err := ncutils.GetNetworkIPMask(node.NetworkSettings.AddressRange) - if err != nil { - ncutils.PrintLog(err.Error(), 1) + + wgClient, wgErr := wgctrl.New() + if wgErr == nil { + dev, devErr := wgClient.Device(cfg.Node.Interface) + if devErr == nil { + local.FlushPeerRoutes(cfg.Node.Interface, cfg.Node.Address, dev.Peers[:]) + _, cidr, cidrErr := net.ParseCIDR(cfg.NetworkSettings.AddressRange) + if cidrErr == nil { + local.RemoveCIDRRoute(cfg.Node.Interface, cfg.Node.Address, cidr) + } + } else { + ncutils.PrintLog("could not flush peer routes when leaving network, "+cfg.Node.Network, 1) } - _, _ = ncutils.RunCmd("route delete "+ip+" mask "+mask+" "+node.Address, true) - } else if ncutils.IsFreeBSD() { - _, _ = ncutils.RunCmd("route del -net "+node.NetworkSettings.AddressRange+" -interface "+node.Interface, true) - } else if ncutils.IsLinux() { - _, _ = ncutils.RunCmd("ip -4 route del "+node.NetworkSettings.AddressRange+" dev "+node.Interface, false) } err = WipeLocal(node.Network) diff --git a/netclient/functions/daemon.go b/netclient/functions/daemon.go index 8b8d5693..2a59c0dc 100644 --- a/netclient/functions/daemon.go +++ b/netclient/functions/daemon.go @@ -3,6 +3,7 @@ package functions import ( "context" "encoding/json" + "errors" "fmt" "os" "os/signal" @@ -13,6 +14,7 @@ import ( "time" mqtt "github.com/eclipse/paho.mqtt.golang" + "github.com/go-ping/ping" "github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/netclient/auth" "github.com/gravitl/netmaker/netclient/config" @@ -83,13 +85,9 @@ func Daemon() error { // SetupMQTT creates a connection to broker and return client func SetupMQTT(cfg *config.ClientConfig) mqtt.Client { opts := mqtt.NewClientOptions() - for _, server := range cfg.Node.NetworkSettings.DefaultServerAddrs { - if server.Address != "" && server.IsLeader { - // ncutils.Log(fmt.Sprintf("adding server (%s) to listen on network %s", server.Address, cfg.Node.Network)) - opts.AddBroker(server.Address + ":1883") - break - } - } + server := getServerAddress(cfg) + opts.AddBroker(server + ":1883") + opts.SetDefaultPublishHandler(All) client := mqtt.NewClient(opts) tperiod := time.Now().Add(12 * time.Second) @@ -123,32 +121,32 @@ func MessageQueue(ctx context.Context, network string) { ncutils.Log("netclient go routine started for " + network) var cfg config.ClientConfig cfg.Network = network - var configPath = fmt.Sprintf("%snetconfig-%s", ncutils.GetNetclientPathSpecific(), network) - fileInfo, err := os.Stat(configPath) - if err != nil { - ncutils.Log("could not stat config file: " + configPath) - } + //var configPath = fmt.Sprintf("%snetconfig-%s", ncutils.GetNetclientPathSpecific(), network) + //fileInfo, err := os.Stat(configPath) + //if err != nil { + // ncutils.Log("could not stat config file: " + configPath) + //} // speed up UDP rest - if time.Now().After(fileInfo.ModTime().Add(time.Minute)) { - sleepTime := 2 - ncutils.Log("pulling latest config for " + cfg.Network) - for { - _, err := Pull(network, true) - if err == nil { - break - } else { - ncutils.PrintLog("error pulling config for "+network+": "+err.Error(), 1) - } - if sleepTime > 3600 { - sleepTime = 3600 - } - ncutils.Log("failed to pull for network " + network) - ncutils.Log(fmt.Sprintf("waiting %d seconds to retry...", sleepTime)) - time.Sleep(time.Second * time.Duration(sleepTime)) - sleepTime = sleepTime * 2 - } - } - time.Sleep(time.Second << 1) + // if time.Now().After(fileInfo.ModTime().Add(time.Minute)) { + // sleepTime := 2 + // ncutils.Log("pulling latest config for " + cfg.Network) + // for { + // _, err := Pull(network, true) + // if err == nil { + // break + // } else { + // ncutils.PrintLog("error pulling config for "+network+": "+err.Error(), 1) + // } + // if sleepTime > 3600 { + // sleepTime = 3600 + // } + // ncutils.Log("failed to pull for network " + network) + // ncutils.Log(fmt.Sprintf("waiting %d seconds to retry...", sleepTime)) + // time.Sleep(time.Second * time.Duration(sleepTime)) + // sleepTime = sleepTime * 2 + // } + // } + //time.Sleep(time.Second << 1) cfg.ReadConfig() ncutils.Log("daemon started for network: " + network) client := SetupMQTT(&cfg) @@ -502,6 +500,9 @@ func Checkin(ctx context.Context, cfg *config.ClientConfig, network string) { PublishNodeUpdate(cfg) } } + if err := pingServer(cfg); err != nil { + ncutils.PrintLog("could not ping server "+err.Error(), 0) + } Hello(cfg, network) // ncutils.Log("Checkin complete") } @@ -578,3 +579,30 @@ func decryptMsg(cfg *config.ClientConfig, msg []byte) ([]byte, error) { return ncutils.BoxDecrypt(msg, serverPubKey, diskKey) } + +func pingServer(cfg *config.ClientConfig) error { + node := getServerAddress(cfg) + pinger, err := ping.NewPinger(node) + if err != nil { + ncutils.Log("error creating pinger " + err.Error()) + return err + } + pinger.Timeout = 2 * time.Second + pinger.Run() + stats := pinger.Statistics() + if stats.PacketLoss == 100 { + ncutils.PrintLog(fmt.Sprintf("lost packets when pinging server: packets sent:%d packets recieved: %d", stats.PacketsSent, stats.PacketsRecv), 1) + return errors.New("ping error") + } + return nil +} + +func getServerAddress(cfg *config.ClientConfig) string { + var server models.ServerAddr + for _, server = range cfg.Node.NetworkSettings.DefaultServerAddrs { + if server.Address != "" && server.IsLeader { + break + } + } + return server.Address +} diff --git a/netclient/local/routes.go b/netclient/local/routes.go index b2a26c9e..0dab135a 100644 --- a/netclient/local/routes.go +++ b/netclient/local/routes.go @@ -58,7 +58,21 @@ func SetCurrentPeerRoutes(iface, currentAddr string, peers []wgtypes.Peer) { } } +// FlushPeerRoutes - removes all current peer routes +func FlushPeerRoutes(iface, currentAddr string, peers []wgtypes.Peer) { + for _, peer := range peers { + for _, allowedIP := range peer.AllowedIPs { + deleteRoute(iface, &allowedIP, currentAddr) + } + } +} + // SetCIDRRoute - sets the CIDR route, used on join and restarts func SetCIDRRoute(iface, currentAddr string, cidr *net.IPNet) { setCidr(iface, currentAddr, cidr) } + +// RemoveCIDRRoute - removes a static cidr route +func RemoveCIDRRoute(iface, currentAddr string, cidr *net.IPNet) { + removeCidr(iface, cidr, currentAddr) +} diff --git a/netclient/local/routes_darwin.go b/netclient/local/routes_darwin.go index c3fb9a22..dbec1719 100644 --- a/netclient/local/routes_darwin.go +++ b/netclient/local/routes_darwin.go @@ -16,22 +16,26 @@ func setRoute(iface string, addr *net.IPNet, address string) error { if strings.Contains(addr.IP.String(), ":") { inetx = "inet6" } - out, err = ncutils.RunCmd("route -n get -"+inetx+" "+addr.IP.String(), true) + out, err = ncutils.RunCmd("route -n get -"+inetx+" "+addr.IP.String(), false) if err != nil { return err } if !(strings.Contains(out, iface)) { - _, err = ncutils.RunCmd("route -q -n add -"+inetx+" "+addr.String()+" -interface "+iface, true) + _, err = ncutils.RunCmd("route -q -n add -"+inetx+" "+addr.String()+" -interface "+iface, false) } return err } func deleteRoute(iface string, addr *net.IPNet, address string) error { var err error - _, err = ncutils.RunCmd("route -q -n delete "+addr.String(), true) + _, err = ncutils.RunCmd("route -q -n delete "+addr.String(), false) return err } func setCidr(iface, address string, addr *net.IPNet) { - ncutils.RunCmd("route -q -n add -net "+addr.String()+" "+address, true) + ncutils.RunCmd("route -q -n add -net "+addr.String()+" "+address, false) +} + +func removeCidr(iface string, addr *net.IPNet, address string) { + ncutils.RunCmd("route -q -n delete "+addr.String()+" -interface "+iface, false) } diff --git a/netclient/local/routes_freebsd.go b/netclient/local/routes_freebsd.go index 400d33cd..a840ea3f 100644 --- a/netclient/local/routes_freebsd.go +++ b/netclient/local/routes_freebsd.go @@ -8,16 +8,20 @@ import ( func setRoute(iface string, addr *net.IPNet, address string) error { var err error - _, _ = ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, true) + _, _ = ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, false) return err } func deleteRoute(iface string, addr *net.IPNet, address string) error { var err error - _, err = ncutils.RunCmd("route delete -net "+addr.String()+" -interface "+iface, true) + _, err = ncutils.RunCmd("route delete -net "+addr.String()+" -interface "+iface, false) return err } func setCidr(iface, address string, addr *net.IPNet) { - ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, true) + ncutils.RunCmd("route add -net "+addr.String()+" -interface "+iface, false) +} + +func removeCidr(iface string, addr *net.IPNet, address string) { + ncutils.RunCmd("route delete -net "+addr.String()+" -interface "+iface, false) } diff --git a/netclient/local/routes_linux.go b/netclient/local/routes_linux.go index 841574f1..3a086e92 100644 --- a/netclient/local/routes_linux.go +++ b/netclient/local/routes_linux.go @@ -13,16 +13,15 @@ import ( func setRoute(iface string, addr *net.IPNet, address string) error { out, err := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false) if err != nil || !strings.Contains(out, iface) { - _, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), true) + _, err = ncutils.RunCmd(fmt.Sprintf("ip route add %s dev %s", addr.String(), iface), false) } return err } func deleteRoute(iface string, addr *net.IPNet, address string) error { - var err error - out, _ := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false) + out, err := ncutils.RunCmd(fmt.Sprintf("ip route get %s", addr.IP.String()), false) if strings.Contains(out, iface) { - _, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), true) + _, err = ncutils.RunCmd(fmt.Sprintf("ip route del %s dev %s", addr.String(), iface), false) } return err } @@ -30,3 +29,7 @@ func deleteRoute(iface string, addr *net.IPNet, address string) error { func setCidr(iface, address string, addr *net.IPNet) { ncutils.RunCmd("ip -4 route add "+addr.String()+" dev "+iface, false) } + +func removeCidr(iface string, addr *net.IPNet, address string) { + ncutils.RunCmd("ip route delete "+addr.String()+" dev "+iface, false) +} diff --git a/netclient/local/routes_windows.go b/netclient/local/routes_windows.go index 4bf1e591..1a7255eb 100644 --- a/netclient/local/routes_windows.go +++ b/netclient/local/routes_windows.go @@ -9,20 +9,24 @@ import ( func setRoute(iface string, addr *net.IPNet, address string) error { var err error - _, err = ncutils.RunCmd("route -p add "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true) + _, err = ncutils.RunCmd("route -p add "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) time.Sleep(time.Second >> 2) - ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true) + ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) return err } func deleteRoute(iface string, addr *net.IPNet, address string) error { var err error - _, err = ncutils.RunCmd("route delete "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true) + _, err = ncutils.RunCmd("route delete "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) return err } func setCidr(iface, address string, addr *net.IPNet) { - ncutils.RunCmd("route -p add "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true) + ncutils.RunCmd("route -p add "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) time.Sleep(time.Second >> 2) - ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, true) + ncutils.RunCmd("route change "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) +} + +func removeCidr(iface, address string, addr *net.IPNet) { + ncutils.RunCmd("route delete "+addr.IP.String()+" mask "+addr.Mask.String()+" "+address, false) }