kiss server monitoring tool with email alerts
go monitoring

feat: add `--deamon` flag

+56 -4
+56 -4
main.go
··· 3 import ( 4 "fmt" 5 "os" 6 "path" 7 8 "github.com/spf13/cobra" 9 ) 10 11 var ( 12 - version = "1.0.0" 13 - flagConfig = "config" 14 - cfgFile string 15 ) 16 17 func main() { ··· 23 24 rootCmd := &cobra.Command{ 25 Use: "servmon", 26 - Short: "Server Monitoring Tool with TUI and Alerts", 27 Version: version, 28 RunE: func(cmd *cobra.Command, args []string) error { 29 cfgPath, err := cmd.Flags().GetString(flagConfig) 30 if err != nil { 31 return fmt.Errorf("error getting flag %s: %v", flagConfig, err) ··· 59 60 rootCmd.CompletionOptions.DisableDefaultCmd = true 61 rootCmd.PersistentFlags().StringVar(&cfgFile, flagConfig, path.Join(homeDir, ".servmon.yaml"), "config file") 62 63 if err := rootCmd.Execute(); err != nil { 64 fmt.Fprint(os.Stderr, err) 65 os.Exit(1) 66 } 67 }
··· 3 import ( 4 "fmt" 5 "os" 6 + "os/exec" 7 "path" 8 + "runtime" 9 10 "github.com/spf13/cobra" 11 ) 12 13 var ( 14 + version = "1.0.0" 15 + flagConfig = "config" 16 + flagDaemon = "daemon" 17 + cfgFile string 18 + runAsDaemon bool 19 ) 20 21 func main() { ··· 27 28 rootCmd := &cobra.Command{ 29 Use: "servmon", 30 + Short: "KISS server monitoring tool with email alerts", 31 Version: version, 32 RunE: func(cmd *cobra.Command, args []string) error { 33 + runAsDaemon, err := cmd.Flags().GetBool(flagDaemon) 34 + if err != nil { 35 + return fmt.Errorf("error getting flag %s: %v", flagDaemon, err) 36 + } 37 + 38 + if runAsDaemon { 39 + pid, err := runAsDaemonProcess() 40 + if err != nil { 41 + return err 42 + } 43 + 44 + cmd.Println("Running as daemon with PID", pid) 45 + return nil 46 + } 47 + 48 cfgPath, err := cmd.Flags().GetString(flagConfig) 49 if err != nil { 50 return fmt.Errorf("error getting flag %s: %v", flagConfig, err) ··· 78 79 rootCmd.CompletionOptions.DisableDefaultCmd = true 80 rootCmd.PersistentFlags().StringVar(&cfgFile, flagConfig, path.Join(homeDir, ".servmon.yaml"), "config file") 81 + rootCmd.PersistentFlags().BoolVarP(&runAsDaemon, flagDaemon, "d", false, "run as daemon") 82 83 if err := rootCmd.Execute(); err != nil { 84 fmt.Fprint(os.Stderr, err) 85 os.Exit(1) 86 } 87 } 88 + 89 + func runAsDaemonProcess() (int, error) { 90 + if runtime.GOOS == "linux" || runtime.GOOS == "freebsd" { 91 + var args []string 92 + for _, a := range os.Args[1:] { 93 + if a != "-d" && a != "--daemon" { 94 + args = append(args, a) 95 + } 96 + } 97 + 98 + cmd := exec.Command(os.Args[0], args...) 99 + cmd.Stdout = os.NewFile(3, "log.out") 100 + cmd.Stderr = os.NewFile(4, "log.err") 101 + cmd.Stdin = os.NewFile(3, "log.in") 102 + 103 + if err := cmd.Start(); err != nil { 104 + return 0, fmt.Errorf("error starting as daemon: %v", err) 105 + } 106 + 107 + pid := cmd.Process.Pid 108 + 109 + // Detach the process 110 + err := cmd.Process.Release() 111 + if err != nil { 112 + return 0, fmt.Errorf("error detaching process: %v", err) 113 + } 114 + 115 + return pid, nil 116 + } 117 + 118 + return 0, fmt.Errorf("daemon mode is not supported on %s", runtime.GOOS) 119 + }