package service import ( "basic.com/valib/bhomeclient.git" "basic.com/valib/bhomedbapi.git" "basic.com/valib/serf.git/serf" "encoding/json" "errors" "github.com/satori/go.uuid" "time" "vamicro/config" "vamicro/system-service/models" sc "vamicro/system-service/serf" dvo "vamicro/devicemanage-service/vo" "vamicro/system-service/sys" "vamicro/system-service/vo" ) func init() { sc.RegisterRpcHandles( DevAuthApply, RemoteCreateCluster, RemoteSearchCluster, RemoteGetSearchNodes, RemoteJoinCluster, RemoteReboot, RemoteUninstall, RemoteUpgrade, RemoteSysUpdate, ) } func DevAuthApply(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { type applyArg struct { Key string `json:"key"` FromDevId string `json:"fromDevId"` FromIp string `json:"fromIp"` } var ret bhomeclient.Reply var retErr error var reqBody applyArg if err := json.Unmarshal(arg.Data, &reqBody); err == nil && reqBody.Key != "" && reqBody.FromIp != "" && reqBody.FromDevId != "" { //1.验证请求的key是否匹配 var config models.AuthConfig ic, _ := config.Select() if ic > 0 { if config.AuthType == models.AuthType_Key && reqBody.Key != config.Password { ret.Msg = "申请密钥不匹配" } } //2.写入authDevice var da models.AuthDevice i, _ := da.FindByDevId(reqBody.FromDevId) if i == 0 { //未申请过 tmp := models.AuthDevice{ Id: uuid.NewV4().String(), DevId: reqBody.FromDevId, DevIp: reqBody.FromIp, ApplyKey: reqBody.Key, CreateTime: time.Now().Format("2006-01-02 15:04:05"), } if tmp.Insert() { ret.Success = true ret.Msg = "添加成功,待审核" } else { ret.Msg = "添加失败" } } else { //已申请过 if da.Status == models.AuthStatus_Agreed { ret.Success = true ret.Msg = "已通过,无需重复申请" } else if da.Status == models.AuthStatus_AuthCanceled { ret.Msg = "已取消授权" } else { ret.Msg = "请等候审核" } } } else { ret.Msg = "参数有误" } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteCreateCluster(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.CreateClusterArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } if len(param.Password) != 6 || param.ClusterName == "" { ret.Msg = "参数有误" } else { sv := NewClusterService(sc.GetBusHandle()) b, newCluterId := sv.Create(param.ClusterName, param.Password, param.VirtualIp) if b { param.ClusterId = newCluterId ret.Data = param } else { retErr = errors.New("创建集群失败") } } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteSearchCluster(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.SearchClusterArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } if len(param.Password) != 6 { retErr = errors.New("密码错误") } else { searchNum := uuid.NewV4().String() sv := NewClusterService(sc.GetBusHandle()) retErr = sv.SearchByPwd(param.Password) if retErr !=nil { ret.Success = true ret.Msg = "搜索中..." } else { ret.Success = true ret.Data = searchNum } } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteGetSearchNodes(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error sv := NewClusterService(sc.GetBusHandle()) nodes := sv.SearchNodes() if nodes !=nil && len(nodes)>0 { var nodeArr []interface{} for _,n :=range nodes { nodeArr = append(nodeArr, n) } ret.Data = nodeArr } else { ret.Data = []interface{}{} } ret.Success = true ret.Msg = "查询成功" nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteJoinCluster(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.JoinClusterArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } else { sv := NewClusterService(sc.GetBusHandle()) cj := vo.ClusterJoinVo{ ClusterId: param.ClusterId, Password: param.Password, NodeIps: param.NodeIps, } if b,err := sv.JoinCluster(&cj); b{ ret.Success = true ret.Msg = "加入成功" } else { ret.Success = false retErr = err } } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteReboot(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.RebootArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } else { if isOk, msg := sys.Reboot(); !isOk { ret.Msg = msg } else { ret.Success = true ret.Msg = "正在重启..." } } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteUninstall(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.UninstallArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } else { if param.Type ==1 { //卸载算法 api := bhomedbapi.SdkApi{} b, d := api.Delete(param.Id) ret.Success = b ret.Data = d } else if param.Type == 2 { //卸载应用 api := bhomedbapi.AppApi{} b, d := api.Delete(param.Id) ret.Success = b ret.Data = d } } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteUpgrade(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.UpgradeArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } else { api := bhomedbapi.AppApi{} b, d := api.Upgrade(param.Id) ret.Success = b ret.Data = d } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr } func RemoteSysUpdate(arg sc.RpcParamTopic) ([]serf.NodeResponse, error) { var ret bhomeclient.Reply var retErr error var param dvo.SysUpdateArg if err := json.Unmarshal(arg.Data, ¶m);err != nil { retErr = err } else { //调用version-control的接口,执行升级操作 ret.Msg = "build..." } nr := serf.NodeResponse{ From: config.Server.AnalyServerId, } if data, err := json.Marshal(ret); err != nil { retErr = err } else { nr.Payload = data } return append([]serf.NodeResponse{}, nr), retErr }