173 lines
5.5 KiB
Go
173 lines
5.5 KiB
Go
package smdl
|
|
|
|
import (
|
|
"admin/apps/game/domain/entity"
|
|
"admin/apps/game/domain/projects/smdl/internal"
|
|
"admin/apps/game/domain/repo"
|
|
"admin/apps/game/model"
|
|
"admin/internal/consts"
|
|
"admin/internal/errcode"
|
|
dto2 "admin/internal/model/dto"
|
|
"admin/lib/xlog"
|
|
"fmt"
|
|
)
|
|
|
|
type ServerHook struct {
|
|
}
|
|
|
|
func (hook *ServerHook) List(projectInfo *entity.Project, resource string, params *dto2.CommonListReq,
|
|
fields []*dto2.CommonDtoFieldDesc, totalCount int, rows []dto2.CommonDtoValues) (
|
|
int, []*dto2.CommonDtoFieldDesc, []dto2.CommonDtoValues, error) {
|
|
alisrvAddr := projectInfo.GetApiAddr()
|
|
if alisrvAddr == "" {
|
|
return 0, nil, nil, errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectInfo.Po.Name)
|
|
}
|
|
|
|
serverInfoList, err := internal.GetRemoteServerInfoList(alisrvAddr)
|
|
if err != nil {
|
|
return 0, nil, nil, err
|
|
}
|
|
|
|
for _, row := range rows {
|
|
var findRemoteServerInfo *internal.ServerInfo
|
|
for _, curRunning := range serverInfoList {
|
|
et := (&entity.CommonResource{}).FromPo(&model.Server{}).FromDto(row)
|
|
if et.ToPo().(*model.Server).ServerConfID == curRunning.ServerId {
|
|
// 运行中,给描述信息添加运行信息
|
|
findRemoteServerInfo = curRunning
|
|
break
|
|
}
|
|
}
|
|
if findRemoteServerInfo != nil {
|
|
row["RunningStatus"] = "运行中"
|
|
row["Ccu"] = findRemoteServerInfo.Ccu
|
|
row["TotalRoleCount"] = findRemoteServerInfo.TotalRoleCount
|
|
row["TotalAccountCount"] = findRemoteServerInfo.TotalAccountCount
|
|
if findRemoteServerInfo.IsServerDown {
|
|
row["IsServerDown"] = "是"
|
|
} else {
|
|
row["IsServerDown"] = "否"
|
|
}
|
|
} else {
|
|
row["RunningStatus"] = "未知"
|
|
row["Ccu"] = 0
|
|
row["TotalRoleCount"] = 0
|
|
row["TotalAccountCount"] = 0
|
|
row["IsWhitelistLogin"] = "否"
|
|
}
|
|
}
|
|
|
|
return totalCount, fields, rows, nil
|
|
}
|
|
|
|
func (hook *ServerHook) RowsSelection(projectInfo *entity.Project, resource string, btnKey string, dtoObjs []dto2.CommonDtoValues) (*dto2.CommonRowsSelectionRsp, error) {
|
|
msg := ""
|
|
serverIds := make([]string, 0, len(dtoObjs))
|
|
|
|
apiAddr := projectInfo.GetApiAddr()
|
|
|
|
allRunningServers, err := getAllRunningServers(projectInfo)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
opHandler := func(serverRunningInfo *internal.ServerInfo) error {
|
|
switch btnKey {
|
|
case consts.BtnKeyGlobal_Server_UpAll, consts.BtnKeyRow_Server_Up:
|
|
err := serverRunningInfo.Up(apiAddr)
|
|
if err != nil {
|
|
xlog.Warnf("操作项目:%v 服务器:%v 起服返回错误:%v", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId, err)
|
|
} else {
|
|
xlog.Warnf("操作项目:%v 服务器:%v 起服成功", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId)
|
|
}
|
|
return err
|
|
case consts.BtnKeyGlobal_Server_DownAll, consts.BtnKeyRow_Server_Down:
|
|
err := serverRunningInfo.Down(apiAddr)
|
|
if err != nil {
|
|
xlog.Warnf("操作项目:%v 服务器:%v 停服返回错误:%v", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId, err)
|
|
} else {
|
|
xlog.Warnf("操作项目:%v 服务器:%v 停服成功", projectInfo.GetProjectPo().ID, serverRunningInfo.ServerId)
|
|
}
|
|
return err
|
|
default:
|
|
return errcode.New(errcode.ParamsInvalid, "unsupport btn key:%v", btnKey)
|
|
}
|
|
}
|
|
|
|
errList := make([]error, 0)
|
|
if len(dtoObjs) == 0 {
|
|
for _, runningServer := range allRunningServers {
|
|
err := opHandler(runningServer)
|
|
if err != nil {
|
|
errList = append(errList, err)
|
|
}
|
|
}
|
|
switch btnKey {
|
|
case consts.BtnKeyGlobal_Server_UpAll:
|
|
msg = "一键起服"
|
|
case consts.BtnKeyGlobal_Server_DownAll:
|
|
msg = "一键停服"
|
|
}
|
|
} else {
|
|
for _, dtoObj := range dtoObjs {
|
|
serverId := dtoObj["ServerConfID"].(string)
|
|
serverRunningInfo := allRunningServers.FindByID(serverId)
|
|
if serverRunningInfo == nil {
|
|
xlog.Warnf("项目:%v 服务器:%v 处于停服中,跳过操作", projectInfo.Po.Name, serverId)
|
|
continue
|
|
}
|
|
serverIds = append(serverIds, serverId)
|
|
err := opHandler(serverRunningInfo)
|
|
if err != nil {
|
|
errList = append(errList, err)
|
|
}
|
|
}
|
|
switch btnKey {
|
|
case consts.BtnKeyGlobal_Server_UpAll:
|
|
msg = fmt.Sprintf("服务器:%v一键起服", serverIds)
|
|
case consts.BtnKeyGlobal_Server_DownAll:
|
|
msg = fmt.Sprintf("服务器:%v一键停服", serverIds)
|
|
case consts.BtnKeyRow_Server_Up:
|
|
msg = fmt.Sprintf("服务器:%v起服", serverIds)
|
|
case consts.BtnKeyRow_Server_Down:
|
|
msg = fmt.Sprintf("服务器:%v停服", serverIds)
|
|
}
|
|
}
|
|
|
|
return &dto2.CommonRowsSelectionRsp{
|
|
Msg: fmt.Sprintf("执行%v操作成功!", msg),
|
|
NeedRefresh: true,
|
|
}, nil
|
|
}
|
|
|
|
// getAllRunningServers 获取本地配置的服务器列表和远程获取的运行中服务器列表求个交集
|
|
func getAllRunningServers(projectEt *entity.Project) (internal.ServerInfoList, error) {
|
|
alisrvAddr := projectEt.GetApiAddr()
|
|
if alisrvAddr == "" {
|
|
return nil, errcode.New(errcode.ServerError, "项目%v没有配置api服务器地址", projectEt.Po.Name)
|
|
}
|
|
|
|
remoteRunningServers, err := internal.GetRemoteServerInfoList(alisrvAddr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
localConfServers, err := repo.ServerRepoInstance.List(projectEt.Po.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
allRunningServers := make(internal.ServerInfoList, 0, len(localConfServers))
|
|
|
|
for _, localServer := range localConfServers {
|
|
serverInfo := localServer.Po.(*model.Server)
|
|
for _, remoteServer := range remoteRunningServers {
|
|
if serverInfo.ServerConfID == remoteServer.ServerId {
|
|
remoteServer.ProjectId = serverInfo.ProjectId
|
|
allRunningServers = append(allRunningServers, remoteServer)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return allRunningServers, nil
|
|
}
|