From 02f3bb4f0532fbe63d1e397cf72d5dfa0e6a1d70 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 23 Jun 2015 14:13:52 -0700 Subject: [PATCH] Use a completely custom usage mesage for plain --help Keep argparse in place for --help , but try to make that match the customised short help as much as possible. --- letsencrypt/cli.py | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/letsencrypt/cli.py b/letsencrypt/cli.py index 36055d909..ee95a35c5 100644 --- a/letsencrypt/cli.py +++ b/letsencrypt/cli.py @@ -25,22 +25,30 @@ from letsencrypt import reporter from letsencrypt.display import util as display_util from letsencrypt.display import ops as display_ops - from letsencrypt.plugins import disco as plugins_disco -USAGE = """ +# Argparse's help formatting has a lot of unhelpful peculiarities, so we want +# to replace as much of it as we can... + +# This is the stub to include in help generated by argparse + +SHORT_USAGE = """ letsencrypt [SUBCOMMAND] [options] [domains] The Let's Encrypt agent can obtain and install HTTPS/TLS/SSL certificates. By default, it will attempt to use a webserver both for obtaining and installing -the cert. Major SUBCOMMANDS are: +the cert. """ - (default) Obtain & install a cert in your current webserver - auth Authenticate & obtain cert, but do not install it - install Install a previously obtained cert in a server - revoke Revoke a previously obtained certificate - rollback Rollback server configuration changes made during install - config-changes Show changes made to server config during installation +# This is the short help for letsencrypt --help, where we disable argparse +# altogether +USAGE = SHORT_USAGE + """Major SUBCOMMANDS are: + + (default) everything Obtain & install a cert in your current webserver + auth Authenticate & obtain cert, but do not install it + install Install a previously obtained cert in a server + revoke Revoke a previously obtained certificate + rollback Rollback server configuration changes made during install + config-changes Show changes made to server config during installation Choice of server for authentication/installation: @@ -142,7 +150,7 @@ def run(args, config, plugins): def auth(args, config, plugins): - """Obtain a certificate (no install).""" + """Authenticate & obtain cert, but do not install it""" # XXX: Update for renewer / RenewableCert acc = _account_init(args, config) if acc is None: @@ -167,7 +175,7 @@ def auth(args, config, plugins): def install(args, config, plugins): - """Install cert in server software (no auth).""" + """Install a previously obtained cert in a server""" # XXX: Update for renewer/RenewableCert acc = _account_init(args, config) if acc is None: @@ -184,7 +192,7 @@ def install(args, config, plugins): def revoke(args, unused_config, unused_plugins): - """Revoke.""" + """Revoke a previously obtained certificate""" if args.rev_cert is None and args.rev_key is None: return "At least one of --certificate or --key is required" @@ -196,12 +204,12 @@ def revoke(args, unused_config, unused_plugins): def rollback(args, config, plugins): - """Rollback.""" + """Rollback server configuration changes made during install""" client.rollback(args.installer, args.checkpoints, config, plugins) def config_changes(unused_args, config, unused_plugins): - """View config changes. + """Show changes made to server config during installation View checkpoints and associated configuration changes. @@ -210,7 +218,7 @@ def config_changes(unused_args, config, unused_plugins): def plugins_cmd(args, config, plugins): # TODO: Use IDiplay rathern than print - """List plugins.""" + """List server software plugins""" logging.debug("Expected interfaces: %s", args.ifaces) ifaces = [] if args.ifaces is None else args.ifaces @@ -285,16 +293,22 @@ class HelpfulArgumentParser(object): plugin_names = [name for name, _p in plugins.iteritems()] self.help_topics = HELP_TOPICS + plugin_names self.parser = configargparse.ArgParser( - description=__doc__, + usage=SHORT_USAGE, formatter_class=argparse.ArgumentDefaultsHelpFormatter, args_for_setting_config_path=["-c", "--config"], default_config_files=flag_default("config_files")) + + self.parser._add_config_file_help = False self.silent_parser = SilentParser(self.parser) h1 = self.prescan_for_flag("-h", self.help_topics) h2 = self.prescan_for_flag("--help", self.help_topics) assert max(True, "a") == "a", "Gravity changed direction" help_arg = max(h1, h2) + if help_arg == True: + # just --help with no topic; avoid argparse altogether + print USAGE + sys.exit(0) self.visible_topics = self.determine_help_topics(help_arg) #print self.visible_topics self.groups = {} # elements are added by .add_group()