package daemon import ( "log" "os" "path/filepath" "time" "github.com/gravitl/netmaker/logger" "github.com/gravitl/netmaker/netclient/ncutils" ) const MAC_SERVICE_NAME = "com.gravitl.netclient" const MAC_EXEC_DIR = "/usr/local/bin/" // SetupMacDaemon - Creates a daemon service from the netclient under LaunchAgents for MacOS func SetupMacDaemon() error { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if err != nil { return err } binarypath := dir + "/netclient" if !ncutils.FileExists(MAC_EXEC_DIR + "netclient") { err = ncutils.Copy(binarypath, MAC_EXEC_DIR+"netclient") if err != nil { log.Println(err) return err } } _, errN := os.Stat("~/Library/LaunchAgents") if os.IsNotExist(errN) { os.Mkdir("~/Library/LaunchAgents", 0755) } err = CreateMacService(MAC_SERVICE_NAME) if err != nil { return err } _, err = ncutils.RunCmd("launchctl load /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true) return err } // CleanupMac - Removes the netclient checkin daemon from LaunchDaemons func CleanupMac() { _, err := ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true) if ncutils.FileExists("/Library/LaunchDaemons/" + MAC_SERVICE_NAME + ".plist") { err = os.Remove("/Library/LaunchDaemons/" + MAC_SERVICE_NAME + ".plist") } if err != nil { logger.Log(1, err.Error()) } os.RemoveAll(ncutils.GetNetclientPath()) os.Remove(MAC_EXEC_DIR + "netclient") } // RestartLaunchD - restart launch daemon func RestartLaunchD() { ncutils.RunCmd("launchctl unload /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true) time.Sleep(time.Second >> 2) ncutils.RunCmd("launchctl load /Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true) } // StopLaunchD - stop launch daemon func StopLaunchD() { ncutils.RunCmd("launchctl unload /System/Library/LaunchDaemons/"+MAC_SERVICE_NAME+".plist", true) } // CreateMacService - Creates the mac service file for LaunchDaemons func CreateMacService(servicename string) error { _, err := os.Stat("/Library/LaunchDaemons") if os.IsNotExist(err) { os.Mkdir("/Library/LaunchDaemons", 0755) } else if err != nil { log.Println("couldnt find or create /Library/LaunchDaemons") return err } daemonstring := MacDaemonString() daemonbytes := []byte(daemonstring) if !ncutils.FileExists("/Library/LaunchDaemons/com.gravitl.netclient.plist") { err = os.WriteFile("/Library/LaunchDaemons/com.gravitl.netclient.plist", daemonbytes, 0644) } return err } // MacDaemonString - the file contents for the mac netclient daemon service (launchdaemon) func MacDaemonString() string { return ` Labelcom.gravitl.netclient ProgramArguments /usr/local/bin/netclient daemon StandardOutPath/etc/netclient/com.gravitl.netclient.log StandardErrorPath/etc/netclient/com.gravitl.netclient.log RunAtLoad KeepAlive AbandonProcessGroup EnvironmentVariables PATH /usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ` } // MacTemplateData - struct to represent the mac service type MacTemplateData struct { Label string Interval string }