fixed client side for multinet and added group filter to query params server side.

This commit is contained in:
afeiszli
2021-04-05 11:06:30 -04:00
parent 0080e9a2ee
commit 1f377997cb
9 changed files with 229 additions and 127 deletions

View File

@@ -121,6 +121,7 @@ func UpdateNode(nodechange models.Node, node models.Node) (models.Node, error) {
//Question: Is there a better way of doing this than a bunch of "if" statements? probably... //Question: Is there a better way of doing this than a bunch of "if" statements? probably...
//Eventually, lets have a better way to check if any of the fields are filled out... //Eventually, lets have a better way to check if any of the fields are filled out...
queryMac := node.MacAddress queryMac := node.MacAddress
queryGroup := node.Group
notifygroup := false notifygroup := false
if nodechange.Address != "" { if nodechange.Address != "" {
@@ -183,7 +184,7 @@ func UpdateNode(nodechange models.Node, node models.Node) (models.Node, error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
// Create filter // Create filter
filter := bson.M{"macaddress": queryMac} filter := bson.M{"macaddress": queryMac, "group": queryGroup}
node.SetLastModified() node.SetLastModified()
@@ -446,7 +447,7 @@ func TimestampNode(node models.Node, updatecheckin bool, updatepeers bool, updat
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
// Create filter // Create filter
filter := bson.M{"macaddress": node.MacAddress} filter := bson.M{"macaddress": node.MacAddress, "group": node.Group}
// prepare update model. // prepare update model.
update := bson.D{ update := bson.D{

View File

@@ -408,7 +408,7 @@ func checkIn(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
filter := bson.M{"macaddress": params["macaddress"]} filter := bson.M{"macaddress": params["macaddress"], "group": params["group"]}
//old code was inefficient, this is all we need. //old code was inefficient, this is all we need.
time := time.Now().String() time := time.Now().String()
@@ -570,7 +570,7 @@ func uncordonNode(w http.ResponseWriter, r *http.Request) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
// Create filter // Create filter
filter := bson.M{"macaddress": params["macaddress"]} filter := bson.M{"macaddress": params["macaddress"], "group": params["group"]}
node.SetLastModified() node.SetLastModified()

View File

@@ -16,7 +16,7 @@ services:
container_name: netmaker container_name: netmaker
depends_on: depends_on:
- mongodb - mongodb
image: gravitl/netmaker:v0.1 image: gravitl/netmaker:v0.1-hotfix
ports: ports:
- "8081:8081" - "8081:8081"
- "50051:50051" - "50051:50051"

BIN
models/.node.go.swp Normal file

Binary file not shown.

View File

@@ -3,18 +3,20 @@ package config
import ( import (
// "github.com/davecgh/go-spew/spew" // "github.com/davecgh/go-spew/spew"
"os" "os"
"errors"
"fmt" "fmt"
"log" "log"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
//homedir "github.com/mitchellh/go-homedir" //homedir "github.com/mitchellh/go-homedir"
) )
var Config *ClientConfig //var Config *ClientConfig
// Configurations exported // Configurations exported
type ClientConfig struct { type ClientConfig struct {
Server ServerConfig `yaml:"server"` Server ServerConfig `yaml:"server"`
Node NodeConfig `yaml:"node"` Node NodeConfig `yaml:"node"`
Network string
} }
type ServerConfig struct { type ServerConfig struct {
Address string `yaml:"address"` Address string `yaml:"address"`
@@ -41,7 +43,11 @@ type NodeConfig struct {
} }
//reading in the env file //reading in the env file
func Write(config *ClientConfig) error{ func Write(config *ClientConfig, network string) error{
if network == "" {
err := errors.New("No network provided. Exiting.")
return err
}
nofile := false nofile := false
//home, err := homedir.Dir() //home, err := homedir.Dir()
_, err := os.Stat("/etc/netclient") _, err := os.Stat("/etc/netclient")
@@ -55,11 +61,11 @@ func Write(config *ClientConfig) error{
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
file := fmt.Sprintf(home + "/.netconfig") file := fmt.Sprintf(home + "/netconfig-" + network)
f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)
if err != nil { if err != nil {
nofile = true nofile = true
//fmt.Println("Could not access " + home + "/.netconfig, proceeding...") //fmt.Println("Could not access " + home + "/netconfig, proceeding...")
} }
defer f.Close() defer f.Close()
@@ -71,7 +77,7 @@ func Write(config *ClientConfig) error{
} }
} else { } else {
newf, err := os.Create(home + "/.netconfig") newf, err := os.Create(home + "/netconfig-" + network)
err = yaml.NewEncoder(newf).Encode(config) err = yaml.NewEncoder(newf).Encode(config)
defer newf.Close() defer newf.Close()
if err != nil { if err != nil {
@@ -82,7 +88,11 @@ func Write(config *ClientConfig) error{
return err return err
} }
func WriteServer(server string, accesskey string) error{ func WriteServer(server string, accesskey string, network string) error{
if network == "" {
err := errors.New("No network provided. Exiting.")
return err
}
nofile := false nofile := false
//home, err := homedir.Dir() //home, err := homedir.Dir()
_, err := os.Stat("/etc/netclient") _, err := os.Stat("/etc/netclient")
@@ -94,12 +104,12 @@ func WriteServer(server string, accesskey string) error{
} }
home := "/etc/netclient" home := "/etc/netclient"
file := fmt.Sprintf(home + "/.netconfig") file := fmt.Sprintf(home + "/netconfig-" + network)
//f, err := os.Open(file) //f, err := os.Open(file)
f, err := os.OpenFile(file, os.O_CREATE|os.O_RDWR, 0666) f, err := os.OpenFile(file, os.O_CREATE|os.O_RDWR, 0666)
//f, err := ioutil.ReadFile(file) //f, err := ioutil.ReadFile(file)
if err != nil { if err != nil {
fmt.Println("couldnt open netconfig") fmt.Println("couldnt open netconfig-" + network)
fmt.Println(err) fmt.Println(err)
nofile = true nofile = true
//err = nil //err = nil
@@ -111,7 +121,7 @@ func WriteServer(server string, accesskey string) error{
var cfg ClientConfig var cfg ClientConfig
if !nofile { if !nofile {
fmt.Println("Writing to existing config file at " + home + "/.netconfig") fmt.Println("Writing to existing config file at " + home + "/netconfig-" + network)
decoder := yaml.NewDecoder(f) decoder := yaml.NewDecoder(f)
err = decoder.Decode(&cfg) err = decoder.Decode(&cfg)
//err = yaml.Unmarshal(f, &cfg) //err = yaml.Unmarshal(f, &cfg)
@@ -145,12 +155,12 @@ func WriteServer(server string, accesskey string) error{
return err return err
} }
} else { } else {
fmt.Println("Creating new config file at " + home + "/.netconfig") fmt.Println("Creating new config file at " + home + "/netconfig-" + network)
cfg.Server.Address = server cfg.Server.Address = server
cfg.Server.AccessKey = accesskey cfg.Server.AccessKey = accesskey
newf, err := os.Create(home + "/.netconfig") newf, err := os.Create(home + "/netconfig-" + network)
err = yaml.NewEncoder(newf).Encode(cfg) err = yaml.NewEncoder(newf).Encode(cfg)
defer newf.Close() defer newf.Close()
if err != nil { if err != nil {
@@ -168,7 +178,7 @@ func(config *ClientConfig) ReadConfig() {
nofile := false nofile := false
//home, err := homedir.Dir() //home, err := homedir.Dir()
home := "/etc/netclient" home := "/etc/netclient"
file := fmt.Sprintf(home + "/.netconfig") file := fmt.Sprintf(home + "/netconfig-" + config.Network)
//f, err := os.Open(file) //f, err := os.Open(file)
f, err := os.OpenFile(file, os.O_RDONLY, 0666) f, err := os.OpenFile(file, os.O_RDONLY, 0666)
if err != nil { if err != nil {
@@ -194,12 +204,15 @@ func(config *ClientConfig) ReadConfig() {
} }
} }
func ReadConfig(network string) (*ClientConfig, error) {
func readConfig() *ClientConfig { if network == "" {
err := errors.New("No network provided. Exiting.")
return nil, err
}
nofile := false nofile := false
//home, err := homedir.Dir() //home, err := homedir.Dir()
home := "/etc/netclient" home := "/etc/netclient"
file := fmt.Sprintf(home + "/.netconfig") file := fmt.Sprintf(home + "/netconfig-" + network)
f, err := os.Open(file) f, err := os.Open(file)
if err != nil { if err != nil {
nofile = true nofile = true
@@ -213,13 +226,14 @@ func readConfig() *ClientConfig {
err = decoder.Decode(&cfg) err = decoder.Decode(&cfg)
if err != nil { if err != nil {
fmt.Println("trouble decoding file") fmt.Println("trouble decoding file")
log.Fatal(err) return nil, err
} }
} }
return &cfg return &cfg, err
} }
/*
func init() { func init() {
Config = readConfig() Config = readConfig()
} }
*/

View File

@@ -14,17 +14,17 @@ import (
) )
// CreateJWT func will used to create the JWT while signing in and signing out // CreateJWT func will used to create the JWT while signing in and signing out
func SetJWT(client nodepb.NodeServiceClient) (context.Context, error) { func SetJWT(client nodepb.NodeServiceClient, network string) (context.Context, error) {
//home, err := os.UserHomeDir() //home, err := os.UserHomeDir()
home := "/etc/netclient" home := "/etc/netclient"
tokentext, err := ioutil.ReadFile(home + "/.nettoken") tokentext, err := ioutil.ReadFile(home + "/nettoken")
if err != nil { if err != nil {
fmt.Println("Error reading token. Logging in to retrieve new token.") fmt.Println("Error reading token. Logging in to retrieve new token.")
err = AutoLogin(client) err = AutoLogin(client, network)
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong with Auto Login: %v", err)) return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong with Auto Login: %v", err))
} }
tokentext, err = ioutil.ReadFile(home + "/.nettoken") tokentext, err = ioutil.ReadFile(home + "/nettoken")
if err != nil { if err != nil {
return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong: %v", err)) return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong: %v", err))
} }
@@ -38,13 +38,17 @@ func SetJWT(client nodepb.NodeServiceClient) (context.Context, error) {
return ctx, nil return ctx, nil
} }
func AutoLogin(client nodepb.NodeServiceClient) error { func AutoLogin(client nodepb.NodeServiceClient, network string) error {
//home, err := os.UserHomeDir() //home, err := os.UserHomeDir()
home := "/etc/netclient" home := "/etc/netclient"
nodecfg := config.Config.Node //nodecfg := config.Config.Node
config, err := config.ReadConfig(network)
if err != nil {
return err
}
login := &nodepb.LoginRequest{ login := &nodepb.LoginRequest{
Password: nodecfg.Password, Password: config.Node.Password,
Macaddress: nodecfg.MacAddress, Macaddress: config.Node.MacAddress,
} }
// RPC call // RPC call
res, err := client.Login(context.TODO(), login) res, err := client.Login(context.TODO(), login)
@@ -52,7 +56,7 @@ func AutoLogin(client nodepb.NodeServiceClient) error {
return err return err
} }
tokenstring := []byte(res.Accesstoken) tokenstring := []byte(res.Accesstoken)
err = ioutil.WriteFile(home + "/.nettoken", tokenstring, 0644) err = ioutil.WriteFile(home + "/nettoken", tokenstring, 0644)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -37,8 +37,12 @@ func Install(accesskey string, password string, server string, group string, noa
} }
defer wgclient.Close() defer wgclient.Close()
nodecfg := config.Config.Node cfg, err := config.ReadConfig(group)
servercfg := config.Config.Server if err != nil {
log.Printf("No Config Yet. Will Write: %v", err)
}
nodecfg := cfg.Node
servercfg := cfg.Server
fmt.Println("SERVER SETTINGS:") fmt.Println("SERVER SETTINGS:")
if server == "" { if server == "" {
@@ -58,7 +62,7 @@ func Install(accesskey string, password string, server string, group string, noa
} }
} }
fmt.Println(" AccessKey: " + accesskey) fmt.Println(" AccessKey: " + accesskey)
err = config.WriteServer(server, accesskey) err = config.WriteServer(server, accesskey, group)
if err != nil { if err != nil {
fmt.Println("Error encountered while writing Server Config.") fmt.Println("Error encountered while writing Server Config.")
return err return err
@@ -278,13 +282,13 @@ func Install(accesskey string, password string, server string, group string, noa
fmt.Println("Awaiting approval from Admin before configuring WireGuard.") fmt.Println("Awaiting approval from Admin before configuring WireGuard.")
if !noauto { if !noauto {
fmt.Println("Configuring Netmaker Service.") fmt.Println("Configuring Netmaker Service.")
err = ConfigureSystemD() err = ConfigureSystemD(group)
return err return err
} }
} }
peers, err := getPeers(node.Macaddress, node.Nodegroup, server) peers, err := getPeers(node.Macaddress, group, server)
if err != nil { if err != nil {
return err return err
@@ -299,7 +303,7 @@ func Install(accesskey string, password string, server string, group string, noa
return err return err
} }
if !noauto { if !noauto {
err = ConfigureSystemD() err = ConfigureSystemD(group)
} }
if err != nil { if err != nil {
return err return err
@@ -336,8 +340,16 @@ func getPublicIP() (string, error) {
} }
func modConfig(node *nodepb.Node) error{ func modConfig(node *nodepb.Node) error{
modconfig := config.Config group := node.Nodegroup
modconfig.ReadConfig() if group == "" {
return errors.New("No Group Provided")
}
//modconfig := config.Config
modconfig, err := config.ReadConfig(group)
//modconfig.ReadConfig()
if err != nil {
return err
}
nodecfg := modconfig.Node nodecfg := modconfig.Node
if node.Name != ""{ if node.Name != ""{
nodecfg.Name = node.Name nodecfg.Name = node.Name
@@ -376,7 +388,7 @@ func modConfig(node *nodepb.Node) error{
nodecfg.PostChanges = node.Postchanges nodecfg.PostChanges = node.Postchanges
} }
modconfig.Node = nodecfg modconfig.Node = nodecfg
err := config.Write(modconfig) err = config.Write(modconfig, group)
return err return err
} }
@@ -417,8 +429,14 @@ func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
} }
wgclient, err := wgctrl.New() wgclient, err := wgctrl.New()
modcfg := config.Config //modcfg := config.Config
modcfg.ReadConfig() //modcfg.ReadConfig()
modcfg, err := config.ReadConfig(node.Nodegroup)
if err != nil {
return err
}
nodecfg := modcfg.Node nodecfg := modcfg.Node
fmt.Println("beginning local WG config") fmt.Println("beginning local WG config")
@@ -535,10 +553,15 @@ func initWireguard(node *nodepb.Node, privkey string, peers []wgtypes.PeerConfig
return err return err
} }
func setWGConfig() error { func setWGConfig(network string) error {
servercfg := config.Config.Server
nodecfg := config.Config.Node cfg, err := config.ReadConfig(network)
node := getNode() if err != nil {
return err
}
servercfg := cfg.Server
nodecfg := cfg.Node
node := getNode(network)
peers, err := getPeers(node.Macaddress, nodecfg.Group, servercfg.Address) peers, err := getPeers(node.Macaddress, nodecfg.Group, servercfg.Address)
if err != nil { if err != nil {
@@ -612,10 +635,14 @@ func getPrivateAddr() (string, error) {
} }
func CheckIn() error { func CheckIn(network string) error {
node := getNode() node := getNode(network)
nodecfg := config.Config.Node cfg, err := config.ReadConfig(network)
servercfg := config.Config.Server if err != nil {
return err
}
nodecfg := cfg.Node
servercfg := cfg.Server
fmt.Println("Checking into server: " + servercfg.Address) fmt.Println("Checking into server: " + servercfg.Address)
setupcheck := true setupcheck := true
@@ -661,13 +688,17 @@ func CheckIn() error {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
} }
err = setWGConfig() err = setWGConfig(network)
if err != nil { if err != nil {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
} }
node = getNode() node = getNode(network)
nodecfg = config.Config.Node cfg, err := config.ReadConfig(network)
if err != nil {
return err
}
nodecfg = cfg.Node
} }
@@ -683,7 +714,7 @@ func CheckIn() error {
ctx := context.Background() ctx := context.Background()
fmt.Println("Authenticating with GRPC Server") fmt.Println("Authenticating with GRPC Server")
ctx, err = SetJWT(wcclient) ctx, err = SetJWT(wcclient, network)
if err != nil { if err != nil {
fmt.Printf("Failed to authenticate: %v", err) fmt.Printf("Failed to authenticate: %v", err)
return err return err
@@ -714,7 +745,7 @@ func CheckIn() error {
return err return err
} }
newinterface := getNode().Interface newinterface := getNode(network).Interface
readreq := &nodepb.ReadNodeReq{ readreq := &nodepb.ReadNodeReq{
Macaddress: node.Macaddress, Macaddress: node.Macaddress,
Group: node.Nodegroup, Group: node.Nodegroup,
@@ -736,7 +767,7 @@ func CheckIn() error {
fmt.Println("ERROR DELETING INTERFACE: " + currentiface) fmt.Println("ERROR DELETING INTERFACE: " + currentiface)
} }
} }
err = setWGConfig() err = setWGConfig(network)
} }
if checkinres.Checkinresponse.Needconfigupdate { if checkinres.Checkinresponse.Needconfigupdate {
@@ -756,7 +787,7 @@ func CheckIn() error {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
} }
err = setWGConfig() err = setWGConfig(network)
if err != nil { if err != nil {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
@@ -765,7 +796,7 @@ func CheckIn() error {
} else if nodecfg.PostChanges == "true" { } else if nodecfg.PostChanges == "true" {
fmt.Println("Node has requested to update remote config.") fmt.Println("Node has requested to update remote config.")
fmt.Println("Posting local config to remote server.") fmt.Println("Posting local config to remote server.")
postnode := getNode() postnode := getNode(network)
req := &nodepb.UpdateNodeReq{ req := &nodepb.UpdateNodeReq{
Node: &postnode, Node: &postnode,
@@ -781,7 +812,7 @@ func CheckIn() error {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
} }
err = setWGConfig() err = setWGConfig(network)
if err != nil { if err != nil {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
@@ -791,7 +822,7 @@ func CheckIn() error {
if checkinres.Checkinresponse.Needpeerupdate { if checkinres.Checkinresponse.Needpeerupdate {
fmt.Println("Server has requested that node update peer list.") fmt.Println("Server has requested that node update peer list.")
fmt.Println("Updating peer list from remote server.") fmt.Println("Updating peer list from remote server.")
err = setWGConfig() err = setWGConfig(network)
if err != nil { if err != nil {
return err return err
log.Fatalf("Unable to process Set Peers request: %v", err) log.Fatalf("Unable to process Set Peers request: %v", err)
@@ -803,7 +834,7 @@ func CheckIn() error {
_, err := net.InterfaceByName(iface) _, err := net.InterfaceByName(iface)
if err != nil { if err != nil {
fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.") fmt.Println("interface " + iface + " does not currently exist. Setting up WireGuard.")
err = setWGConfig() err = setWGConfig(network)
if err != nil { if err != nil {
return err return err
log.Fatalf("Error: %v", err) log.Fatalf("Error: %v", err)
@@ -829,9 +860,13 @@ func needInterfaceUpdate(ctx context.Context, mac string, group string, iface st
return iface != oldiface, oldiface, err return iface != oldiface, oldiface, err
} }
func getNode() nodepb.Node { func getNode(network string) nodepb.Node {
modcfg := config.Config
modcfg.ReadConfig() modcfg, err := config.ReadConfig(network)
if err != nil {
log.Fatalf("Error: %v", err)
}
nodecfg := modcfg.Node nodecfg := modcfg.Node
var node nodepb.Node var node nodepb.Node
@@ -856,10 +891,14 @@ func getNode() nodepb.Node {
func Remove() error { func Remove(network string) error {
//need to implement checkin on server side //need to implement checkin on server side
servercfg := config.Config.Server cfg, err := config.ReadConfig(network)
node := config.Config.Node if err != nil {
return err
}
servercfg := cfg.Server
node := cfg.Node
fmt.Println("Deleting remote node with MAC: " + node.MacAddress) fmt.Println("Deleting remote node with MAC: " + node.MacAddress)
@@ -875,7 +914,7 @@ func Remove() error {
ctx := context.Background() ctx := context.Background()
fmt.Println("Authenticating with GRPC Server") fmt.Println("Authenticating with GRPC Server")
ctx, err = SetJWT(wcclient) ctx, err = SetJWT(wcclient, network)
if err != nil { if err != nil {
//return err //return err
log.Printf("Failed to authenticate: %v", err) log.Printf("Failed to authenticate: %v", err)
@@ -900,11 +939,11 @@ func Remove() error {
} }
} }
} }
err = WipeLocal() err = 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)
} }
err = RemoveSystemDServices() err = RemoveSystemDServices(network)
if err != nil { if err != nil {
return err return err
log.Printf("Unable to remove systemd services: %v", err) log.Printf("Unable to remove systemd services: %v", err)
@@ -915,17 +954,21 @@ func Remove() error {
return nil return nil
} }
func WipeLocal() error{ func WipeLocal(network string) error{
nodecfg := config.Config.Node cfg, err := config.ReadConfig(network)
if err != nil {
return err
}
nodecfg := cfg.Node
ifacename := nodecfg.Interface ifacename := nodecfg.Interface
//home, err := homedir.Dir() //home, err := homedir.Dir()
home := "/etc/netclient" home := "/etc/netclient"
err := os.Remove(home + "/.netconfig") err = os.Remove(home + "/netconfig-" + network)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} }
err = os.Remove(home + "/.nettoken") err = os.Remove(home + "/nettoken")
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
} }
@@ -967,9 +1010,11 @@ func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerCon
//need to implement checkin on server side //need to implement checkin on server side
var peers []wgtypes.PeerConfig var peers []wgtypes.PeerConfig
var wcclient nodepb.NodeServiceClient var wcclient nodepb.NodeServiceClient
modcfg := config.Config cfg, err := config.ReadConfig(group)
modcfg.ReadConfig() if err != nil {
nodecfg := modcfg.Node log.Fatalf("Issue retrieving config for network: " + group + ". Please investigate: %v", err)
}
nodecfg := cfg.Node
keepalive := nodecfg.KeepAlive keepalive := nodecfg.KeepAlive
keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s") keepalivedur, err := time.ParseDuration(strconv.FormatInt(int64(keepalive), 10) + "s")
if err != nil { if err != nil {
@@ -992,7 +1037,7 @@ func getPeers(macaddress string, group string, server string) ([]wgtypes.PeerCon
} }
ctx := context.Background() ctx := context.Background()
fmt.Println("Authenticating with GRPC Server") fmt.Println("Authenticating with GRPC Server")
ctx, err = SetJWT(wcclient) ctx, err = SetJWT(wcclient, group)
if err != nil { if err != nil {
fmt.Println("Failed to authenticate.") fmt.Println("Failed to authenticate.")
return peers, err return peers, err

View File

@@ -11,7 +11,16 @@ import (
"os/exec" "os/exec"
) )
func ConfigureSystemD() error {
func fileExists(f string) bool {
info, err := os.Stat(f)
if os.IsNotExist(err) {
return false
}
return !info.IsDir()
}
func ConfigureSystemD(network string) error {
/* /*
path, err := os.Getwd() path, err := os.Getwd()
if err != nil { if err != nil {
@@ -36,17 +45,20 @@ func ConfigureSystemD() error {
return err return err
} }
if !fileExists("/usr/local/bin/netclient") {
_, err = copy(binarypath, "/usr/local/bin/netclient") _, err = copy(binarypath, "/usr/local/bin/netclient")
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return err
} }
}
if !fileExists("/etc/netclient/netclient") {
_, err = copy(binarypath, "/etc/netclient/netclient") _, err = copy(binarypath, "/etc/netclient/netclient")
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return err
} }
}
systemservice := `[Unit] systemservice := `[Unit]
@@ -54,8 +66,8 @@ Description=Regularly checks for updates in peers and local config
Wants=netclient.timer Wants=netclient.timer
[Service] [Service]
Type=oneshot Type=simple
ExecStart=/etc/netclient/netclient -c checkin ExecStart=/etc/netclient/netclient -c checkin -n %i
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
@@ -63,45 +75,62 @@ WantedBy=multi-user.target
systemtimer := `[Unit] systemtimer := `[Unit]
Description=Calls the Netmaker Mesh Client Service Description=Calls the Netmaker Mesh Client Service
Requires=netclient.service
`
systemtimer = systemtimer + "Requires=netclient@"+network+".service"
systemtimer = systemtimer +
`
[Timer] [Timer]
Unit=netclient.service
`
systemtimer = systemtimer + "Unit=netclient@"+network+".service"
systemtimer = systemtimer +
`
OnCalendar=*:*:0/30 OnCalendar=*:*:0/30
[Install] [Install]
WantedBy=timers.target WantedBy=timers.target
` `
servicebytes := []byte(systemservice) servicebytes := []byte(systemservice)
timerbytes := []byte(systemtimer) timerbytes := []byte(systemtimer)
err = ioutil.WriteFile("/etc/systemd/system/netclient.service", servicebytes, 0644) if !fileExists("/etc/systemd/system/netclient@.service") {
err = ioutil.WriteFile("/etc/systemd/system/netclient@.service", servicebytes, 0644)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return err
} }
}
err = ioutil.WriteFile("/etc/systemd/system/netclient.timer", timerbytes, 0644) if !fileExists("/etc/systemd/system/netclient-"+network+".timer") {
err = ioutil.WriteFile("/etc/systemd/system/netclient-"+network+".timer", timerbytes, 0644)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return err return err
} }
}
sysExec, err := exec.LookPath("systemctl") sysExec, err := exec.LookPath("systemctl")
cmdSysEnableService := &exec.Cmd { cmdSysEnableService := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "enable", "netclient.service" }, Args: []string{ sysExec, "enable", "netclient@.service" },
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
/*
cmdSysStartService := &exec.Cmd { cmdSysStartService := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "start", "netclient.service"}, Args: []string{ sysExec, "start", "netclient@.service"},
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
*/
cmdSysDaemonReload := &exec.Cmd { cmdSysDaemonReload := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "daemon-reload"}, Args: []string{ sysExec, "daemon-reload"},
@@ -110,25 +139,20 @@ WantedBy=timers.target
} }
cmdSysEnableTimer := &exec.Cmd { cmdSysEnableTimer := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "enable", "netclient.timer" }, Args: []string{ sysExec, "enable", "netclient-"+network+".timer" },
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
cmdSysStartTimer := &exec.Cmd { cmdSysStartTimer := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "start", "netclient.timer"}, Args: []string{ sysExec, "start", "netclient-"+network+".timer"},
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
err = cmdSysEnableService.Run() err = cmdSysEnableService.Run()
if err != nil { if err != nil {
fmt.Println("Error enabling netclient.service. Please investigate.") fmt.Println("Error enabling netclient@.service. Please investigate.")
fmt.Println(err)
}
err = cmdSysStartService.Run()
if err != nil {
fmt.Println("Error starting netclient.service. Please investigate.")
fmt.Println(err) fmt.Println(err)
} }
err = cmdSysDaemonReload.Run() err = cmdSysDaemonReload.Run()
@@ -143,24 +167,18 @@ WantedBy=timers.target
} }
err = cmdSysStartTimer.Run() err = cmdSysStartTimer.Run()
if err != nil { if err != nil {
fmt.Println("Error starting netclient.timer. Please investigate.") fmt.Println("Error starting netclient-"+network+".timer. Please investigate.")
fmt.Println(err) fmt.Println(err)
} }
return nil return nil
} }
func RemoveSystemDServices() error { func RemoveSystemDServices(network string) error {
sysExec, err := exec.LookPath("systemctl") sysExec, err := exec.LookPath("systemctl")
cmdSysStopService := &exec.Cmd {
Path: sysExec,
Args: []string{ sysExec, "stop", "netclient.service" },
Stdout: os.Stdout,
Stderr: os.Stdout,
}
cmdSysDisableService := &exec.Cmd { cmdSysDisableService := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "disable", "netclient.service"}, Args: []string{ sysExec, "disable", "netclient@.service"},
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
@@ -178,40 +196,40 @@ func RemoveSystemDServices() error {
} }
cmdSysStopTimer := &exec.Cmd { cmdSysStopTimer := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "stop", "netclient.timer" }, Args: []string{ sysExec, "stop", "netclient-"+network+".timer" },
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
cmdSysDisableTimer := &exec.Cmd { cmdSysDisableTimer := &exec.Cmd {
Path: sysExec, Path: sysExec,
Args: []string{ sysExec, "disable", "netclient.timer"}, Args: []string{ sysExec, "disable", "netclient-"+network+".timer"},
Stdout: os.Stdout, Stdout: os.Stdout,
Stderr: os.Stdout, Stderr: os.Stdout,
} }
err = cmdSysStopService.Run() //err = cmdSysStopService.Run()
if err != nil { if err != nil {
fmt.Println("Error stopping netclient.service. Please investigate.") fmt.Println("Error stopping netclient@.service. Please investigate.")
fmt.Println(err) fmt.Println(err)
} }
err = cmdSysDisableService.Run() err = cmdSysDisableService.Run()
if err != nil { if err != nil {
fmt.Println("Error disabling netclient.service. Please investigate.") fmt.Println("Error disabling netclient@.service. Please investigate.")
fmt.Println(err) fmt.Println(err)
} }
err = cmdSysStopTimer.Run() err = cmdSysStopTimer.Run()
if err != nil { if err != nil {
fmt.Println("Error stopping netclient.timer. Please investigate.") fmt.Println("Error stopping netclient-"+network+".timer. Please investigate.")
fmt.Println(err) fmt.Println(err)
} }
err = cmdSysDisableTimer.Run() err = cmdSysDisableTimer.Run()
if err != nil { if err != nil {
fmt.Println("Error disabling netclient.timer. Please investigate.") fmt.Println("Error disabling netclient-"+network+".timer. Please investigate.")
fmt.Println(err) fmt.Println(err)
} }
err = os.Remove("/etc/systemd/system/netclient.service") err = os.Remove("/etc/systemd/system/netclient@.service")
err = os.Remove("/etc/systemd/system/netclient.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)

View File

@@ -36,7 +36,7 @@ func main() {
tpassword := flag.String("p", "changeme", "This node's password for accessing the server regularly") tpassword := flag.String("p", "changeme", "This node's password for accessing the server regularly")
taccesskey := flag.String("k", "badkey", "an access key generated by the server and used for one-time access (install only)") taccesskey := flag.String("k", "badkey", "an access key generated by the server and used for one-time access (install only)")
tserver := flag.String("s", "localhost:50051", "The location (including port) of the remote gRPC server.") tserver := flag.String("s", "localhost:50051", "The location (including port) of the remote gRPC server.")
tgroup := flag.String("g", "badgroup", "The node group you are attempting to join.") tnetwork := flag.String("n", "nonetwork", "The node group you are attempting to join.")
tnoauto := flag.Bool("na", false, "No auto mode. If true, netmclient will not be installed as a system service and you will have to retrieve updates manually via checkin command.") tnoauto := flag.Bool("na", false, "No auto mode. If true, netmclient will not be installed as a system service and you will have to retrieve updates manually via checkin command.")
tnoforward := flag.Bool("nf", false, "No Forward mode. If true, netclient will not check for IP forwarding. This may break functionality") tnoforward := flag.Bool("nf", false, "No Forward mode. If true, netclient will not check for IP forwarding. This may break functionality")
command := flag.String("c", "required", "The command to run") command := flag.String("c", "required", "The command to run")
@@ -75,6 +75,12 @@ func main() {
os.Exit(1) os.Exit(1)
log.Fatal("Exiting") log.Fatal("Exiting")
case "install": case "install":
if *tnetwork == "nonetwork" || *tnetwork == ""{
fmt.Println("Required, '-n'. No network provided. Exiting.")
os.Exit(1)
}
if !*tnoforward { if !*tnoforward {
forward := exec.Command("sysctl", "net.ipv4.ip_forward") forward := exec.Command("sysctl", "net.ipv4.ip_forward")
out, err := forward.Output() out, err := forward.Output()
@@ -93,25 +99,26 @@ func main() {
} }
fmt.Println("Beginning agent installation.") fmt.Println("Beginning agent installation.")
err := functions.Install(*taccesskey, *tpassword, *tserver, *tgroup, *tnoauto) err := functions.Install(*taccesskey, *tpassword, *tserver, *tnetwork, *tnoauto)
if err != nil { if err != nil {
fmt.Println("Error installing: ", err) fmt.Println("Error installing: ", err)
fmt.Println("Cleaning up (uninstall)") fmt.Println("Cleaning up (uninstall)")
err = functions.Remove() err = functions.Remove(*tnetwork)
if err != nil { if err != nil {
fmt.Println("Error uninstalling: ", err) fmt.Println("Error uninstalling: ", err)
fmt.Println("Wiping local.") fmt.Println("Wiping local.")
err = functions.WipeLocal() err = functions.WipeLocal(*tnetwork)
if err != nil { if err != nil {
fmt.Println("Error removing artifacts: ", err) fmt.Println("Error removing artifacts: ", err)
} }
err = functions.RemoveSystemDServices() err = functions.RemoveSystemDServices(*tnetwork)
if err != nil { if err != nil {
fmt.Println("Error removing services: ", err) fmt.Println("Error removing services: ", err)
} }
} }
os.Exit(1) os.Exit(1)
} }
/*
case "service-install": case "service-install":
fmt.Println("Beginning service installation.") fmt.Println("Beginning service installation.")
err := functions.ConfigureSystemD() err := functions.ConfigureSystemD()
@@ -126,16 +133,25 @@ func main() {
fmt.Println("Error installing service: ", err) fmt.Println("Error installing service: ", err)
os.Exit(1) os.Exit(1)
} }
*/
case "checkin": case "checkin":
fmt.Println("Beginning node check in.") if *tnetwork == "nonetwork" || *tnetwork == "" {
err := functions.CheckIn() fmt.Println("Required, '-n'. No network provided. Exiting.")
os.Exit(1)
}
fmt.Println("Beginning node check in for group " + *tnetwork)
err := functions.CheckIn(*tnetwork)
if err != nil { if err != nil {
fmt.Println("Error checking in: ", err) fmt.Println("Error checking in: ", err)
os.Exit(1) os.Exit(1)
} }
case "remove": case "remove":
if *tnetwork == "nonetwork" || *tnetwork == "" {
fmt.Println("Required, '-n'. No network provided. Exiting.")
os.Exit(1)
}
fmt.Println("Beginning node cleanup.") fmt.Println("Beginning node cleanup.")
err := functions.Remove() err := functions.Remove(*tnetwork)
if err != nil { if err != nil {
/* /*
fmt.Println("Error uninstalling: ", err) fmt.Println("Error uninstalling: ", err)
@@ -152,6 +168,10 @@ func main() {
fmt.Println("Error deleting node: ", err) fmt.Println("Error deleting node: ", err)
os.Exit(1) os.Exit(1)
} }
default:
fmt.Println("You must select from the following commands: install|remove|checkin", err)
os.Exit(1)
} }
fmt.Println("Command " + *command + " Executed Successfully") fmt.Println("Command " + *command + " Executed Successfully")
} }