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
@@ -702,7 +733,7 @@ func CheckIn() error {
) )
if err != nil { if err != nil {
if checkinres != nil && checkinres.Checkinresponse.Ispending { if checkinres != nil && checkinres.Checkinresponse.Ispending {
fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.") fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
return nil return nil
} }
fmt.Printf("Unable to process Check In request: %v", err) fmt.Printf("Unable to process Check In request: %v", err)
@@ -710,11 +741,11 @@ func CheckIn() error {
} }
fmt.Println("Checked in.") fmt.Println("Checked in.")
if checkinres.Checkinresponse.Ispending { if checkinres.Checkinresponse.Ispending {
fmt.Println("Node is in pending status. Waiting for Admin approval of node before making furtherupdates.") fmt.Println("Node is in pending status. Waiting for Admin approval of node before making further updates.")
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")
} }