From 2a39fcaf8cf6d20c2cfac46ddba661ddc9699f39 Mon Sep 17 00:00:00 2001
From: Kali Kaneko <kali@leap.se>
Date: Wed, 6 Jul 2016 14:24:30 +0200
Subject: [refactor] beautify cli output

---
 src/leap/bitmask/cli/bitmask_cli.py | 48 +++++++++++++++++++++++++------------
 src/leap/bitmask/cli/command.py     | 23 ++++++++++++++----
 src/leap/bitmask/cli/eip.py         | 10 ++++----
 src/leap/bitmask/cli/keys.py        | 38 ++++++++++++++---------------
 src/leap/bitmask/cli/mail.py        | 10 ++++----
 src/leap/bitmask/cli/user.py        | 21 ++++++++--------
 6 files changed, 90 insertions(+), 60 deletions(-)

(limited to 'src/leap/bitmask')

diff --git a/src/leap/bitmask/cli/bitmask_cli.py b/src/leap/bitmask/cli/bitmask_cli.py
index 76b27c94..0aafeb78 100755
--- a/src/leap/bitmask/cli/bitmask_cli.py
+++ b/src/leap/bitmask/cli/bitmask_cli.py
@@ -18,6 +18,7 @@
 """
 Bitmask Command Line interface: zmq client.
 """
+import json
 import sys
 
 from colorama import Fore
@@ -31,30 +32,30 @@ from leap.bitmask.cli.user import User
 
 
 class BitmaskCLI(Command):
-    usage = '''bitmask_cli <command> [<args>]
+    usage = '''bitmaskctl <command> [<args>]
 
 Controls the Bitmask application.
 
 SERVICE COMMANDS:
 
-   user       Handles Bitmask accounts
-   mail       Bitmask Encrypted Mail
-   eip        Encrypted Internet Proxy
-   keys       Bitmask Keymanager
+  user       Handles Bitmask accounts
+  mail       Bitmask Encrypted Mail
+  eip        Encrypted Internet Proxy
+  keys       Bitmask Keymanager
 
 GENERAL COMMANDS:
 
-   version    prints version number and exit
-   launch     launch the Bitmask backend daemon
-   shutdown   shutdown Bitmask backend daemon
-   status     displays general status about the running Bitmask services
-   stats      show some debug info about bitmask-core
-   help       show this help message
+  version    prints version number and exit
+  launch     launch the Bitmask backend daemon
+  shutdown   shutdown Bitmask backend daemon
+  status     displays general status about the running Bitmask services
+  stats      show some debug info about bitmask-core
+  help       show this help message
 
 '''
-    epilog = ("Use 'bitmask_cli <command> help' to learn more "
+    epilog = ("Use 'bitmaskctl <command> help' to learn more "
               "about each command.")
-    commands = ['shutdown', 'status', 'stats']
+    commands = ['shutdown', 'stats']
 
     def user(self, raw_args):
         user = User()
@@ -82,9 +83,26 @@ GENERAL COMMANDS:
         return defer.succeed(None)
 
     def version(self, raw_args):
-        print Fore.GREEN + 'bitmask_cli: 0.0.1' + Fore.RESET
+        print(Fore.GREEN + 'bitmask_cli:  ' + Fore.RESET + '0.0.1')
         self.data = ['version']
-        return self._send()
+        return self._send(printer=self._print_version)
+
+    def _print_version(self, version):
+        corever = version['version_core']
+        print(Fore.GREEN + 'bitmask_core: ' + Fore.RESET + corever)
+
+    def status(self, raw_args):
+        self.data = ['status']
+        return self._send(printer=self._print_status)
+
+    def _print_status(self, status):
+        statusdict = json.loads(status)
+        for key, value in statusdict.items():
+            color = Fore.GREEN
+            if value == 'stopped':
+                color = Fore.RED
+            print(key.ljust(10) + ': ' + color +
+                  value + Fore.RESET)
 
 
 def execute():
diff --git a/src/leap/bitmask/cli/command.py b/src/leap/bitmask/cli/command.py
index ac427c76..36552c03 100644
--- a/src/leap/bitmask/cli/command.py
+++ b/src/leap/bitmask/cli/command.py
@@ -31,15 +31,28 @@ from txzmq import ZmqRequestTimeoutError
 from leap.bitmask.core import ENDPOINT
 
 
+appname = 'bitmaskctl'
+
+
 def _print_result(result):
     print Fore.GREEN + '%s' % result + Fore.RESET
 
 
+def default_dict_printer(result):
+    for key, value in result.items():
+        if value is None:
+            value = str(value)
+        print(Fore.RESET + key.ljust(10) + Fore.GREEN + value + Fore.RESET)
+
+
 class Command(object):
+    """A generic command dispatcher.
+    Any command in the class attribute `commands` will be dispached and
+    represented with a generic printer."""
     service = ''
-    usage = '''%s %s <subcommand>''' % tuple(sys.argv[:2])
-    epilog = ("Use '%s %s <subcommand> --help' to learn more "
-              "about each command." % tuple(sys.argv[:2]))
+    usage = '''{name} <subcommand>'''.format(name=appname)
+    epilog = ("Use bitmaskctl <subcommand> --help' to learn more "
+              "about each command.")
     commands = []
 
     def __init__(self):
@@ -61,9 +74,11 @@ class Command(object):
         except SystemExit:
             return defer.succeed(None)
 
+        # if command is in the default list, send the bare command
+        # and use the default printer
         if args.command in self.commands:
             self.data += [args.command]
-            return self._send()
+            return self._send(printer=default_dict_printer)
 
         elif (args.command == 'execute' or
                 args.command.startswith('_') or
diff --git a/src/leap/bitmask/cli/eip.py b/src/leap/bitmask/cli/eip.py
index 389b662e..2ce43d81 100644
--- a/src/leap/bitmask/cli/eip.py
+++ b/src/leap/bitmask/cli/eip.py
@@ -17,16 +17,14 @@
 """
 Bitmask Command Line interface: eip
 """
-import sys
-
-from leap.bitmask.cli.command import Command
+from leap.bitmask.cli.command import appname, Command
 
 
 class Eip(Command):
     service = 'eip'
-    usage = '''%s eip <subcommand>
+    usage = '''{name} eip <subcommand>
 
-Bitmask encrypted internet service
+Bitmask Encrypted Internet Service
 
 SUBCOMMANDS:
 
@@ -34,6 +32,6 @@ SUBCOMMANDS:
    stop       Stop service
    status     Display status about service
 
-''' % sys.argv[0]
+'''.format(name=appname)
 
     commands = ['start', 'stop', 'status']
diff --git a/src/leap/bitmask/cli/keys.py b/src/leap/bitmask/cli/keys.py
index b07b4ab8..829dd46f 100644
--- a/src/leap/bitmask/cli/keys.py
+++ b/src/leap/bitmask/cli/keys.py
@@ -22,13 +22,13 @@ import sys
 
 from colorama import Fore
 
-from leap.bitmask.cli.command import Command
+from leap.bitmask.cli.command import appname, Command
 from leap.keymanager.validation import ValidationLevels
 
 
 class Keys(Command):
     service = 'keys'
-    usage = '''%s keys <subcommand>
+    usage = '''{name} keys <subcommand>
 
 Bitmask Keymanager management service
 
@@ -38,8 +38,7 @@ SUBCOMMANDS:
    export     Export a given key
    insert     Insert a key to the key storage
    delete     Delete a key from the key storage
-
-''' % sys.argv[0]
+'''.format(name=appname)
 
     def list(self, raw_args):
         parser = argparse.ArgumentParser(
@@ -104,21 +103,22 @@ SUBCOMMANDS:
         return self._send()
 
     def _print_key_list(self, keys):
-        print Fore.GREEN
         for key in keys:
-            print key["fingerprint"] + " " + key['address']
-        print Fore.RESET
+            print(Fore.GREEN +
+                  key["fingerprint"] + " " + key['address'] +
+                  Fore.RESET)
 
     def _print_key(self, key):
-        print Fore.GREEN
-        print "Uids:        " + ', '.join(key['uids'])
-        print "Fingerprint: " + key['fingerprint']
-        print "Length:      " + str(key['length'])
-        print "Expiration:  " + key['expiry_date']
-        print "Validation:  " + key['validation']
-        print("Used:        " + "sig:" + str(key['sign_used']) +
-              ", encr:" + str(key['encr_used']))
-        print "Refresed:    " + key['refreshed_at']
-        print Fore.RESET
-        print ""
-        print key['key_data']
+        print(Fore.GREEN)
+        print("Uids:       " + ', '.join(key['uids']))
+        print("Fingerprint:" + key['fingerprint'])
+        print("Length:     " + str(key['length']))
+        print("Expiration: " + key['expiry_date'])
+        print("Validation: " + key['validation'])
+        print("Used:       " + "sig:" +
+              str(key['sign_used']) + ", encr:" +
+              str(key['encr_used']))
+        print("Refreshed:   " + key['refreshed_at'])
+        print(Fore.RESET)
+        print("")
+        print(key['key_data'])
diff --git a/src/leap/bitmask/cli/mail.py b/src/leap/bitmask/cli/mail.py
index a02797cc..76fdc3b9 100644
--- a/src/leap/bitmask/cli/mail.py
+++ b/src/leap/bitmask/cli/mail.py
@@ -17,16 +17,14 @@
 """
 Bitmask Command Line interface: mail
 """
-import sys
-
-from leap.bitmask.cli.command import Command
+from leap.bitmask.cli.command import appname, Command
 
 
 class Mail(Command):
     service = 'mail'
-    usage = '''%s mail <subcommand>
+    usage = '''{name} mail <subcommand>
 
-Bitmask encrypted internet service
+Bitmask Encrypted Email service
 
 SUBCOMMANDS:
 
@@ -36,7 +34,7 @@ SUBCOMMANDS:
    get-token            Returns token for the mail service
    get-smtp-certificate Downloads a new smtp certificate
 
-''' % sys.argv[0]
+'''.format(name=appname)
 
     commands = ['enable', 'disable', 'status', 'get-token',
                 'get-smtp-certificate']
diff --git a/src/leap/bitmask/cli/user.py b/src/leap/bitmask/cli/user.py
index f2bfc0c0..dccfc7d5 100644
--- a/src/leap/bitmask/cli/user.py
+++ b/src/leap/bitmask/cli/user.py
@@ -21,23 +21,23 @@ import argparse
 import getpass
 import sys
 
-from leap.bitmask.cli.command import Command
+from leap.bitmask.cli import command
 
 
-class User(Command):
+class User(command.Command):
     service = 'user'
-    usage = '''%s user <subcommand>
+    usage = '''{name} user <subcommand>
 
 Bitmask account service
 
 SUBCOMMANDS:
 
-   create     Register a new user, if possible
-   auth       Logs in gainst the provider
+   create     Registers new user, if possible
+   auth       Logs in against the provider
    logout     Ends any active session with the provider
    active     Shows the active user, if any
 
-''' % sys.argv[0]
+'''.format(name=command.appname)
 
     commands = ['active']
 
@@ -45,23 +45,24 @@ SUBCOMMANDS:
         username = self.username(raw_args)
         passwd = getpass.getpass()
         self.data += ['signup', username, passwd]
-        return self._send()
+        return self._send(printer=command.default_dict_printer)
 
     def auth(self, raw_args):
         username = self.username(raw_args)
         passwd = getpass.getpass()
         self.data += ['authenticate', username, passwd]
-        return self._send()
+        return self._send(printer=command.default_dict_printer)
 
     def logout(self, raw_args):
         username = self.username(raw_args)
         self.data += ['logout', username]
-        return self._send()
+        return self._send(printer=command.default_dict_printer)
 
     def username(self, raw_args):
+        args = tuple([command.appname] + sys.argv[1:3])
         parser = argparse.ArgumentParser(
             description='Bitmask user',
-            prog='%s %s %s' % tuple(sys.argv[:3]))
+            prog='%s %s %s' % args)
         parser.add_argument('username', nargs=1,
                             help='username ID, in the form <user@example.org>')
         subargs = parser.parse_args(raw_args)
-- 
cgit v1.2.3