mirror of
https://github.com/tuna/tunasync.git
synced 2025-06-15 22:52:42 +00:00
124 lines
3.7 KiB
Python
124 lines
3.7 KiB
Python
#!/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
|