From 67d6757e6adda2d7f74aeeeb6eac86f4b210a113 Mon Sep 17 00:00:00 2001 From: bigeagle Date: Sun, 26 Oct 2014 11:09:40 +0800 Subject: [PATCH] status command for tunasynctl --- tunasync/clt_server.py | 8 ++++--- tunasync/status_manager.py | 45 +++++++++++++++++++++++++++++++++----- tunasync/tunasync.py | 7 +++++- tunasynctl.py | 7 +++--- 4 files changed, 55 insertions(+), 12 deletions(-) diff --git a/tunasync/clt_server.py b/tunasync/clt_server.py index 6f95380..4a6ed3d 100644 --- a/tunasync/clt_server.py +++ b/tunasync/clt_server.py @@ -3,6 +3,7 @@ import socket import os import json +import struct class ControlServer(object): @@ -16,9 +17,9 @@ class ControlServer(object): except OSError: if os.path.exists(self.address): raise Exception("file exists: {}".format(self.address)) - self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock.bind(self.address) + os.chmod(address, 0700) print("Control Server listening on: {}".format(self.address)) self.sock.listen(1) @@ -28,7 +29,7 @@ class ControlServer(object): conn, _ = self.sock.accept() try: - length = ord(conn.recv(1)) + length = struct.unpack('!H', conn.recv(2))[0] content = conn.recv(length) cmd = json.loads(content) self.mgr_chan.put(("CMD", (cmd['cmd'], cmd['target']))) @@ -38,7 +39,8 @@ class ControlServer(object): else: res = self.cld_chan.get() - conn.sendall(chr(len(res)) + res) + conn.sendall(struct.pack('!H', len(res))) + conn.sendall(res) conn.close() diff --git a/tunasync/status_manager.py b/tunasync/status_manager.py index 7c14687..e323f00 100644 --- a/tunasync/status_manager.py +++ b/tunasync/status_manager.py @@ -49,13 +49,48 @@ class StatusManager(object): } with open(self.dbfile, 'wb') as f: - _mirrors = sorted( - [m for _, m in self.mirrors.items()], - key=lambda x: x['name'] - ) - + _mirrors = self.list_status() print("Updated status file, {}:{}".format(name, status)) json.dump(_mirrors, f) + 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) + # vim: ts=4 sw=4 sts=4 expandtab diff --git a/tunasync/tunasync.py b/tunasync/tunasync.py index 6a3bc37..4d75bc8 100644 --- a/tunasync/tunasync.py +++ b/tunasync/tunasync.py @@ -190,7 +190,7 @@ class TUNASync(object): elif msg_hdr == "CMD": cmd, name = msg_body - if name not in self.mirrors: + if (name not in self.mirrors) and (name != "__ALL__"): self.ctrl_channel.put("Invalid target") continue @@ -218,6 +218,11 @@ class TUNASync(object): self.run_provider(name) res = "Started Job: {}".format(name) + elif cmd == "status": + if name == "__ALL__": + res = self.status_manager.list_status(_format=True) + else: + res = self.status_manager.get_status(name, _format=True) else: res = "Invalid command" diff --git a/tunasynctl.py b/tunasynctl.py index 352f119..4efe53f 100755 --- a/tunasynctl.py +++ b/tunasynctl.py @@ -4,13 +4,14 @@ import sys import socket import argparse import json +import struct if __name__ == "__main__": parser = argparse.ArgumentParser(prog="tunasynctl") parser.add_argument("-s", "--socket", default="/var/run/tunasync.sock", help="socket file") parser.add_argument("command", help="command") - parser.add_argument("target", help="target") + parser.add_argument("target", nargs="?", default="__ALL__", help="target") args = parser.parse_args() @@ -28,8 +29,8 @@ if __name__ == "__main__": }) try: - sock.sendall(chr(len(pack)) + pack) - length = ord(sock.recv(1)) + sock.sendall(struct.pack('!H', len(pack)) + pack) + length = struct.unpack('!H', sock.recv(2))[0] print(sock.recv(length)) except Exception as e: