run.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package zdaemon
  2. import (
  3. "fmt"
  4. "git.swzry.com/zry/SatorIPC/golang/sipc_conn"
  5. "github.com/gin-gonic/gin"
  6. "gopkg.in/natefinch/lumberjack.v2"
  7. "net/http"
  8. "os"
  9. "path"
  10. "sync"
  11. "time"
  12. )
  13. const TimeFormatLayout = "2006-01-02 15:04:05"
  14. func (zd *ZDaemon) directRun() {
  15. if zd.checkRunning() {
  16. zd.stop()
  17. }
  18. logger := &lumberjack.Logger{
  19. Filename: path.Join(zd.zdaemonPath, "local.log"),
  20. MaxSize: 1,
  21. MaxAge: 30,
  22. MaxBackups: 24,
  23. LocalTime: true,
  24. Compress: true,
  25. }
  26. zd.webserver = gin.Default()
  27. zd.webserver.GET("/", zd.webHome)
  28. zd.webserver.GET("/check-alive.satori", zd.webCheckAlive)
  29. zd.webserver.GET("/stop.satori", zd.webStop)
  30. zd.webserver.GET("/status.satori", zd.webStatus)
  31. zd.webserver.POST("/other-operation.satori", zd.webOtherOp)
  32. zd.cleanIPCUnixSock()
  33. zd.makeIPCDir()
  34. ipcaddr := sipc_conn.GenerateCustomPath(path.Join(zd.zdaemonPath, "ipc"), sipc_conn.GenerateServerName())
  35. var err error
  36. zd.ipcserver, err = sipc_conn.NewServer(ipcaddr, false)
  37. if err != nil {
  38. _, _ = fmt.Fprintln(logger, "Failed create IPC server: ", err.Error())
  39. return
  40. }
  41. zd.daemonProgram = zd.initFunc()
  42. zd.daemonProgram.SetLocalLogWriter(logger)
  43. zd.ipcserver.SetConnErrorHandler(func(err error) {
  44. _, _ = fmt.Fprintln(logger, "Wrong IPC Connection: ", err.Error())
  45. })
  46. zd.ipclistener, err = zd.ipcserver.GetListenerAndListen()
  47. if err != nil {
  48. _, _ = fmt.Fprintln(logger, "Failed create IPC server: ", err.Error())
  49. return
  50. }
  51. zd.daemonConfig.IsRunning = true
  52. zd.daemonConfig.PID = os.Getpid()
  53. zd.daemonConfig.IpcAddr = ipcaddr
  54. zd.writeStatus()
  55. var wg sync.WaitGroup
  56. wg.Add(2)
  57. go func() {
  58. err := http.Serve(zd.ipclistener, zd.webserver)
  59. if err != nil {
  60. _, _ = fmt.Fprintln(logger, "Error in IPC server listening: ", err.Error())
  61. }
  62. wg.Done()
  63. }()
  64. go func() {
  65. err := zd.daemonProgram.Start()
  66. if err != nil {
  67. _, _ = fmt.Fprintln(logger, "Error in daemon running: ", err.Error())
  68. }
  69. wg.Done()
  70. }()
  71. wg.Wait()
  72. _, _ = fmt.Fprintln(logger, "Both IPC server and user program end. Daemon program quit.")
  73. }
  74. func (zd *ZDaemon) webHome(ctx *gin.Context) {
  75. ctx.JSON(200, gin.H{
  76. "zdaemon_version": "1.0",
  77. "daemon_name": zd.daemonName,
  78. })
  79. }
  80. func (zd *ZDaemon) webCheckAlive(ctx *gin.Context) {
  81. al := &IPCJsonDef_CheckAlive{Alive: true}
  82. ctx.JSON(200, al)
  83. }
  84. func (zd *ZDaemon) webStop(ctx *gin.Context) {
  85. if zd.daemonProgram == nil {
  86. al := &IPCJsonDef_Stop{
  87. Success: false,
  88. Msg: "daemon program instance is null pointer.",
  89. }
  90. ctx.JSON(200, al)
  91. return
  92. }
  93. var al *IPCJsonDef_Stop
  94. if zd.daemonProgram != nil {
  95. err := zd.daemonProgram.Stop()
  96. if err != nil {
  97. al = &IPCJsonDef_Stop{
  98. Success: false,
  99. Msg: err.Error(),
  100. }
  101. } else {
  102. al = &IPCJsonDef_Stop{
  103. Success: true,
  104. Msg: "None",
  105. }
  106. }
  107. } else {
  108. al = &IPCJsonDef_Stop{
  109. Success: false,
  110. Msg: "daemon program instance is null pointer",
  111. }
  112. }
  113. ctx.JSON(200, al)
  114. go func() {
  115. time.Sleep(time.Second)
  116. if zd.ipclistener != nil {
  117. _ = zd.ipclistener.Close()
  118. os.Exit(0)
  119. }
  120. }()
  121. }
  122. func (zd *ZDaemon) webStatus(ctx *gin.Context) {
  123. if zd.daemonProgram == nil {
  124. al := &IPCJsonDef_GetStatus{
  125. Status: "error",
  126. HasExtra: false,
  127. ExtraInfo: map[string]string{
  128. "errmsg": "daemon program instance is null pointer.",
  129. },
  130. }
  131. ctx.JSON(200, al)
  132. return
  133. }
  134. st, he, ex := zd.daemonProgram.GetStatus()
  135. al := &IPCJsonDef_GetStatus{
  136. Status: st,
  137. HasExtra: he,
  138. ExtraInfo: ex,
  139. }
  140. ctx.JSON(200, al)
  141. }
  142. func (zd *ZDaemon) webOtherOp(ctx *gin.Context) {
  143. if zd.daemonProgram == nil {
  144. al := &IPCJsonDef_OtherOperationResponse{
  145. Result: "Error: daemon program instance is null pointer.",
  146. }
  147. ctx.JSON(200, al)
  148. return
  149. }
  150. var jv IPCJsonDef_OtherOperationRequest
  151. err := ctx.BindJSON(&jv)
  152. if err != nil {
  153. al := &IPCJsonDef_OtherOperationResponse{
  154. Result: fmt.Sprint("Error: ", err.Error()),
  155. }
  156. ctx.JSON(200, al)
  157. return
  158. }
  159. st := zd.daemonProgram.OtherOperation(jv.Operation, jv.Args)
  160. al := &IPCJsonDef_OtherOperationResponse{
  161. Result: st,
  162. }
  163. ctx.JSON(200, al)
  164. }