123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #!/usr/bin/env python2
- # -*- coding:utf-8 -*-
- import json
- from datetime import datetime
- class StatusManager(object):
- def __init__(self, parent, dbfile):
- self.parent = parent
- self.dbfile = dbfile
- self.init_mirrors()
- def init_mirrors(self):
- mirrors = {}
- for name, cfg in self.parent.mirrors.iteritems():
- mirrors[name] = {
- 'name': name,
- 'last_update': '-',
- 'status': 'unknown',
- 'upstream': cfg.upstream or '-',
- }
- try:
- with open(self.dbfile) as f:
- _mirrors = json.load(f)
- for m in _mirrors:
- name = m["name"]
- mirrors[name]["last_update"] = m["last_update"]
- mirrors[name]["status"] = m["status"]
- except:
- pass
- self.mirrors = mirrors
- self.mirrors_ctx = {key: {} for key in self.mirrors}
- def get_info(self, name, key):
- if key == "ctx":
- return self.mirrors_ctx.get(name, {})
- _m = self.mirrors.get(name, {})
- return _m.get(key, None)
- def refresh_mirror(self, name):
- cfg = self.parent.mirrors.get(name, None)
- if cfg is None:
- return
- _m = self.mirrors.get(name, {
- 'name': name,
- 'last_update': '-',
- 'status': '-',
- })
- _m['upstream'] = cfg.upstream or '-'
- self.mirrors[name] = dict(_m.items())
- self.commit_db()
- def update_status(self, name, status, ctx={}):
- _m = self.mirrors.get(name, {
- 'name': name,
- 'last_update': '-',
- 'status': '-',
- })
- if status in ("syncing", "fail", "pre-syncing"):
- update_time = _m["last_update"]
- elif status == "success":
- update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
- else:
- print("Invalid status: {}, from {}".format(status, name))
- _m['last_update'] = update_time
- _m['status'] = status
- self.mirrors[name] = dict(_m.items())
- self.mirrors_ctx[name] = ctx
- self.commit_db()
- print("Updated status file, {}:{}".format(name, status))
- def list_status(self, _format=False):
- _mirrors = sorted(
- [m for _, m in self.mirrors.items()],
- key=lambda x: x['name']
- )
- if not _format:
- return _mirrors
- name_len = max([len(_m['name']) for _m in _mirrors])
- update_len = max([len(_m['last_update']) for _m in _mirrors])
- status_len = max([len(_m['status']) for _m in _mirrors])
- heading = ' '.join([
- 'name'.ljust(name_len),
- 'last update'.ljust(update_len),
- 'status'.ljust(status_len)
- ])
- line = ' '.join(['-'*name_len, '-'*update_len, '-'*status_len])
- tabular = '\n'.join(
- [
- ' '.join(
- (_m['name'].ljust(name_len),
- _m['last_update'].ljust(update_len),
- _m['status'].ljust(status_len))
- ) for _m in _mirrors
- ]
- )
- return '\n'.join((heading, line, tabular))
- def get_status(self, name, _format=False):
- if name not in self.mirrors:
- return None
- mir = self.mirrors[name]
- if not _format:
- return mir
- tmpl = "{name} last_update: {last_update} status: {status}"
- return tmpl.format(**mir)
- def commit_db(self):
- with open(self.dbfile, 'wb') as f:
- _mirrors = self.list_status()
- json.dump(_mirrors, f, indent=2, separators=(',', ':'))
- # vim: ts=4 sw=4 sts=4 expandtab
|