Node.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package controller
  2. import (
  3. "fmt"
  4. "github.com/gogf/gf/v2/errors/gcode"
  5. "github.com/gogf/gf/v2/errors/gerror"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/os/gcron"
  8. "github.com/gogf/gf/v2/os/glog"
  9. "golang.org/x/net/context"
  10. v1 "nodeMonitor/api/v1"
  11. "nodeMonitor/internal/model"
  12. "nodeMonitor/internal/service"
  13. "nodeMonitor/internal/task"
  14. "time"
  15. )
  16. var Node = sNode{}
  17. type sNode struct {
  18. }
  19. func (c *sNode) Add(ctx context.Context, req *v1.NodeReq) (res *v1.NodeRes, err error) {
  20. //res = new(v1.NodeRes)
  21. exist, err := service.Node().IsExist(ctx, req.Host)
  22. if err != nil {
  23. return
  24. }
  25. if !exist {
  26. err = gerror.NewCode(gcode.New(401, "", nil), "数据已经存在")
  27. return
  28. }
  29. err = service.Node().Create(ctx, model.NodeCreateInput{
  30. Name: req.Name,
  31. Host: req.Host,
  32. Port: req.Port,
  33. Url: req.Url,
  34. PingType: req.PingType,
  35. })
  36. server, err := service.Node().FindServer(ctx, req.Host)
  37. err = service.NodeConfig().Create(ctx, model.NodeConfigAndEditCreateInput{
  38. ServerId: server.Id,
  39. SshCom: req.Sshcommand,
  40. SshPass: req.Sshpassword,
  41. SshUser: req.Sshusername,
  42. })
  43. return
  44. }
  45. func (c *sNode) Del(ctx context.Context, req *v1.NodeDelReq) (res *v1.NodeDelRes, err error) {
  46. err = service.Node().Del(ctx, model.NodeDelInput{
  47. Id: req.Id,
  48. })
  49. err = service.NodeConfig().Delete(ctx, req.Id)
  50. return
  51. }
  52. func (c *sNode) Edit(ctx context.Context, req *v1.NodeEditReq) (res *v1.NodeEditRes, err error) {
  53. err = service.Node().UpdateNode(ctx, model.NodeEditInput{
  54. Id: req.Id,
  55. Name: req.Name,
  56. Host: req.Host,
  57. Port: req.Port,
  58. Url: req.Url,
  59. UrlRecover: req.UrlRecover,
  60. PingType: req.PingType,
  61. UrlStatus: req.UrlStatus,
  62. IsNotice: req.IsNotice,
  63. })
  64. err = service.NodeConfig().Edit(ctx, model.NodeConfigAndEditCreateInput{
  65. ServerId: req.Id,
  66. SshCom: req.Sshcommand,
  67. SshPass: req.Sshpassword,
  68. SshUser: req.Sshusername,
  69. })
  70. return
  71. }
  72. func (c *sNode) All(ctx context.Context, req *v1.NodeAllReq) (res *v1.NodeALlRes, err error) {
  73. res = new(v1.NodeALlRes)
  74. res.NodeList, err = service.NodeConfig().GetAll(ctx)
  75. return
  76. }
  77. func (c *sNode) NodeStatus(ctx context.Context, req *v1.NodeStatusReq) (res *v1.NodeStatusRes, err error) {
  78. res = new(v1.NodeStatusRes)
  79. res.NodeItme, err = service.Node().GetNodePingStatus(ctx)
  80. return
  81. }
  82. func (c *sNode) Start(ctx context.Context, req *v1.NodeCronStartReq) (res *v1.NodeCronStartRes, err error) {
  83. res = new(v1.NodeCronStartRes)
  84. StartTime := req.StartTime
  85. taskName, err := g.Cfg().Get(ctx, "node.taskName")
  86. if err != nil {
  87. glog.Debug(ctx, err.Error())
  88. return
  89. }
  90. search := gcron.Search(taskName.String())
  91. if search != nil {
  92. gcron.Stop(taskName.String())
  93. gcron.Start(taskName.String())
  94. res.RetEntry = gcron.Entries()
  95. res.RetCronCount = gcron.Size()
  96. res.Status = true
  97. glog.Debug(ctx, "task -- ", gcron.Size())
  98. } else {
  99. s := fmt.Sprintf("*/%d * * * * *", StartTime)
  100. _, err = gcron.AddSingleton(ctx, s, func(ctx context.Context) {
  101. taskStatusTime, err := g.Cfg().Get(ctx, "node.taskStatusTime")
  102. if err != nil {
  103. glog.Error(ctx, err.Error())
  104. return
  105. }
  106. s := fmt.Sprintf("0 */%d * * * *", taskStatusTime.Int())
  107. t, err := task.GetCronNextTime(s, time.Now())
  108. if err != nil {
  109. glog.Error(ctx, err.Error())
  110. return
  111. }
  112. go task.PingStatus(ctx, t)
  113. }, taskName.String())
  114. res.RetEntry = gcron.Entries()
  115. res.RetCronCount = gcron.Size()
  116. res.Status = true
  117. }
  118. //taskStatusName, err := g.Cfg().Get(ctx, "node.ping_status_task")
  119. //if err != nil {
  120. // glog.Debug(ctx, err.Error())
  121. // return
  122. //}
  123. //search_status := gcron.Search(taskStatusName.String())
  124. //if search_status != nil {
  125. // gcron.Stop(taskStatusName.String())
  126. // gcron.Start(taskStatusName.String())
  127. // glog.Debug(ctx, "task -- ", gcron.Size())
  128. // res.RetEntry = gcron.Entries()
  129. // res.RetCronCount = gcron.Size()
  130. // res.Status = true
  131. //} else {
  132. // s := fmt.Sprintf("*/%d * * * * *", 120)
  133. // _, err = gcron.AddSingleton(ctx, s, func(ctx context.Context) {
  134. // go task.PingStatus(ctx)
  135. // }, taskStatusName.String())
  136. // res.RetEntry = gcron.Entries()
  137. // res.RetCronCount = gcron.Size()
  138. // res.Status = true
  139. //
  140. //}
  141. return
  142. }
  143. func (c *sNode) Stop(ctx context.Context, req *v1.NodeCronStopReq) (res *v1.NodeCronStopRes, err error) {
  144. res = new(v1.NodeCronStopRes)
  145. remove := req.Remove
  146. taskName, err := g.Cfg().Get(ctx, "node.taskName")
  147. if err != nil {
  148. glog.Debug(ctx, err.Error())
  149. return
  150. }
  151. //taskStatusName, err := g.Cfg().Get(ctx, "node.ping_status_task")
  152. //if err != nil {
  153. // glog.Debug(ctx, err.Error())
  154. // return
  155. //}
  156. gcron.Stop(taskName.String())
  157. //gcron.Stop(taskStatusName.String())
  158. if remove {
  159. gcron.Remove(taskName.String())
  160. //gcron.Remove(taskStatusName.String())
  161. }
  162. search := gcron.Search(taskName.String())
  163. if search == nil {
  164. res.Status = false
  165. }
  166. //search_status := gcron.Search(taskStatusName.String())
  167. //if search_status == nil {
  168. // res.Status = false
  169. //}
  170. res.RetCronCount = gcron.Size()
  171. return
  172. }
  173. func (c *sNode) Task(ctx context.Context, req *v1.NodeCronStatusReq) (res *v1.NodeCronStatusRes, err error) {
  174. res = new(v1.NodeCronStatusRes)
  175. res.RetEntry = gcron.Entries()
  176. res.RetCronCount = gcron.Size()
  177. return
  178. }