2025-05-09 18:28:15 +08:00
|
|
|
|
package internal
|
|
|
|
|
|
2025-05-13 18:13:22 +08:00
|
|
|
|
import (
|
|
|
|
|
"admin/lib/httpclient"
|
|
|
|
|
"admin/lib/xlog"
|
|
|
|
|
"net/url"
|
|
|
|
|
)
|
2025-05-09 18:28:15 +08:00
|
|
|
|
|
|
|
|
|
type ServerInfo struct {
|
2025-05-13 18:13:22 +08:00
|
|
|
|
ProjectId int `json:"project_id"`
|
|
|
|
|
ServerId string `json:"serverId"`
|
|
|
|
|
ServerName string `json:"serverName"`
|
|
|
|
|
Ccu int `json:"ccu"`
|
|
|
|
|
TotalRoleCount int `json:"total_role_count"`
|
|
|
|
|
TotalAccountCount int `json:"total_account_count"`
|
|
|
|
|
Addr string `json:"addr"`
|
|
|
|
|
IsServerDown bool `json:"open_whitelist_login"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (server *ServerInfo) Down(api string) error {
|
|
|
|
|
addr := api + "/gm"
|
|
|
|
|
params := &url.Values{}
|
|
|
|
|
params.Set("server", server.ServerId)
|
|
|
|
|
params.Set("cmd_data", "pauseServer")
|
|
|
|
|
params.Set("reason", "down")
|
|
|
|
|
|
|
|
|
|
rsp := make(map[string]any)
|
|
|
|
|
err := httpclient.Request(addr, "get", params, rsp)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
xlog.Infof("操作项目:%v服务器:%v停服返回:%v", server.ProjectId, server.ServerId, rsp)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (server *ServerInfo) Up(api string) error {
|
|
|
|
|
addr := api + "/gm"
|
|
|
|
|
params := &url.Values{}
|
|
|
|
|
params.Set("server", server.ServerId)
|
|
|
|
|
params.Set("cmd_data", "setWhite")
|
|
|
|
|
params.Set("open", "false")
|
|
|
|
|
|
|
|
|
|
rsp := make(map[string]any)
|
|
|
|
|
err := httpclient.Request(addr, "get", params, rsp)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
xlog.Infof("操作项目:%v服务器:%v起服返回:%v", server.ProjectId, server.ServerId, rsp)
|
|
|
|
|
return nil
|
2025-05-09 18:28:15 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type ServerInfoList []*ServerInfo
|
|
|
|
|
|
|
|
|
|
type PageServerCountInfo struct {
|
|
|
|
|
Offset int
|
|
|
|
|
Count int
|
|
|
|
|
RawInfo *ServerInfo
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type PageInfo struct {
|
|
|
|
|
PageNo int // 页数,从1开始
|
|
|
|
|
Count int // 当前页的数量,一般是pageLen,但如果是最后一页可能不足
|
|
|
|
|
ServerList []*PageServerCountInfo // 参与组成这一页的服务器列表
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-13 18:13:22 +08:00
|
|
|
|
func (list ServerInfoList) FindByID(serverId string) *ServerInfo {
|
|
|
|
|
for _, info := range list {
|
|
|
|
|
if info.ServerId == serverId {
|
|
|
|
|
return info
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-09 18:28:15 +08:00
|
|
|
|
func (list ServerInfoList) TidyToPageList(pageLen int, queryCountField func(info *ServerInfo) int) (totalCount int, pageList []*PageInfo) {
|
|
|
|
|
curPageNo := 1
|
|
|
|
|
curPageNeedCount := pageLen
|
|
|
|
|
var curPageInfo *PageInfo
|
|
|
|
|
for _, serverInfo := range list {
|
|
|
|
|
serverCount := queryCountField(serverInfo)
|
|
|
|
|
totalCount += serverCount
|
|
|
|
|
serverRestCount := serverCount
|
|
|
|
|
serverAccOffset := 0
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
if serverRestCount >= curPageNeedCount {
|
|
|
|
|
// 当前页数量足够,切下一页
|
|
|
|
|
if curPageInfo == nil {
|
|
|
|
|
curPageInfo = &PageInfo{
|
|
|
|
|
PageNo: curPageNo,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
curPageInfo.Count += curPageNeedCount
|
|
|
|
|
curPageInfo.ServerList = append(curPageInfo.ServerList, &PageServerCountInfo{
|
|
|
|
|
RawInfo: serverInfo,
|
|
|
|
|
Offset: serverAccOffset,
|
|
|
|
|
Count: curPageNeedCount,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 切下一个页
|
|
|
|
|
// 置空,等待下一次循环判断来创建
|
|
|
|
|
pageList = append(pageList, curPageInfo)
|
|
|
|
|
curPageInfo = nil
|
|
|
|
|
serverRestCount -= curPageNeedCount
|
|
|
|
|
serverAccOffset += curPageNeedCount
|
|
|
|
|
curPageNeedCount = pageLen
|
|
|
|
|
curPageNo += 1
|
|
|
|
|
|
|
|
|
|
if serverRestCount <= 0 {
|
|
|
|
|
// 当前服务器没有余额了,也要切下一个服务器
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 当前页还不够,切下一个服务器信息
|
|
|
|
|
if curPageInfo == nil {
|
|
|
|
|
curPageInfo = &PageInfo{
|
|
|
|
|
PageNo: curPageNo,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
curPageInfo.Count += serverRestCount
|
|
|
|
|
curPageInfo.ServerList = append(curPageInfo.ServerList, &PageServerCountInfo{
|
|
|
|
|
RawInfo: serverInfo,
|
|
|
|
|
Offset: serverAccOffset,
|
|
|
|
|
Count: serverRestCount,
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
// 切下一个服务器,页面不切
|
|
|
|
|
serverAccOffset += serverRestCount
|
|
|
|
|
curPageNeedCount -= serverRestCount
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if curPageInfo != nil { // 最后一页还没达到数量的
|
|
|
|
|
pageList = append(pageList, curPageInfo)
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type RspData struct {
|
|
|
|
|
Code int `json:"code"`
|
|
|
|
|
Msg string `json:"msg"`
|
|
|
|
|
Data struct {
|
|
|
|
|
List []*ServerInfo `json:"list"`
|
|
|
|
|
} `json:"data"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetRemoteServerInfoList(alisrvAddr string) (ServerInfoList, error) {
|
|
|
|
|
rsp := &RspData{}
|
|
|
|
|
err := httpclient.Request(alisrvAddr+"/server", "get", nil, rsp)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return rsp.Data.List, nil
|
|
|
|
|
}
|