Browse Source

added freebsd daemon

Matthew R. Kasun 3 years ago
parent
commit
a545643172

+ 6 - 0
netclient/command/commands.go

@@ -34,6 +34,12 @@ func Join(cfg config.ClientConfig, privateKey string) error {
 				if err != nil {
 				if err != nil {
 					ncutils.PrintLog("error removing services: "+err.Error(), 1)
 					ncutils.PrintLog("error removing services: "+err.Error(), 1)
 				}
 				}
+				if ncutils.IsFreebsd() {
+					err = daemon.RemoveFreebsdDaemon()
+				}
+				if err != nil {
+					ncutils.PrintLog("error removing services: "+err.Error(), 1)
+				}
 			}
 			}
 		} else {
 		} else {
 			ncutils.PrintLog("success", 0)
 			ncutils.PrintLog("success", 0)

+ 6 - 0
netclient/daemon/common.go

@@ -25,6 +25,8 @@ func InstallDaemon(cfg config.ClientConfig) error {
 		err = SetupMacDaemon(interval)
 		err = SetupMacDaemon(interval)
 	case "linux":
 	case "linux":
 		err = SetupSystemDDaemon(interval)
 		err = SetupSystemDDaemon(interval)
+	case "freebsd":
+		err = SetupFreebsdDaemon()
 	default:
 	default:
 		err = errors.New("this os is not yet supported for daemon mode. Run join cmd with flag '--daemon off'")
 		err = errors.New("this os is not yet supported for daemon mode. Run join cmd with flag '--daemon off'")
 	}
 	}
@@ -45,6 +47,8 @@ func Restart() error {
 		RestartLaunchD()
 		RestartLaunchD()
 	case "linux":
 	case "linux":
 		RestartSystemD()
 		RestartSystemD()
+	case "freebsd":
+		FreebsdDaemon("restart")
 	default:
 	default:
 		err = errors.New("this os is not yet supported for daemon mode. Run join cmd with flag '--daemon off'")
 		err = errors.New("this os is not yet supported for daemon mode. Run join cmd with flag '--daemon off'")
 	}
 	}
@@ -65,6 +69,8 @@ func Stop() error {
 		StopLaunchD()
 		StopLaunchD()
 	case "linux":
 	case "linux":
 		StopSystemD()
 		StopSystemD()
+	case "freebsd":
+		FreebsdDaemon("stop")
 	default:
 	default:
 		err = errors.New("no OS daemon to stop")
 		err = errors.New("no OS daemon to stop")
 	}
 	}

+ 132 - 0
netclient/daemon/freebsd.go

@@ -0,0 +1,132 @@
+package daemon
+
+import (
+	"fmt"
+	"log"
+	"path/filepath"
+
+	"github.com/gravitl/netmaker/netclient/ncutils"
+)
+
+const EXEC_DIR = "/sbin"
+
+// SetupFreebsdDaemon -- sets up daemon for freebsd
+func SetupFreebsdDaemon() error {
+	dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
+	if err != nil {
+		return err
+	}
+	binarypath := dir + "/netclient"
+
+	_, err = os.Stat("/etc/netclient/config")
+	if os.IsNotExist(err) {
+		os.MkdirAll("/etc/netclient/config", 0744)
+	} else if err != nil {
+		log.Println("couldnt find or create /etc/netclient")
+		return err
+	}
+	//install binary
+	//should check if the existing binary is the corect version -- for now only copy if file doesn't exist
+	if !ncutils.FileExists(EXEC_DIR + "netclient") {
+		err = ncutils.Copy(binarypath, EXEC_DIR+"netclient")
+		if err != nil {
+			log.Println(err)
+			return err
+		}
+	}
+
+	rcFile := `#!/bin/sh
+#
+# PROVIDE: netclient
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+# Description:
+#    This script runs netclient as a service as root on boot
+
+# How to use:
+#    Place this file in /usr/local/etc/rc.d/
+#    Add netclient="YES" to /etc/rc.config.d/netclient
+#    To pass args, add netclient_args="daemon" to /etc/rc.config.d/netclient
+
+# Freebsd rc library
+. /etc/rc.subr
+
+# General Info
+name="netclient"            # Safe name of program
+program_name="netclient"   # Name of exec
+title="netclient"          # Title to display in top/htop
+
+# RC.config vars
+load_rc_config $name      # Loading rc config vars
+: ${netclient_enable="YES"}  # Default: enable netclient
+: ${netclient_runAs="root"} # Default: Run Node-RED as root
+
+# Freebsd Setup
+rcvar=netclient_enable                   # Enables the rc.conf YES/NO flag
+pidfile="/var/run/${program_name}.pid" # File that allows the system to keep track of node-red status
+
+# Env Setup
+#export HOME=$( getent passwd "$netclient_runAs" | cut -d: -f6 ) # Gets the home directory of the runAs user
+
+# Command Setup
+exec_path="/sbin/${program_name}" # Path to the netclient exec
+output_file="/var/log/${program_name}.log" # Path to netclient logs
+
+# Command
+command="/usr/sbin/daemon"
+command_args="-r -t ${title} -u ${netclient_runAs} -o ${output_file} -P ${pidfile} ${exec_path} ${netclient_args}"
+
+# Loading Config
+load_rc_config ${name}
+run_rc_command "$1"
+`
+
+	rcConfig := `netclient="YES"
+netclient_args="daemon"`
+
+	rcbytes := []byte(rcFile)
+	if !ncutils.FileExists("/etc/rc.d/netclient") {
+		err := os.Write("/etc/rc.d/netclient", rcbytes, 0744)
+		if err != nil {
+			return err
+		}
+		rcConfigbytes := []byte(rcConfig)
+		if !ncutils.FileExists("/etc/rc.conf.d/netclient") {
+			err := os.WriteFile("/etc/rc.conf.d/netclient", rcConfigbytes, 0644)
+			if err != nil {
+				return err
+			}
+			FreebsdDaemon("start")
+			return nil
+		}
+	}
+}
+
+func FreebsdDaemon(command string) {
+	_, _ := ncutils.RunCmd(fmt.Sprintf("service netclient %s", command), true)
+}
+
+func CleanUpFreebsd() {
+	if err := os.RemoveAll(ncutils.GetNetclientPath()); err != nil {
+		ncutils.PrintLog("Removing netclient configs: "+err.Error(), 1)
+	}
+	if err := os.Remove(EXEC_DIR + "netclient"); err != nil {
+		ncutils.PrintLog("Removing netclient binary: "+err.Error(), 1)
+	}
+}
+
+func RemoveFreebsdDaemon() {
+	if ncutils.FileExists("/etc/rc.d/netclient") {
+		err = os.Remove("/etc/rc.d/netclient")
+		if err != nil {
+			ncutils.Log("Error removing /etc/rc.d/netclient. Please investigate.")
+		}
+	}
+	if ncutils.FileExists("/etc/rc.conf.d/netclient") {
+		err = os.Remove("/etc/rc.conf.d/netclient")
+		if err != nil {
+			ncutils.Log("Error removing /etc/rc.conf.d/netclient. Please investigate.")
+		}
+	}
+}

+ 4 - 0
netclient/functions/common.go

@@ -137,6 +137,8 @@ func Uninstall() error {
 		daemon.CleanupMac()
 		daemon.CleanupMac()
 	} else if ncutils.IsLinux() {
 	} else if ncutils.IsLinux() {
 		daemon.CleanupLinux()
 		daemon.CleanupLinux()
+	} else if ncutils.IsFreebsd() {
+		daemon.CleanupFreebsd()
 	} else if !ncutils.IsKernel() {
 	} else if !ncutils.IsKernel() {
 		ncutils.PrintLog("manual cleanup required", 1)
 		ncutils.PrintLog("manual cleanup required", 1)
 	}
 	}
@@ -233,6 +235,8 @@ func RemoveLocalInstance(cfg *config.ClientConfig, networkName string) error {
 			// TODO: Remove job?
 			// TODO: Remove job?
 		} else if ncutils.IsMac() {
 		} else if ncutils.IsMac() {
 			//TODO: Delete mac daemon
 			//TODO: Delete mac daemon
+		} else if ncutils.IsFreebsd() {
+			daemon.RemoveFreebsdDaemon()
 		} else {
 		} else {
 			daemon.RemoveSystemDServices()
 			daemon.RemoveSystemDServices()
 		}
 		}