@@ -3,28 +3,114 @@ package main
33import (
44 "flag"
55 "fmt"
6+ "github.com/kardianos/service"
67 log "github.com/sirupsen/logrus"
8+ "io/fs"
79 "oms/internal/config"
810 "oms/internal/models"
911 "oms/internal/server"
1012 "oms/pkg/logger"
1113 "oms/version"
1214 "os"
13- "os/signal "
14- "syscall "
15+ "path/filepath "
16+ "runtime "
1517)
1618
19+ type App struct {
20+ conf * config.Conf
21+ sigs chan os.Signal
22+ }
23+
24+ // NewApp create application
25+ func NewApp (conf * config.Conf ) * App {
26+ return & App {
27+ conf : conf ,
28+ }
29+ }
30+
31+ // Start application
32+ func (a * App ) Start (s service.Service ) error {
33+ // run server
34+ srv := server .NewServer (a .conf )
35+ srv .Run ()
36+ return nil
37+ }
38+
39+ // Stop application
40+ func (a * App ) Stop (s service.Service ) error {
41+ return nil
42+ }
43+
1744func main () {
1845 // flags & init conf
1946
2047 configPath := flag .String ("config" , "" , "path of config" )
48+ act := flag .String ("action" , "" , "install or uninstall" )
49+ user := flag .String ("user" , "" , "run with user" )
2150 flag .Parse ()
2251
52+ var depends []string
53+ if runtime .GOOS != "windows" {
54+ depends = append (depends , "After=network.target" )
55+ }
56+ var opt service.KeyValue
57+ switch runtime .GOOS {
58+ case "windows" :
59+ opt = service.KeyValue {
60+ "StartType" : "automatic" ,
61+ "OnFailure" : "restart" ,
62+ "OnFailureDelayDuration" : "5s" ,
63+ "OnFailureResetPeriod" : 10 ,
64+ }
65+ case "linux" :
66+ opt = service.KeyValue {
67+ "LimitNOFILE" : 65000 ,
68+ }
69+ case "darwin" :
70+ opt = service.KeyValue {
71+ "SessionCreate" : true ,
72+ }
73+ }
74+
75+ appCfg := & service.Config {
76+ Name : "omsd" ,
77+ DisplayName : "omsd" ,
78+ Description : "nat forward service" ,
79+ UserName : * user ,
80+ Dependencies : depends ,
81+ Option : opt ,
82+ }
83+
84+ if * configPath != "" {
85+ abs , err := filepath .Abs (* configPath )
86+ if err == nil {
87+ appCfg .Arguments = []string {"--config" , abs }
88+ }
89+ }
90+
2391 conf , err := config .NewServerConfig (* configPath )
2492 if err != nil {
2593 panic (err )
2694 }
2795
96+ if conf .App .Logger == "" || conf .App .Logger == "stdout" {
97+ logger .SetOutput (os .Stdout )
98+ } else {
99+ var logPath string
100+
101+ if filepath .IsAbs (conf .App .Logger ) {
102+ logPath = conf .App .Logger
103+ } else {
104+ logPath = filepath .Join (conf .App .DataPath , conf .App .Logger )
105+ }
106+ logFile , err := os .OpenFile (logPath , os .O_CREATE | os .O_RDWR | os .O_APPEND , fs .ModePerm )
107+ if err != nil {
108+ log .Error ("打开日志文件失败!" )
109+ return
110+ }
111+ logger .SetOutput (logFile )
112+ }
113+
28114 log .Infof ("当前版本: %s" , version .Version )
29115
30116 // init db
@@ -39,14 +125,25 @@ func main() {
39125 logger .SetLevelAndFormat (logger .InfoLevel , & log.TextFormatter {})
40126 }
41127
42- // run server
43- srv := server .NewServer (conf )
44- srv .Run ()
45-
46- sigs := make (chan os.Signal , 1 )
47- signal .Notify (sigs , syscall .SIGINT , syscall .SIGTERM )
128+ app := NewApp (conf )
129+ sv , err := service .New (app , appCfg )
130+ if err != nil {
131+ panic (err )
132+ }
48133
49- <- sigs
134+ switch * act {
135+ case "install" :
136+ err = sv .Install ()
137+ log .Infof ("服务注册成功" )
138+ case "uninstall" :
139+ err = sv .Uninstall ()
140+ log .Infof ("服务取消成功" )
141+ default :
142+ err = sv .Run ()
143+ log .Info ("程序退出" )
144+ }
145+ if err != nil {
146+ panic (err )
147+ }
50148
51- log .Info ("程序退出" )
52149}
0 commit comments