tangled
alpha
login
or
join now
julien.rbrt.fr
/
servmon
0
fork
atom
kiss server monitoring tool with email alerts
go
monitoring
0
fork
atom
overview
issues
pulls
pipelines
feat: add `--deamon` flag
julien.rbrt.fr
1 year ago
6c316252
7c22375c
+56
-4
1 changed file
expand all
collapse all
unified
split
main.go
+56
-4
main.go
···
3
import (
4
"fmt"
5
"os"
0
6
"path"
0
7
8
"github.com/spf13/cobra"
9
)
10
11
var (
12
-
version = "1.0.0"
13
-
flagConfig = "config"
14
-
cfgFile string
0
0
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 {
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
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")
0
62
63
if err := rootCmd.Execute(); err != nil {
64
fmt.Fprint(os.Stderr, err)
65
os.Exit(1)
66
}
67
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
···
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
+
}