| | |
| | | package controllers |
| | | |
| | | import ( |
| | | "basic.com/valib/bhomeclient.git" |
| | | "basic.com/valib/logger.git" |
| | | "encoding/json" |
| | | "github.com/satori/go.uuid" |
| | | "nanomsg.org/go-mangos" |
| | | "nanomsg.org/go-mangos/protocol/req" |
| | | "nanomsg.org/go-mangos/transport/ipc" |
| | | "nanomsg.org/go-mangos/transport/tcp" |
| | | "strconv" |
| | | "time" |
| | | "vamicro/system-service/models" |
| | | ) |
| | | |
| | | //设备授权 |
| | | type DevAuthController struct { |
| | | |
| | | } |
| | | |
| | | //获取设备授权配置 |
| | | func (dac *DevAuthController) AuthConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { |
| | | var config models.AuthConfig |
| | | i, _ := config.Select() |
| | | if i > 0 { |
| | | return &bhomeclient.Reply{ Success: true, Data: config } |
| | | } |
| | | return &bhomeclient.Reply{ Success: true, Data: models.AuthConfig{}} |
| | | } |
| | | |
| | | //修改设备授权配置 |
| | | func (dac *DevAuthController) SaveAuthConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { |
| | | //一旦修改,如果在集群内,则集群内所有设备的授权配置都将修改 |
| | | var reqBody models.AuthConfig |
| | | if err := c.BindJSON(&reqBody);err != nil { |
| | | return &bhomeclient.Reply{ Msg: "参数有误"+err.Error()} |
| | | } |
| | | var config models.AuthConfig |
| | | i, _ := config.Select() |
| | | if i == 0{ |
| | | tmp := models.AuthConfig{ |
| | | AuthType: reqBody.AuthType, |
| | | Password: reqBody.Password, |
| | | } |
| | | if tmp.Insert() { |
| | | return &bhomeclient.Reply{ Success: true, Msg: "保存成功"} |
| | | } else { |
| | | return &bhomeclient.Reply{ Msg: "保存失败"} |
| | | } |
| | | } else { |
| | | config.AuthType = reqBody.AuthType |
| | | config.Password = reqBody.Password |
| | | if config.Update() { |
| | | return &bhomeclient.Reply{ Success: true, Msg: "保存成功"} |
| | | } else { |
| | | return &bhomeclient.Reply{ Msg: "保存失败"} |
| | | } |
| | | } |
| | | } |
| | | |
| | | //设备管理发送的申请请求 |
| | | func (dac *DevAuthController) Apply(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { |
| | | type applyArg struct { |
| | | Key string `json:"key"` |
| | | FromDevId string `json:"fromDevId"` |
| | | FromIp string `json:"fromIp"` |
| | | } |
| | | var reqBody applyArg |
| | | if err := c.BindJSON(&reqBody); err != nil || reqBody.Key == "" || reqBody.FromIp == "" || reqBody.FromDevId == "" { |
| | | return &bhomeclient.Reply{ Msg: "参数有误"} |
| | | } |
| | | //1.验证请求的key是否匹配 |
| | | var config models.AuthConfig |
| | | ic, _ := config.Select() |
| | | if ic > 0 { |
| | | if config.AuthType == models.AuthType_Key && reqBody.Key != config.Password { |
| | | return &bhomeclient.Reply{ 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() { |
| | | return &bhomeclient.Reply{ Success:true, Msg: "添加成功,待审核"} |
| | | } else { |
| | | return &bhomeclient.Reply{ Msg: "添加失败"} |
| | | } |
| | | } else { //已申请过 |
| | | if da.Status == models.AuthStatus_Agreed { |
| | | return &bhomeclient.Reply{ Success: true, Msg: "已通过,无需重复申请"} |
| | | } else if da.Status == models.AuthStatus_AuthCanceled { |
| | | return &bhomeclient.Reply{ Msg: "已取消授权"} |
| | | } else { |
| | | return &bhomeclient.Reply{ Success:true, Msg:"请等候审核"} |
| | | } |
| | | } |
| | | } |
| | | |
| | | //显示申请信息 |
| | | func (dac *DevAuthController) ApplyShow(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { |
| | | var ad models.AuthDevice |
| | | list := ad.FindByStatus(models.AuthStatus_Waiting) |
| | | if list == nil { |
| | | list = make([]models.AuthDevice, 0) |
| | | } |
| | | return &bhomeclient.Reply{ Success: true, Data: list} |
| | | } |
| | | |
| | | //通过或拒绝 |
| | | func (dac *DevAuthController) Approve(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { |
| | | type approveArg struct { |
| | | Id string `json:"id"` |
| | | DevId string `json:"devId"` |
| | | DevIp string `json:"devIp"` |
| | | Status int `json:"status"` |
| | | } |
| | | var reqBody approveArg |
| | | c.BindJSON(&reqBody) |
| | | if reqBody.Status == models.AuthStatus_Agreed || reqBody.Status == models.AuthStatus_Rejected { //通过或拒绝 |
| | | //1.通知对方,已通过授权或已拒绝(serf1运行在master节点上,设备管理服务可能运行在集群内任一一台服务器上) |
| | | //根据管理设备的id获取ip(通过设备间bus通信反馈)? |
| | | arg, _ := json.Marshal(reqBody) |
| | | remoteReply,err := approve(arg, reqBody.DevIp) |
| | | if err != nil { |
| | | return &bhomeclient.Reply{ Msg: err.Error()} |
| | | } |
| | | if remoteReply.Success { |
| | | //2.修改本地记录的状态 |
| | | //if len(resp) > 0 { |
| | | var ad models.AuthDevice |
| | | if ad.UpdateStatus(reqBody.Id, reqBody.Status) { |
| | | return &bhomeclient.Reply{ Success: true, Msg: "操作成功"} |
| | | } else { |
| | | return &bhomeclient.Reply{ Msg: "操作失败"} |
| | | } |
| | | //} else { |
| | | // return &bhomeclient.Reply{Msg:"设备管理响应失败"} |
| | | //} |
| | | } else { |
| | | return remoteReply |
| | | } |
| | | |
| | | } else { |
| | | return &bhomeclient.Reply{ Msg: "参数有误"} |
| | | } |
| | | } |
| | | |
| | | func approve(arg []byte, devIp string) (*bhomeclient.Reply, error) { |
| | | var sock mangos.Socket |
| | | var err error |
| | | var msg []byte |
| | | |
| | | if sock,err = req.NewSocket();err !=nil { |
| | | logger.Debug("comp can't new req socket:%s",err.Error()) |
| | | return nil, err |
| | | } |
| | | sock.AddTransport(ipc.NewTransport()) |
| | | sock.AddTransport(tcp.NewTransport()) |
| | | if err = sock.Dial(devIp+":"+strconv.Itoa(4012));err !=nil { |
| | | logger.Debug("comp can't dial on req socket:%s",err.Error()) |
| | | return nil, err |
| | | } |
| | | sock.SetOption(mangos.OptionMaxRecvSize, 1024*1024*100) |
| | | sock.SetOption(mangos.OptionRecvDeadline, time.Second*5) |
| | | if err = sock.Send(arg);err !=nil { |
| | | logger.Debug("comp can't send message on push socket:%s",err.Error()) |
| | | return nil, err |
| | | } |
| | | if msg,err = sock.Recv();err !=nil { |
| | | logger.Debug("comp sock.Recv receive err:%s",err.Error()) |
| | | return nil, err |
| | | } |
| | | sock.Close() |
| | | var ret bhomeclient.Reply |
| | | retErr := json.Unmarshal(msg, &ret) |
| | | if retErr != nil { |
| | | return nil, retErr |
| | | } |
| | | return &ret, nil |
| | | } |
| | | |
| | | //获取已授权的设备列表 |
| | | func (dac *DevAuthController) AuthedList(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply { |
| | | var ad models.AuthDevice |
| | | list := ad.FindByStatus(models.AuthStatus_Agreed) |
| | | if list == nil { |
| | | list = make([]models.AuthDevice, 0) |
| | | } |
| | | return &bhomeclient.Reply{ Success: true, Data: list} |
| | | package controllers
|
| | |
|
| | | import (
|
| | | "basic.com/valib/bhomeclient.git"
|
| | | "basic.com/valib/logger.git"
|
| | | "encoding/json"
|
| | | "github.com/satori/go.uuid"
|
| | | "nanomsg.org/go-mangos"
|
| | | "nanomsg.org/go-mangos/protocol/req"
|
| | | "nanomsg.org/go-mangos/transport/ipc"
|
| | | "nanomsg.org/go-mangos/transport/tcp"
|
| | | "strconv"
|
| | | "time"
|
| | | "vamicro/system-service/models"
|
| | | )
|
| | |
|
| | | //设备授权
|
| | | type DevAuthController struct {
|
| | |
|
| | | }
|
| | |
|
| | | //获取设备授权配置
|
| | | func (dac *DevAuthController) AuthConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
| | | var config models.AuthConfig
|
| | | i, _ := config.Select()
|
| | | if i > 0 {
|
| | | return &bhomeclient.Reply{ Success: true, Data: config }
|
| | | }
|
| | | return &bhomeclient.Reply{ Success: true, Data: models.AuthConfig{}}
|
| | | }
|
| | |
|
| | | //修改设备授权配置
|
| | | func (dac *DevAuthController) SaveAuthConfig(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
| | | //一旦修改,如果在集群内,则集群内所有设备的授权配置都将修改
|
| | | var reqBody models.AuthConfig
|
| | | if err := c.BindJSON(&reqBody);err != nil {
|
| | | return &bhomeclient.Reply{ Msg: "参数有误"+err.Error()}
|
| | | }
|
| | | var config models.AuthConfig
|
| | | i, _ := config.Select()
|
| | | if i == 0{
|
| | | tmp := models.AuthConfig{
|
| | | AuthType: reqBody.AuthType,
|
| | | Password: reqBody.Password,
|
| | | }
|
| | | if tmp.Insert() {
|
| | | return &bhomeclient.Reply{ Success: true, Msg: "保存成功"}
|
| | | } else {
|
| | | return &bhomeclient.Reply{ Msg: "保存失败"}
|
| | | }
|
| | | } else {
|
| | | config.AuthType = reqBody.AuthType
|
| | | config.Password = reqBody.Password
|
| | | if config.Update() {
|
| | | return &bhomeclient.Reply{ Success: true, Msg: "保存成功"}
|
| | | } else {
|
| | | return &bhomeclient.Reply{ Msg: "保存失败"}
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //设备管理发送的申请请求
|
| | | func (dac *DevAuthController) Apply(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
| | | type applyArg struct {
|
| | | Key string `json:"key"`
|
| | | FromDevId string `json:"fromDevId"`
|
| | | FromIp string `json:"fromIp"`
|
| | | }
|
| | | var reqBody applyArg
|
| | | if err := c.BindJSON(&reqBody); err != nil || reqBody.Key == "" || reqBody.FromIp == "" || reqBody.FromDevId == "" {
|
| | | return &bhomeclient.Reply{ Msg: "参数有误"}
|
| | | }
|
| | | //1.验证请求的key是否匹配
|
| | | var config models.AuthConfig
|
| | | ic, _ := config.Select()
|
| | | if ic > 0 {
|
| | | if config.AuthType == models.AuthType_Key && reqBody.Key != config.Password {
|
| | | return &bhomeclient.Reply{ 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() {
|
| | | return &bhomeclient.Reply{ Success:true, Msg: "添加成功,待审核"}
|
| | | } else {
|
| | | return &bhomeclient.Reply{ Msg: "添加失败"}
|
| | | }
|
| | | } else { //已申请过
|
| | | if da.Status == models.AuthStatus_Agreed {
|
| | | return &bhomeclient.Reply{ Success: true, Msg: "已通过,无需重复申请"}
|
| | | } else if da.Status == models.AuthStatus_AuthCanceled {
|
| | | return &bhomeclient.Reply{ Msg: "已取消授权"}
|
| | | } else {
|
| | | return &bhomeclient.Reply{ Success:true, Msg:"请等候审核"}
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | //显示申请信息
|
| | | func (dac *DevAuthController) ApplyShow(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
| | | var ad models.AuthDevice
|
| | | list := ad.FindByStatus(models.AuthStatus_Waiting)
|
| | | if list == nil {
|
| | | list = make([]models.AuthDevice, 0)
|
| | | }
|
| | | return &bhomeclient.Reply{ Success: true, Data: list}
|
| | | }
|
| | |
|
| | | //通过或拒绝
|
| | | func (dac *DevAuthController) Approve(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
| | | type approveArg struct {
|
| | | Id string `json:"id"`
|
| | | DevId string `json:"devId"`
|
| | | DevIp string `json:"devIp"`
|
| | | Status int `json:"status"`
|
| | | }
|
| | | var reqBody approveArg
|
| | | c.BindJSON(&reqBody)
|
| | | if reqBody.Status == models.AuthStatus_Agreed || reqBody.Status == models.AuthStatus_Rejected { //通过或拒绝
|
| | | //1.通知对方,已通过授权或已拒绝(serf1运行在master节点上,设备管理服务可能运行在集群内任一一台服务器上)
|
| | | //根据管理设备的id获取ip(通过设备间bus通信反馈)?
|
| | | arg, _ := json.Marshal(reqBody)
|
| | | remoteReply,err := approve(arg, reqBody.DevIp)
|
| | | if err != nil {
|
| | | return &bhomeclient.Reply{ Msg: err.Error()}
|
| | | }
|
| | | if remoteReply.Success {
|
| | | //2.修改本地记录的状态
|
| | | //if len(resp) > 0 {
|
| | | var ad models.AuthDevice
|
| | | if ad.UpdateStatus(reqBody.Id, reqBody.Status) {
|
| | | return &bhomeclient.Reply{ Success: true, Msg: "操作成功"}
|
| | | } else {
|
| | | return &bhomeclient.Reply{ Msg: "操作失败"}
|
| | | }
|
| | | //} else {
|
| | | // return &bhomeclient.Reply{Msg:"设备管理响应失败"}
|
| | | //}
|
| | | } else {
|
| | | return remoteReply
|
| | | }
|
| | |
|
| | | } else {
|
| | | return &bhomeclient.Reply{ Msg: "参数有误"}
|
| | | }
|
| | | }
|
| | |
|
| | | func approve(arg []byte, devIp string) (*bhomeclient.Reply, error) {
|
| | | var sock mangos.Socket
|
| | | var err error
|
| | | var msg []byte
|
| | |
|
| | | if sock,err = req.NewSocket();err !=nil {
|
| | | logger.Debug("comp can't new req socket:%s",err.Error())
|
| | | return nil, err
|
| | | }
|
| | | sock.AddTransport(ipc.NewTransport())
|
| | | sock.AddTransport(tcp.NewTransport())
|
| | | if err = sock.Dial(devIp+":"+strconv.Itoa(4012));err !=nil {
|
| | | logger.Debug("comp can't dial on req socket:%s",err.Error())
|
| | | return nil, err
|
| | | }
|
| | | sock.SetOption(mangos.OptionMaxRecvSize, 1024*1024*100)
|
| | | sock.SetOption(mangos.OptionRecvDeadline, time.Second*5)
|
| | | if err = sock.Send(arg);err !=nil {
|
| | | logger.Debug("comp can't send message on push socket:%s",err.Error())
|
| | | return nil, err
|
| | | }
|
| | | if msg,err = sock.Recv();err !=nil {
|
| | | logger.Debug("comp sock.Recv receive err:%s",err.Error())
|
| | | return nil, err
|
| | | }
|
| | | sock.Close()
|
| | | var ret bhomeclient.Reply
|
| | | retErr := json.Unmarshal(msg, &ret)
|
| | | if retErr != nil {
|
| | | return nil, retErr
|
| | | }
|
| | | return &ret, nil
|
| | | }
|
| | |
|
| | | //获取已授权的设备列表
|
| | | func (dac *DevAuthController) AuthedList(h *bhomeclient.WrapperHandler, c *bhomeclient.Request) *bhomeclient.Reply {
|
| | | var ad models.AuthDevice
|
| | | list := ad.FindByStatus(models.AuthStatus_Agreed)
|
| | | if list == nil {
|
| | | list = make([]models.AuthDevice, 0)
|
| | | }
|
| | | return &bhomeclient.Reply{ Success: true, Data: list}
|
| | | } |