Commit eb90e790 authored by Marcello Golfieri's avatar Marcello Golfieri
Browse files

major rewrite of the CLI wrapper wgcli.py, fixed a bunch of bugs altogether as well

parent bc4395ba
Loading
Loading
Loading
Loading
+117 −64
Original line number Diff line number Diff line
@@ -10,6 +10,14 @@ import atexit
import os
import sys
import argparse
import logging

logging.basicConfig(
    stream=sys.stdout,
    level=os.environ.get("LOGLEVEL", "INFO"),
    format="%(levelname)s %(message)s",
)
logger = logging.getLogger(__name__)

if sys.version_info[0] < 3:
    raise Exception("Must be using Python 3")
@@ -56,16 +64,115 @@ def print_workgroup(workgroupt, workgroup, maxdepth=1000, depth=1):
        print_workgroup("ADMIN_WORKGROUP", child, maxdepth, depth + 1)


def cmd_tree(manager, workgroup):
    print_workgroup("WORKGROUP", manager.workgroup(workgroup))
class MainMenu(object):
    def __init__(self, base_url, cert, cert_key):
        # UAT/DEV url:
        #   https://aswsuat.stanford.edu/mais/workgroupsvc/v1/workgroups
        self.manager = SUWorkgroupManager(base_url, cert, cert_key)
        self.workgroup = None

    def usage(self, banner=False):
        if banner:
            print(
                """######################################
Welcome to Stanford Workgroup CLI tool
######################################
"""
            )
        print(
            """
Commands are:
  workgroup <workgroup>
     to select a working workgroup
  workgroup_full <workgroup>
     to select a working workgroup and load it with stem-owners (slower)
  ls
     to list members
  tree
     to list members recursively

"""
        )

    def cmd_tree(self):
        print_workgroup("WORKGROUP", self.manager.workgroup(self.workgroup.name))

    def cmd_ls(self):
        print_workgroup(
            "WORKGROUP", self.manager.workgroup(self.workgroup.name), maxdepth=1
        )

def cmd_ls(manager, workgroup):
    print_workgroup("WORKGROUP", manager.workgroup(workgroup), maxdepth=1)
    def cmd_workgroup(self, workgroup_name):
        logger.debug("loading workgroup {}...".format(workgroup_name))
        self.workgroup = self.manager.workgroup(workgroup_name, fetch_owners=False)
        logger.debug("workgroup loaded: {}".format(self.workgroup))

    def cmd_workgroup_full(self, workgroup_name):
        logger.debug("loading workgroup in full {}...".format(workgroup_name))
        self.workgroup = self.manager.workgroup(workgroup_name, fetch_owners=True)
        logger.debug("workgroup fully loaded: {}".format(self.workgroup))

    def cmd_add(self, member_name):
        self.workgroup.add_member(member_name)

    def cmd_remove(self, member_name):
        self.workgroup.remove_member(member_name)

    def cmd_reload(self):
        self.manager.clear()
        self.workgroup = self.manager.workgroup(self.workgroup.name)

    def cmd_exit(self):
        sys.exit(0)

    def selector(self, argument):
        switcher = {
            "quit": ("cmd_exit", 0),
            "exit": ("cmd_exit", 0),
            "workgroup": ("cmd_workgroup", 1),
            "workgroup_full": ("cmd_workgroup_full", 1),
            "add": ("cmd_add", 1),
            "remove": ("cmd_remove", 1),
            "reload": ("cmd_reload", 0),
            "ls": ("cmd_ls", 0),
            "tree": ("cmd_tree", 0),
            "help": ("usage", 0),
        }
        logger.debug("switcher arg: {}".format(argument))
        selection = switcher.get(argument, "Invalid command")
        logger.debug("menu choice: {}".format(selection))
        return selection

    def main_menu(self):
        self.usage(banner=True)
        while True:
            prompt = "{}> ".format(self.workgroup.name) if self.workgroup else "#> "
            choice = input(prompt)
            dgrams = choice.split(" ")
            if len(dgrams) == 0:
                continue
            choice = dgrams[0]
            args = dgrams[1:]
            logger.debug("Got dgrams: {}".format(dgrams))
            logger.debug("choice: {}".format(choice))
            logger.debug("args: {}".format(args))
            try:
                selection = self.selector(choice)
                cmd = selection[0]
                args_needed = selection[1]
                if args_needed != (len(args)):
                    print("Wrong number of args")
                    usage()
                    continue
                if args_needed > 0:
                    getattr(self, cmd)(*args)
                else:
                    getattr(self, cmd)()
            except SUWorkgroupAPIError as exc:
                print(exc)


def main():
    """wgcli script main entry point"""
if __name__ == "__main__":
    try:
        readline_setup()
    except ImportError:
@@ -95,62 +202,8 @@ def main():
    )
    args = parser.parse_args()

    # UAT/DEV url:
    #   https://aswsuat.stanford.edu/mais/workgroupsvc/v1/workgroups

    manager = SUWorkgroupManager(base_url=args.base_url, cert=args.wg_cert, cert_key=args.wg_cert_key)

    print(
        """######################################
Welcome to Stanford Workgroup CLI tool
######################################

Commands are:
  workgroup <workgroup>
     to select a working workgroup
  workgroup_full <workgroup>
     to select a working workgroup and load it with stem-owners (slower)
  ls
     to list members
  tree
     to list members recursively

"""
    # wgcli script main entry point
    main = MainMenu(
        base_url=args.base_url, cert=args.wg_cert, cert_key=args.wg_cert_key
    )

    workgroup = None

    cmd = ""
    while cmd.lower() != "quit":
        if workgroup:
            prompt = "%s> " % workgroup.name
        else:
            prompt = "#> "
        cmd = input(prompt)
        ##print "Got cmd %s" % cmd
        args = cmd.split()
        if len(args) == 0:
            continue
        cmd = args[0]
        try:
            if cmd == "workgroup":
                workgroup = manager.workgroup(args[1], fetch_owners=False)
            if cmd == "workgroup_full":
                workgroup = manager.workgroup(args[1])
            elif cmd == "add":
                workgroup.add_member(args[1])
            elif cmd == "remove":
                workgroup.remove_member(args[1])
            elif cmd == "reload":
                manager.clear()
                workgroup = manager.workgroup(workgroup.name)
            elif cmd == "ls":
                cmd_ls(manager, workgroup.name)
            elif cmd == "tree":
                cmd_tree(manager, workgroup.name)
        except SUWorkgroupAPIError as exc:
            print(exc)


if __name__ == "__main__":
    main()
    main.main_menu()