From afa4f1e8bbedc31beb8d7bf329282dc99d175331 Mon Sep 17 00:00:00 2001 From: afeiszli Date: Sat, 29 May 2021 15:12:15 -0400 Subject: [PATCH] netclient grpc registration working --- models/intclient.go | 1 + netclient/command/commands.go | 9 ++++++++ netclient/functions/join.go | 3 ++- netclient/functions/register.go | 39 ++++++++++++++++++++++++++------- netclient/main.go | 33 ++++++++++++++++++++++++++++ netclient/wireguard/kernel.go | 17 ++++++++++---- 6 files changed, 89 insertions(+), 13 deletions(-) diff --git a/models/intclient.go b/models/intclient.go index 55d735f2..2b193eae 100644 --- a/models/intclient.go +++ b/models/intclient.go @@ -9,6 +9,7 @@ type IntClient struct { Address6 string `json:"address6" bson:"address6"` Network string `json:"network" bson:"network"` ServerEndpoint string `json:"serverendpoint" bson:"serverendpoint"` + ServerAPIEndpoint string `json:"serverapiendpoint" bson:"serverapiendpoint"` ServerAddress string `json:"serveraddress" bson:"serveraddress"` ServerPort string `json:"serverport" bson:"serverport"` ServerKey string `json:"serverkey" bson:"serverkey"` diff --git a/netclient/command/commands.go b/netclient/command/commands.go index a61208e8..5e30d657 100644 --- a/netclient/command/commands.go +++ b/netclient/command/commands.go @@ -103,3 +103,12 @@ func Uninstall(cfg config.GlobalConfig) error { err = functions.Unregister(cfg) return err } +func Reregister(cfg config.GlobalConfig) error { + err := functions.Reregister(cfg) + return err +} +func Unregister(cfg config.GlobalConfig) error { + err := functions.Unregister(cfg) + return err +} + diff --git a/netclient/functions/join.go b/netclient/functions/join.go index de21a0e9..b917011d 100644 --- a/netclient/functions/join.go +++ b/netclient/functions/join.go @@ -24,6 +24,7 @@ func JoinNetwork(cfg config.ClientConfig) error { 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 } + log.Println("attempting to joining " + cfg.Network + " at " + cfg.Server.GRPCAddress) err := config.Write(&cfg, cfg.Network) if err != nil { return err @@ -42,7 +43,7 @@ func JoinNetwork(cfg config.ClientConfig) error { return err } _, localrange, err := net.ParseCIDR(cfg.Node.LocalRange) - if err != nil { + if err != nil { return err } diff --git a/netclient/functions/register.go b/netclient/functions/register.go index d2d905e3..8bb32472 100644 --- a/netclient/functions/register.go +++ b/netclient/functions/register.go @@ -2,6 +2,7 @@ package functions import ( "time" + "os" "log" "io/ioutil" "bytes" @@ -17,6 +18,14 @@ import ( func Register(cfg config.GlobalConfig) error { + _, err := os.Stat("/etc/netclient") + if os.IsNotExist(err) { + os.Mkdir("/etc/netclient", 744) + } else if err != nil { + log.Println("couldnt find or create /etc/netclient") + return err + } + postclient := &models.IntClient{ AccessKey: cfg.Client.AccessKey, PublicKey: cfg.Client.PublicKey, @@ -31,8 +40,7 @@ func Register(cfg config.GlobalConfig) error { } jsonbytes := []byte(jsonstring) body := bytes.NewBuffer(jsonbytes) - log.Println(jsonstring) - log.Println("http://"+cfg.Client.ServerEndpoint+"/api/client/register","application/json") + log.Println("registering to http://"+cfg.Client.ServerAPIEndpoint+"/api/client/register") res, err := http.Post("http://"+cfg.Client.ServerEndpoint+"/api/intclient/register","application/json",body) if err != nil { return err @@ -62,21 +70,36 @@ func Register(cfg config.GlobalConfig) error { func Unregister(cfg config.GlobalConfig) error { client := &http.Client{ Timeout: 7 * time.Second,} - req, err := http.NewRequest("DELETE", "http://"+cfg.Client.ServerEndpoint+"/api/intclient/"+cfg.Client.ClientID, nil) + req, err := http.NewRequest("DELETE", "http://"+cfg.Client.ServerAPIEndpoint+"/api/intclient/"+cfg.Client.ClientID, nil) if err != nil { return err } res, err := client.Do(req) if res == nil { + return errors.New("server not reachable at " + "http://"+cfg.Client.ServerAPIEndpoint+"/api/intclient/"+cfg.Client.ClientID) + + } else if res.StatusCode != http.StatusOK { + return errors.New("request to server failed: " + res.Status) + defer res.Body.Close() + } else { err = local.WipeGRPCClient() if err == nil { log.Println("successfully removed grpc client interface") } - } else { - if res.StatusCode != http.StatusOK { - return errors.New("request to server failed: " + res.Status) - defer res.Body.Close() - } } return err } + +func Reregister(cfg config.GlobalConfig) error { + err := Unregister(cfg) + if err != nil { + log.Println("failed to un-register") + return err + } + err = Register(cfg) + if err != nil { + log.Println("failed to re-register after unregistering") + } + return err +} + diff --git a/netclient/main.go b/netclient/main.go index a32da4ba..466d128d 100644 --- a/netclient/main.go +++ b/netclient/main.go @@ -199,6 +199,22 @@ func main() { return err }, }, + { + Name: "reregister", + Usage: "Re-Register with Netmaker Server for secure GRPC communications.", + Flags: cliFlags, + Action: func(c *cli.Context) error { + cfg, err := config.ReadGlobalConfig() + if err != nil { + return err + } + var gconf config.GlobalConfig + gconf = *cfg + + err = command.Reregister(gconf) + return err + }, + }, { Name: "join", Usage: "Join a Netmaker network.", @@ -312,6 +328,23 @@ func main() { return err }, }, + { + Name: "unregister", + Usage: "Unregister the netclient from secure server GRPC.", + Flags: cliFlags, + // the action, or code that will be executed when + // we execute our `ns` command + Action: func(c *cli.Context) error { + cfg, err := config.ReadGlobalConfig() + if err != nil { + return err + } + var gconf config.GlobalConfig + gconf = *cfg + err = command.Unregister(gconf) + return err + }, + }, } // start our application diff --git a/netclient/wireguard/kernel.go b/netclient/wireguard/kernel.go index 17b81e5c..8cbd064f 100644 --- a/netclient/wireguard/kernel.go +++ b/netclient/wireguard/kernel.go @@ -48,9 +48,9 @@ func InitGRPCWireguard(client models.IntClient) error { return errors.New("no address to configure") } cmdIPDevLinkAdd := exec.Command("ip","link", "add", "dev", ifacename, "type", "wireguard" ) - cmdIPAddrAdd := exec.Command("ip", "address", "add", "dev", ifacename, client.Address+"/24") - cmdIPAddr6Add := exec.Command("ip", "address", "add", "dev", ifacename, client.Address6+"/64") - currentiface, err := net.InterfaceByName(ifacename) + cmdIPAddrAdd := exec.Command("ip", "address", "add", "dev", ifacename, client.Address+"/24") + cmdIPAddr6Add := exec.Command("ip", "address", "add", "dev", ifacename, client.Address6+"/64") + currentiface, err := net.InterfaceByName(ifacename) if err != nil { err = cmdIPDevLinkAdd.Run() if err != nil && !strings.Contains(err.Error(), "exists") { @@ -87,7 +87,7 @@ func InitGRPCWireguard(client models.IntClient) error { var peers []wgtypes.PeerConfig var peeraddr = net.IPNet{ IP: net.ParseIP(client.ServerAddress), - Mask: net.CIDRMask(64, 128), + Mask: net.CIDRMask(32, 32), } var allowedips []net.IPNet allowedips = append(allowedips, peeraddr) @@ -126,6 +126,15 @@ func InitGRPCWireguard(client models.IntClient) error { log.Printf("This is inconvenient: %v", err) } } + + cmdIPLinkUp := exec.Command("ip", "link", "set", "up", "dev", ifacename) + cmdIPLinkDown := exec.Command("ip", "link", "set", "down", "dev", ifacename) + err = cmdIPLinkDown.Run() + err = cmdIPLinkUp.Run() + if err != nil { + return err + } + return err }