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