client: allow callers to add information to the user agent (#4690)

This change introduces a new flag to allow callers to add information to
the user agent without replacing it entirely.

This allows people re-packaging or wrapping Certbot to influence its user
agent string. They may which to do this so that stats/metrics related to
their distribution are available to boulder.

This is beneficial for both the Certbot team and the party re-packaging
Certbot as it allows the custom user agent to match the Certbot user
agent as closely as possible, allowing data about use of the re-packaged
version to be collected along side or separately from vanilla certbot.
This commit is contained in:
Zach Shepherd
2017-08-01 11:34:35 -07:00
committed by Brad Warren
parent 7461bdbffd
commit 314f4bbe22
2 changed files with 12 additions and 2 deletions
+9
View File
@@ -1145,6 +1145,11 @@ def _create_subparsers(helpful):
'(default: {0}). The flags encoded in the user agent are: ' '(default: {0}). The flags encoded in the user agent are: '
'--duplicate, --force-renew, --allow-subset-of-names, -n, and ' '--duplicate, --force-renew, --allow-subset-of-names, -n, and '
'whether any hooks are set.'.format(sample_user_agent())) 'whether any hooks are set.'.format(sample_user_agent()))
helpful.add(
None, "--user-agent-comment", default=None, type=_user_agent_comment_type,
help="Add a comment to the default user agent string. May be used when repackaging Certbot "
"or calling it from another tool to allow additional statistical data to be collected."
" Ignored if --user-agent is set. (Example: Foo-Wrapper/1.0)")
helpful.add("certonly", helpful.add("certonly",
"--csr", type=read_file, "--csr", type=read_file,
help="Path to a Certificate Signing Request (CSR) in DER or PEM format." help="Path to a Certificate Signing Request (CSR) in DER or PEM format."
@@ -1360,6 +1365,10 @@ def parse_preferred_challenges(pref_challs):
"Unrecognized challenges: {0}".format(unrecognized)) "Unrecognized challenges: {0}".format(unrecognized))
return challs return challs
def _user_agent_comment_type(value):
if "(" in value or ")" in value:
raise argparse.ArgumentTypeError("may not contain parentheses")
return value
class _DeployHookAction(argparse.Action): class _DeployHookAction(argparse.Action):
"""Action class for parsing deploy hooks.""" """Action class for parsing deploy hooks."""
+3 -2
View File
@@ -58,11 +58,12 @@ def determine_user_agent(config):
# policy, talk to a core Certbot team member before making any # policy, talk to a core Certbot team member before making any
# changes here. # changes here.
if config.user_agent is None: if config.user_agent is None:
ua = ("CertbotACMEClient/{0} ({1}; {2}) Authenticator/{3} Installer/{4} " ua = ("CertbotACMEClient/{0} ({1}; {2}{8}) Authenticator/{3} Installer/{4} "
"({5}; flags: {6}) Py/{7}") "({5}; flags: {6}) Py/{7}")
ua = ua.format(certbot.__version__, cli.cli_command, util.get_os_info_ua(), ua = ua.format(certbot.__version__, cli.cli_command, util.get_os_info_ua(),
config.authenticator, config.installer, config.verb, config.authenticator, config.installer, config.verb,
ua_flags(config), platform.python_version()) ua_flags(config), platform.python_version(),
"; " + config.user_agent_comment if config.user_agent_comment else "")
else: else:
ua = config.user_agent ua = config.user_agent
return ua return ua