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 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()

View File

@ -49,13 +49,48 @@ class StatusManager(object):
}
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(
[m for _, m in self.mirrors.items()],
key=lambda x: x['name']
)
if not _format:
return _mirrors
print("Updated status file, {}:{}".format(name, status))
json.dump(_mirrors, f)
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

View File

@ -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"

View File

@ -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: