daemon.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package daemon
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "github.com/astaxie/beego/logs"
  7. "github.com/beego/beego/v2/adapter"
  8. "github.com/beego/beego/v2/server/web"
  9. "github.com/kardianos/service"
  10. "github.com/mindoc-org/mindoc/commands"
  11. "github.com/mindoc-org/mindoc/conf"
  12. "github.com/mindoc-org/mindoc/controllers"
  13. )
  14. type Daemon struct {
  15. config *service.Config
  16. errs chan error
  17. }
  18. func NewDaemon() *Daemon {
  19. config := &service.Config{
  20. Name: "mindocd", //服务显示名称
  21. DisplayName: "MinDoc service", //服务名称
  22. Description: "A document online management program.", //服务描述
  23. WorkingDirectory: conf.WorkingDirectory,
  24. Arguments: os.Args[1:],
  25. }
  26. return &Daemon{
  27. config: config,
  28. errs: make(chan error, 100),
  29. }
  30. }
  31. func (d *Daemon) Config() *service.Config {
  32. return d.config
  33. }
  34. func (d *Daemon) Start(s service.Service) error {
  35. go d.Run()
  36. return nil
  37. }
  38. func (d *Daemon) Run() {
  39. commands.ResolveCommand(d.config.Arguments)
  40. commands.RegisterFunction()
  41. commands.RegisterAutoLoadConfig()
  42. commands.RegisterError()
  43. /* TODO: which ErrorController to use? currently there are
  44. * two ErrorController avalable, one is beego/v2/server/web.ErrorController,
  45. * and another is beego/v2/adapter.ErrorController, which is actually a calling to the first one
  46. * here the first one is used, which is the original implementation.
  47. */
  48. web.ErrorController(&controllers.ErrorController{})
  49. f, err := filepath.Abs(os.Args[0])
  50. if err != nil {
  51. f = os.Args[0]
  52. }
  53. fmt.Printf("MinDoc version => %s\nbuild time => %s\nstart directory => %s\n%s\n", conf.VERSION, conf.BUILD_TIME, f, conf.GO_VERSION)
  54. adapter.Run()
  55. }
  56. func (d *Daemon) Stop(s service.Service) error {
  57. if service.Interactive() {
  58. os.Exit(0)
  59. }
  60. return nil
  61. }
  62. func Install() {
  63. d := NewDaemon()
  64. d.config.Arguments = os.Args[3:]
  65. s, err := service.New(d, d.config)
  66. if err != nil {
  67. logs.Error("Create service error => ", err)
  68. os.Exit(1)
  69. }
  70. err = s.Install()
  71. if err != nil {
  72. logs.Error("Install service error:", err)
  73. os.Exit(1)
  74. } else {
  75. logs.Info("Service installed!")
  76. }
  77. os.Exit(0)
  78. }
  79. func Uninstall() {
  80. d := NewDaemon()
  81. s, err := service.New(d, d.config)
  82. if err != nil {
  83. logs.Error("Create service error => ", err)
  84. os.Exit(1)
  85. }
  86. err = s.Uninstall()
  87. if err != nil {
  88. logs.Error("Install service error:", err)
  89. os.Exit(1)
  90. } else {
  91. logs.Info("Service uninstalled!")
  92. }
  93. os.Exit(0)
  94. }
  95. func Restart() {
  96. d := NewDaemon()
  97. s, err := service.New(d, d.config)
  98. if err != nil {
  99. logs.Error("Create service error => ", err)
  100. os.Exit(1)
  101. }
  102. err = s.Restart()
  103. if err != nil {
  104. logs.Error("Install service error:", err)
  105. os.Exit(1)
  106. } else {
  107. logs.Info("Service Restart!")
  108. }
  109. os.Exit(0)
  110. }