node.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package node
  2. import (
  3. "github.com/gogf/gf/v2/database/gdb"
  4. "github.com/gogf/gf/v2/frame/g"
  5. "github.com/gogf/gf/v2/os/glog"
  6. "github.com/gogf/gf/v2/os/gtime"
  7. "golang.org/x/net/context"
  8. "nodeMonitor/internal/dao"
  9. "nodeMonitor/internal/model"
  10. "nodeMonitor/internal/model/do"
  11. "nodeMonitor/internal/model/entity"
  12. "nodeMonitor/internal/service"
  13. "time"
  14. )
  15. type (
  16. sNode struct{}
  17. )
  18. func init() {
  19. service.RegisterNode(New())
  20. }
  21. func New() *sNode {
  22. return &sNode{}
  23. }
  24. // Create 创建节点
  25. func (c *sNode) Create(ctx context.Context, input model.NodeCreateInput) error {
  26. return dao.Node.Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
  27. _, err := dao.Node.Ctx(ctx).Data(do.Node{
  28. Name: input.Name,
  29. Host: input.Host,
  30. Port: input.Port,
  31. Url: input.Url,
  32. PingType: input.PingType,
  33. NodeMs: 0,
  34. }).Insert()
  35. return err
  36. })
  37. }
  38. func (c *sNode) FindServer(ctx context.Context, host string) (*entity.Node, error) {
  39. var data *entity.Node
  40. err := dao.Node.Ctx(ctx).Where("host", host).Scan(&data)
  41. if err != nil {
  42. return nil, err
  43. }
  44. return data, nil
  45. }
  46. // UpdateNodeMs 更新节点延迟1
  47. func (c *sNode) UpdateNodeMs(ctx context.Context, input model.NodeUpdateInput) error {
  48. _, err := dao.Node.Ctx(ctx).Where(g.Map{
  49. "id": input.ServerId,
  50. }).Update(g.Map{
  51. "node_ms": input.NodeMs,
  52. })
  53. return err
  54. }
  55. func (c *sNode) GetLasDowTime(ctx context.Context, serverid int) (*gtime.Time, error) {
  56. var data *entity.Node
  57. err := dao.Node.Ctx(ctx).Where("id", serverid).Scan(&data)
  58. if err != nil {
  59. return nil, err
  60. }
  61. return data.LastDownTime, nil
  62. }
  63. func (c *sNode) UpdateNodeLasDowTime(ctx context.Context, serverid int, lastDownTime *gtime.Time) error {
  64. _, err := dao.Node.Ctx(ctx).Where(g.Map{
  65. "id": serverid,
  66. }).Update(g.Map{
  67. "last_down_time": lastDownTime,
  68. })
  69. return err
  70. }
  71. func (c *sNode) UpdateAllNodeMs(ctx context.Context) error {
  72. _, err := dao.Node.Ctx(ctx).Update(g.Map{
  73. "nodeMs": 0,
  74. })
  75. return err
  76. }
  77. // Del 删除节点
  78. func (c *sNode) Del(ctx context.Context, input model.NodeDelInput) error {
  79. _, err := dao.Node.Ctx(ctx).Where(g.Map{
  80. "id": input.Id,
  81. }).Delete()
  82. return err
  83. }
  84. // IsExist 节点是否存在
  85. func (c *sNode) IsExist(ctx context.Context, host string) (bool, error) {
  86. count, err := dao.Node.Ctx(ctx).Where(g.Map{
  87. "host": host,
  88. }).Count()
  89. if err != nil {
  90. return false, err
  91. }
  92. return count == 0, nil
  93. }
  94. // UpdateNode 更新指定节点
  95. func (c *sNode) UpdateNode(ctx context.Context, input model.NodeEditInput) error {
  96. _, err := dao.Node.Ctx(ctx).Where(g.Map{
  97. "id": input.Id,
  98. }).Update(g.Map{
  99. "host": input.Host,
  100. "name": input.Name,
  101. "port": input.Port,
  102. "url": input.Url,
  103. "url_Recover": input.UrlRecover,
  104. "ping_type": input.PingType,
  105. "url_status": input.UrlStatus,
  106. "is_notice": input.IsNotice,
  107. })
  108. return err
  109. }
  110. // GetNode 获取全部数据
  111. func (c *sNode) GetNode(ctx context.Context) ([]*entity.Node, error) {
  112. var nodeList []*entity.Node
  113. err := dao.Node.Ctx(ctx).OrderDesc("create_at").Scan(&nodeList)
  114. return nodeList, err
  115. }
  116. // GetNodePingStatus 获取节点监控结果
  117. func (c *sNode) GetNodePingStatus(ctx context.Context) ([]*model.UserItem, error) {
  118. //查询10分钟内的数据
  119. //startTime, err := g.Cfg().Get(ctx, "node.startTime")
  120. //if err != nil {
  121. // glog.Debug(ctx, err.Error())
  122. // return nil, err
  123. //}
  124. timeStartStr := gtime.Now().Add(-7200 * time.Second).String()
  125. timeEnd := gtime.Now().String()
  126. var nodeList []*model.UserItem
  127. err := dao.Node.Ctx(ctx).OrderDesc("create_at").ScanList(&nodeList, "Node")
  128. if err != nil {
  129. return nil, err
  130. }
  131. //获取2个小时内的数据
  132. err = dao.Pinglog.Ctx(ctx).Where("serverid", gdb.ListItemValuesUnique(nodeList, "Node", "Id")).WhereBetween("create_at", timeStartStr, timeEnd).OrderDesc("create_at").ScanList(&nodeList, "PingLog", "Node", "serverid=id")
  133. glog.Debug(ctx, timeStartStr)
  134. if err != nil {
  135. return nil, err
  136. }
  137. return nodeList, nil
  138. }
  139. // FindNode 获取指定节点数据
  140. func (c *sNode) FindNode(ctx context.Context, id int) (*entity.Node, error) {
  141. var nodeList *entity.Node
  142. err := dao.Node.Ctx(ctx).Where("id = ?", id).Scan(&nodeList)
  143. return nodeList, err
  144. }
  145. // 查询节点MS等于0的线路
  146. func (c *sNode) FindNodeMs(ctx context.Context) ([]*entity.Node, error) {
  147. var nodeList []*entity.Node
  148. err := dao.Node.Ctx(ctx).Where("nodeMs = 0").OrderDesc("create_at").Scan(&nodeList)
  149. return nodeList, err
  150. }
  151. // UpdateNodeUrlStatus 更新节点url是否执行完成
  152. func (c *sNode) UpdateNodeUrlStatus(ctx context.Context, input model.NodeCreateInput) error {
  153. _, err := dao.Node.Ctx(ctx).Where(g.Map{
  154. "host": input.Host,
  155. }).Update(g.Map{
  156. "url_status": input.UrlStatus,
  157. })
  158. return err
  159. }
  160. // 获取节点执行次数
  161. func (c *sNode) GetNodeUrlCount(ctx context.Context, id int) (*entity.Node, error) {
  162. var ccc *entity.Node
  163. err := dao.Node.Ctx(ctx).Where(g.Map{
  164. "id": id,
  165. }).Scan(&ccc)
  166. return ccc, err
  167. }
  168. // 更新执行次数
  169. func (c *sNode) UPdateNodeUrlCount(ctx context.Context, id int, urlCount int, urlret string, urlstatus int) error {
  170. _, err := dao.Node.Ctx(ctx).Where(g.Map{
  171. "id": id,
  172. }).Update(g.Map{
  173. "urlCount": urlCount,
  174. "url_status": urlstatus,
  175. "urlRet": urlret,
  176. })
  177. return err
  178. }