From: Jason Ish Date: Thu, 7 Dec 2017 20:46:33 +0000 (-0600) Subject: rework parser to support global options before subcommand X-Git-Tag: 1.0.0b1~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0789ccf2b64ddc93d20ea2afb0585b4cece50e1;p=thirdparty%2Fsuricata-update.git rework parser to support global options before subcommand Allows to do something like: suricata-update --verbose update-sources OR suricata-update update-sources --verbose having the same result. --- diff --git a/suricata/update/main.py b/suricata/update/main.py index 113ba53..c2119d8 100644 --- a/suricata/update/main.py +++ b/suricata/update/main.py @@ -940,35 +940,30 @@ def _main(): suricata_path = suricata.update.engine.get_path() - # If no command given, default to the "update" command. - if len(sys.argv) == 1 or sys.argv[1].startswith("-"): - sys.argv.insert(1, "update") - - # Arguments that are common to all sub-commands. - common_parser = argparse.ArgumentParser(add_help=False) - common_parser.add_argument( - "-c", "--config", metavar="", - help="configuration file (default: /etc/suricata/update.yaml)") - common_parser.add_argument( + global_parser = argparse.ArgumentParser(add_help=False) + global_parser.add_argument( "-v", "--verbose", action="store_true", default=False, help="Be more verbose") - common_parser.add_argument( + global_parser.add_argument( "-q", "--quiet", action="store_true", default=False, help="Be quiet, warning and error messages only") - common_parser.add_argument( + global_parser.add_argument( "-D", "--data-dir", metavar="", dest="data_dir", help="Data directory (default: /var/lib/suricata)") + global_parser.add_argument( + "-c", "--config", metavar="", + help="configuration file (default: /etc/suricata/update.yaml)") + global_args, rem = global_parser.parse_known_args() - # Create the root parser with the common_parser as a parent, - # allowing the common options to be specified before or after the - # sub-command. - parser = argparse.ArgumentParser(parents=[common_parser]) + if not rem or rem[0].startswith("-"): + rem.insert(0, "update") + parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(dest="subcommand", metavar="") # The "update" (default) sub-command parser. update_parser = subparsers.add_parser( - "update", add_help=False, parents=[common_parser]) + "update", add_help=False, parents=[global_parser]) update_parser.add_argument( "-o", "--output", metavar="", dest="output", @@ -1052,21 +1047,28 @@ def _main(): update_parser.add_argument("--drop", default=False, help=argparse.SUPPRESS) commands.listsources.register(subparsers.add_parser( - "list-sources", parents=[common_parser])) + "list-sources", parents=[global_parser])) commands.listenabledsources.register(subparsers.add_parser( - "list-enabled-sources", parents=[common_parser])) + "list-enabled-sources", parents=[global_parser])) commands.addsource.register(subparsers.add_parser( - "add-source", parents=[common_parser])) + "add-source", parents=[global_parser])) commands.updatesources.register(subparsers.add_parser( - "update-sources", parents=[common_parser])) + "update-sources", parents=[global_parser])) commands.enablesource.register(subparsers.add_parser( - "enable-source", parents=[common_parser])) + "enable-source", parents=[global_parser])) commands.disablesource.register(subparsers.add_parser( - "disable-source", parents=[common_parser])) + "disable-source", parents=[global_parser])) commands.removesource.register(subparsers.add_parser( - "remove-source", parents=[common_parser])) + "remove-source", parents=[global_parser])) + + args = parser.parse_args(rem) - args = parser.parse_args() + # Merge global args into args. + for arg in vars(global_args): + if not hasattr(args, arg): + setattr(args, arg, getattr(global_args, arg)) + elif hasattr(args, arg) and getattr(args, arg) is None: + setattr(args, arg, getattr(global_args, arg)) # Go verbose or quiet sooner than later. if args.verbose: