feat: 服务器状态API

This commit is contained in:
Akkia
2022-05-17 11:21:27 +08:00
parent 5fca0a52ef
commit 76928b71d9
6 changed files with 172 additions and 5 deletions

83
service/singleton/api.go Normal file
View File

@@ -0,0 +1,83 @@
package singleton
import "github.com/naiba/nezha/model"
type ServerAPI struct {
Token string // 传入Token 后期可能会需要用于scope判定
IDList []uint64
Tag string
}
type CommonResponse struct {
Code int `json:"code"`
Message string `json:"message"`
}
type StatusResponse struct {
Host *model.Host `json:"host"`
Status *model.HostState `json:"status"`
}
type ServerStatusResponse struct {
CommonResponse
Result []*StatusResponse `json:"result"`
}
// GetStatusByIDList 获取传入IDList的服务器状态信息
func (s *ServerAPI) GetStatusByIDList() *ServerStatusResponse {
var res []*StatusResponse
ServerLock.RLock()
defer ServerLock.RUnlock()
for _, v := range s.IDList {
server := ServerList[v]
if server == nil {
continue
}
res = append(res, &StatusResponse{
Host: server.Host,
Status: server.State,
})
}
return &ServerStatusResponse{
CommonResponse: CommonResponse{
Code: 0,
Message: "success",
},
Result: res,
}
}
// GetStatusByTag 获取传入分组的所有服务器状态信息
func (s *ServerAPI) GetStatusByTag() *ServerStatusResponse {
s.IDList = ServerTagToIDList[s.Tag]
return s.GetStatusByIDList()
}
// GetAllStatus 获取所有服务器状态信息
func (s *ServerAPI) GetAllStatus() *ServerStatusResponse {
ServerLock.RLock()
defer ServerLock.RUnlock()
var res []*StatusResponse
for _, v := range ServerList {
host := v.Host
state := v.State
if host == nil || state == nil {
continue
}
res = append(res, &StatusResponse{
Host: v.Host,
Status: v.State,
})
}
return &ServerStatusResponse{
CommonResponse: CommonResponse{
Code: 0,
Message: "success",
},
Result: res,
}
}

View File

@@ -8,9 +8,10 @@ import (
)
var (
ServerList map[uint64]*model.Server // [ServerID] -> model.Server
SecretToID map[string]uint64 // [ServerSecret] -> ServerID
ServerLock sync.RWMutex
ServerList map[uint64]*model.Server // [ServerID] -> model.Server
SecretToID map[string]uint64 // [ServerSecret] -> ServerID
ServerTagToIDList map[string][]uint64 // [ServerTag] -> ServerID
ServerLock sync.RWMutex
SortedServerList []*model.Server // 用于存储服务器列表的 slice按照服务器 ID 排序
SortedServerLock sync.RWMutex
@@ -20,6 +21,7 @@ var (
func InitServer() {
ServerList = make(map[uint64]*model.Server)
SecretToID = make(map[string]uint64)
ServerTagToIDList = make(map[string][]uint64)
}
//LoadServers 加载服务器列表并根据ID排序
@@ -33,6 +35,7 @@ func LoadServers() {
innerS.State = &model.HostState{}
ServerList[innerS.ID] = &innerS
SecretToID[innerS.Secret] = innerS.ID
ServerTagToIDList[innerS.Tag] = append(ServerTagToIDList[innerS.Tag], innerS.ID)
}
ReSortServer()
}

View File

@@ -63,7 +63,7 @@ func InitDBFromPath(path string) {
}
err = DB.AutoMigrate(model.Server{}, model.User{},
model.Notification{}, model.AlertRule{}, model.Monitor{},
model.MonitorHistory{}, model.Cron{}, model.Transfer{})
model.MonitorHistory{}, model.Cron{}, model.Transfer{}, model.ApiToken{})
if err != nil {
panic(err)
}