status_manager.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/usr/bin/env python2
  2. # -*- coding:utf-8 -*-
  3. import json
  4. from datetime import datetime
  5. class StatusManager(object):
  6. def __init__(self, parent, dbfile):
  7. self.parent = parent
  8. self.dbfile = dbfile
  9. self.init_mirrors()
  10. def init_mirrors(self):
  11. mirrors = {}
  12. for name, cfg in self.parent.mirrors.iteritems():
  13. mirrors[name] = {
  14. 'name': name,
  15. 'last_update': '-',
  16. 'status': 'unknown',
  17. 'upstream': cfg.upstream or '-',
  18. }
  19. try:
  20. with open(self.dbfile) as f:
  21. _mirrors = json.load(f)
  22. for m in _mirrors:
  23. name = m["name"]
  24. mirrors[name]["last_update"] = m["last_update"]
  25. mirrors[name]["status"] = m["status"]
  26. except:
  27. pass
  28. self.mirrors = mirrors
  29. self.mirrors_ctx = {key: {} for key in self.mirrors}
  30. def get_info(self, name, key):
  31. if key == "ctx":
  32. return self.mirrors_ctx.get(name, {})
  33. _m = self.mirrors.get(name, {})
  34. return _m.get(key, None)
  35. def refresh_mirror(self, name):
  36. cfg = self.parent.mirrors.get(name, None)
  37. if cfg is None:
  38. return
  39. _m = self.mirrors.get(name, {
  40. 'name': name,
  41. 'last_update': '-',
  42. 'status': '-',
  43. })
  44. _m['upstream'] = cfg.upstream or '-'
  45. self.mirrors[name] = dict(_m.items())
  46. self.commit_db()
  47. def update_status(self, name, status, ctx={}):
  48. _m = self.mirrors.get(name, {
  49. 'name': name,
  50. 'last_update': '-',
  51. 'status': '-',
  52. })
  53. if status in ("syncing", "fail", "pre-syncing"):
  54. update_time = _m["last_update"]
  55. elif status == "success":
  56. update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  57. else:
  58. print("Invalid status: {}, from {}".format(status, name))
  59. _m['last_update'] = update_time
  60. _m['status'] = status
  61. self.mirrors[name] = dict(_m.items())
  62. self.mirrors_ctx[name] = ctx
  63. self.commit_db()
  64. print("Updated status file, {}:{}".format(name, status))
  65. def list_status(self, _format=False):
  66. _mirrors = sorted(
  67. [m for _, m in self.mirrors.items()],
  68. key=lambda x: x['name']
  69. )
  70. if not _format:
  71. return _mirrors
  72. name_len = max([len(_m['name']) for _m in _mirrors])
  73. update_len = max([len(_m['last_update']) for _m in _mirrors])
  74. status_len = max([len(_m['status']) for _m in _mirrors])
  75. heading = ' '.join([
  76. 'name'.ljust(name_len),
  77. 'last update'.ljust(update_len),
  78. 'status'.ljust(status_len)
  79. ])
  80. line = ' '.join(['-'*name_len, '-'*update_len, '-'*status_len])
  81. tabular = '\n'.join(
  82. [
  83. ' '.join(
  84. (_m['name'].ljust(name_len),
  85. _m['last_update'].ljust(update_len),
  86. _m['status'].ljust(status_len))
  87. ) for _m in _mirrors
  88. ]
  89. )
  90. return '\n'.join((heading, line, tabular))
  91. def get_status(self, name, _format=False):
  92. if name not in self.mirrors:
  93. return None
  94. mir = self.mirrors[name]
  95. if not _format:
  96. return mir
  97. tmpl = "{name} last_update: {last_update} status: {status}"
  98. return tmpl.format(**mir)
  99. def commit_db(self):
  100. with open(self.dbfile, 'wb') as f:
  101. _mirrors = self.list_status()
  102. json.dump(_mirrors, f, indent=2, separators=(',', ':'))
  103. # vim: ts=4 sw=4 sts=4 expandtab