fixing netclient join command

This commit is contained in:
afeiszli
2021-06-02 11:00:10 -04:00
parent 5dfb60a5ab
commit 6fd4794475
6 changed files with 92 additions and 43 deletions

View File

@@ -381,8 +381,9 @@ func GetCLIConfig(c *cli.Context) (ClientConfig, error){
cfg.Network = tokenvals[3] cfg.Network = tokenvals[3]
cfg.Node.Network = tokenvals[3] cfg.Node.Network = tokenvals[3]
cfg.Server.AccessKey = tokenvals[4] cfg.Server.AccessKey = tokenvals[4]
cfg.Node.LocalRange = tokenvals[5] if len(tokenvals) > 4 {
cfg.Node.LocalRange = tokenvals[5]
}
if c.String("grpcserver") != "" { if c.String("grpcserver") != "" {
cfg.Server.GRPCAddress = 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.Password = c.String("password")
cfg.Node.MacAddress = c.String("macaddress") cfg.Node.MacAddress = c.String("macaddress")
cfg.Node.LocalAddress = c.String("localaddress") cfg.Node.LocalAddress = c.String("localaddress")
cfg.Node.LocalRange = c.String("localrange")
cfg.Node.WGAddress = c.String("address") cfg.Node.WGAddress = c.String("address")
cfg.Node.WGAddress6 = c.String("addressIPV6") cfg.Node.WGAddress6 = c.String("addressIPV6")
cfg.Node.Roaming = c.String("") cfg.Node.Roaming = c.String("roaming")
cfg.Node.DNS = c.String("") cfg.Node.DNS = c.String("dns")
cfg.Node.IsLocal = c.String("") cfg.Node.IsLocal = c.String("islocal")
cfg.Node.IsDualStack = c.String("") cfg.Node.IsDualStack = c.String("isdualstack")
cfg.Node.IsIngressGateway = c.String("") cfg.Node.PostUp = c.String("postup")
cfg.Node.PostUp = c.String("") cfg.Node.PostDown = c.String("postdown")
cfg.Node.PostDown = c.String("") cfg.Node.Port = int32(c.Int("port"))
cfg.Node.Port = int32(c.Int("")) cfg.Node.KeepAlive = int32(c.Int("keepalive"))
cfg.Node.KeepAlive = int32(c.Int("")) cfg.Node.PublicKey = c.String("publickey")
cfg.Node.PublicKey = c.String("") cfg.Node.PrivateKey = c.String("privatekey")
cfg.Node.PrivateKey = c.String("") cfg.Node.Endpoint = c.String("endpoint")
cfg.Node.Endpoint = c.String("") cfg.Node.IPForwarding = c.String("ipforwarding")
cfg.Node.IPForwarding = c.String("") cfg.OperatingSystem = c.String("operatingsystem")
cfg.Daemon = c.String("daemon")
return cfg, nil return cfg, nil
} }

View File

@@ -309,15 +309,17 @@ func LeaveNetwork(network string) error {
) )
if err != nil { if err != nil {
log.Printf("Encountered error deleting node: %v", err) log.Printf("Encountered error deleting node: %v", err)
fmt.Println(err) log.Println(err)
} else { } 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) err = local.WipeLocal(network)
if err != nil { if err != nil {
log.Printf("Unable to wipe local config: %v", err) log.Printf("Unable to wipe local config: %v", err)
} else {
log.Println("Removed " + node.Network + " network locally")
} }
if cfg.Daemon != "off" { if cfg.Daemon != "off" {
err = local.RemoveSystemDServices(network) err = local.RemoveSystemDServices(network)
@@ -336,13 +338,13 @@ func DeleteInterface(ifacename string, postdown string) error{
} }
err = cmdIPLinkDel.Run() err = cmdIPLinkDel.Run()
if err != nil { if err != nil {
fmt.Println(err) log.Println(err)
} }
if postdown != "" { if postdown != "" {
runcmds := strings.Split(postdown, "; ") runcmds := strings.Split(postdown, "; ")
err = local.RunCmds(runcmds) err = local.RunCmds(runcmds)
if err != nil { if err != nil {
fmt.Println("Error encountered running PostDown: " + err.Error()) log.Println("Error encountered running PostDown: " + err.Error())
} }
} }
return err return err
@@ -367,9 +369,9 @@ func List() error{
PublicEndpoint: cfg.Node.Endpoint, PublicEndpoint: cfg.Node.Endpoint,
} }
jsoncfg, _ := json.Marshal(listconfig) jsoncfg, _ := json.Marshal(listconfig)
fmt.Println(network + ": " + string(jsoncfg)) log.Println(network + ": " + string(jsoncfg))
} else { } else {
fmt.Println(network + ": Could not retrieve network configuration.") log.Println(network + ": Could not retrieve network configuration.")
} }
} }
return nil return nil

View File

@@ -6,6 +6,8 @@ import (
"context" "context"
"log" "log"
"net" "net"
"math/rand"
"time"
"github.com/gravitl/netmaker/netclient/config" "github.com/gravitl/netmaker/netclient/config"
"github.com/gravitl/netmaker/netclient/wireguard" "github.com/gravitl/netmaker/netclient/wireguard"
"github.com/gravitl/netmaker/netclient/server" "github.com/gravitl/netmaker/netclient/server"
@@ -20,7 +22,7 @@ import (
func JoinNetwork(cfg config.ClientConfig) error { func JoinNetwork(cfg config.ClientConfig) error {
hasnet := local.HasNetwork(cfg.Network) 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.") 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 return err
} }
@@ -35,9 +37,12 @@ func JoinNetwork(cfg config.ClientConfig) error {
return err return err
} }
defer wgclient.Close() defer wgclient.Close()
if cfg.Node.Network == "" {
return errors.New("no network provided")
}
if cfg.Node.LocalRange != "" { if cfg.Node.LocalRange != "" {
if cfg.Node.LocalAddress == "" { if cfg.Node.LocalAddress == "" {
log.Println("local vpn, getting local address from range: " + cfg.Node.LocalRange)
ifaces, err := net.Interfaces() ifaces, err := net.Interfaces()
if err != nil { if err != nil {
return err return err
@@ -90,6 +95,9 @@ func JoinNetwork(cfg config.ClientConfig) error {
cfg.Node.LocalAddress = local cfg.Node.LocalAddress = local
} }
} }
if cfg.Node.Password == "" {
cfg.Node.Password = GenPass()
}
if cfg.Node.Endpoint == "" { if cfg.Node.Endpoint == "" {
if cfg.Node.IsLocal == "yes" && cfg.Node.LocalAddress != "" { if cfg.Node.IsLocal == "yes" && cfg.Node.LocalAddress != "" {
cfg.Node.Endpoint = cfg.Node.LocalAddress cfg.Node.Endpoint = cfg.Node.LocalAddress
@@ -124,7 +132,12 @@ func JoinNetwork(cfg config.ClientConfig) error {
cfg.Node.MacAddress = macs[0] 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 wcclient nodepb.NodeServiceClient
var requestOpts grpc.DialOption var requestOpts grpc.DialOption
requestOpts = grpc.WithInsecure() requestOpts = grpc.WithInsecure()
@@ -214,3 +227,20 @@ func JoinNetwork(cfg config.ClientConfig) error {
return err 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)
}

View File

@@ -13,7 +13,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"errors" "errors"
"github.com/davecgh/go-spew/spew" // "github.com/davecgh/go-spew/spew"
) )
func Register(cfg config.GlobalConfig) error { func Register(cfg config.GlobalConfig) error {
@@ -43,33 +43,34 @@ func Register(cfg config.GlobalConfig) error {
body := bytes.NewBuffer(jsonbytes) body := bytes.NewBuffer(jsonbytes)
publicaddress := cfg.Client.ServerPublicEndpoint + ":" + cfg.Client.ServerAPIPort 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) res, err := http.Post("http://"+publicaddress+"/api/intclient/register","application/json",body)
if err != nil { if err != nil {
log.Println("Failed to register to http://"+publicaddress+"/api/client/register")
return err return err
} }
if res.StatusCode != http.StatusOK { 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) return errors.New("request to server failed: " + res.Status)
} }
bodyBytes, err := ioutil.ReadAll(res.Body) bodyBytes, err := ioutil.ReadAll(res.Body)
bodyString := string(bodyBytes) //bodyString := string(bodyBytes)
spew.Dump(bodyString) //spew.Dump(bodyString)
if err != nil { if err != nil {
return err return err
} }
var wgclient models.IntClient var wgclient models.IntClient
json.Unmarshal(bodyBytes, &wgclient) json.Unmarshal(bodyBytes, &wgclient)
spew.Dump(wgclient) //spew.Dump(wgclient)
err = config.ModGlobalConfig(wgclient) err = config.ModGlobalConfig(wgclient)
if err != nil { if err != nil {
return err return err
} }
spew.Dump(wgclient) //spew.Dump(wgclient)
err = wireguard.InitGRPCWireguard(wgclient) err = wireguard.InitGRPCWireguard(wgclient)
if err != nil { if err != nil {
return err return err
} }
log.Println("registered netclient to " + cfg.Client.ServerPrivateAddress)
return err return err
} }

View File

@@ -136,7 +136,6 @@ OnCalendar=*:*:0/30
WantedBy=timers.target WantedBy=timers.target
` `
servicebytes := []byte(systemservice) servicebytes := []byte(systemservice)
timerbytes := []byte(systemtimer) timerbytes := []byte(systemtimer)
@@ -255,9 +254,13 @@ func RemoveSystemDServices(network string) error {
fmt.Println(err) fmt.Println(err)
} }
if fullremove { 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 { if err != nil {
fmt.Println("Error removing file. Please investigate.") fmt.Println("Error removing file. Please investigate.")
fmt.Println(err) fmt.Println(err)
@@ -286,9 +289,15 @@ func WipeLocal(network string) error{
//home, err := homedir.Dir() //home, err := homedir.Dir()
home := "/etc/netclient" home := "/etc/netclient"
_ = os.Remove(home + "/netconfig-" + network) if FileExists(home + "/netconfig-" + network) {
_ = os.Remove(home + "/nettoken-" + network) _ = os.Remove(home + "/netconfig-" + network)
_ = os.Remove(home + "/wgkey-" + 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") ipExec, err := exec.LookPath("ip")

View File

@@ -1,7 +1,7 @@
package wireguard package wireguard
import ( import (
"github.com/davecgh/go-spew/spew" //"github.com/davecgh/go-spew/spew"
"fmt" "fmt"
"strconv" "strconv"
"errors" "errors"
@@ -25,7 +25,9 @@ import (
//homedir "github.com/mitchellh/go-homedir" //homedir "github.com/mitchellh/go-homedir"
) )
func InitGRPCWireguard(client models.IntClient) error { func InitGRPCWireguard(client models.IntClient) error {
key, err := wgtypes.ParseKey(client.PrivateKey) //spew.Dump(client)
key, err := wgtypes.ParseKey(client.PrivateKey)
if err != nil { if err != nil {
return err return err
} }
@@ -117,7 +119,7 @@ func InitGRPCWireguard(client models.IntClient) error {
return err return err
} }
} }
spew.Dump(conf) //spew.Dump(conf)
err = wgclient.ConfigureDevice(ifacename, conf) err = wgclient.ConfigureDevice(ifacename, conf)
if err != nil { 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 { 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") ipExec, err := exec.LookPath("ip")
if err != nil { if err != nil {
return err return err
@@ -246,7 +250,6 @@ func InitWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
} }
} }
err = wgclient.ConfigureDevice(ifacename, conf) err = wgclient.ConfigureDevice(ifacename, conf)
if err != nil { if err != nil {
@@ -284,13 +287,15 @@ func InitWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
} }
//=========End DNS Setup=======\\ //=========End DNS Setup=======\\
cmdIPLinkUp := &exec.Cmd { cmdIPLinkUp := &exec.Cmd {
Path: ipExec, Path: ipExec,
Args: []string{ ipExec, "link", "set", "up", "dev", ifacename}, Args: []string{ ipExec, "link", "set", "up", "dev", ifacename},
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
cmdIPLinkDown := &exec.Cmd {
cmdIPLinkDown := &exec.Cmd {
Path: ipExec, Path: ipExec,
Args: []string{ ipExec, "link", "set", "down", "dev", ifacename}, Args: []string{ ipExec, "link", "set", "down", "dev", ifacename},
Stdout: os.Stdout, 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()) fmt.Println("Error encountered adding ipv6: " + err.Error())
} }
} }
return err return err
} }