diff --git a/bin/cc-cli b/bin/cc-cli index 90abfb5c9f4cf83c8851e6ab48055b4babbd4ddd..3983de010f10919eb62b5cea0849b6d3cac03bdb 100755 --- a/bin/cc-cli +++ b/bin/cc-cli @@ -90,8 +90,6 @@ try: help="History file") oparser.add_option("--history-size",action="store",dest="hsize", help="History max entry count") - oparser.add_option("--force-yes",action="store_true",dest="forceyes", - help="Answer Yes to all questions (Dangerous)") (options, args) = oparser.parse_args() # options handling diff --git a/cccli/cli.py b/cccli/cli.py index 91225700ad176fdf4f7636c0e737be5ff1f4a25e..e1387801ff2c65a3302ee20873ade234a98ed876 100644 --- a/cccli/cli.py +++ b/cccli/cli.py @@ -37,7 +37,6 @@ class Cli(object): self.interactive = sys.stderr.isatty() and sys.stdin.isatty() # start printer and load history self.printer = Printer(self.interactive, - self.settings.get("forceyes", False), historyfile=self.settings.get("history", ""), historysize=self.settings.get("hsize", None)) # load alias diff --git a/cccli/command.py b/cccli/command.py index c0632601baa71c53570e9c3bcd23e46cd7b6765e..d10f0a110edc778732e5e136f4991dfacbad098a 100644 --- a/cccli/command.py +++ b/cccli/command.py @@ -192,7 +192,7 @@ class Command(object): self._list_table(objs) else: self._list(objs) - cmd_list.usage = "list [tql]" + cmd_list.usage = "list [-t] [--help] tql" def _list(self, objs): for o in objs: @@ -221,60 +221,90 @@ class Command(object): self.printer.out(str(obj.get(t, "")).ljust(v) ,nl=" ") self.printer.out() - - def _vm_action(self, argv): - # arg stuff - if len(argv) == 1: - raise cmdBadArgument() - tql = str.join("", argv[1:]) - # print tql list result - try: - objs = self.cli.rpc.call("list",tql) - except RpcError as e: - raise cmdError("RPCError: %s"%str(e)) - if len(objs) == 0: - raise cmdWarning("No selected object") - self.printer.out("You request give the following result:") - for obj in objs: - self.printer.out("%sid:%s%s%s"%(color["green"],color["yellow"],obj["id"],color["reset"])) - self.printer.out("%sCount: %s%s"%(color["green"],color["reset"], len(objs))) - if self.printer.ask("Are you sure to %s%s%s these %s id? (yes/NO) "%(color["lred"], - argv[0], - color["reset"], - len(objs)), "yes") != "yes": - raise cmdWarning("Aborted") - if len(objs) > 5: - if self.printer.ask("You request is on more than 5 objets. Are you really sure to %s its? (Sir, yes Sir!) "%argv[0], "Sir, yes Sir!") != "Sir, yes Sir!": - raise cmdWarning("Aborted") + def _vm_action(self, argv, filters=None): + '''All command about vm are the same''' try: - self.cli.rpc.call(argv[0],tql) - except RpcError as e: - raise cmdError("RPCError: %s"%str(e)) + oparser = OptionParser(prog=argv[0]) + oparser.add_option("--raw", action="store_true", dest="raw", + help="Don't append filter on request") + oparser.add_option("--direct", action="store_true", dest="direct", + help="Directly send tql to server (don't list before)") + oparser.add_option("--force", action="store_true", dest="force", + help="Don't ask confirmation (Dangerous)") + (options, args) = oparser.parse_args(argv[1:]) + except SystemExit: + return + if len(args) == 0: + raise cmdBadArgument() + tql = str.join("", args) + # append securty options by command name + if filters is not None and not options.raw: + tql += filters + if options.direct: + try: + objs = self.cli.rpc.call(argv[0], tql) + except RpcError as e: + raise cmdError("RPCError: %s"%str(e)) + else: + # get objects id + try: + objs = self.cli.rpc.call("list", tql) + except RpcError as e: + raise cmdError("RPCError: %s"%str(e)) + # no result, goodbye + if len(objs) == 0: + raise cmdWarning("tql: '%s': No result."%tql) + self.printer.out("You will %s:"%argv[0]) + for obj in objs: + self.printer.out("%sid:%s%s%s"%(color["green"],color["yellow"],obj["id"],color["reset"])) + self.printer.out("%sCount: %s%s"%(color["green"],color["reset"], len(objs))) + # be sure boby want do that + if not options.force: + self.printer.out("%sProceed?%s"%(color["lred"], color["reset"])) + if self.printer.ask("Answer (yes/NO): ") != "yes": + raise cmdWarning("Aborted") + if len(objs) > 5: + self.printer.out("%sYou request is on more than 5 objets!%s"%(color["yellow"], color["reset"])) + self.printer.out("%sAre you really sure?%s"%(color["lred"], color["reset"])) + if self.printer.ask("Answer (Sir, yes Sir!): ") != "Sir, yes Sir!": + raise cmdWarning("Bad Answer. Aborted") + # execute action for each object + for obj in objs: + self.printer.out("%s%s%s %s%s%s"%(color["lblue"], + argv[0], + color["reset"], + color["yellow"], + obj["id"], + color["reset"])) + try: + self.cli.rpc.call(argv[0], "id:%s"%obj["id"]) + except RpcError as e: + self.printer.error("RPCError: %s"%str(e)) def cmd_start(self, argv): '''Start objects''' - self._vm_action(argv) - cmd_start.usage = "start [tql]" + self._vm_action(argv, "&role=vm&status=stopped") + cmd_start.usage = "start [--raw] [--direct] [--force] [--help] tql" def cmd_stop(self, argv): '''Stop objects''' - self._vm_action(argv) - cmd_stop.usage = "stop [tql]" + self._vm_action(argv, "&role=vm&status=running") + cmd_stop.usage = "stop [--raw] [--direct] [--force] [--help] tql" def cmd_pause(self, argv): '''Pause objects''' - self._vm_action(argv) - cmd_pause.usage = "pause [tql]" + self._vm_action(argv, "&role=vm&status=running") + cmd_pause.usage = "pause [--raw] [--direct] [--force] [--help] tql" def cmd_resume(self, argv): '''Resume objects''' - self._vm_action(argv) - cmd_resume.usage = "resume [tql]" + self._vm_action(argv, "&role=vm&status=stalled") + cmd_resume.usage = "resume [--raw] [--direct] [--force] [--help] tql" def cmd_destroy(self, argv): '''Force objects to stop''' - self._vm_action(argv) - cmd_destroy.usage = "destroy [tql]" + self._vm_action(argv, "&role=vm&status!=stopped") + cmd_destroy.usage = "destroy [--raw] [--direct] [--force] [--help] tql" def cmd_clear(self, argv): '''Clear tty''' diff --git a/cccli/printer.py b/cccli/printer.py index 7cb18cd5c6fb7efa20b5b5d9f226daad0654306e..4ed45ffd1505408c45fc5c9c10b65a8ffd50d0fb 100644 --- a/cccli/printer.py +++ b/cccli/printer.py @@ -46,12 +46,11 @@ color = { class Printer(object): '''Print relative class''' - def __init__(self, interactive=False, forceyes=False, historyfile=None, historysize=None): + def __init__(self, interactive=False, historyfile=None, historysize=None): self.readline = None self.history = History() self.historyfile = historyfile self.historysize = historysize - self.forceyes = forceyes if interactive: self.setinteractive() @@ -120,10 +119,8 @@ class Printer(object): raise cliError("Unable to ask a password in non-interactive mode") return getpass.getpass(prompt) - def ask(self, prompt, goodans=None): + def ask(self, prompt): '''Used to ask a question. Default answer not saved to history''' - if self.forceyes and goodans is not None: - return goodans if self.readline is None: raise cliError("Unable to ask question in non-interactive mode") return self.getline(prompt, history=False)