Parcourir la source

status command for tunasynctl

bigeagle il y a 11 ans
Parent
commit
67d6757e6a
4 fichiers modifiés avec 55 ajouts et 12 suppressions
  1. 5 3
      tunasync/clt_server.py
  2. 40 5
      tunasync/status_manager.py
  3. 6 1
      tunasync/tunasync.py
  4. 4 3
      tunasynctl.py

+ 5 - 3
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()
 
 

+ 40 - 5
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

+ 6 - 1
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"
 

+ 4 - 3
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: