zhangzengfei
2023-09-05 63645d248c765244488cd34dbc1bb6528ca6b7c7
system-service/service/ctrlService.go
@@ -1,327 +1,327 @@
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, &param);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, &param);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, &param);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, &param);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, &param);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, &param);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, &param);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
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, &param);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, &param);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, &param);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, &param);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, &param);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, &param);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, &param);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
}