liuhaijun e94826ce29 add server
Change-Id: I0760f17f6a01c0121b59fcbfafc666032dbc30af
2024-09-19 09:44:15 +00:00

354 lines
9.8 KiB
Go

package v1
import (
"encoding/base64"
"encoding/json"
"fmt"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/data"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/controller"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/model"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/model/agent"
devc "git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/model/device"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/model/message"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/pkg/errors"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/pkg/request"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/service"
"git.inspur.com/sbg-jszt/cfn/cfn-schedule/internal/validator"
"github.com/gin-gonic/gin"
"strings"
"time"
)
// 每30s的健康检查接口
func CheckHeartBeat(c *gin.Context) {
device := &devc.DeviceInfo{}
err := validator.CheckPostParams(c, device)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
_, err = device.SaveHealth()
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
controller.Success(c, "保存成功!")
}
// 设备基础信息上报
func PushDeviceInfo(c *gin.Context) {
device := &devc.DeviceInfo{}
err := validator.CheckPostParams(c, device)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
_, err = device.SaveBase()
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
controller.Success(c, "保存成功!")
}
type PageBodyDevice struct {
PageInfo *request.PageInfo `json:"pageInfo" binding:"required"`
Name string `json:"name"`
IsNew string `json:"isNew"`
}
// 分页查询设备信息-关联资产属性
func PageDevices(c *gin.Context) {
var pageBody PageBodyDevice
err := c.ShouldBindJSON(&pageBody)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
device := &devc.AssetDeviceInfo{}
fields := map[string]interface{}{}
if pageBody.Name != "" {
fields["pr.name"] = pageBody.Name
}
if pageBody.IsNew != "" {
fields["is_new"] = pageBody.IsNew
}
page := &model.Page[devc.AssetDeviceInfo]{}
page.Covert(pageBody.PageInfo)
err = device.Page(page, fields)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
controller.Success(c, page)
}
// 统计设备升级数统计
func CountDeviceUpgrade(c *gin.Context) {
fields := map[string]interface{}{}
device := &devc.DeviceInfo{}
result, err := device.CountUpgradeNum(fields)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
controller.Success(c, result)
}
// 获取设备基本信息
func GetDeviceInfo(c *gin.Context) {
device := &devc.AssetDeviceInfo{}
serialNo := c.Param("serialNo")
fields := map[string]interface{}{}
fields["serial_no"] = serialNo
asset, err := device.Get(fields)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
controller.Success(c, asset)
}
// 获取设备的组件列表信息
func ListDeviceConfigs(c *gin.Context) {
serialNo := c.Param("serialNo")
device := &devc.AssetDeviceInfo{}
fields := map[string]interface{}{}
fields["serial_no"] = serialNo
_, err := device.Get(fields)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "未找到设备!")
return
}
sub := strings.ReplaceAll(message.TO_AGENT_UNICAST_SUBJECT, "{rid}", serialNo)
dat := message.MsgModel{
Body: nil,
Func: message.FUNC_COMPONENTINFO,
Rid: serialNo,
Version: "v1",
}
payload, _ := json.Marshal(dat)
msg, err := data.Nc.Request(sub, payload, 6*time.Second)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
res, err := message.UnmarshalMsgRespModel(msg.Data)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "无法解析的消息格式!")
return
}
if res.Code != 200 {
controller.FailCode(c, errors.ServerError, err, "小助手消息错误!")
return
}
deStr, err := base64.StdEncoding.DecodeString(fmt.Sprint(res.Data))
result := make([]map[string]interface{}, 0)
json.Unmarshal(deStr, &result)
controller.Success(c, result)
}
// 创建设备升级记录
func CreateDeviceUpgradeRecord(c *gin.Context) {
record := &devc.DeviceUpgradeRecord{}
err := validator.CheckPostParams(c, record)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
_, err = record.Create()
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
controller.Success(c, "")
}
type PageBodyRecord struct {
PageInfo *request.PageInfo `json:"pageInfo" binding:"required"`
}
// 获取设备升级记录
func PageDeviceUpgradeRecord(c *gin.Context) {
var pageBody PageBodyRecord
err := c.ShouldBindJSON(&pageBody)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
serialNo := c.Param("serialNo")
fields := map[string]interface{}{}
fields["serial_no"] = serialNo
record := &devc.DeviceUpgradeRecord{}
page := &model.Page[devc.UpgradeRecord]{}
page.Covert(pageBody.PageInfo)
err = record.Page(page, fields)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
controller.Success(c, page)
}
// 创建设备升级规则
func CreateDeviceUpgradeRule(c *gin.Context) {
rule := &devc.DeviceUpgradeRule{}
err := validator.CheckPostParams(c, rule)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
//企业+一体机类型唯一
fields := map[string]interface{}{}
fields["vendor_id"] = rule.VendorId
rules, err := rule.ListAll(fields)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
if len(rules) > 0 && rule.DeviceType == "0" {
controller.FailCode(c, errors.InvalidParameter, err, "与已有公司规则冲突!")
return
}
for _, r := range rules {
if r.DeviceType == rule.DeviceType || r.DeviceType == "0" {
controller.FailCode(c, errors.InvalidParameter, err, "与已有公司规则冲突!")
return
}
}
num, err := rule.Create()
if err != nil {
controller.FailCode(c, errors.ServerError, err, "创建失败!")
return
}
if num > 0 {
go func(ru devc.DeviceUpgradeRule) {
rules := make([]devc.DeviceUpgradeRule, 0)
rules = append(rules, ru)
if err == nil && len(rules) > 0 {
_ = service.SendUpgradePlans(rules, "create")
}
}(*rule)
}
controller.Success(c, "保存成功!")
}
type PageRule struct {
PageInfo *request.PageInfo `json:"pageInfo" binding:"required"`
VendorId string `json:"vendorId"`
}
// 获取设备升级规则
func PageDeviceUpgradeRule(c *gin.Context) {
var pageBody PageRule
err := c.ShouldBindJSON(&pageBody)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
fields := map[string]interface{}{}
if pageBody.VendorId != "" {
fields["vendor_id"] = pageBody.VendorId
}
rule := &devc.DeviceUpgradeRule{}
page := &model.Page[devc.DeviceUpgradeRule]{}
page.Covert(pageBody.PageInfo)
err = rule.Page(page, fields)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误!")
return
}
controller.Success(c, page)
}
type DeleteUpgradeRuleBody struct {
Ids []int64 `json:"ids" binding:"required"`
}
// 删除设备升级规则
func DeleteDeviceUpgradeRule(c *gin.Context) {
rule := &devc.DeviceUpgradeRule{}
var deleteBody DeleteUpgradeRuleBody
err := c.ShouldBindJSON(&deleteBody)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
rules, err := rule.GetBatch(deleteBody.Ids)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "请检查参数!")
return
}
var num int64
if len(rules) > 0 {
num, err = rule.DeleteBatch(deleteBody.Ids)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "删除失败!")
return
}
}
if num > 0 {
go func(rules []devc.DeviceUpgradeRule) {
_ = service.SendUpgradePlans(rules, "delete")
}(rules)
}
controller.Success(c, "删除成功!")
}
// 触发升级命令
func DoDeviceUpgrade(c *gin.Context) {
serialNo := c.Param("serialNo")
device := &devc.AssetDeviceInfo{}
fields := map[string]interface{}{}
fields["serial_no"] = serialNo
d, err := device.Get(fields)
if err != nil {
controller.FailCode(c, errors.InvalidParameter, err, "未找到设备!")
return
}
aget := &agent.AgentInfo{}
agents, err := aget.ListLastVersion()
if err != nil {
controller.FailCode(c, errors.ServerError, err, "未查询到最新版本!")
return
}
for _, a := range agents {
if strings.ToLower(a.OsType) == strings.ToLower(d.OsType) && strings.ToLower(a.ArchType) == strings.ToLower(d.ArchType) {
aget = &a
break
}
}
plan, err := service.GetUpgradeCommandNow(aget)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "未找到小助手包!")
return
}
body, _ := json.Marshal(plan)
dat := message.MsgModel{
Body: body,
Func: message.FUNC_UPGRADEIMMEDIATELY,
Rid: serialNo,
Version: "v1",
}
payload, _ := json.Marshal(dat)
sub := strings.ReplaceAll(message.TO_AGENT_UNICAST_SUBJECT, "{rid}", serialNo)
msg, err := data.Nc.Request(sub, payload, 6*time.Second)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "内部错误,下发通知失败!")
return
}
res, err := message.UnmarshalMsgRespModel(msg.Data)
if err != nil {
controller.FailCode(c, errors.ServerError, err, "消息格式错误,下发通知失败!")
return
}
if res.Code != 200 {
controller.FailCode(c, errors.ServerError, err, "下发通知失败!")
return
}
controller.Success(c, "已通知,自动升级!")
}