status_manager.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. try:
  13. with open(self.dbfile) as f:
  14. _mirrors = json.load(f)
  15. for m in _mirrors:
  16. mirrors[m["name"]] = m
  17. except:
  18. for name, _ in self.parent.mirrors.iteritems():
  19. mirrors[name] = {
  20. 'name': name,
  21. 'last_update': '-',
  22. 'status': 'unknown',
  23. }
  24. self.mirrors = mirrors
  25. def update_status(self, name, status):
  26. _m = self.mirrors.get(name, {
  27. 'name': name,
  28. 'last_update': '-',
  29. 'status': '-',
  30. })
  31. if status in ("syncing", "fail"):
  32. update_time = _m["last_update"]
  33. elif status == "success":
  34. update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
  35. else:
  36. print("Invalid status: {}, from {}".format(status, name))
  37. self.mirrors[name] = {
  38. 'name': name,
  39. 'last_update': update_time,
  40. 'status': status,
  41. }
  42. with open(self.dbfile, 'wb') as f:
  43. _mirrors = self.list_status()
  44. print("Updated status file, {}:{}".format(name, status))
  45. json.dump(_mirrors, f)
  46. def list_status(self, _format=False):
  47. _mirrors = sorted(
  48. [m for _, m in self.mirrors.items()],
  49. key=lambda x: x['name']
  50. )
  51. if not _format:
  52. return _mirrors
  53. name_len = max([len(_m['name']) for _m in _mirrors])
  54. update_len = max([len(_m['last_update']) for _m in _mirrors])
  55. status_len = max([len(_m['status']) for _m in _mirrors])
  56. heading = ' '.join([
  57. 'name'.ljust(name_len),
  58. 'last update'.ljust(update_len),
  59. 'status'.ljust(status_len)
  60. ])
  61. line = ' '.join(['-'*name_len, '-'*update_len, '-'*status_len])
  62. tabular = '\n'.join(
  63. [
  64. ' '.join(
  65. (_m['name'].ljust(name_len),
  66. _m['last_update'].ljust(update_len),
  67. _m['status'].ljust(status_len))
  68. ) for _m in _mirrors
  69. ]
  70. )
  71. return '\n'.join((heading, line, tabular))
  72. def get_status(self, name, _format=False):
  73. if name not in self.mirrors:
  74. return None
  75. mir = self.mirrors[name]
  76. if not _format:
  77. return mir
  78. tmpl = "{name} last_update: {last_update} status: {status}"
  79. return tmpl.format(**mir)
  80. # vim: ts=4 sw=4 sts=4 expandtab