package main import ( "context" "flag" "fmt" "os" "strings" "github.com/alroyso/clash-for-flutter-service/constant" "github.com/alroyso/clash-for-flutter-service/server" "github.com/kardianos/service" ) var Service service.Service type program struct{} var ( port int64 ) func (p *program) Start(s service.Service) error { go p.run() fmt.Println("Start success") return nil } func (p *program) run() { err := server.StartServer(port) if err != nil { fmt.Println(err) if strings.Contains(err.Error(), "http: Server closed") { return } if strings.Contains(err.Error(), "bind: address already in use") { if os.Args[1] == "service-mode" { Service.Stop() } else { p.Stop(Service) os.Exit(101) } } } } func (p *program) Stop(s service.Service) error { if server.Server != nil { server.Server.Shutdown(context.TODO()) } if server.Cmd != nil { server.Cmd.Process.Kill() server.Cmd.Process.Wait() } fmt.Println("Stop success") return nil } func main() { //// 使用 flag 包为全局变量 port 定义命令行参数 flag.Int64Var(&port, "port", 9899, "The port number to listen on") // 解析命令行参数 flag.Parse() args := flag.Args() if len(args) <= 1 { fmt.Println("Please use command: install, uninstall, status, start, stop, restart, version, service-mode, user-mode") return } svcConfig := &service.Config{ Name: "naiyou-core-service", DisplayName: "naiyou core Service", Description: "This is a naiyou core Service.", Arguments: []string{"service-mode"}, } prg := &program{} s, err := service.New(prg, svcConfig) Service = s if err != nil { fmt.Println(err) return } for _, it := range args { switch it { case "install": handleInstall(s) case "uninstall": handleUnInstall(s) case "status": handleStatus(s) case "start": handleStart(s) case "stop": handleStop(s) case "restart": handleRestart(s) case "version": handleVersion(s) case "service-mode": handleRun(s) case "user-mode": handleRun(s) default: fmt.Println("Command does not exist") } } } func handleInstall(s service.Service) { err := s.Install() if err != nil { fmt.Println(err) } else { fmt.Println("Install Service Success") } } func handleUnInstall(s service.Service) { err := s.Uninstall() if err != nil { fmt.Println(err) } else { fmt.Println("UnInstall Service Success") } } func handleStatus(s service.Service) { status, err := s.Status() if err != nil { fmt.Println(err) } else { switch status { case service.StatusRunning: fmt.Println("Service Status is runing") case service.StatusStopped: fmt.Println("Service Status is stoped") default: fmt.Println("Service Status is unknow") } } } func handleStart(s service.Service) { err := s.Start() if err != nil { fmt.Println(err) } else { fmt.Println("Service Start Success ") } } func handleStop(s service.Service) { err := s.Stop() if err != nil { fmt.Println(err) } else { fmt.Println("Service Stop Success") } } func handleRestart(s service.Service) { err := s.Restart() if err != nil { fmt.Println(err) } else { fmt.Println("Service Restart Success") } } func handleVersion(s service.Service) { fmt.Println(constant.Version) } func handleRun(s service.Service) { err := s.Run() if err != nil { fmt.Println(err) } }