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

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