status.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package manager
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "strconv"
  7. "time"
  8. . "github.com/tuna/tunasync/internal"
  9. )
  10. type mirrorStatus struct {
  11. Name string
  12. Worker string
  13. IsMaster bool
  14. Status SyncStatus
  15. LastUpdate time.Time
  16. Upstream string
  17. Size string // approximate size
  18. }
  19. func (s mirrorStatus) MarshalJSON() ([]byte, error) {
  20. m := map[string]interface{}{
  21. "name": s.Name,
  22. "worker": s.Worker,
  23. "is_master": s.IsMaster,
  24. "status": s.Status,
  25. "last_update": s.LastUpdate.Format("2006-01-02 15:04:05"),
  26. "last_update_ts": fmt.Sprintf("%d", s.LastUpdate.Unix()),
  27. "size": s.Size,
  28. "upstream": s.Upstream,
  29. }
  30. return json.Marshal(m)
  31. }
  32. func (s *mirrorStatus) UnmarshalJSON(v []byte) error {
  33. var m map[string]interface{}
  34. err := json.Unmarshal(v, &m)
  35. if err != nil {
  36. return err
  37. }
  38. if name, ok := m["name"]; ok {
  39. if s.Name, ok = name.(string); !ok {
  40. return errors.New("name should be a string")
  41. }
  42. } else {
  43. return errors.New("key `name` does not exist in the json")
  44. }
  45. if isMaster, ok := m["is_master"]; ok {
  46. if s.IsMaster, ok = isMaster.(bool); !ok {
  47. return errors.New("is_master should be a string")
  48. }
  49. } else {
  50. return errors.New("key `is_master` does not exist in the json")
  51. }
  52. if _worker, ok := m["worker"]; ok {
  53. if s.Worker, ok = _worker.(string); !ok {
  54. return errors.New("worker should be a string")
  55. }
  56. } else {
  57. return errors.New("key `worker` does not exist in the json")
  58. }
  59. if upstream, ok := m["upstream"]; ok {
  60. if s.Upstream, ok = upstream.(string); !ok {
  61. return errors.New("upstream should be a string")
  62. }
  63. } else {
  64. return errors.New("key `upstream` does not exist in the json")
  65. }
  66. if size, ok := m["size"]; ok {
  67. if s.Size, ok = size.(string); !ok {
  68. return errors.New("size should be a string")
  69. }
  70. } else {
  71. return errors.New("key `size` does not exist in the json")
  72. }
  73. // tricky: status
  74. if status, ok := m["status"]; ok {
  75. if ss, ok := status.(string); ok {
  76. err := json.Unmarshal([]byte(`"`+ss+`"`), &(s.Status))
  77. if err != nil {
  78. return err
  79. }
  80. } else {
  81. return errors.New("status should be a string")
  82. }
  83. } else {
  84. return errors.New("key `status` does not exist in the json")
  85. }
  86. // tricky: last update
  87. if lastUpdate, ok := m["last_update_ts"]; ok {
  88. if sts, ok := lastUpdate.(string); ok {
  89. ts, err := strconv.Atoi(sts)
  90. if err != nil {
  91. return fmt.Errorf("last_update_ts should be a interger, got: %s", sts)
  92. }
  93. s.LastUpdate = time.Unix(int64(ts), 0)
  94. } else {
  95. return fmt.Errorf("last_update_ts should be a string of integer, got: %s", lastUpdate)
  96. }
  97. } else {
  98. return errors.New("key `last_update_ts` does not exist in the json")
  99. }
  100. return nil
  101. }
  102. type workerStatus struct {
  103. ID string `json:"id"` // worker name
  104. Token string `json:"token"` // session token
  105. URL string `json:"url"` // worker url
  106. LastOnline time.Time `json:"last_online"` // last seen
  107. }