package controllers
|
|
import (
|
"basic.com/valib/bhomeclient.git"
|
"basic.com/valib/bhomedbapi.git"
|
"basic.com/valib/logger.git"
|
"context"
|
"encoding/json"
|
"github.com/satori/go.uuid"
|
"nanomsg.org/go-mangos"
|
"nanomsg.org/go-mangos/protocol/rep"
|
"nanomsg.org/go-mangos/transport/ipc"
|
"nanomsg.org/go-mangos/transport/tcp"
|
"strconv"
|
"time"
|
"vamicro/devicemanage-service/broadcast"
|
"vamicro/devicemanage-service/models"
|
"vamicro/devicemanage-service/service"
|
"vamicro/devicemanage-service/vo"
|
)
|
|
type DeviceController struct {
|
|
}
|
|
//搜索设备
|
func (dc *DeviceController) Search(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
nodes, err := broadcast.BroadCast()
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
if nodes == nil {
|
nodes = make([]string, 0)
|
}
|
return &bhomeclient.Reply{ Success: true, Data: nodes}
|
}
|
|
//申请添加设备
|
func (dc *DeviceController) AddApply(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
type addApplyArg struct {
|
Key string `json:"key"`
|
DevId string `json:"devId"`
|
Ip string `json:"ip"`
|
}
|
var reqBody addApplyArg
|
err := c.BindJSON(&reqBody)
|
if err != nil || reqBody.Key == "" || reqBody.DevId == "" || reqBody.Ip == "" {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
var da models.DeviceApply
|
i,e := da.FindByDevId(reqBody.DevId)
|
if e != nil || i == 0 { //未申请添加过此设备
|
da.Id = uuid.NewV4().String()
|
da.DevId = reqBody.DevId
|
da.CreateTime = time.Now().Format("2006-01-02 15:04:05")
|
da.ApplyKey = reqBody.Key
|
da.Ip = reqBody.Ip
|
da.Status = models.ApplyStatus_Sending
|
if da.Insert() {
|
return &bhomeclient.Reply{ Success: true, Msg: "添加成功"}
|
} else {
|
return &bhomeclient.Reply{ Success: true, Msg: "添加失败"}
|
}
|
} else if da.Status == models.ApplyStatus_Reject { //已被拒绝的请求,可以重新发起申请
|
if da.UpdateStatus(models.ApplyStatus_Sending, da.Id) {
|
return &bhomeclient.Reply{ Success: true, Msg: "操作成功"}
|
} else {
|
return &bhomeclient.Reply{ Msg: "重新发送请求失败"}
|
}
|
}
|
|
return &bhomeclient.Reply{ Msg: "已添加对此设备的申请"}
|
}
|
|
func RecvApprove(ctx context.Context) {
|
url := "0.0.0.0:"+strconv.Itoa(4012)
|
var sock mangos.Socket
|
var err error
|
var msg []byte
|
if sock, err = rep.NewSocket(); err != nil {
|
logger.Debug("new applyApprove socket err:", err)
|
}
|
sock.AddTransport(ipc.NewTransport())
|
sock.AddTransport(tcp.NewTransport())
|
if err = sock.Listen(url); err != nil {
|
logger.Debug("listen on applyApprove socket err:", err)
|
}
|
|
for {
|
select {
|
case <-ctx.Done():
|
logger.Debug("ctx done")
|
return
|
default:
|
msg, err = sock.Recv()
|
if err != nil {
|
continue
|
}
|
|
if len(msg) > 0 {
|
apply := dealApprove(msg)
|
ret, _ := json.Marshal(*apply)
|
retErr := sock.Send(ret)
|
if retErr != nil {
|
logger.Debug("retErr:", retErr)
|
}
|
} else {
|
time.Sleep(time.Millisecond*100)
|
}
|
}
|
}
|
}
|
|
func dealApprove(msg []byte) *bhomeclient.Reply {
|
type approveArg struct {
|
DevId string `json:"devId"` //设备id
|
Status int `json:"status"` //-1表示拒绝,1:表示通过
|
}
|
|
var reqBody approveArg
|
err := json.Unmarshal(msg, &reqBody)
|
if err != nil || reqBody.Status < models.ApplyStatus_Reject || reqBody.Status > models.ApplyStatus_Agreed {
|
return &bhomeclient.Reply{ Msg: "请求参数有误"}
|
}
|
var da models.DeviceApply
|
i, _ := da.FindByDevId(reqBody.DevId)
|
if i == 0 {
|
return &bhomeclient.Reply{ Msg: reqBody.DevId+"的申请请求已不存在,请检查" }
|
}
|
if da.Status != models.ApplyStatus_Waiting {
|
return &bhomeclient.Reply{ Msg: "当前此设备id不是申请状态,请检查" }
|
}
|
if da.UpdateStatus(reqBody.Status, da.Id) {
|
return &bhomeclient.Reply{ Success: true, Msg: "操作成功"}
|
}
|
|
return &bhomeclient.Reply{ Msg: "操作失败"}
|
}
|
|
//其他节点通过申请或者拒绝申请
|
func (dc *DeviceController) ApplyApprove(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
return &bhomeclient.Reply{ Msg: "building..."}
|
}
|
|
//func (dc *DeviceController) SyncDevToManager(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
// var reqBody sysVo.SyncDevInfo
|
// err := c.BindJSON(&reqBody)
|
// if err != nil {
|
// return &bhomeclient.Reply{ Msg: err.Error() }
|
// }
|
//
|
// return &bhomeclient.Reply{ Data: reqBody }
|
//}
|
|
//设备归类统计,分全部设备、集群xx设备、未加入集群
|
func (dc *DeviceController) Types(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
type devStatistic struct {
|
Name string `json:"name"`
|
DevCount int `json:"devCount"`
|
SdkCount int `json:"sdkCount"`
|
Percent string `json:"percent"`
|
ClusterId string `json:"clusterId"`
|
Type int `json:"type"`
|
}
|
list := make([]devStatistic, 0)
|
//1.统计全部设备
|
total := devStatistic{
|
Name: "全部设备",
|
DevCount: 100,
|
SdkCount: 45,
|
Percent: "80%",
|
Type: 0,
|
}
|
list = append(list, total)
|
//2.按集群统计
|
var d models.Device
|
devCts := d.GroupByCluster()
|
if devCts != nil {
|
for _,g := range devCts {
|
ds := devStatistic{
|
Name: g.ClusterName,
|
ClusterId: g.ClusterId,
|
DevCount: g.Count,
|
SdkCount: 0,
|
Percent: "70%",
|
Type: 1,
|
}
|
list = append(list, ds)
|
}
|
}
|
//3.未加入集群设备
|
ns := devStatistic{
|
Name: "未加入集群",
|
DevCount: 0,
|
SdkCount: 0,
|
Percent: "10%",
|
Type: 2,
|
}
|
list = append(list, ns)
|
|
return &bhomeclient.Reply{ Success: true, Data: list}
|
}
|
|
//通过不同类别获取设备列表,分页
|
func (dc *DeviceController) PageByType(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
type PageDevArg struct {
|
Type int `json:"type"` //类型
|
ClusterId string `json:"clusterId"` //集群id
|
Status int `json:"status"` //状态 0:全部,1:在线,-1:离线
|
Page int `json:"page"`
|
Size int `json:"size"`
|
InputTxt string `json:"inputTxt"`
|
}
|
var reqBody PageDevArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg:err.Error()}
|
}
|
if reqBody.Page <= 0 {
|
reqBody.Page = 1
|
}
|
if reqBody.Size <= 0 {
|
reqBody.Size = 8
|
}
|
var d models.Device
|
if reqBody.Type == 0 { //全部设备
|
list, err := d.PageAllDev(reqBody.Page, reqBody.Size, reqBody.Status, reqBody.InputTxt)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
return &bhomeclient.Reply{ Success: true, Data: list}
|
} else if reqBody.Type == 1 || reqBody.Type == 2 { //按集群统计
|
list, err := d.PageDevByCluster(reqBody.Page, reqBody.Size, reqBody.ClusterId, reqBody.Status, reqBody.InputTxt)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
return &bhomeclient.Reply{ Success: true, Data: list}
|
}
|
|
return nil
|
}
|
|
//获取设备详情
|
func (dc *DeviceController) Detail(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
devId := c.Query("devId")
|
logger.Debug("Detail devId:", devId)
|
var d models.Device
|
i, e := d.FindByDevId(devId)
|
if e == nil && i > 0 {
|
detail := vo.DevDetail{}
|
pd,_ := vo.CopyDeviceFromModel(d)
|
detail.Device = pd
|
detail.Sdks = getSdkDetailsByDevId(d.DevId)
|
detail.Apps = getAppDetailsByDevId(d.DevId)
|
|
|
return &bhomeclient.Reply{ Success:true, Data: detail }
|
} else {
|
return &bhomeclient.Reply{ Msg:"未找到此设备的相关信息"}
|
}
|
}
|
|
func getSdkDetailsByDevId(devId string) []vo.SdkDetail {
|
arr := make([]vo.SdkDetail, 0)
|
|
var sdkApi bhomedbapi.SdkApi
|
sdkMap := sdkApi.FindAllMap()
|
|
var ds models.DeviceSdk
|
list, _ := ds.FindByMachineCode("", devId)
|
if list != nil {
|
for _,s :=range list {
|
if v,ok := sdkMap[s.SdkId]; ok {
|
sd := vo.SdkDetail{}
|
sd.Sdk = v
|
sd.InstallTime = s.InstallTime
|
sd.ExpireTime = s.ExpireTime
|
sd.ActivateCode = s.ActivateCode
|
arr = append(arr, sd)
|
}
|
}
|
}
|
return arr
|
}
|
|
func getAppDetailsByDevId(devId string) []vo.AppDetail {
|
arr := make([]vo.AppDetail, 0)
|
|
var appApi bhomedbapi.AppApi
|
appMap := appApi.FindAppMap()
|
|
var da models.DeviceApp
|
list, _ := da.FindByMachineCode("", devId)
|
if list != nil {
|
for _,s :=range list {
|
if v,ok := appMap[s.AppId]; ok {
|
ad := vo.AppDetail{}
|
ad.App = v
|
ad.InstallTime = s.InstallTime
|
ad.ExpireTime = s.ExpireTime
|
ad.ActivateCode = s.ActivateCode
|
arr = append(arr, ad)
|
}
|
}
|
}
|
return arr
|
}
|
|
|
//控制远程设备创建集群
|
func (dc *DeviceController) RemoteCreateCluster(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody vo.CreateClusterArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
|
r,err := service.RemoteCreateCluster(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error() }
|
}
|
|
//控制远程设备搜索集群
|
func (dc *DeviceController) RemoteSearchCluster(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody vo.SearchClusterArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
r, err := service.RemoteSearchCluster(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error() }
|
}
|
|
//获取远程设备搜索到的设备列表
|
func (dc *DeviceController) RemoteGetSearchNodes(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
var reqBody vo.GetSearchNodesArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
r,err := service.RemoteGetSearchNodes(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{Msg: err.Error()}
|
}
|
|
//加入集群
|
func (dc *DeviceController) RemoteJoinCluster(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
var reqBody vo.JoinClusterArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
r,err := service.RemoteJoinCluster(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
|
//设备重启
|
func (dc *DeviceController) RemoteReboot(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
var reqBody vo.RebootArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
r,err := service.RemoteReboot(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
|
//移除设备
|
func (dc *DeviceController) RemoteRemove(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
|
return nil
|
}
|
|
//卸载算法或者应用
|
func (dc *DeviceController) RemoteUninstall(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
var reqBody vo.UninstallArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
r,err := service.RemoteUninstall(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
|
//升级算法或者应用
|
func (dc *DeviceController) RemoteUpgrade(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
var reqBody vo.UpgradeArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
r,err := service.RemoteUpgrade(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|
|
//系统更新
|
func (dc *DeviceController) RemoteSysUpdate(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply{
|
var reqBody vo.SysUpdateArg
|
err := c.BindJSON(&reqBody)
|
if err != nil {
|
return &bhomeclient.Reply{ Msg: "参数有误"}
|
}
|
|
r,err := service.RemoteSysUpdate(reqBody)
|
if err == nil {
|
return r
|
}
|
return &bhomeclient.Reply{ Msg: err.Error()}
|
}
|