Browse Source

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

afeiszli 4 years ago
parent
commit
1f377997cb

+ 3 - 2
controllers/common.go

@@ -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...
     //Eventually, lets have a better way to check if any of the fields are filled out...
     queryMac := node.MacAddress
+    queryGroup := node.Group
     notifygroup := false
 
     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)
 
         // Create filter
-        filter := bson.M{"macaddress": queryMac}
+        filter := bson.M{"macaddress": queryMac, "group": queryGroup}
 
         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)
 
         // Create filter
-        filter := bson.M{"macaddress": node.MacAddress}
+        filter := bson.M{"macaddress": node.MacAddress, "group": node.Group}
 
         // prepare update model.
         update := bson.D{

+ 2 - 2
controllers/nodeHttpController.go

@@ -408,7 +408,7 @@ func checkIn(w http.ResponseWriter, r *http.Request) {
 
         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.
 	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)
 
         // Create filter
-        filter := bson.M{"macaddress": params["macaddress"]}
+	filter := bson.M{"macaddress": params["macaddress"], "group": params["group"]}
 
         node.SetLastModified()
 

+ 1 - 1
docker-compose.yml

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

BIN
models/.node.go.swp


+ 32 - 18
netclient/config/config.go

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

+ 14 - 10
netclient/functions/auth.go

@@ -14,17 +14,17 @@ import (
 )
 
 // 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 := "/etc/netclient"
-		tokentext, err := ioutil.ReadFile(home + "/.nettoken")
+		tokentext, err := ioutil.ReadFile(home + "/nettoken")
                 if err != nil {
 			fmt.Println("Error reading token. Logging in to retrieve new token.")
-			err = AutoLogin(client)
+			err = AutoLogin(client, network)
 			if err != nil {
                                 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 {
 				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
 }
 
-func AutoLogin(client nodepb.NodeServiceClient) error {
+func AutoLogin(client nodepb.NodeServiceClient, network string) error {
 	        //home, err := os.UserHomeDir()
 		home := "/etc/netclient"
-		nodecfg := config.Config.Node
-                login := &nodepb.LoginRequest{
-                        Password: nodecfg.Password,
-                        Macaddress: nodecfg.MacAddress,
+		//nodecfg := config.Config.Node
+                config, err := config.ReadConfig(network) 
+		if err != nil {
+			return err
+		}
+		login := &nodepb.LoginRequest{
+                        Password: config.Node.Password,
+                        Macaddress: config.Node.MacAddress,
                 }
     // RPC call
                 res, err := client.Login(context.TODO(), login)
@@ -52,7 +56,7 @@ func AutoLogin(client nodepb.NodeServiceClient) error {
                         return err
                 }
                 tokenstring := []byte(res.Accesstoken)
-                err = ioutil.WriteFile(home + "/.nettoken", tokenstring, 0644)
+                err = ioutil.WriteFile(home + "/nettoken", tokenstring, 0644)
                 if err != nil {
                         return err
                 }

+ 94 - 49
netclient/functions/common.go

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

+ 55 - 37
netclient/functions/local.go

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

+ 28 - 8
netclient/main.go

@@ -36,7 +36,7 @@ func main() {
 	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)")
 	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.")
 	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")
@@ -75,6 +75,12 @@ func main() {
                         os.Exit(1)
 			log.Fatal("Exiting")
                 case "install":
+
+                        if *tnetwork == "nonetwork"  || *tnetwork == ""{
+                                fmt.Println("Required, '-n'. No network provided. Exiting.")
+                                os.Exit(1)
+                        }
+
 			if !*tnoforward {
 				forward := exec.Command("sysctl", "net.ipv4.ip_forward")
 				out, err := forward.Output()
@@ -93,25 +99,26 @@ func main() {
 			}
 
 			fmt.Println("Beginning agent installation.")
-			err := functions.Install(*taccesskey, *tpassword, *tserver, *tgroup, *tnoauto)
+			err := functions.Install(*taccesskey, *tpassword, *tserver, *tnetwork, *tnoauto)
 			if err != nil {
 				fmt.Println("Error installing: ", err)
 				fmt.Println("Cleaning up (uninstall)")
-				err = functions.Remove()
+				err = functions.Remove(*tnetwork)
 				if err != nil {
                                         fmt.Println("Error uninstalling: ", err)
                                         fmt.Println("Wiping local.")
-					err = functions.WipeLocal()
+					err = functions.WipeLocal(*tnetwork)
 					if err != nil {
 						fmt.Println("Error removing artifacts: ", err)
 					}
-                                        err = functions.RemoveSystemDServices()
+                                        err = functions.RemoveSystemDServices(*tnetwork)
                                         if err != nil {
                                                 fmt.Println("Error removing services: ", err)
                                         }
 				}
 				os.Exit(1)
 			}
+		/*
 		case "service-install":
                         fmt.Println("Beginning service installation.")
                         err := functions.ConfigureSystemD()
@@ -126,16 +133,25 @@ func main() {
                                 fmt.Println("Error installing service: ", err)
                                 os.Exit(1)
                         }
+		*/
 		case "checkin":
-			fmt.Println("Beginning node check in.")
-			err := functions.CheckIn()
+                        if *tnetwork == "nonetwork" || *tnetwork == "" {
+                                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 {
 				fmt.Println("Error checking in: ", err)
 				os.Exit(1)
 			}
 		case "remove":
+			if *tnetwork == "nonetwork" || *tnetwork == "" {
+                                fmt.Println("Required, '-n'. No network provided. Exiting.")
+                                os.Exit(1)
+			}
                         fmt.Println("Beginning node cleanup.")
-			err := functions.Remove()
+			err := functions.Remove(*tnetwork)
                         if err != nil {
 					/*
                                         fmt.Println("Error uninstalling: ", err)
@@ -152,6 +168,10 @@ func main() {
                                 fmt.Println("Error deleting node: ", err)
                                 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")
 }