manager.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "errors"
  4. "github.com/garyburd/redigo/redis"
  5. "sparrow/pkg/online"
  6. "sparrow/pkg/rpcs"
  7. "sparrow/pkg/token"
  8. )
  9. type DeviceManager struct {
  10. onlineManager *online.Manager
  11. tokenHelper *token.Helper
  12. }
  13. func NewDeviceManager(redishost string) *DeviceManager {
  14. mgr := online.NewManager(redishost)
  15. helper := token.NewHelper(redishost)
  16. return &DeviceManager{
  17. onlineManager: mgr,
  18. tokenHelper: helper,
  19. }
  20. }
  21. func (dm *DeviceManager) GenerateDeviceAccessToken(args rpcs.ArgsGenerateDeviceAccessToken, reply *rpcs.ReplyGenerateDeviceAccessToken) error {
  22. token, err := dm.tokenHelper.GenerateToken(args.Id)
  23. if err != nil {
  24. return err
  25. }
  26. reply.AccessToken = token
  27. return nil
  28. }
  29. func (dm *DeviceManager) ValidateDeviceAccessToken(args rpcs.ArgsValidateDeviceAccessToken, reply *rpcs.ReplyValidateDeviceAccessToken) error {
  30. dm.onlineManager.SetHeartbeat(args.Id)
  31. return dm.tokenHelper.ValidateToken(args.Id, args.AccessToken)
  32. }
  33. func (dm *DeviceManager) GetOnline(args rpcs.ArgsGetOnline, reply *rpcs.ReplyGetOnline) error {
  34. return dm.onlineManager.GetOnline(args.Id, online.Status{
  35. ClientIP: args.ClientIP,
  36. AccessRPCHost: args.AccessRPCHost,
  37. HeartbeatInterval: args.HeartbeatInterval,
  38. })
  39. }
  40. func (dm *DeviceManager) HeartBeat(args rpcs.ArgsHeartBeat, reply *rpcs.ReplyHeartBeat) error {
  41. return dm.onlineManager.SetHeartbeat(args.Id)
  42. }
  43. func (dm *DeviceManager) GetOffline(args rpcs.ArgsGetOffline, reply *rpcs.ReplyGetOffline) error {
  44. return dm.onlineManager.GetOffline(args.Id)
  45. }
  46. func (dm *DeviceManager) GetDeviceOnlineStatus(args rpcs.ArgsGetDeviceOnlineStatus, reply *rpcs.ReplyGetDeviceOnlineStatus) error {
  47. status, err := dm.onlineManager.GetStatus(args.Id)
  48. if err != nil && err != redis.ErrNil {
  49. return err
  50. }
  51. if status == nil {
  52. return errors.New("device not online")
  53. }
  54. reply.ClientIP = status.ClientIP
  55. reply.AccessRPCHost = status.AccessRPCHost
  56. reply.HeartbeatInterval = status.HeartbeatInterval
  57. return nil
  58. }