标签模块
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

service.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "log"
  7. "os"
  8. "path/filepath"
  9. cfg "3g3e.com/ymdx/config"
  10. "3g3e.com/ymdx/glog"
  11. "3g3e.com/ymdx/lib"
  12. "github.com/takama/daemon"
  13. )
  14. type exitApp struct {
  15. ctx context.Context
  16. exit context.CancelFunc
  17. baseDir string
  18. }
  19. func imain(ctx context.Context, baseDir string) *exitApp {
  20. app := &exitApp{
  21. ctx: ctx,
  22. baseDir: baseDir,
  23. }
  24. go app.main()
  25. return app
  26. }
  27. func (app *exitApp) WillExit() error {
  28. return nil
  29. }
  30. func (app *exitApp) SetExitCtrl(exit context.CancelFunc) {
  31. app.exit = exit
  32. }
  33. // Service is
  34. type Service struct {
  35. daemon.Daemon
  36. baseDir string
  37. }
  38. // Manage is
  39. func (s *Service) Manage() (string, error) {
  40. usage := "Usage: " + srvName + " install | remove | start | stop | status"
  41. if len(os.Args) > 1 {
  42. command := os.Args[1]
  43. switch command {
  44. case "install":
  45. return s.Install()
  46. case "remove":
  47. return s.Remove()
  48. case "start":
  49. return s.Start()
  50. case "stop":
  51. return s.Stop()
  52. case "status":
  53. return s.Status()
  54. default:
  55. return usage, nil
  56. }
  57. }
  58. /*************** CLI ***************/
  59. cliLog := &log.Logger{}
  60. glog.LoggerOutput(cliLog, &glog.LogBridgeOptions{
  61. Prefix: "CLI",
  62. BaseDepth: 3,
  63. ReplaceMap: nil,
  64. ShowHeaderTrace: true,
  65. })
  66. cli, ctx := lib.NewCLI(s.baseDir, cliLog)
  67. defer cli.Shutdown()
  68. /*************** 性能分析 ***************/
  69. //go http.ListenAndServe(":6060", nil)
  70. /*************** 核心 ***************/
  71. // defer cfg.SaveConfig()
  72. defer glog.Flush()
  73. sp := imain(ctx, s.baseDir)
  74. cli.Add(sp)
  75. /************** CLI LOOP **************/
  76. cli.Loop()
  77. return "Daemon was killed", nil
  78. }
  79. func main() {
  80. baseDir := ""
  81. flag.StringVar(&baseDir, "dir", "./_data", "running in a directory")
  82. flag.Parse()
  83. baseDir = lib.EnsureDir(baseDir)
  84. pathGLogDir := filepath.Join(baseDir, "glog")
  85. pathLogDir := filepath.Join(baseDir, "log")
  86. // 独立于baseDir
  87. confDir := lib.EnsureDir("./conf")
  88. pathConfig := filepath.Join(confDir, "default.conf")
  89. // os.RemoveAll(pathPageDir)
  90. // os.RemoveAll(pathCaptureDir)
  91. // os.RemoveAll(pathGLogDir)
  92. cfg.InitWithFile("json", pathConfig)
  93. glog.DefaultInit(glog.OtherLog, true, pathGLogDir, pathLogDir)
  94. /*************** Service ***************/
  95. srv, err := daemon.New(srvName, srvDescription, daemon.SystemDaemon)
  96. if err != nil {
  97. glog.Errorln("Error: ", err)
  98. os.Exit(1)
  99. }
  100. s := &Service{srv, baseDir}
  101. status, err := s.Manage()
  102. if err != nil {
  103. glog.Errorln(status, "\nError: ", err)
  104. os.Exit(1)
  105. }
  106. fmt.Println(status)
  107. }