123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- 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)
- }
- }
|