diff --git a/logic/accesskeys.go b/logic/accesskeys.go index 1b1cbcef..116123b5 100644 --- a/logic/accesskeys.go +++ b/logic/accesskeys.go @@ -57,6 +57,7 @@ func CreateAccessKey(accesskey models.AccessKey, network models.Network) (models GRPCConnString: s.GRPCConnString, GRPCSSL: s.GRPCSSL, Server: s.Server, + APIConnString: s.APIConnString, } accessToken.ServerConfig = servervals accessToken.ClientConfig.Network = netID diff --git a/models/accessToken.go b/models/accessToken.go index e66d932a..57523d91 100644 --- a/models/accessToken.go +++ b/models/accessToken.go @@ -15,4 +15,5 @@ type ServerConfig struct { GRPCConnString string `json:"grpcconn"` GRPCSSL string `json:"grpcssl"` Server string `json:"server"` + APIConnString string `json:"apiconnstring"` } diff --git a/netclient/cli_options/cmds.go b/netclient/cli_options/cmds.go index 8ae39dca..d940a955 100644 --- a/netclient/cli_options/cmds.go +++ b/netclient/cli_options/cmds.go @@ -105,6 +105,18 @@ func GetCommands(cliFlags []cli.Flag) []*cli.Command { return err }, }, + { + Name: "register", + Usage: "register with netmaker", + Flags: cliFlags, + Action: func(c *cli.Context) error { + cfg, _, err := config.GetCLIConfig(c) + if err != nil { + return err + } + return command.Register(&cfg) + }, + }, } } diff --git a/netclient/command/commands.go b/netclient/command/commands.go index b4c3670f..03f6764d 100644 --- a/netclient/command/commands.go +++ b/netclient/command/commands.go @@ -154,3 +154,7 @@ func Daemon() error { err := functions.Daemon() return err } + +func Register(cfg *config.ClientConfig) error { + return functions.Register(cfg) +} diff --git a/netclient/config/config.go b/netclient/config/config.go index 46c4652b..df32c3ec 100644 --- a/netclient/config/config.go +++ b/netclient/config/config.go @@ -2,6 +2,7 @@ package config import ( //"github.com/davecgh/go-spew/spew" + "crypto/x509" "encoding/base64" "encoding/json" "errors" @@ -35,6 +36,12 @@ type ServerConfig struct { GRPCSSL string `yaml:"grpcssl"` CommsNetwork string `yaml:"commsnetwork"` Server string `yaml:"server"` + API string `yaml:"api"` +} + +// RegisterRequest - struct for registation with netmaker server +type RegisterRequest struct { + CSR x509.CertificateRequest } // Write - writes the config of a client to disk @@ -190,6 +197,7 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) { cfg.Node.LocalRange = accesstoken.ClientConfig.LocalRange cfg.Server.GRPCSSL = accesstoken.ServerConfig.GRPCSSL cfg.Server.Server = accesstoken.ServerConfig.Server + cfg.Server.API = accesstoken.ServerConfig.APIConnString if c.String("grpcserver") != "" { cfg.Server.GRPCAddress = c.String("grpcserver") } @@ -209,6 +217,9 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) { if c.String("corednsaddr") != "" { cfg.Server.CoreDNSAddr = c.String("corednsaddr") } + if c.String("apiserver") != "" { + cfg.Server.API = c.String("apiserver") + } } else { cfg.Server.GRPCAddress = c.String("grpcserver") @@ -218,6 +229,7 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, string, error) { cfg.Node.LocalRange = c.String("localrange") cfg.Server.GRPCSSL = c.String("grpcssl") cfg.Server.CoreDNSAddr = c.String("corednsaddr") + cfg.Server.API = c.String("apiserver") } cfg.Node.Name = c.String("name") cfg.Node.Interface = c.String("interface") diff --git a/netclient/functions/register.go b/netclient/functions/register.go new file mode 100644 index 00000000..7fb08ea3 --- /dev/null +++ b/netclient/functions/register.go @@ -0,0 +1,45 @@ +package functions + +import ( + "crypto/x509" + "encoding/json" + "errors" + "net/http" + + "github.com/gravitl/netmaker/logger" + "github.com/gravitl/netmaker/netclient/config" + "github.com/gravitl/netmaker/netclient/ncutils" + "github.com/gravitl/netmaker/tls" +) + +func Register(cfg *config.ClientConfig) error { + if cfg.Server.Server == "" { + return errors.New("no server provided") + } + if cfg.Server.AccessKey == "" { + return errors.New("no access key provided") + } + url := "https://" + cfg.Server.Server + "/api/register" + request, err := http.NewRequest(http.MethodPost, url, nil) + if err != nil { + return err + } + request.Header.Set("authorization", "Bearer "+cfg.Server.AccessKey) + client := http.Client{} + response, err := client.Do(request) + if err != nil { + return err + } + if response.StatusCode != http.StatusOK { + return errors.New(response.Status) + } + var cert *x509.Certificate + if err := json.NewDecoder(response.Body).Decode(cert); err != nil { + return err + } + if err := tls.SaveCert(ncutils.GetNetclientPath()+cfg.Server.Server, "root.cert", cert); err != nil { + return err + } + logger.Log(0, "server certificate saved ") + return nil +} diff --git a/netclient/ncutils/netclientutils.go b/netclient/ncutils/netclientutils.go index c5e56a53..763ee0c2 100644 --- a/netclient/ncutils/netclientutils.go +++ b/netclient/ncutils/netclientutils.go @@ -40,7 +40,7 @@ const NO_DB_RECORD = "no result found" const NO_DB_RECORDS = "could not find any records" // LINUX_APP_DATA_PATH - linux path -const LINUX_APP_DATA_PATH = "/etc/netclient" +const LINUX_APP_DATA_PATH = "/etc/netclient/" // WINDOWS_APP_DATA_PATH - windows path const WINDOWS_APP_DATA_PATH = "C:\\ProgramData\\Netclient"