From 1b34d7bacad94933ad63fc0e199bd32ac49d9fa5 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期二, 05 九月 2023 10:00:00 +0800 Subject: [PATCH] 修复编译 --- devicemanage-service/models/device.go | 137 +++++ devicemanage-service/controllers/device.go | 428 +++++++++++++++ system-service/service/busRequest.go | 141 +++++ devicemanage-service/service/device.go | 189 +++++++ devicemanage-service/models/deviceSdk.go | 85 +++ devicemanage-service/models/db.go | 32 + devicemanage-service/main.go | 134 ++++ devicemanage-service/models/deviceApp.go | 69 ++ devicemanage-service/models/deviceApply.go | 69 ++ devicemanage-service/service/ctrl.go | 61 ++ devicemanage-service/vo/ctrl.go | 47 + devicemanage-service/vo/device.go | 40 + system-service/service/toNode.go | 80 ++ devicemanage-service/Makefile | 7 devicemanage-service/broadcast/client.go | 79 ++ system-service/controllers/syssetconf.go | 3 16 files changed, 1,599 insertions(+), 2 deletions(-) diff --git a/devicemanage-service/Makefile b/devicemanage-service/Makefile new file mode 100644 index 0000000..9d3abe8 --- /dev/null +++ b/devicemanage-service/Makefile @@ -0,0 +1,7 @@ +BUILD_VERSION := 1.1.1 +#APP_NAME := myversion + +include ../module.dep + + + diff --git a/devicemanage-service/broadcast/client.go b/devicemanage-service/broadcast/client.go new file mode 100644 index 0000000..66e255b --- /dev/null +++ b/devicemanage-service/broadcast/client.go @@ -0,0 +1,79 @@ +package broadcast + +import ( + "fmt" + "github.com/gogf/greuse" + "strconv" + "strings" + "sync" + "time" +) + +var ( + port = 31995 + lport = 31996 + + lock sync.Mutex //鍚屼竴鏃跺埢鍙兘鏈変竴涓嚎绋嬪湪鎵ц鎼滅储 +) + + +//骞挎挱鏀堕泦鍏朵粬鑺傜偣淇℃伅 +func BroadCast() ([]string, error) { + lock.Lock() + defer lock.Unlock() + + retCh := make(chan []string) + go startRecv(retCh) + + conn, err := greuse.Dial("udp", "0.0.0.0:"+strconv.Itoa(lport), "255.255.255.255:"+strconv.Itoa(port)) + + if err != nil { + fmt.Println("err:", err) + } else { + defer conn.Close() + + n,err := conn.Write([]byte("who are you?")) + if err != nil || n == 0 { + fmt.Println("conn.Write err:", err, " n:", n) + } + } + + nodes := <-retCh + + return nodes, nil +} + +func startRecv(rCh chan []string) { + conn, err := greuse.ListenPacket("udp", "0.0.0.0:"+strconv.Itoa(lport)) + + if err != nil { + fmt.Println("startRecv ListenPacket err:", err) + rCh <- []string{} + return + } + //10绉掗挓涔嬪唴鏀跺埌鐨勮繑鍥烇紝鍗宠涓烘槸鍦ㄧ嚎鐨� + conn.SetReadDeadline(time.Now().Add(time.Second * 1)) + ch := time.After(time.Second * 4) + var nodes []string +Loop: + for { + select { + case <-ch: + fmt.Println("<-ch") + break Loop + default: + ret := make([]byte, 1024) + n, from, e := conn.ReadFrom(ret) + if e == nil && n >0 { + arr := strings.Split(from.String(), ":") + if len(arr) == 2 { + nodes = append(nodes, arr[0]) + } + fmt.Println("read message from udp:", string(ret), " from:", from) + } else { + time.Sleep(time.Millisecond * 100) + } + } + } + rCh <- nodes +} diff --git a/devicemanage-service/controllers/device.go b/devicemanage-service/controllers/device.go new file mode 100644 index 0000000..60045bf --- /dev/null +++ b/devicemanage-service/controllers/device.go @@ -0,0 +1,428 @@ +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: "褰撳墠姝よ澶噄d涓嶆槸鐢宠鐘舵�侊紝璇锋鏌�" } + } + 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 } +//} + +//璁惧褰掔被缁熻锛屽垎鍏ㄩ儴璁惧銆侀泦缇x璁惧銆佹湭鍔犲叆闆嗙兢 +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()} +} \ No newline at end of file diff --git a/devicemanage-service/main.go b/devicemanage-service/main.go new file mode 100644 index 0000000..598baeb --- /dev/null +++ b/devicemanage-service/main.go @@ -0,0 +1,134 @@ +package main + +import ( + "basic.com/valib/bhomeclient.git" + "basic.com/valib/bhomedbapi.git" + "basic.com/valib/logger.git" + "basic.com/valib/version.git" + "context" + "flag" + "os" + "os/signal" + "syscall" + "time" + "vamicro/config" + "vamicro/devicemanage-service/controllers" + "vamicro/devicemanage-service/models" + "vamicro/devicemanage-service/service" +) + +var ( + procName = "devicemanage-service" + proc = &bhomeclient.ProcInfo{ + Name: procName, //杩涚▼鍚嶇О + ID: procName, //杩涚▼id + Info: "", //杩涚▼鐨勬弿杩颁俊鎭紝鐢ㄤ簬鍖哄垎鍚屼竴杩涚▼鍚嶇О涓嬪涓繘绋� + } + env = flag.String("e", "pro", "") +) + +func init() { + flag.Parse() + vaversion.Usage() + + config.Init(*env) + // 鏃ュ織鍒濆鍖� + var logFile = config.LogConf.Path + "vamicro-"+procName+".log" + logger.InitLogger(logFile, config.LogConf.Level, config.LogConf.MaxSize, config.LogConf.MaxBackups, config.LogConf.MaxAge) + logger.Info("log init success !") +} + +func main(){ + flag.Parse() + + models.Init() + defer models.CloseDB() + ctx, cancel := context.WithCancel(context.Background()) + fm,pubTopics := initFuncMap() + var reg = &bhomeclient.RegisterInfo { + Proc: *proc, + Channel: nil, + PubTopic: pubTopics, + SubTopic: []string{ service.CollectDeviceTopic }, + } + + q := make(chan os.Signal, 1) + signal.Notify(q, os.Interrupt, os.Kill, syscall.SIGTERM) + + ms, err := bhomeclient.NewMicroNode(ctx, q, config.Server.AnalyServerId, reg, logger.Debug) + if err !=nil { + return + } + bhomedbapi.InitLog(logger.Debug) + bhomedbapi.InitGetNetNode(ms.GetLocalNetNodeByTopic) + bhomedbapi.InitDoReq(ms.RequestOnly) + + go dealSubMsg(ctx, ms) + go testPubNetMsg(ms) + + go ms.StartServer(fm) + service.DealApply() + go controllers.RecvApprove(ctx) + + <-q + ms.DeRegister() + cancel() + ms.Free() +} + +//娴嬭瘯鍙戝竷鍏ㄧ綉娑堟伅 +func testPubNetMsg(ms *bhomeclient.MicroNode) { + netTopic := "globalPublishTopic" + tk := time.NewTicker(3 * time.Second) + for { + select { + case <-tk.C: + pmsg := []byte("hello world"+time.Now().Format("2006-01-02 15:04:05")) + n := ms.PublishNetTimeout(nil, netTopic, pmsg, 1000) + logger.Debug("PublishNetTimeOut n:", n) + default: + time.Sleep(1* time.Second) + } + } +} + +//澶勭悊璁㈤槄娑堟伅 +func dealSubMsg(ctx context.Context, ms *bhomeclient.MicroNode) { + for { + select { + case <-ctx.Done(): + return + case msg := <-ms.SubCh: + logger.Debug("recv sub msg topic:", string(msg.Topic), " data:", string(msg.Data)) + if string(msg.Topic) == service.CollectDeviceTopic { + service.CollectManageDeviceInfo(msg.Data) + } + } + } +} + +const urlPrefix= "/data/api-v" +func initFuncMap() (map[string]bhomeclient.MicroFunc,[]string) { + m := make(map[string]bhomeclient.MicroFunc) + dc := new(controllers.DeviceController) + m[urlPrefix+"/device/search"] = dc.Search + m[urlPrefix+"/device/addApply"] = dc.AddApply + m[urlPrefix+"/device/applyApprove"] = dc.ApplyApprove + m[urlPrefix+"/device/types"] = dc.Types + m[urlPrefix+"/device/pageByType"] = dc.PageByType + m[urlPrefix+"/device/detail"] = dc.Detail + m[urlPrefix+"/device/remoteCreateCluster"] = dc.RemoteCreateCluster + m[urlPrefix+"/device/remoteSearchCluster"] = dc.RemoteSearchCluster + m[urlPrefix+"/device/remoteJoinCluster"] = dc.RemoteJoinCluster + m[urlPrefix+"/device/remoteReboot"] = dc.RemoteReboot + m[urlPrefix+"/device/remoteRemove"] = dc.RemoteRemove + m[urlPrefix+"/device/remoteUninstall"] = dc.RemoteUninstall + m[urlPrefix+"/device/remoteUpgrade"] = dc.RemoteUpgrade + m[urlPrefix+"/device/remoteSysUpdate"] = dc.RemoteSysUpdate + + var pubTopics []string + for key,_ := range m { + pubTopics = append(pubTopics, key) + } + return m, pubTopics +} diff --git a/devicemanage-service/models/db.go b/devicemanage-service/models/db.go new file mode 100644 index 0000000..5f56d2b --- /dev/null +++ b/devicemanage-service/models/db.go @@ -0,0 +1,32 @@ +package models + +import ( + "basic.com/valib/logger.git" + "github.com/jinzhu/gorm" + _ "github.com/jinzhu/gorm/dialects/sqlite" + "vamicro/config" +) + +var db *gorm.DB +var err error + +// Init creates a connection to mysql database and +// migrates any new models +func Init() { + db, err = gorm.Open(config.DBconf.Name, "../config/devicemanage-service.db") + if err != nil { + logger.Debug("db open error ", err) + } + db.LogMode(true) + //db.SetLogger(&DbLogger{}) + db.AutoMigrate(&DeviceApply{}) +} + +//GetDB ... +func GetDB() *gorm.DB { + return db +} + +func CloseDB() { + db.Close() +} diff --git a/devicemanage-service/models/device.go b/devicemanage-service/models/device.go new file mode 100644 index 0000000..29f7dd5 --- /dev/null +++ b/devicemanage-service/models/device.go @@ -0,0 +1,137 @@ +package models + +import "strconv" + +type Device struct { + Id string `gorm:"primary_key;column:id" json:"id"` + DevId string `gorm:"column:devId;unique;not null;" json:"devId"` //璁惧id + DevType string `gorm:"column:devType" json:"devType"` //璁惧绫诲瀷锛屽锛氬瓨鍌ㄣ�佸垎鏋�(鐩掑瓙鎴朼md鏈嶅姟鍣�)銆佸垎鏋愬瓨鍌ㄤ竴浣� + DevMode string `gorm:"column:devMode" json:"devMode"` //璁惧鍨嬪彿,濡傦細Bsk-JS1000X + DevName string `gorm:"column:devName" json:"devName"` //璁惧鍚嶇О + MachineCode string `gorm:"column:machineCode" json:"machineCode"` //鏈哄櫒鐮� + ActivateCode string `gorm:"column:activateCode" json:"activateCode"` //婵�娲荤爜 + ProductId string `gorm:"column:productId" json:"productId"` //浜у搧id + UserId string `gorm:"column:userId" json:"userId"` //鐢ㄦ埛id + Address string `gorm:"column:address" json:"address"` //鍦板潃 + DevIp string `gorm:"column:devIp" json:"devIp"` //ip + DevCpu string `gorm:"column:devCpu" json:"devCpu"` //cpu + DevGpu string `gorm:"column:devGpu" json:"devGpu"` //gpu + Mem int `gorm:"column:mem" json:"mem"` //鍐呭瓨 + Disk string `gorm:"column:disk" json:"disk"` //纭洏 + ChannelCount int `gorm:"column:channelCount;default:16" json:"channelCount"` //绠楀姏鏁伴噺 + MasterVersion string `gorm:"column:masterVersion" json:"masterVersion"` //涓绘帶鐗堟湰 + WebVersion string `gorm:"column:webVersion" json:"webVersion"` //web鐗堟湰 + ServerPort string `gorm:"column:serverPort" json:"serverPort"` //绔彛锛氶粯璁�7003 + SubMask string `gorm:"column:subMask" json:"subMask"` //瀛愮綉鎺╃爜 + Gateway string `gorm:"column:gateway" json:"gateway"` //缃戝叧 + Dns string `gorm:"column:dns" json:"dns"` //dns + Runtime string `gorm:"column:runtime" json:"runtime"` //杩愯鏃堕暱 + + InstallTime string `gorm:"column:installTime" json:"installTime"` //瀹夎鏃堕棿 + FirstUseTime string `gorm:"column:firstUseTime" json:"firstUseTime"` //棣栨浣跨敤鏃堕棿 + + //闆嗙兢鐩稿叧淇℃伅 + ClusterId string `gorm:"column:clusterId" json:"clusterId"` //闆嗙兢id + ClusterName string `gorm:"column:clusterName" json:"clusterName"` //闆嗙兢鍚嶇О + Status int `gorm:"column:status;default:0;" json:"status"` //鐘舵�� -1:绂荤嚎, 1:鍦ㄧ嚎 + + CreateTime string `gorm:"column:createTime" json:"createTime"` //璁板綍鏃堕棿 + UpdateTime string `gorm:"column:updateTime" json:"updateTime"` //鏇存柊鏃堕棿 +} + +const ( + DevStatus_OnLine = 1 //鍦ㄧ嚎 + DevStatus_OffLine = -1 //绂荤嚎 +) + +func (Device) TableName() string { + return "t_device" +} + +func (d *Device) Insert() bool { + result := db.Table(d.TableName()).Create(&d) + if result.Error !=nil { + return false + } + return result.RowsAffected>0 +} + +func (d *Device) Update() bool { + result := db.Table(d.TableName()).Update(&d) + if result.Error !=nil { + return false + } + return result.RowsAffected>0 +} + +func (d *Device) SelectById(id string) (int64, error){ + result := db.Table(d.TableName()).Where("id=?",id).First(&d) + if result.Error != nil || result.RowsAffected == 0 { + return 0, err + } + return result.RowsAffected, nil +} + +func (d *Device) FindByDevId(devId string) (int64,error) { + result := db.Table(d.TableName()).Where("devId=?", devId).First(&d) + if result.Error != nil || result.RowsAffected == 0 { + return 0, result.Error + } + return result.RowsAffected, nil +} + +func (d *Device) FindAll() (list []Device){ + if err:=db.Table(d.TableName()).Scan(&list).Error;err !=nil{ + return nil + } + return list +} + +type DevClusterGroup struct { + ClusterId string `json:"clusterId"` //闆嗙兢id + ClusterName string `json:"clusterName"` //闆嗙兢鍚嶇О + Count int `json:"count"` //鏁伴噺 +} +func (d *Device) GroupByCluster() (list []DevClusterGroup) { + err := db.Raw("select clusterId,clusterName,count(1) as count from "+d.TableName()+" where clusterId!='' group by clusterId,clusterName order by clusterId asc").Scan(&list).Error + if err != nil { + return nil + } + return list +} + +func (d *Device) PageAllDev(page int, size int, status int, inputTxt string) (list []Device, err error) { + sql := "select * from "+d.TableName()+" where 1=1" + from := (page-1)*size + if inputTxt != "" { + sql += " and devName like '%"+inputTxt+"%'" + } + if status == DevStatus_OnLine || status == DevStatus_OffLine { + sql += " and status="+strconv.Itoa(status) + } + sql += " order by createTime limit "+strconv.Itoa(from)+","+strconv.Itoa(size)+"" + err = db.Raw(sql).Scan(&list).Error + if err != nil { + return nil, err + } + return +} + +func (d *Device) PageDevByCluster(page int, size int, clusterId string, status int, inputTxt string) (list []Device, err error) { + sql := "select * from "+d.TableName()+" where 1=1 and clusterId='"+clusterId+"'" + from := (page-1)*size + if inputTxt != "" { + sql += " and devName like '%"+inputTxt+"%'" + } + if status == DevStatus_OnLine || status == DevStatus_OffLine { + sql += " and status="+strconv.Itoa(status) + } + + sql += " order by createTime desc limit "+strconv.Itoa(from)+","+strconv.Itoa(size)+"" + err = db.Raw(sql).Scan(&list).Error + if err != nil { + return nil, err + } + return + +} diff --git a/devicemanage-service/models/deviceApp.go b/devicemanage-service/models/deviceApp.go new file mode 100644 index 0000000..e65d84c --- /dev/null +++ b/devicemanage-service/models/deviceApp.go @@ -0,0 +1,69 @@ +package models + +type DeviceApp struct { + Id string `gorm:"column:id;primary_key;type:varchar(50);unique;not null;" json:"id"` + DevId string `gorm:"column:devId" json:"devId"` + MachineCode string `gorm:"column:machineCode" json:"machineCode"` + ActivateCode string `gorm:"column:activateCode" json:"activateCode"` + AppId string `gorm:"column:appId" json:"appId"` + ExpireTime string `gorm:"column:expireTime" json:"expireTime"` //婵�娲绘椂闂� + InstallTime string `gorm:"column:installTime" json:"installTime"` //瀹夎鏃堕棿 + + AppName string `gorm:"column:appName" json:"appName"` //姹囨�诲睍鐜板埌椤甸潰涓婏紝姝よ繘绋嬫棤娉曡幏鍙朼pp鍜宻dks琛ㄤ俊鎭� + IconBlob string `gorm:"column:iconBlob" json:"iconBlob"` + Version string `gorm:"column:version" json:"version"` + IsDefault bool `gorm:"column:isDefault" json:"isDefault"` + Upgrade bool `gorm:"column:upgrade" json:"upgrade"` +} + +func (DeviceApp) TableName() string { + return "t_device_app" +} + +func (da *DeviceApp) Insert() bool { + result := db.Table(da.TableName()).Create(&da) + if result.Error == nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (da *DeviceApp) SelectById(id string) (int64, error){ + result := db.Table(da.TableName()).Where("id=?",id).First(&da) + if result.Error != nil || result.RowsAffected == 0 { + return 0, err + } + return result.RowsAffected, nil +} + +func (da *DeviceApp) Update() bool { + result := db.Table(da.TableName()).Where("id=?", da.Id).Update(&da) + if result.Error ==nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (da *DeviceApp) DeleteById(id string) bool { + result := db.Exec("delete from "+da.TableName()+" where id='"+id+"'") + if result.Error == nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (da *DeviceApp) FindByActivateCode(activateCode string) (list []DeviceApp, err error) { + result := db.Table(da.TableName()).Where("activateCode=?", activateCode).Find(&list) + if result.Error != nil { + return []DeviceApp{},result.Error + } + return list, nil +} + +func (da *DeviceApp) FindByMachineCode(machineCode string, serverId string) (list []DeviceApp, err error) { + result := db.Table(da.TableName()).Where("machineCode=? or devId=?", machineCode, serverId).Order("installTime desc").Find(&list) + if result.Error != nil { + return []DeviceApp{},result.Error + } + return list, nil +} \ No newline at end of file diff --git a/devicemanage-service/models/deviceApply.go b/devicemanage-service/models/deviceApply.go new file mode 100644 index 0000000..71cadec --- /dev/null +++ b/devicemanage-service/models/deviceApply.go @@ -0,0 +1,69 @@ +package models + +//璁惧娣诲姞鐢宠璁板綍 +type DeviceApply struct { + Id string `gorm:"column:id;primary_key;type:varchar(50);unique;not null;" json:"id"` + DevId string `gorm:"column:devId;unique;not null;" json:"devId"` + DevName string `gorm:"column:devName" json:"devName"` + ApplyKey string `gorm:"column:applyKey" json:"applyKey"` + Ip string `gorm:"column:ip" json:"ip"` + CreateTime string `gorm:"column:createTime" json:"createTime"` + Status int `gorm:"column:status;default:0;" json:"status"` //鐘舵�� 0锛氬凡娣诲姞锛屽緟鍙戦�佺粰瀵规柟 1锛氬凡鎴愬姛鍙戦�佽姹傚埌瀵规柟锛岀瓑寰呭弽棣堛�� 2锛氬鏂瑰凡鍚屾剰 -2:瀵规柟宸叉嫆缁� +} + +const ( + ApplyStatus_KeyErr = -2 //瀵嗛挜閿欒 + ApplyStatus_Reject = -1 //宸叉嫆缁� + ApplyStatus_Sending = 0 //绛夊緟鍙戦�佺粰瀵规柟 + ApplyStatus_Waiting = 1 //绛夊緟鍝嶅簲 + ApplyStatus_Agreed = 2 //宸插悓鎰� + ApplyStatus_Managed = 3 //宸插浜庣鐞嗙姸鎬� +) + +func (DeviceApply) TableName() string { + return "t_device_apply" +} + +func (da *DeviceApply) Insert() bool { + result := db.Table(da.TableName()).Create(&da) + if result.Error == nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (da *DeviceApply) FindByDevId(devId string) (int64,error) { + result := db.Table(da.TableName()).Where("devId=?", devId).First(&da) + if result.Error != nil || result.RowsAffected == 0 { + return 0, result.Error + } + return result.RowsAffected, nil +} + +func (da *DeviceApply) Update() bool { + result := db.Table(da.TableName()).Where("id=?", da.Id).Update(&da) + if result.Error ==nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (da *DeviceApply) DeleteById(id string) bool { + result := db.Exec("delete from "+da.TableName()+" where id='"+id+"'") + if result.Error == nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (da *DeviceApply) FindByStatus(status int) (list []DeviceApply) { + err := db.Table(da.TableName()).Where("status=?", status).Find(&list).Error + if err != nil { + return nil + } + return list +} + +func (da *DeviceApply) UpdateStatus(status int, id string) bool { + return db.Exec("update "+da.TableName()+" set status=? where id=?", status, id).RowsAffected >0 +} \ No newline at end of file diff --git a/devicemanage-service/models/deviceSdk.go b/devicemanage-service/models/deviceSdk.go new file mode 100644 index 0000000..9506ef5 --- /dev/null +++ b/devicemanage-service/models/deviceSdk.go @@ -0,0 +1,85 @@ +package models + +type DeviceSdk struct { + Id string `gorm:"column:id;primary_key;type:varchar(50);unique;not null;" json:"id"` + DevId string `gorm:"column:devId" json:"devId"` + MachineCode string `gorm:"column:machineCode" json:"machineCode"` + ActivateCode string `gorm:"column:activateCode" json:"activateCode"` + SdkId string `gorm:"column:sdkId" json:"sdkId"` + ExpireTime string `gorm:"column:expireTime" json:"expireTime"` + InstallTime string `gorm:"column:installTime" json:"installTime"` //瀹夎鏃堕棿 + + SdkName string `gorm:"column:sdkName" json:"sdkName"` + IconBlob string `gorm:"column:iconBlob" json:"iconBlob"` + Version string `gorm:"column:version" json:"version"` + Upgrade bool `gorm:"column:upgrade" json:"upgrade"` +} + +func (DeviceSdk) TableName() string { + return "t_device_sdk" +} + +func (ds *DeviceSdk) Insert() bool { + result := db.Table(ds.TableName()).Create(&ds) + if result.Error == nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (ds *DeviceSdk) SelectById(id string) (int64, error){ + result := db.Table(ds.TableName()).Where("id=?",id).First(&ds) + if result.Error != nil || result.RowsAffected == 0 { + return 0, err + } + return result.RowsAffected, nil +} + +func (ds *DeviceSdk) Update() bool { + result := db.Table(ds.TableName()).Where("id=?", ds.Id).Update(&ds) + if result.Error ==nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (ds *DeviceSdk) DeleteById(id string) bool { + result := db.Exec("delete from "+ds.TableName()+" where id='"+id+"'") + if result.Error == nil && result.RowsAffected > 0 { + return true + } + return false +} + +func (ds *DeviceSdk) FindByActivateCode(activateCode string) (list []DeviceSdk, err error) { + result := db.Table(ds.TableName()).Where("activateCode=?", activateCode).Find(&list) + if result.Error != nil { + return []DeviceSdk{},result.Error + } + return list, nil +} + +func (ds *DeviceSdk) FindByMachineCode(machineCode string, serverId string) (list []DeviceSdk, err error) { + result := db.Table(ds.TableName()).Where("machineCode=? or devId=?", machineCode, serverId).Order("installTime desc").Find(&list) + if result.Error != nil { + return []DeviceSdk{},result.Error + } + return list, nil +} + +func (ds *DeviceSdk) FindByMacAndSdk(macCode, serverId, sdkId string) (list []DeviceSdk, err error) { + result := db.Table(ds.TableName()).Where("(machineCode=? or devId=?) and sdkId=?", macCode, serverId, sdkId).Find(&list) + if result.Error != nil { + return []DeviceSdk{},result.Error + } + return list, nil +} + +//鎸夎澶噄d缁熻绠楁硶鏁伴噺 +func (ds *DeviceSdk) CountByDevId(devId string) (int,error) { + var count int + if err := db.Raw("select count(1) as count from "+ds.TableName()+" where devId=?",devId).Count(&count).Error; err != nil { + return 0, err + } + return count, nil +} \ No newline at end of file diff --git a/devicemanage-service/service/ctrl.go b/devicemanage-service/service/ctrl.go new file mode 100644 index 0000000..ae0fcb9 --- /dev/null +++ b/devicemanage-service/service/ctrl.go @@ -0,0 +1,61 @@ +package service + +import ( + "basic.com/valib/bhomeclient.git" + "encoding/json" + "errors" + "vamicro/devicemanage-service/vo" +) + +func remoteCall(arg interface{}, rTopic string, targetDevId string, ip string) (*bhomeclient.Reply, error) { + body, err := json.Marshal(arg) + if err != nil { + return nil, err + } + r, err := WrapQueryRpc(rTopic, body, targetDevId, ip) + if err != nil { + return nil, err + } + if len(r) != 1 { + return nil, errors.New("no response") + } + var ret bhomeclient.Reply + err = json.Unmarshal(r[0].Payload, &ret) + if err != nil { + return nil, err + } + return &ret, nil +} + +//鎺у埗鍏跺畠鑺傜偣鍒涘缓闆嗙兢 +func RemoteCreateCluster(arg vo.CreateClusterArg) (*bhomeclient.Reply, error){ + return remoteCall(arg, "RemoteCreateCluster", "", arg.Ip) +} + +func RemoteSearchCluster(arg vo.SearchClusterArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteSearchCluster", arg.DevId, arg.Ip) +} + +func RemoteGetSearchNodes(arg vo.GetSearchNodesArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteGetSearchNodes", arg.DevId, arg.Ip) +} + +func RemoteJoinCluster(arg vo.JoinClusterArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteJoinCluster", arg.DevId, arg.Ip) +} + +func RemoteReboot(arg vo.RebootArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteReboot", arg.DevId, arg.Ip) +} + +func RemoteUninstall(arg vo.UninstallArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteUninstall", "", "") +} + +func RemoteUpgrade(arg vo.UpgradeArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteUpgrade", "", "") +} + +func RemoteSysUpdate(arg vo.SysUpdateArg) (*bhomeclient.Reply, error) { + return remoteCall(arg, "RemoteSysUpdate", "", "") +} \ No newline at end of file diff --git a/devicemanage-service/service/device.go b/devicemanage-service/service/device.go new file mode 100644 index 0000000..e73c0da --- /dev/null +++ b/devicemanage-service/service/device.go @@ -0,0 +1,189 @@ +package service + +import ( + "basic.com/valib/logger.git" + "basic.com/valib/serf.git/client" + "encoding/json" + "errors" + "time" + "vamicro/config" + "vamicro/devicemanage-service/models" + "vamicro/system-service/serf" +) + +//澶勭悊鐢宠淇℃伅锛岀淮鎶ょ姸鎬� +func DealApply() { + //1.澶勭悊寰呭彂閫佽姹傜殑鏁版嵁锛屽皢璇锋眰鍙戦�佸埌鐩爣璁惧锛屽苟灏唖tatus璁剧疆涓哄凡鐢宠 + go applying() + //2.澶勭悊宸查�氳繃鐨勬暟鎹紝灏嗘璁惧鍐欏叆鍒癲evice琛ㄤ腑锛岃〃绀哄彲浠ユ帶鍒舵璁惧浜� + go applied() +} + +func applying() { + var da models.DeviceApply + for { + list := da.FindByStatus(models.ApplyStatus_Sending) + if list != nil && len(list) > 0 { + for _,d := range list { + if sendApply(d.ApplyKey, config.Server.AnalyServerId, d.Ip, d.DevId ) { + da.UpdateStatus(models.ApplyStatus_Waiting, d.Id) + } + } + } + time.Sleep(time.Second * 3) + } +} + +func applied() { + var da models.DeviceApply + for { + list := da.FindByStatus(models.ApplyStatus_Agreed) + if list != nil && len(list) > 0 { + for _,d :=range list { + //1.灏嗕俊鎭啓鍏ュ埌device琛ㄤ腑 + //2.灏嗘鏉$敵璇蜂俊鎭疆涓篗anaged鐘舵�� + doAgreedByTx(d) + } + } + time.Sleep(time.Second * 3) + } +} + +func doAgreedByTx(da models.DeviceApply) { + tx := models.GetDB().Begin() + var err error + defer func() { + if err != nil || tx != nil { + tx.Rollback() + } + }() + var tmp models.DeviceApply + i, _ := tmp.FindByDevId(da.DevId) + if i >0 { + err = errors.New("device琛ㄤ腑宸插瓨鍦ㄦ璁惧") + return + } + //1.鑾峰彇璁惧淇℃伅 + //d := getRemoteDevInfo(da.DevId, da.Ip) + //d.Id = uuid.NewV4().String() + //if b := d.Insert(); !b { + // err = errors.New("鏂板device澶辫触") + // return + //} + if !da.UpdateStatus(models.ApplyStatus_Managed, da.Id) { + err = errors.New("淇敼managed鐘舵�佸け璐�") + return + } + tx.Commit() +} + +type devCollectNew struct { + DeviceList []models.Device `json:"deviceList"` + Sdks []models.DeviceSdk `json:"sdks"` + Apps []models.DeviceApp `json:"apps"` +} +const CollectDeviceTopic = "collect-manage-device-info" +func CollectManageDeviceInfo(data []byte) error { + applyM := make(map[string]struct{}) + var dApply models.DeviceApply + list := dApply.FindByStatus(models.ApplyStatus_Managed) + for _, d := range list { + applyM[d.DevId] = struct{}{} + } + var dc devCollectNew + e := json.Unmarshal(data, &dc) + if e == nil { + tx := models.GetDB().Begin() + var err error + var devModel models.Device + var dsModel models.DeviceSdk + var daModel models.DeviceApp + defer func() { + if err != nil && tx != nil { + tx.Rollback() + } + }() + for _, d := range dc.DeviceList { + if _,ok := applyM[d.DevId]; ok { + if rows,_ := devModel.SelectById(d.Id); rows >0 { + if err = tx.Table(d.TableName()).Save(&d).Error;err != nil { + return err + } + } else { + if err = tx.Table(d.TableName()).Create(&d).Error;err != nil { + return err + } + } + } + + } + for _,ds := range dc.Sdks { + if rows,_ := dsModel.SelectById(ds.Id); rows >0 { + if err = tx.Table(ds.TableName()).Save(&ds).Error;err != nil { + return err + } + } else { + if err = tx.Table(ds.TableName()).Create(&ds).Error;err != nil { + return err + } + } + } + + for _,da := range dc.Apps { + if rows,_ := daModel.SelectById(da.Id); rows >0 { + if err = tx.Table(da.TableName()).Save(&da).Error;err != nil { + return err + } + } else { + if err = tx.Table(da.TableName()).Create(&da).Error;err != nil { + return err + } + } + } + + + tx.Commit() + return nil + } else { + logger.Error("unmarshal err:", e) + return e + } +} + +func getRemoteDevInfo(devId, ip string) { + + +} + +//灏嗚姹傚彂閫佸埌鎸囧畾鑺傜偣涓� +func sendApply(key, devId, ip, targetDevId string) bool { + //ipv4, _, _ := util.GetLocalIP(config.Server.NetworkAdapter) + + body := map[string]interface{} { + "key": key, + "fromDevId": devId, + "fromIp": ip, + } + bts, _ := json.Marshal(body) + + resp, err := WrapQueryRpc("DevAuthApply", bts, targetDevId, ip) + + return err ==nil && len(resp) >0 +} + +func WrapQueryRpc(topic string, data []byte, targetDevId string, targetIp string) ([]client.NodeResponse, error) { + arg := serf.RpcParamTopic{ + Topic: topic, + Data: data, + } + d, _ := json.Marshal(arg) + + param := serf.RpcParam{ + Name: serf.QueryRpc, + Timeout: time.Second * 5, + FilterNodes: []string { targetDevId }, + Data: d, + } + + return serf.RpcQuery(targetIp, ¶m) +} \ No newline at end of file diff --git a/devicemanage-service/vo/ctrl.go b/devicemanage-service/vo/ctrl.go new file mode 100644 index 0000000..46289d6 --- /dev/null +++ b/devicemanage-service/vo/ctrl.go @@ -0,0 +1,47 @@ +package vo + +type CreateClusterArg struct { + DevId string `json:"devId"` + Ip string `json:"ip"` + Password string `json:"password"` + ClusterName string `json:"clusterName"` + ClusterId string `json:"clusterId"` + VirtualIp string `json:"virtualIp"` +} + +type SearchClusterArg struct { + DevId string `json:"devId"` + Ip string `json:"ip"` + Password string `json:"password"` +} + +type GetSearchNodesArg struct { + DevId string `json:"devId"` + Ip string `json:"ip"` +} + +type JoinClusterArg struct { + DevId string `json:"devId"` + Ip string `json:"ip"` + ClusterId string `json:"clusterId"` + Password string `json:"password"` + NodeIps []string `json:"nodeIps"` +} + +type RebootArg struct { + DevId string `json:"devId"` + Ip string `json:"ip"` +} + +type UninstallArg struct { + Id string `json:"id"` //鍗歌浇鐨勭畻娉曟垨搴旂敤id + Type int `json:"type"` //1.绠楁硶锛�2.搴旂敤 +} + +type UpgradeArg struct { + Id string `json:"id"` //鍗囩骇绠楁硶鎴栧簲鐢╥d +} + +type SysUpdateArg struct { + +} \ No newline at end of file diff --git a/devicemanage-service/vo/device.go b/devicemanage-service/vo/device.go new file mode 100644 index 0000000..8039540 --- /dev/null +++ b/devicemanage-service/vo/device.go @@ -0,0 +1,40 @@ +package vo + +import ( + "basic.com/pubsub/protomsg.git" + "encoding/json" + "vamicro/devicemanage-service/models" + "vamicro/proto" +) + +type DevDetail struct { + proto.Device + Sdks []SdkDetail `json:"sdks"` + Apps []AppDetail `json:"apps"` +} + +func CopyDeviceFromModel(d models.Device) (proto.Device, error) { + var pd proto.Device + b, err := json.Marshal(d) + if err != nil { + return pd, err + } + err = json.Unmarshal(b, &pd) + return pd, err +} + +type SdkDetail struct { + protomsg.Sdk + InstallInfo +} + +type AppDetail struct { + protomsg.App + InstallInfo +} + +type InstallInfo struct { + InstallTime string `json:"installTime"` + ExpireTime string `json:"expireTime"` + ActivateCode string `json:"activateCode"` +} \ No newline at end of file diff --git a/system-service/controllers/syssetconf.go b/system-service/controllers/syssetconf.go index 117a5ce..c5b2efa 100644 --- a/system-service/controllers/syssetconf.go +++ b/system-service/controllers/syssetconf.go @@ -10,7 +10,6 @@ "time" "vamicro/config" "vamicro/extend/util" - service2 "vamicro/saas-service/service" "vamicro/system-service/models" "vamicro/system-service/service" "vamicro/system-service/sys" @@ -1180,7 +1179,7 @@ machineCode := licence.GetMachineCode() // 鑾峰彇璁惧婵�娲绘椂闂� - res, err := service2.DoBusReq("/data/api-v/version/snBus", config.Server.AnalyServerId, aiot.RequestMethod_Post, aiot.RequestContentType_ApplicationJson, map[string]interface{}{}) + res, err := service.DoBusReq("/data/api-v/version/snBus", config.Server.AnalyServerId, aiot.RequestMethod_Post, aiot.RequestContentType_ApplicationJson, map[string]interface{}{}) logger.Warn("snBus", string(res)) installTime := "" if err == nil { diff --git a/system-service/service/busRequest.go b/system-service/service/busRequest.go new file mode 100644 index 0000000..dfbd9d8 --- /dev/null +++ b/system-service/service/busRequest.go @@ -0,0 +1,141 @@ +package service + +import ( + "encoding/json" + "strings" + "vamicro/config" + + "basic.com/valib/bhomeclient.git" + "basic.com/valib/bhomedbapi.git" + "basic.com/valib/go-aiot.git/aiotProto/aiot" + "basic.com/valib/logger.git" + "gitee.com/LearingIt/goTypeTrans/trans" +) + +const ( + Token = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ3NDUwMjU5MjMsInVzZXIiOiJ7XCJpZFwiOlwiZTZjY2QzNmQtNGYxNi00NmZjLTg4ZDUtMDczNjU4NjZkMjA1XCIsXCJwZXJtaXNzaW9uc1wiOltcInByb2R1Y3RNYW5nZTpwdWJsaXNoXCIsXCJjb2RlTWFuZ2U6dmlld1wiLFwiZGV2aWNlTWFuYWdlOmFkZFwiLFwiYWRtaW5NYW5hZ2VcIixcIm9yZGVyTWFuZ2VcIixcImRldmljZU1hbmFnZTp2aWV3XCIsXCJwcm9kdWN0TWFuZ2U6YWRkXCIsXCJhZG1pbk1hbmFnZTp2aWV3XCIsXCJjb2RlTWFuZ2U6YWRkXCIsXCJwcm9kdWN0TWFuZ2U6b2ZmU2FsZVwiLFwib3JkZXJNYW5nZTpjYW5jZWxcIixcInByb2R1Y3RDZW50ZXI6ZG93bmxvYWRcIixcInByb2R1Y3RDZW50ZXI6YnV5XCIsXCJwcm9kdWN0TWFuZ2U6dmlld1wiLFwiYXBpXCIsXCJob21lXCIsXCJvcmRlck1hbmdlOnBheVwiLFwiYWRtaW5NYW5hZ2U6YWRkXCIsXCJvcmRlck1hbmdlOmRvd25sb2FkXCIsXCJwcm9kdWN0Q2VudGVyXCIsXCJkZXZpY2VNYW5hZ2U6dW5iaW5kXCIsXCJvcmRlck1hbmdlOnZpZXdcIixcImFkbWluTWFuYWdlOmVkaXRcIixcImRldmljZU1hbmFnZVwiLFwidmlwTWFuYWdlOmFkZFwiLFwidmlwTWFuYWdlOnZpZXdcIixcInByb2R1Y3RDZW50ZXI6dmlld1wiLFwidmlwTWFuYWdlOmVkaXRcIixcInZpcE1hbmFnZVwiLFwicHJvZHVjdE1hbmdlOmVkaXRcIixcImNvZGVNYW5nZVwiLFwicHJvZHVjdE1hbmdlXCJdLFwidXNlcm5hbWVcIjpcImJhc2ljXCJ9In0.vwjAFkWuEyadRLvIOGK8LFE3MjpY3SQ7j6AlTXnQDG8" +) + +// string杞琲nterface +func stringParams2paramsBody(params map[string]string) map[string]interface{} { + paramsBody := make(map[string]interface{}) + for k, v := range params { + paramsBody[k] = v + } + return paramsBody +} + +// interface杞瑂tring +func interfaceParams2paramsBody(params map[string]interface{}) map[string]string { + paramsBody := make(map[string]string) + for k, v := range params { + paramsBody[k] = trans.Any2String(v) + } + return paramsBody +} + +// 灏佽缁熶竴璇锋眰鏂规硶 +func DoBusReq(topic string, nodeId string, method aiot.RequestMethod, contentType aiot.RequestContentType, params map[string]interface{}) ([]byte, error) { + var err error + var data []byte + logger.Debug("DoBusReq...", topic, nodeId, method, contentType, GetContentTypeString(contentType), params) + switch method { + case aiot.RequestMethod_Get: + // 鍙戦�乬et璇锋眰 + return DoGetToBus(nodeId, topic, interfaceParams2paramsBody(params)) + case aiot.RequestMethod_Post: + // post璇锋眰 + return DoPostToBus(nodeId, topic, GetContentTypeString(contentType), params) + case aiot.RequestMethod_Put: + // put + return DoPutToBus(nodeId, topic, GetContentTypeString(contentType), params) + case aiot.RequestMethod_Delete: + // delete + return DoDeleteToBus(nodeId, topic, GetContentTypeString(contentType), params) + } + return data, err +} + +// 鑾峰彇鑺傜偣IP +func GetNodeIp(nodeId string) (string, error) { + client := bhomedbapi.NewClient(bhomedbapi.WithNodes(nil)) + params := map[string]interface{}{ + "node_id": nodeId, + } + node, err := client.DoPostRequest("/data/api-v/cluster/findIpByNode", bhomedbapi.CONTENT_TYPE_JSON, params, nil, nil) + if err != nil { + logger.Error("Fail to execute GetNodeIp", err) + return "", err + } + + var ret bhomeclient.Reply + err = json.Unmarshal(node, &ret) + if err != nil { + return "", err + } + ip := trans.Any2String(ret.Data) + if ip != "" && strings.Index(ip, ":") > 0 { + return ip[0:strings.Index(ip, ":")], nil + } + return ip, nil +} + +// bus-get璇锋眰 +func DoGetToBus(nodeId string, url string, params map[string]string) ([]byte, error) { + ip, _ := GetNodeIp(nodeId) + header := map[string]string{ + "Authorization": Token, + } + client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) + if client == nil || nodeId != config.Server.AnalyServerId { + logger.Warn("client is nil. return from bus to http") + client = bhomedbapi.HttpClient{} + url = "http://" + ip + ":8888/" + strings.Trim(url, "/") + } + return client.DoGetRequest(url, params, header) +} + +// bus-post璇锋眰 +func DoPostToBus(nodeId string, url string, contentType string, params map[string]interface{}) ([]byte, error) { + ip, _ := GetNodeIp(nodeId) + header := map[string]string{ + "Authorization": Token, + } + client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) + if client == nil || nodeId != config.Server.AnalyServerId { + logger.Warn("client is nil. return from bus to http") + client = bhomedbapi.HttpClient{} + url = "http://" + ip + ":8888/" + strings.Trim(url, "/") + } + return client.DoPostRequest(url, contentType, params, nil, header) +} + +// bus-put璇锋眰 +func DoPutToBus(nodeId string, url string, contentType string, params map[string]interface{}) ([]byte, error) { + ip, _ := GetNodeIp(nodeId) + header := map[string]string{ + "Authorization": Token, + } + client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) + if client == nil || nodeId != config.Server.AnalyServerId { + logger.Warn("client is nil. return from bus to http") + client = bhomedbapi.HttpClient{} + url = "http://" + ip + ":8888/" + strings.Trim(url, "/") + } + return client.DoPutRequest(url, contentType, params, header) +} + +// bus-delete璇锋眰 +func DoDeleteToBus(nodeId string, url string, contentType string, params map[string]interface{}) ([]byte, error) { + ip, _ := GetNodeIp(nodeId) + header := map[string]string{ + "Authorization": Token, + } + client := bhomedbapi.NewClient(bhomedbapi.WithIp(ip), bhomedbapi.WithDevId(nodeId), bhomedbapi.WithTopic(url)) + if client == nil || nodeId != config.Server.AnalyServerId { + logger.Warn("client is nil. return from bus to http") + client = bhomedbapi.HttpClient{} + url = "http://" + ip + ":8888/" + strings.Trim(url, "/") + } + return client.DoDeleteRequest(url, contentType, params, header) +} diff --git a/system-service/service/toNode.go b/system-service/service/toNode.go new file mode 100644 index 0000000..04c8aee --- /dev/null +++ b/system-service/service/toNode.go @@ -0,0 +1,80 @@ +package service + +import ( + "encoding/json" + "errors" + + "basic.com/valib/bhomedbapi.git" + "basic.com/valib/go-aiot.git/aiotProto/aiot" + "basic.com/valib/logger.git" +) + +// 杩斿洖缁撴灉 +type Reply struct { + Success bool `json:"success"` + Msg string `json:"msg"` + Data interface{} `json:"data"` +} + +// 鑾峰彇content-type瀛楃涓� +func GetContentTypeString(contentType aiot.RequestContentType) string { + switch contentType { + case aiot.RequestContentType_ApplicationJson: + // application/json 鏍煎紡 + return bhomedbapi.CONTENT_TYPE_JSON + case aiot.RequestContentType_ApplicationXWwwFormUrlencoded: + // application/x-www-form-urlencoded 鏍煎紡 + return bhomedbapi.CONTENT_TYPE_FORM + case aiot.RequestContentType_MultipartFormData: + // multipart/form-data 鏍煎紡 + return bhomedbapi.CONTENT_TYPE_MULFORM + case aiot.RequestContentType_ApplicationXml: + // application/xml + return "application/xml" + default: + // application/json 鏍煎紡 + return bhomedbapi.CONTENT_TYPE_JSON + } +} + +// 鍗曡妭鐐硅姹� +func NodeReq(msg *aiot.Protocol, req *aiot.NodeReq, reply *aiot.BusinessReply) error { + // 鏍规嵁鍙傛暟璋冪敤鏈嶅姟 + var data []byte + param := make(map[string]interface{}) + err := json.Unmarshal(req.Req, ¶m) + if err != nil { + logger.Error("Fail to Unmarshal req.Req", req.Req, err) + return err + } + + var nodeId string + if len(msg.DeviceProto.DeviceIds) == 1 { + nodeId = msg.DeviceProto.DeviceIds[0] + } else if msg.DeviceProto.MasterDeviceId != "" { + // debug_test + nodeId = msg.DeviceProto.MasterDeviceId + } else { + err = errors.New("the node can not be null for NodeReq") + logger.Error("The node is null", err, msg) + return err + } + + logger.Debugf("bus return result nodeId=%v, topic=%v, Method=%v, DeviceProto=%v", nodeId, req.Topic, req.Method, msg.DeviceProto) + data, err = DoBusReq(req.Topic, nodeId, req.Method, req.ContentType, param) + dataReply := Reply{} + _ = json.Unmarshal(data, &dataReply) + + reply.Code = 200 + if !dataReply.Success { + reply.Code = 500 + } + reply.Success = dataReply.Success + reply.Msg = dataReply.Msg + reply.Data, _ = json.Marshal(dataReply.Data) + + if err != nil { + return err + } + return nil +} -- Gitblit v1.8.0