From 6fd4794475d5ff61256a0fcc8933befe621e59e4 Mon Sep 17 00:00:00 2001 From: afeiszli Date: Wed, 2 Jun 2021 11:00:10 -0400 Subject: [PATCH] fixing netclient join command --- netclient/config/config.go | 33 +++++++++++++++--------------- netclient/functions/common.go | 14 +++++++------ netclient/functions/join.go | 36 ++++++++++++++++++++++++++++++--- netclient/functions/register.go | 15 +++++++------- netclient/local/local.go | 21 +++++++++++++------ netclient/wireguard/kernel.go | 16 ++++++++++----- 6 files changed, 92 insertions(+), 43 deletions(-) diff --git a/netclient/config/config.go b/netclient/config/config.go index a9340109..bd451b31 100644 --- a/netclient/config/config.go +++ b/netclient/config/config.go @@ -381,8 +381,9 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, error){ cfg.Network = tokenvals[3] cfg.Node.Network = tokenvals[3] cfg.Server.AccessKey = tokenvals[4] - cfg.Node.LocalRange = tokenvals[5] - + if len(tokenvals) > 4 { + cfg.Node.LocalRange = tokenvals[5] + } if c.String("grpcserver") != "" { cfg.Server.GRPCAddress = c.String("grpcserver") } @@ -412,22 +413,22 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, error){ cfg.Node.Password = c.String("password") cfg.Node.MacAddress = c.String("macaddress") cfg.Node.LocalAddress = c.String("localaddress") - cfg.Node.LocalRange = c.String("localrange") cfg.Node.WGAddress = c.String("address") cfg.Node.WGAddress6 = c.String("addressIPV6") - cfg.Node.Roaming = c.String("") - cfg.Node.DNS = c.String("") - cfg.Node.IsLocal = c.String("") - cfg.Node.IsDualStack = c.String("") - cfg.Node.IsIngressGateway = c.String("") - cfg.Node.PostUp = c.String("") - cfg.Node.PostDown = c.String("") - cfg.Node.Port = int32(c.Int("")) - cfg.Node.KeepAlive = int32(c.Int("")) - cfg.Node.PublicKey = c.String("") - cfg.Node.PrivateKey = c.String("") - cfg.Node.Endpoint = c.String("") - cfg.Node.IPForwarding = c.String("") + cfg.Node.Roaming = c.String("roaming") + cfg.Node.DNS = c.String("dns") + cfg.Node.IsLocal = c.String("islocal") + cfg.Node.IsDualStack = c.String("isdualstack") + cfg.Node.PostUp = c.String("postup") + cfg.Node.PostDown = c.String("postdown") + cfg.Node.Port = int32(c.Int("port")) + cfg.Node.KeepAlive = int32(c.Int("keepalive")) + cfg.Node.PublicKey = c.String("publickey") + cfg.Node.PrivateKey = c.String("privatekey") + cfg.Node.Endpoint = c.String("endpoint") + cfg.Node.IPForwarding = c.String("ipforwarding") + cfg.OperatingSystem = c.String("operatingsystem") + cfg.Daemon = c.String("daemon") return cfg, nil } diff --git a/netclient/functions/common.go b/netclient/functions/common.go index e1d8ea84..b82082ac 100644 --- a/netclient/functions/common.go +++ b/netclient/functions/common.go @@ -309,15 +309,17 @@ func LeaveNetwork(network string) error { ) if err != nil { log.Printf("Encountered error deleting node: %v", err) - fmt.Println(err) + log.Println(err) } else { - fmt.Println("delete node " + node.MacAddress + "from remote server on network " + node.Network) + log.Println("Removed machine from " + node.Network + " network on remote server") } } } err = local.WipeLocal(network) if err != nil { log.Printf("Unable to wipe local config: %v", err) + } else { + log.Println("Removed " + node.Network + " network locally") } if cfg.Daemon != "off" { err = local.RemoveSystemDServices(network) @@ -336,13 +338,13 @@ func DeleteInterface(ifacename string, postdown string) error{ } err = cmdIPLinkDel.Run() if err != nil { - fmt.Println(err) + log.Println(err) } if postdown != "" { runcmds := strings.Split(postdown, "; ") err = local.RunCmds(runcmds) if err != nil { - fmt.Println("Error encountered running PostDown: " + err.Error()) + log.Println("Error encountered running PostDown: " + err.Error()) } } return err @@ -367,9 +369,9 @@ func List() error{ PublicEndpoint: cfg.Node.Endpoint, } jsoncfg, _ := json.Marshal(listconfig) - fmt.Println(network + ": " + string(jsoncfg)) + log.Println(network + ": " + string(jsoncfg)) } else { - fmt.Println(network + ": Could not retrieve network configuration.") + log.Println(network + ": Could not retrieve network configuration.") } } return nil diff --git a/netclient/functions/join.go b/netclient/functions/join.go index ddc2d3d5..7893cd18 100644 --- a/netclient/functions/join.go +++ b/netclient/functions/join.go @@ -6,6 +6,8 @@ import ( "context" "log" "net" + "math/rand" + "time" "github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/wireguard" "github.com/gravitl/netmaker/netclient/server" @@ -20,7 +22,7 @@ import ( func JoinNetwork(cfg config.ClientConfig) error { hasnet := local.HasNetwork(cfg.Network) - if hasnet { + if hasnet { err := errors.New("ALREADY_INSTALLED. Netclient appears to already be installed for cfg.Network " + cfg.Network + ". To re-install, please remove by executing 'sudo netclient -c remove -n " + cfg.Network + "'. Then re-run the install command.") return err } @@ -35,9 +37,12 @@ func JoinNetwork(cfg config.ClientConfig) error { return err } defer wgclient.Close() - + if cfg.Node.Network == "" { + return errors.New("no network provided") + } if cfg.Node.LocalRange != "" { if cfg.Node.LocalAddress == "" { + log.Println("local vpn, getting local address from range: " + cfg.Node.LocalRange) ifaces, err := net.Interfaces() if err != nil { return err @@ -90,6 +95,9 @@ func JoinNetwork(cfg config.ClientConfig) error { cfg.Node.LocalAddress = local } } + if cfg.Node.Password == "" { + cfg.Node.Password = GenPass() + } if cfg.Node.Endpoint == "" { if cfg.Node.IsLocal == "yes" && cfg.Node.LocalAddress != "" { cfg.Node.Endpoint = cfg.Node.LocalAddress @@ -124,7 +132,12 @@ func JoinNetwork(cfg config.ClientConfig) error { cfg.Node.MacAddress = macs[0] } } - + if cfg.Node.Port == 0 { + cfg.Node.Port, err = GetFreePort(51821) + if err != nil { + fmt.Printf("Error retrieving port: %v", err) + } + } var wcclient nodepb.NodeServiceClient var requestOpts grpc.DialOption requestOpts = grpc.WithInsecure() @@ -214,3 +227,20 @@ func JoinNetwork(cfg config.ClientConfig) error { return err } + +//generate an access key value +func GenPass() string { + + var seededRand *rand.Rand = rand.New( + rand.NewSource(time.Now().UnixNano())) + + length := 16 + charset := "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + + b := make([]byte, length) + for i := range b { + b[i] = charset[seededRand.Intn(len(charset))] + } + return string(b) +} + diff --git a/netclient/functions/register.go b/netclient/functions/register.go index 5cfacc6f..e7d3b6eb 100644 --- a/netclient/functions/register.go +++ b/netclient/functions/register.go @@ -13,7 +13,7 @@ import ( "encoding/json" "net/http" "errors" - "github.com/davecgh/go-spew/spew" +// "github.com/davecgh/go-spew/spew" ) func Register(cfg config.GlobalConfig) error { @@ -43,33 +43,34 @@ func Register(cfg config.GlobalConfig) error { body := bytes.NewBuffer(jsonbytes) publicaddress := cfg.Client.ServerPublicEndpoint + ":" + cfg.Client.ServerAPIPort - log.Println("registering to http://"+publicaddress+"/api/client/register") res, err := http.Post("http://"+publicaddress+"/api/intclient/register","application/json",body) if err != nil { + log.Println("Failed to register to http://"+publicaddress+"/api/client/register") return err } if res.StatusCode != http.StatusOK { + log.Println("Failed to register to http://"+publicaddress+"/api/client/register") return errors.New("request to server failed: " + res.Status) } bodyBytes, err := ioutil.ReadAll(res.Body) - bodyString := string(bodyBytes) - spew.Dump(bodyString) + //bodyString := string(bodyBytes) + //spew.Dump(bodyString) if err != nil { return err } var wgclient models.IntClient json.Unmarshal(bodyBytes, &wgclient) - spew.Dump(wgclient) + //spew.Dump(wgclient) err = config.ModGlobalConfig(wgclient) if err != nil { return err } - spew.Dump(wgclient) + //spew.Dump(wgclient) err = wireguard.InitGRPCWireguard(wgclient) if err != nil { return err } - + log.Println("registered netclient to " + cfg.Client.ServerPrivateAddress) return err } diff --git a/netclient/local/local.go b/netclient/local/local.go index 9788a014..d3f56dec 100644 --- a/netclient/local/local.go +++ b/netclient/local/local.go @@ -136,7 +136,6 @@ OnCalendar=*:*:0/30 WantedBy=timers.target ` - servicebytes := []byte(systemservice) timerbytes := []byte(systemtimer) @@ -255,9 +254,13 @@ func RemoveSystemDServices(network string) error { fmt.Println(err) } if fullremove { - err = os.Remove("/etc/systemd/system/netclient@.service") + if FileExists("/etc/systemd/system/netclient@.service") { + err = os.Remove("/etc/systemd/system/netclient@.service") + } + } + if FileExists("/etc/systemd/system/netclient-"+network+".timer") { + err = os.Remove("/etc/systemd/system/netclient-"+network+".timer") } - err = os.Remove("/etc/systemd/system/netclient-"+network+".timer") if err != nil { fmt.Println("Error removing file. Please investigate.") fmt.Println(err) @@ -286,9 +289,15 @@ func WipeLocal(network string) error{ //home, err := homedir.Dir() home := "/etc/netclient" - _ = os.Remove(home + "/netconfig-" + network) - _ = os.Remove(home + "/nettoken-" + network) - _ = os.Remove(home + "/wgkey-" + network) + if FileExists(home + "/netconfig-" + network) { + _ = os.Remove(home + "/netconfig-" + network) + } + if FileExists(home + "/nettoken-" + network) { + _ = os.Remove(home + "/nettoken-" + network) + } + if FileExists(home + "/wgkey-" + network) { + _ = os.Remove(home + "/wgkey-" + network) + } ipExec, err := exec.LookPath("ip") diff --git a/netclient/wireguard/kernel.go b/netclient/wireguard/kernel.go index 17baecc6..c6289145 100644 --- a/netclient/wireguard/kernel.go +++ b/netclient/wireguard/kernel.go @@ -1,7 +1,7 @@ package wireguard import ( -"github.com/davecgh/go-spew/spew" + //"github.com/davecgh/go-spew/spew" "fmt" "strconv" "errors" @@ -25,7 +25,9 @@ import ( //homedir "github.com/mitchellh/go-homedir" ) func InitGRPCWireguard(client models.IntClient) error { - key, err := wgtypes.ParseKey(client.PrivateKey) + //spew.Dump(client) + + key, err := wgtypes.ParseKey(client.PrivateKey) if err != nil { return err } @@ -117,7 +119,7 @@ func InitGRPCWireguard(client models.IntClient) error { return err } } - spew.Dump(conf) + //spew.Dump(conf) err = wgclient.ConfigureDevice(ifacename, conf) if err != nil { @@ -142,6 +144,8 @@ func InitGRPCWireguard(client models.IntClient) error { func InitWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig, hasGateway bool, gateways []string) error { + //spew.Dump(node) + //spew.Dump(peers) ipExec, err := exec.LookPath("ip") if err != nil { return err @@ -246,7 +250,6 @@ func InitWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig } } - err = wgclient.ConfigureDevice(ifacename, conf) if err != nil { @@ -284,13 +287,15 @@ func InitWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig } //=========End DNS Setup=======\\ + cmdIPLinkUp := &exec.Cmd { Path: ipExec, Args: []string{ ipExec, "link", "set", "up", "dev", ifacename}, Stdout: os.Stdout, Stderr: os.Stdout, } - cmdIPLinkDown := &exec.Cmd { + + cmdIPLinkDown := &exec.Cmd { Path: ipExec, Args: []string{ ipExec, "link", "set", "down", "dev", ifacename}, Stdout: os.Stdout, @@ -334,6 +339,7 @@ func InitWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig fmt.Println("Error encountered adding ipv6: " + err.Error()) } } + return err }