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...
//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{

View File

@@ -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()

View File

@@ -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 Normal file

Binary file not shown.

View File

@@ -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()
}
*/

View File

@@ -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
//nodecfg := config.Config.Node
config, err := config.ReadConfig(network)
if err != nil {
return err
}
login := &nodepb.LoginRequest{
Password: nodecfg.Password,
Macaddress: nodecfg.MacAddress,
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
}

View File

@@ -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
@@ -714,7 +745,7 @@ func CheckIn() error {
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

View File

@@ -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/netclient@.service") {
err = ioutil.WriteFile("/etc/systemd/system/netclient@.service", 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 netclient@.service. 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", "netclient@.service"},
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)

View File

@@ -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")
}