status command for tunasynctl

This commit is contained in:
bigeagle 2014-10-26 11:09:40 +08:00
parent 199ca93e66
commit 67d6757e6a
4 changed files with 55 additions and 12 deletions

View File

@ -3,6 +3,7 @@
import socket import socket
import os import os
import json import json
import struct
class ControlServer(object): class ControlServer(object):
@ -16,9 +17,9 @@ class ControlServer(object):
except OSError: except OSError:
if os.path.exists(self.address): if os.path.exists(self.address):
raise Exception("file exists: {}".format(self.address)) raise Exception("file exists: {}".format(self.address))
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.bind(self.address) self.sock.bind(self.address)
os.chmod(address, 0700)
print("Control Server listening on: {}".format(self.address)) print("Control Server listening on: {}".format(self.address))
self.sock.listen(1) self.sock.listen(1)
@ -28,7 +29,7 @@ class ControlServer(object):
conn, _ = self.sock.accept() conn, _ = self.sock.accept()
try: try:
length = ord(conn.recv(1)) length = struct.unpack('!H', conn.recv(2))[0]
content = conn.recv(length) content = conn.recv(length)
cmd = json.loads(content) cmd = json.loads(content)
self.mgr_chan.put(("CMD", (cmd['cmd'], cmd['target']))) self.mgr_chan.put(("CMD", (cmd['cmd'], cmd['target'])))
@ -38,7 +39,8 @@ class ControlServer(object):
else: else:
res = self.cld_chan.get() res = self.cld_chan.get()
conn.sendall(chr(len(res)) + res) conn.sendall(struct.pack('!H', len(res)))
conn.sendall(res)
conn.close() conn.close()

View File

@ -49,13 +49,48 @@ class StatusManager(object):
} }
with open(self.dbfile, 'wb') as f: with open(self.dbfile, 'wb') as f:
_mirrors = self.list_status()
print("Updated status file, {}:{}".format(name, status))
json.dump(_mirrors, f)
def list_status(self, _format=False):
_mirrors = sorted( _mirrors = sorted(
[m for _, m in self.mirrors.items()], [m for _, m in self.mirrors.items()],
key=lambda x: x['name'] key=lambda x: x['name']
) )
if not _format:
return _mirrors
print("Updated status file, {}:{}".format(name, status)) name_len = max([len(_m['name']) for _m in _mirrors])
json.dump(_mirrors, f) 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 # vim: ts=4 sw=4 sts=4 expandtab

View File

@ -190,7 +190,7 @@ class TUNASync(object):
elif msg_hdr == "CMD": elif msg_hdr == "CMD":
cmd, name = msg_body 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") self.ctrl_channel.put("Invalid target")
continue continue
@ -218,6 +218,11 @@ class TUNASync(object):
self.run_provider(name) self.run_provider(name)
res = "Started Job: {}".format(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: else:
res = "Invalid command" res = "Invalid command"

View File

@ -4,13 +4,14 @@ import sys
import socket import socket
import argparse import argparse
import json import json
import struct
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(prog="tunasynctl") parser = argparse.ArgumentParser(prog="tunasynctl")
parser.add_argument("-s", "--socket", parser.add_argument("-s", "--socket",
default="/var/run/tunasync.sock", help="socket file") default="/var/run/tunasync.sock", help="socket file")
parser.add_argument("command", help="command") 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() args = parser.parse_args()
@ -28,8 +29,8 @@ if __name__ == "__main__":
}) })
try: try:
sock.sendall(chr(len(pack)) + pack) sock.sendall(struct.pack('!H', len(pack)) + pack)
length = ord(sock.recv(1)) length = struct.unpack('!H', sock.recv(2))[0]
print(sock.recv(length)) print(sock.recv(length))
except Exception as e: except Exception as e: