Apply changes to cli since last merge from master (efc8d49806)

This commit is contained in:
Adrien Ferrand 2020-02-21 12:27:57 +01:00
parent a6d4205c02
commit a7b3d84cad
11 changed files with 81 additions and 100 deletions

View file

@ -13,7 +13,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/).
### Changed
*
* certbot._internal.cli is now a package split in submodules instead of a whole module.
### Fixed

View file

@ -5,20 +5,18 @@ import logging
import logging.handlers
import argparse
import sys
import certbot.plugins.selection as plugin_selection
from certbot.plugins import disco as plugins_disco
import certbot._internal.plugins.selection as plugin_selection
from certbot._internal.plugins import disco as plugins_disco
# pylint: disable=unused-import, no-name-in-module
from acme.magic_typing import Any, Dict, Optional
# pylint: enable=unused-import, no-name-in-module
from acme.magic_typing import Optional
import certbot
from certbot import constants
from certbot._internal import constants
import certbot.plugins.enhancements as enhancements
from certbot.cli.cli_constants import (
from certbot._internal.cli.cli_constants import (
LEAUTO,
old_path_fragment,
new_path_prefix,
@ -32,7 +30,7 @@ from certbot.cli.cli_constants import (
VAR_MODIFIERS
)
from certbot.cli.cli_utils import (
from certbot._internal.cli.cli_utils import (
_Default,
read_file,
flag_default,
@ -52,16 +50,15 @@ from certbot.cli.cli_utils import (
)
# These imports depend on cli_constants and cli_utils.
from certbot.cli.report_config_interaction import report_config_interaction
from certbot.cli.warning import possible_deprecation_warning
from certbot.cli.verb_help import VERB_HELP, VERB_HELP_MAP
from certbot.cli.group_adder import _add_all_groups
from certbot.cli.subparsers import _create_subparsers
from certbot.cli.paths_parser import _paths_parser
from certbot.cli.plugins_parsing import _plugins_parsing
from certbot._internal.cli.report_config_interaction import report_config_interaction
from certbot._internal.cli.verb_help import VERB_HELP, VERB_HELP_MAP
from certbot._internal.cli.group_adder import _add_all_groups
from certbot._internal.cli.subparsers import _create_subparsers
from certbot._internal.cli.paths_parser import _paths_parser
from certbot._internal.cli.plugins_parsing import _plugins_parsing
# These imports depend on some or all of the submodules for cli.
from certbot.cli.helpful import HelpfulArgumentParser
from certbot._internal.cli.helpful import HelpfulArgumentParser
logger = logging.getLogger(__name__)
@ -71,7 +68,7 @@ logger = logging.getLogger(__name__)
helpful_parser = None # type: Optional[HelpfulArgumentParser]
def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: disable=too-many-statements
def prepare_and_parse_args(plugins, args, detect_defaults=False):
"""Returns parsed command line arguments.
:param .PluginsRegistry plugins: available plugins
@ -82,8 +79,6 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
"""
# pylint: disable=too-many-statements
helpful = HelpfulArgumentParser(args, plugins, detect_defaults)
_add_all_groups(helpful)
@ -181,12 +176,6 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
"certificates. Updates to the Subscriber Agreement will still "
"affect you, and will be effective 14 days after posting an "
"update to the web site.")
# TODO: When `certbot register --update-registration` is fully deprecated,
# delete following helpful.add
helpful.add(
"register", "--update-registration", action="store_true",
default=flag_default("update_registration"), dest="update_registration",
help=argparse.SUPPRESS)
helpful.add(
["register", "update_account", "unregister", "automation"], "-m", "--email",
default=flag_default("email"),
@ -272,6 +261,11 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
help="(certbot-auto only) prevent the certbot-auto script from"
" installing OS-level dependencies (default: Prompt to install "
" OS-wide dependencies, but exit if the user says 'No')")
helpful.add(
"automation", "--no-permissions-check", action="store_true",
default=flag_default("no_permissions_check"),
help="(certbot-auto only) skip the check on the file system"
" permissions of the certbot-auto script")
helpful.add(
["automation", "renew", "certonly", "run"],
"-q", "--quiet", dest="quiet", action="store_true",
@ -296,14 +290,6 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
"testing", "--no-verify-ssl", action="store_true",
help=config_help("no_verify_ssl"),
default=flag_default("no_verify_ssl"))
helpful.add(
["testing", "standalone", "apache", "nginx"], "--tls-sni-01-port", type=int,
default=flag_default("tls_sni_01_port"),
help=config_help("tls_sni_01_port"))
helpful.add(
["testing", "standalone"], "--tls-sni-01-address",
default=flag_default("tls_sni_01_address"),
help=config_help("tls_sni_01_address"))
helpful.add(
["testing", "standalone", "manual"], "--http-01-port", type=int,
dest="http01_port",
@ -312,6 +298,10 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
["testing", "standalone"], "--http-01-address",
dest="http01_address",
default=flag_default("http01_address"), help=config_help("http01_address"))
helpful.add(
["testing", "nginx"], "--https-port", type=int,
default=flag_default("https_port"),
help=config_help("https_port"))
helpful.add(
"testing", "--break-my-certs", action="store_true",
default=flag_default("break_my_certs"),
@ -372,7 +362,7 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
action=_PrefChallAction, default=flag_default("pref_challs"),
help='A sorted, comma delimited list of the preferred challenge to '
'use during authorization with the most preferred challenge '
'listed first (Eg, "dns" or "tls-sni-01,http,dns"). '
'listed first (Eg, "dns" or "http,dns"). '
'Not all plugins support all challenges. See '
'https://certbot.eff.org/docs/using.html#plugins for details. '
'ACME Challenges are versioned, but if you pick "http" rather '
@ -440,9 +430,6 @@ def prepare_and_parse_args(plugins, args, detect_defaults=False): # pylint: dis
default=flag_default("autorenew"), dest="autorenew",
help="Disable auto renewal of certificates.")
helpful.add_deprecated_argument("--agree-dev-preview", 0)
helpful.add_deprecated_argument("--dialog", 0)
# Populate the command line parameters for new style enhancements
enhancements.populate_cli(helpful.add)

View file

@ -59,12 +59,13 @@ obtain, install, and renew certificates:
manage certificates:
certificates Display information about certificates you have from Certbot
revoke Revoke a certificate (supply --cert-path or --cert-name)
delete Delete a certificate
revoke Revoke a certificate (supply --cert-name or --cert-path)
delete Delete a certificate (supply --cert-name)
manage your account with Let's Encrypt:
register Create a Let's Encrypt ACME account
update_account Update a Let's Encrypt ACME account
manage your account:
register Create an ACME account
unregister Deactivate an ACME account
update_account Update an ACME account
--agree-tos Agree to the ACME server's Subscriber Agreement
-m EMAIL Email address for important account notifications
"""
@ -80,7 +81,7 @@ More detailed help:
all, automation, commands, paths, security, testing, or any of the
subcommands or plugins (certonly, renew, install, register, nginx,
apache, standalone, webroot, etc.)
-h all print a detailed help page including all topics
--version print the version number
"""

View file

@ -4,10 +4,10 @@ import copy
import os
from acme import challenges
from certbot import constants
from certbot import interfaces
from certbot import util
from certbot import errors
from certbot._internal import constants
# pylint: disable=unused-import, no-name-in-module
import zope.interface.interface
@ -63,12 +63,10 @@ def flag_default(name):
def config_help(name, hidden=False):
"""Extract the help message for an `.IConfig` attribute."""
# pylint: disable=no-member
if hidden:
return argparse.SUPPRESS
else:
field = interfaces.IConfig.__getitem__(name) # type: zope.interface.interface.Attribute
return field.__doc__
field = interfaces.IConfig.__getitem__(name) # type: zope.interface.interface.Attribute
return field.__doc__
class HelpfulArgumentGroup(object):
@ -175,9 +173,10 @@ def parse_preferred_challenges(pref_challs):
:raises errors.Error: if pref_challs is invalid
"""
aliases = {"dns": "dns-01", "http": "http-01", "tls-sni": "tls-sni-01"}
aliases = {"dns": "dns-01", "http": "http-01"}
challs = [c.strip() for c in pref_challs]
challs = [aliases.get(c, c) for c in challs]
unrecognized = ", ".join(name for name in challs
if name not in challenges.Challenge.TYPES)
if unrecognized:

View file

@ -1,6 +1,6 @@
"""This module contains a function to add the groups of arguments for the help
display"""
from certbot.cli import VERB_HELP
from certbot._internal.cli import VERB_HELP
def _add_all_groups(helpful):

View file

@ -16,16 +16,16 @@ from zope.interface import interfaces as zope_interfaces
from acme.magic_typing import Any, Dict, Optional
# pylint: enable=unused-import, no-name-in-module
from certbot import constants
from certbot import crypto_util
from certbot import errors
from certbot import hooks
from certbot import interfaces
from certbot import util
from certbot._internal import constants
from certbot._internal import hooks
from certbot.display import util as display_util
from certbot.cli import (
from certbot._internal.cli import (
SHORT_USAGE,
CustomHelpFormatter,
flag_default,
@ -34,7 +34,6 @@ from certbot.cli import (
COMMAND_OVERVIEW,
HELP_AND_VERSION_USAGE,
_Default,
possible_deprecation_warning,
add_domains,
EXIT_ACTIONS,
ZERO_ARG_ACTIONS,
@ -51,14 +50,11 @@ class HelpfulArgumentParser(object):
'certbot --help security' for security options.
"""
def __init__(self, args, plugins, detect_defaults=False):
from certbot import main
from certbot._internal import main
self.VERBS = {
"auth": main.certonly,
"certonly": main.certonly,
"config_changes": main.config_changes,
"run": main.run,
"install": main.install,
"plugins": main.plugins_cmd,
@ -124,12 +120,13 @@ class HelpfulArgumentParser(object):
" and ".join(flag_default("config_files"))))
# This is the only way to turn off overly verbose config flag documentation
self.parser._add_config_file_help = False # pylint: disable=protected-access
self.parser._add_config_file_help = False
# Help that are synonyms for --help subcommands
COMMANDS_TOPICS = ["command", "commands", "subcommand", "subcommands", "verbs"]
def _list_subcommands(self):
longest = max(len(v) for v in VERB_HELP_MAP.keys())
longest = max(len(v) for v in VERB_HELP_MAP)
text = "The full list of available SUBCOMMANDS is:\n\n"
for verb, props in sorted(VERB_HELP):
@ -157,7 +154,7 @@ class HelpfulArgumentParser(object):
apache_doc = "(the certbot apache plugin is not installed)"
usage = SHORT_USAGE
if help_arg == True:
if help_arg is True:
self.notify(usage + COMMAND_OVERVIEW % (apache_doc, nginx_doc) + HELP_AND_VERSION_USAGE)
sys.exit(0)
elif help_arg in self.COMMANDS_TOPICS:
@ -235,20 +232,25 @@ class HelpfulArgumentParser(object):
raise errors.Error(
"Parameters --hsts and --auto-hsts cannot be used simultaneously.")
possible_deprecation_warning(parsed_args)
return parsed_args
def set_test_server(self, parsed_args):
"""We have --staging/--dry-run; perform sanity check and set config.server"""
if parsed_args.server not in (flag_default("server"), constants.STAGING_URI):
conflicts = ["--staging"] if parsed_args.staging else []
conflicts += ["--dry-run"] if parsed_args.dry_run else []
raise errors.Error("--server value conflicts with {0}".format(
" and ".join(conflicts)))
# Flag combinations should produce these results:
# | --staging | --dry-run |
# ------------------------------------------------------------
# | --server acme-v02 | Use staging | Use staging |
# | --server acme-staging-v02 | Use staging | Use staging |
# | --server <other> | Conflict error | Use <other> |
parsed_args.server = constants.STAGING_URI
default_servers = (flag_default("server"), constants.STAGING_URI)
if parsed_args.staging and parsed_args.server not in default_servers:
raise errors.Error("--server value conflicts with --staging")
if parsed_args.server in default_servers:
parsed_args.server = constants.STAGING_URI
if parsed_args.dry_run:
if self.verb not in ["certonly", "renew"]:
@ -287,7 +289,7 @@ class HelpfulArgumentParser(object):
parsed_args.actual_csr = (csr, typ)
csr_domains = set([d.lower() for d in domains])
csr_domains = {d.lower() for d in domains}
config_domains = set(parsed_args.domains)
if csr_domains != config_domains:
raise errors.ConfigurationError(
@ -344,9 +346,10 @@ class HelpfulArgumentParser(object):
"""Add a new command line argument.
:param topics: str or [str] help topic(s) this should be listed under,
or None for "always documented". The first entry
determines where the flag lives in the "--help all"
output (None -> "optional arguments").
or None for options that don't fit under a specific
topic which will only be shown in "--help all" output.
The first entry determines where the flag lives in the
"--help all" output (None -> "optional arguments").
:param list *args: the names of this argument flag
:param dict **kwargs: various argparse settings for this argument
@ -459,9 +462,7 @@ class HelpfulArgumentParser(object):
chosen_topic = "run"
if chosen_topic == "all":
# Addition of condition closes #6209 (removal of duplicate route53 option).
return dict([(t, True) if t != 'certbot-route53:auth' else (t, False)
for t in self.help_topics])
return {t: t != 'certbot-route53:auth' for t in self.help_topics}
elif not chosen_topic:
return dict([(t, False) for t in self.help_topics])
else:
return dict([(t, t == chosen_topic) for t in self.help_topics])
return {t: False for t in self.help_topics}
return {t: t == chosen_topic for t in self.help_topics}

View file

@ -2,7 +2,7 @@
paths for certificates"""
import os
from certbot.cli import (
from certbot._internal.cli import (
read_file,
flag_default,
config_help

View file

@ -1,5 +1,5 @@
"""This is a module that handles parsing of plugins for the argument parser"""
from certbot.cli import flag_default
from certbot._internal.cli import flag_default
def _plugins_parsing(helpful, plugins):
@ -19,10 +19,10 @@ def _plugins_parsing(helpful, plugins):
help="Authenticator plugin name.")
helpful.add("plugins", "-i", "--installer", default=flag_default("installer"),
help="Installer plugin name (also used to find domains).")
helpful.add(["plugins", "certonly", "run", "install", "config_changes"],
helpful.add(["plugins", "certonly", "run", "install"],
"--apache", action="store_true", default=flag_default("apache"),
help="Obtain and install certificates using Apache")
helpful.add(["plugins", "certonly", "run", "install", "config_changes"],
helpful.add(["plugins", "certonly", "run", "install"],
"--nginx", action="store_true", default=flag_default("nginx"),
help="Obtain and install certificates using Nginx")
helpful.add(["plugins", "certonly"], "--standalone", action="store_true",
@ -52,12 +52,12 @@ def _plugins_parsing(helpful, plugins):
"using DNSimple for DNS)."))
helpful.add(["plugins", "certonly"], "--dns-dnsmadeeasy", action="store_true",
default=flag_default("dns_dnsmadeeasy"),
help=("Obtain certificates using a DNS TXT record (if you are"
help=("Obtain certificates using a DNS TXT record (if you are "
"using DNS Made Easy for DNS)."))
helpful.add(["plugins", "certonly"], "--dns-gehirn", action="store_true",
default=flag_default("dns_gehirn"),
help=("Obtain certificates using a DNS TXT record "
"(if you are using Gehirn Infrastracture Service for DNS)."))
"(if you are using Gehirn Infrastructure Service for DNS)."))
helpful.add(["plugins", "certonly"], "--dns-google", action="store_true",
default=flag_default("dns_google"),
help=("Obtain certificates using a DNS TXT record (if you are "

View file

@ -1,7 +1,8 @@
"""This is a module that reports config option interaction that should be
checled by set_by_cli"""
checked by set_by_cli"""
import six
from certbot.cli import VAR_MODIFIERS
from certbot._internal.cli import VAR_MODIFIERS
def report_config_interaction(modified, modifiers):

View file

@ -1,8 +1,8 @@
"""This module creates subparsers for the argument parser"""
from certbot import constants
from certbot import interfaces
from certbot._internal import constants
from certbot.cli import (
from certbot._internal.cli import (
flag_default,
read_file,
CaseInsensitiveList,
@ -12,10 +12,7 @@ from certbot.cli import (
def _create_subparsers(helpful):
helpful.add("config_changes", "--num", type=int, default=flag_default("num"),
help="How many past revisions you want to be displayed")
from certbot.client import sample_user_agent # avoid import loops
from certbot._internal.client import sample_user_agent # avoid import loops
helpful.add(
None, "--user-agent", default=flag_default("user_agent"),
help='Set a custom user agent string for the client. User agent strings allow '

View file

@ -1,7 +1,7 @@
"""This module contain help information for verbs supported by certbot"""
import os
from certbot.cli import (
from certbot._internal.cli import (
SHORT_USAGE,
flag_default
)
@ -77,11 +77,6 @@ VERB_HELP = [
"usage": "\n\n certbot install --cert-path /path/to/fullchain.pem "
" --key-path /path/to/private-key [options]\n\n"
}),
("config_changes", {
"short": "Show changes that Certbot has made to server configurations",
"opts": "Options for controlling which changes are displayed",
"usage": "\n\n certbot config_changes --num NUM [options]\n\n"
}),
("rollback", {
"short": "Roll back server conf changes made during certificate installation",
"opts": "Options for rolling back server configuration changes",
@ -89,7 +84,7 @@ VERB_HELP = [
}),
("plugins", {
"short": "List plugins that are installed and available on your system",
"opts": 'Options for for the "plugins" subcommand',
"opts": 'Options for the "plugins" subcommand',
"usage": "\n\n certbot plugins [options]\n\n"
}),
("update_symlinks", {