From 92aaa9703b2f415ae0afd3fb66a3e569e41b4853 Mon Sep 17 00:00:00 2001 From: Phil Martin Date: Thu, 13 Oct 2022 22:52:08 +0100 Subject: [PATCH 01/16] TSIG SOA query fix (#9408) * Use the TSIG keyring for the initial SOA request Helps allow the use of keys in BIND ACLs to help certbot update the correct zone. Previously TSIG was only used for zone updates, rather than for both the authoritative SOA request and zone update. * Update CHANGELOG.md * Update AUTHORS.md * Workaround for mypy failure due to dnspython stubs As per https://github.com/certbot/certbot/pull/9408#issuecomment-1257868864 Co-authored-by: Alex Zorin --- AUTHORS.md | 1 + .../certbot_dns_rfc2136/_internal/dns_rfc2136.py | 2 ++ certbot/CHANGELOG.md | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/AUTHORS.md b/AUTHORS.md index f8708dde1..4b8dd9e73 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -210,6 +210,7 @@ Authors * [Peter Conrad](https://github.com/pconrad-fb) * [Peter Eckersley](https://github.com/pde) * [Peter Mosmans](https://github.com/PeterMosmans) +* [Phil Martin](https://github.com/frillip) * [Philippe Langlois](https://github.com/langloisjp) * [Philipp Spitzer](https://github.com/spitza) * [Piero Steinger](https://github.com/Jadaw1n) diff --git a/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py b/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py index 8cf6d9966..2c52486e2 100644 --- a/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py +++ b/certbot-dns-rfc2136/certbot_dns_rfc2136/_internal/dns_rfc2136.py @@ -216,6 +216,8 @@ class _RFC2136Client: request = dns.message.make_query(domain, dns.rdatatype.SOA, dns.rdataclass.IN) # Turn off Recursion Desired bit in query request.flags ^= dns.flags.RD + # Use our TSIG keyring + request.use_tsig(self.keyring, algorithm=self.algorithm) # type: ignore[attr-defined] try: try: diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 231f5c453..9403209dc 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -10,7 +10,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Changed -* +* DNS RFC2136 module now uses the TSIG key to check for an authoritative SOA record. Helps the use of split-horizon and multiple views in BIND9 using the key in an ACL to determine which view to use. ### Fixed From 314ded348e31279cb9357bedab63d1bd9c668969 Mon Sep 17 00:00:00 2001 From: alexzorin Date: Fri, 14 Oct 2022 11:58:18 +1100 Subject: [PATCH 02/16] docs: add third-party dns-multi plugin (#9430) --- certbot/docs/using.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/certbot/docs/using.rst b/certbot/docs/using.rst index c0510da4a..ebb2348cf 100644 --- a/certbot/docs/using.rst +++ b/certbot/docs/using.rst @@ -322,6 +322,7 @@ njalla_ Y N DNS Authentication for njalla DuckDNS_ Y N DNS Authentication for DuckDNS Porkbun_ Y N DNS Authentication for Porkbun Infomaniak_ Y N DNS Authentication using Infomaniak Domains API +dns-multi_ Y N DNS authentication of 100+ providers using go-acme/lego ================== ==== ==== =============================================================== .. _haproxy: https://github.com/greenhost/certbot-haproxy @@ -344,6 +345,7 @@ Infomaniak_ Y N DNS Authentication using Infomaniak Domains API .. _DuckDNS: https://github.com/infinityofspace/certbot_dns_duckdns .. _Porkbun: https://github.com/infinityofspace/certbot_dns_porkbun .. _Infomaniak: https://github.com/Infomaniak/certbot-dns-infomaniak +.. _dns-multi: https://github.com/alexzorin/certbot-dns-multi If you're interested, you can also :ref:`write your own plugin `. From 5270c34dd79e2dfc28017afc152d0ec68763fbcf Mon Sep 17 00:00:00 2001 From: alexzorin Date: Tue, 18 Oct 2022 10:55:00 +1100 Subject: [PATCH 03/16] docs: use modern tsig-keygen util in certbot-dns-rfc2136 (#9424) Fixes #7206. I think it's about time we did this: - `dnssec-keygen` on new distros doesn't support the HMAC algorithms anymore, so our instructions don't work. - The oldest distros we support are Debian Buster (`9.11.5.P4+dfsg-5.1+deb10u7`) and CentOS 7 (`9.11.4-26.P2.el7_9.9`), which ship `tsig-keygen` and support `HMAC-SHA512`. --- certbot-dns-rfc2136/certbot_dns_rfc2136/__init__.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/certbot-dns-rfc2136/certbot_dns_rfc2136/__init__.py b/certbot-dns-rfc2136/certbot_dns_rfc2136/__init__.py index e06cef5a7..19734d29b 100644 --- a/certbot-dns-rfc2136/certbot_dns_rfc2136/__init__.py +++ b/certbot-dns-rfc2136/certbot_dns_rfc2136/__init__.py @@ -107,12 +107,11 @@ permission to issue updates on the target DNS zone. .. code-block:: bash :caption: Generate a new SHA512 TSIG key - dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST keyname. + tsig-keygen -a HMAC-SHA512 keyname. .. note:: - There are a few tools shipped with BIND that can all generate TSIG keys; - ``dnssec-keygen``, ``rndc-confgen``, and ``ddns-confgen``. Try and use the - most secure algorithm supported by your DNS server. + Prior to BIND version 9.10.0, you will need to use ``dnssec-keygen`` to generate + TSIG keys. Try and use the most secure algorithm supported by your DNS server. .. code-block:: none :caption: Sample BIND configuration From 3a738cadc36d1950b96de915ee6e3e8736ff258e Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Thu, 20 Oct 2022 13:07:18 -0700 Subject: [PATCH 04/16] Remove docker-compose dependency (#9436) This is progress towards https://github.com/certbot/certbot/issues/9370 as discussed at https://github.com/certbot/certbot/pull/9435. I kept the command using `docker-compose` because `docker compose` doesn't seem that widely recognized yet and https://www.docker.com/blog/announcing-compose-v2-general-availability/ describes aliasing `docker-compose` to `docker compose` on newer systems by default. * refactor boulder shutdown * remove docker-compose dep * Reorder shutdown process --- acme/acme/messages.py | 6 +- .../nginx_tests/context.py | 3 +- .../utils/acme_server.py | 41 ++++++--- .../utils/constants.py | 1 + .../utils/dns_server.py | 4 +- certbot-ci/setup.py | 1 - tools/oldest_constraints.txt | 64 ++++++------- tools/requirements.txt | 90 +++++++++---------- 8 files changed, 102 insertions(+), 108 deletions(-) diff --git a/acme/acme/messages.py b/acme/acme/messages.py index cdefcfa4f..a6eab3467 100644 --- a/acme/acme/messages.py +++ b/acme/acme/messages.py @@ -157,7 +157,7 @@ class Error(jose.JSONObjectWithFields, errors.Error): # Mypy does not understand the josepy magic happening here, and falsely claims # that subproblems is redefined. Let's ignore the type check here. @subproblems.decoder # type: ignore - def subproblems(value: List[Dict[str, Any]]) -> Tuple['Error', ...]: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring + def subproblems(value: List[Dict[str, Any]]) -> Tuple['Error', ...]: # pylint: disable=no-self-argument,missing-function-docstring return tuple(Error.from_json(subproblem) for subproblem in value) @classmethod @@ -603,7 +603,7 @@ class Authorization(ResourceBody): # Mypy does not understand the josepy magic happening here, and falsely claims # that challenge is redefined. Let's ignore the type check here. @challenges.decoder # type: ignore - def challenges(value: List[Dict[str, Any]]) -> Tuple[ChallengeBody, ...]: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring + def challenges(value: List[Dict[str, Any]]) -> Tuple[ChallengeBody, ...]: # pylint: disable=no-self-argument,missing-function-docstring return tuple(ChallengeBody.from_json(chall) for chall in value) @property @@ -691,7 +691,7 @@ class Order(ResourceBody): # Mypy does not understand the josepy magic happening here, and falsely claims # that identifiers is redefined. Let's ignore the type check here. @identifiers.decoder # type: ignore - def identifiers(value: List[Dict[str, Any]]) -> Tuple[Identifier, ...]: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring + def identifiers(value: List[Dict[str, Any]]) -> Tuple[Identifier, ...]: # pylint: disable=no-self-argument,missing-function-docstring return tuple(Identifier.from_json(identifier) for identifier in value) diff --git a/certbot-ci/certbot_integration_tests/nginx_tests/context.py b/certbot-ci/certbot_integration_tests/nginx_tests/context.py index d52501596..9dd633db2 100644 --- a/certbot-ci/certbot_integration_tests/nginx_tests/context.py +++ b/certbot-ci/certbot_integration_tests/nginx_tests/context.py @@ -9,6 +9,7 @@ import pytest from certbot_integration_tests.certbot_tests import context as certbot_context from certbot_integration_tests.nginx_tests import nginx_config as config from certbot_integration_tests.utils import certbot_call +from certbot_integration_tests.utils import constants from certbot_integration_tests.utils import misc @@ -65,4 +66,4 @@ class IntegrationTestsContext(certbot_context.IntegrationTestsContext): def _stop_nginx(self) -> None: assert self.process.poll() is None self.process.terminate() - self.process.wait() + self.process.wait(constants.MAX_SUBPROCESS_WAIT) diff --git a/certbot-ci/certbot_integration_tests/utils/acme_server.py b/certbot-ci/certbot_integration_tests/utils/acme_server.py index 8994d0ef0..c12057cd4 100755 --- a/certbot-ci/certbot_integration_tests/utils/acme_server.py +++ b/certbot-ci/certbot_integration_tests/utils/acme_server.py @@ -18,6 +18,7 @@ from typing import Dict from typing import List from typing import Mapping from typing import Optional +from typing import Tuple from typing import Type import requests @@ -63,6 +64,7 @@ class ACMEServer: self._stdout = sys.stdout if stdout else open(os.devnull, 'w') # pylint: disable=consider-using-with self._dns_server = dns_server self._http_01_port = http_01_port + self._preterminate_cmds_args: List[Tuple[Tuple[Any, ...], Dict[str, Any]]] = [] if http_01_port != DEFAULT_HTTP_01_PORT: if self._acme_type != 'pebble' or self._proxy: raise ValueError('setting http_01_port is not currently supported ' @@ -85,6 +87,7 @@ class ACMEServer: """Stop the test stack, and clean its resources""" print('=> Tear down the test infrastructure...') try: + self._run_preterminate_cmds() for process in self._processes: try: process.terminate() @@ -94,17 +97,7 @@ class ACMEServer: if e.errno != errno.ESRCH: raise for process in self._processes: - process.wait() - - if os.path.exists(os.path.join(self._workspace, 'boulder')): - # Boulder docker generates build artifacts owned by root with 0o744 permissions. - # If we started the acme server from a normal user that has access to the Docker - # daemon, this user will not be able to delete these artifacts from the host. - # We need to do it through a docker. - process = self._launch_process(['docker', 'run', '--rm', '-v', - '{0}:/workspace'.format(self._workspace), - 'alpine', 'rm', '-rf', '/workspace/boulder']) - process.wait() + process.wait(MAX_SUBPROCESS_WAIT) finally: if os.path.exists(self._workspace): shutil.rmtree(self._workspace) @@ -187,7 +180,7 @@ class ACMEServer: # Load Boulder from git, that includes a docker-compose.yml ready for production. process = self._launch_process(['git', 'clone', 'https://github.com/letsencrypt/boulder', '--single-branch', '--depth=1', instance_path]) - process.wait() + process.wait(MAX_SUBPROCESS_WAIT) # Allow Boulder to ignore usual limit rate policies, useful for tests. os.rename(join(instance_path, 'test/rate-limit-policies-b.yml'), @@ -202,6 +195,17 @@ class ACMEServer: with open(join(instance_path, 'test/config/va{}.json'.format(suffix)), 'w') as f: f.write(json.dumps(config, indent=2, separators=(',', ': '))) + # This command needs to be run before we try and terminate running processes because + # docker-compose up doesn't always respond to SIGTERM. See + # https://github.com/certbot/certbot/pull/9435. + self._register_preterminate_cmd(['docker-compose', 'down'], cwd=instance_path) + # Boulder docker generates build artifacts owned by root with 0o744 permissions. + # If we started the acme server from a normal user that has access to the Docker + # daemon, this user will not be able to delete these artifacts from the host. + # We need to do it through a docker. + self._register_preterminate_cmd(['docker', 'run', '--rm', '-v', + '{0}:/workspace'.format(self._workspace), 'alpine', 'rm', + '-rf', '/workspace/boulder']) try: # Launch the Boulder server self._launch_process(['docker-compose', 'up', '--force-recreate'], cwd=instance_path) @@ -224,7 +228,7 @@ class ACMEServer: process = self._launch_process([ 'docker-compose', 'logs'], cwd=instance_path, force_stderr=True ) - process.wait() + process.wait(MAX_SUBPROCESS_WAIT) raise print('=> Finished boulder instance deployment.') @@ -253,6 +257,17 @@ class ACMEServer: self._processes.append(process) return process + def _register_preterminate_cmd(self, *args: Any, **kwargs: Any) -> None: + self._preterminate_cmds_args.append((args, kwargs)) + + def _run_preterminate_cmds(self) -> None: + for args, kwargs in self._preterminate_cmds_args: + process = self._launch_process(*args, **kwargs) + process.wait(MAX_SUBPROCESS_WAIT) + # It's unlikely to matter, but let's clear the list of cleanup commands + # once they've been run. + self._preterminate_cmds_args.clear() + def main() -> None: # pylint: disable=missing-function-docstring diff --git a/certbot-ci/certbot_integration_tests/utils/constants.py b/certbot-ci/certbot_integration_tests/utils/constants.py index a788881ef..ce0cd91d5 100644 --- a/certbot-ci/certbot_integration_tests/utils/constants.py +++ b/certbot-ci/certbot_integration_tests/utils/constants.py @@ -9,3 +9,4 @@ PEBBLE_MANAGEMENT_URL = 'https://localhost:15000' PEBBLE_CHALLTESTSRV_URL = f'http://localhost:{CHALLTESTSRV_PORT}' MOCK_OCSP_SERVER_PORT = 4002 PEBBLE_ALTERNATE_ROOTS = 2 +MAX_SUBPROCESS_WAIT = 120 diff --git a/certbot-ci/certbot_integration_tests/utils/dns_server.py b/certbot-ci/certbot_integration_tests/utils/dns_server.py index 7dfc9c0b2..ed5b6ccae 100644 --- a/certbot-ci/certbot_integration_tests/utils/dns_server.py +++ b/certbot-ci/certbot_integration_tests/utils/dns_server.py @@ -17,6 +17,8 @@ from typing import Type from pkg_resources import resource_filename +from certbot_integration_tests.utils import constants + BIND_DOCKER_IMAGE = "internetsystemsconsortium/bind9:9.16" BIND_BIND_ADDRESS = ("127.0.0.1", 45953) @@ -67,7 +69,7 @@ class DNSServer: if self.process: try: self.process.terminate() - self.process.wait() + self.process.wait(constants.MAX_SUBPROCESS_WAIT) except BaseException as e: print("BIND9 did not stop cleanly: {}".format(e), file=sys.stderr) diff --git a/certbot-ci/setup.py b/certbot-ci/setup.py index 4341ef266..728c6c707 100644 --- a/certbot-ci/setup.py +++ b/certbot-ci/setup.py @@ -15,7 +15,6 @@ if parse_version(setuptools_version) < parse_version(min_setuptools_version): install_requires = [ 'coverage', 'cryptography', - 'docker-compose', 'pyopenssl', 'pytest', 'pytest-cov', diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index 16dfbb758..e5f4db42f 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -3,58 +3,49 @@ apacheconfig==0.3.2 asn1crypto==0.24.0 astroid==2.11.7; python_version >= "3.7" -atomicwrites==1.4.1; sys_platform == "win32" and python_version >= "3.7" attrs==22.1.0; python_version >= "3.7" -bcrypt==3.2.2; python_version >= "3.7" boto3==1.15.15 botocore==1.18.15 -cached-property==1.5.2; python_version >= "3.7" -certifi==2022.6.15; python_version >= "3.7" +certifi==2022.9.24; python_version >= "3.7" cffi==1.9.1 chardet==3.0.4 cloudflare==1.5.1 colorama==0.4.5; sys_platform == "win32" and python_version >= "3.7" configargparse==0.10.0 configobj==5.0.6 -coverage==6.4.2; python_version >= "3.7" +coverage==6.5.0; python_version >= "3.7" cryptography==3.2.1 -cython==0.29.31 +cython==0.29.32 dill==0.3.5.1; python_version >= "3.7" -distlib==0.3.5; python_version >= "3.7" +distlib==0.3.6; python_version >= "3.7" distro==1.0.1 dns-lexicon==3.2.1 dnspython==1.15.0 -docker-compose==1.25.5; python_version >= "3.7" -docker==4.2.2; python_version >= "3.7" -dockerpty==0.4.1; python_version >= "3.7" -docopt==0.6.2; python_version >= "3.7" execnet==1.9.0; python_version >= "3.7" -filelock==3.7.1; python_version >= "3.7" +filelock==3.8.0; python_version >= "3.7" funcsigs==0.4 future==0.18.2; python_version >= "3.7" google-api-python-client==1.5.5 httplib2==0.9.2 idna==2.6 -importlib-metadata==4.12.0; python_version < "3.8" and python_version >= "3.7" +importlib-metadata==5.0.0; python_version < "3.8" and python_version >= "3.7" iniconfig==1.1.1; python_version >= "3.7" ipaddress==1.0.16 isort==5.10.1; python_version >= "3.7" and python_version < "4.0" jmespath==0.10.0; python_version >= "3.7" josepy==1.13.0; python_version >= "3.7" -jsonschema==3.2.0; python_version >= "3.7" lazy-object-proxy==1.7.1; python_version >= "3.7" logger==1.4; python_version >= "3.7" mccabe==0.7.0; python_version >= "3.7" mock==1.0.1 mypy-extensions==0.4.3; python_version >= "3.7" -mypy==0.971; python_version >= "3.7" +mypy==0.982; python_version >= "3.7" ndg-httpsclient==0.3.2 oauth2client==4.0.0 packaging==21.3; python_version >= "3.7" -paramiko==2.11.0; python_version >= "3.7" parsedatetime==2.4 pbr==1.8.0 -pip==22.2.1; python_version >= "3.7" +pip==22.3; python_version >= "3.7" platformdirs==2.5.2; python_version >= "3.7" pluggy==1.0.0; python_version >= "3.7" ply==3.4 @@ -63,53 +54,48 @@ pyasn1-modules==0.0.10; python_version >= "3.7" pyasn1==0.1.9 pycparser==2.14 pylint==2.13.9 -pynacl==1.5.0; python_version >= "3.7" pyopenssl==17.5.0 pyparsing==2.2.1 -pypiwin32==223; sys_platform == "win32" and python_version >= "3.7" pyrfc3339==1.0 -pyrsistent==0.18.1; python_version >= "3.7" -pytest-cov==3.0.0; python_version >= "3.7" +pytest-cov==4.0.0; python_version >= "3.7" pytest-forked==1.4.0; python_version >= "3.7" pytest-xdist==2.5.0; python_version >= "3.7" -pytest==7.1.2; python_version >= "3.7" +pytest==7.1.3; python_version >= "3.7" python-augeas==0.5.0 python-dateutil==2.8.2; python_version >= "3.7" python-digitalocean==1.11 pytz==2019.3 pywin32==304; sys_platform == "win32" and python_version >= "3.7" -pyyaml==5.4.1; python_version >= "3.7" +pyyaml==6.0; python_version >= "3.7" requests-file==1.5.1; python_version >= "3.7" -requests-toolbelt==0.9.1; python_version >= "3.7" +requests-toolbelt==0.10.0; python_version >= "3.7" requests==2.20.0 rsa==4.9; python_version >= "3.7" and python_version < "4" s3transfer==0.3.7; python_version >= "3.7" setuptools==41.6.0 six==1.11.0 -texttable==1.6.4; python_version >= "3.7" -tldextract==3.3.1; python_version >= "3.7" +tldextract==3.4.0; python_version >= "3.7" tomli==2.0.1; python_version < "3.11" and python_version >= "3.7" or python_full_version <= "3.11.0a6" and python_version >= "3.7" or python_version >= "3.7" tox==1.9.2; python_version >= "3.7" typed-ast==1.5.4; python_version >= "3.7" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.7" -types-cryptography==3.3.21; python_version >= "3.7" -types-mock==4.0.15; python_version >= "3.7" -types-pyopenssl==22.0.9; python_version >= "3.7" +types-cryptography==3.3.23.1; python_version >= "3.7" +types-mock==4.0.15.1; python_version >= "3.7" +types-pyopenssl==22.1.0.1; python_version >= "3.7" types-pyrfc3339==1.1.1; python_version >= "3.7" -types-python-dateutil==2.8.19; python_version >= "3.7" -types-pytz==2022.1.2; python_version >= "3.7" -types-requests==2.28.5; python_version >= "3.7" -types-setuptools==63.2.2; python_version >= "3.7" -types-six==1.16.18; python_version >= "3.7" -types-urllib3==1.26.17; python_version >= "3.7" -typing-extensions==4.3.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" +types-python-dateutil==2.8.19.2; python_version >= "3.7" +types-pytz==2022.5.0.0; python_version >= "3.7" +types-requests==2.28.11.2; python_version >= "3.7" +types-setuptools==65.5.0.1; python_version >= "3.7" +types-six==1.16.21; python_version >= "3.7" +types-urllib3==1.26.25.1; python_version >= "3.7" +typing-extensions==4.4.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" uritemplate==3.0.1; python_version >= "3.7" urllib3==1.24.2 -virtualenv==20.16.2; python_version >= "3.7" -websocket-client==0.59.0; python_version >= "3.7" +virtualenv==20.16.5; python_version >= "3.7" wheel==0.33.6 wheel==0.33.6; python_version >= "3.7" wrapt==1.14.1; python_version >= "3.7" -zipp==3.8.1; python_version < "3.8" and python_version >= "3.7" +zipp==3.9.0; python_version < "3.8" and python_version >= "3.7" zope.component==4.1.0 zope.event==4.0.3 zope.hookable==4.0.4 diff --git a/tools/requirements.txt b/tools/requirements.txt index fb3afc90f..36c8bbf85 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -11,52 +11,47 @@ appdirs==1.4.4; python_version >= "3.7" and python_version < "4.0" appnope==0.1.3; python_version >= "3.7" and sys_platform == "darwin" astroid==2.11.7; python_version >= "3.7" attrs==22.1.0; python_version >= "3.7" -awscli==1.25.76 -awscli==1.25.76; python_version >= "3.7" +awscli==1.25.95 +awscli==1.25.95; python_version >= "3.7" azure-devops==6.0.0b4; python_version >= "3.7" babel==2.10.3; python_version >= "3.7" backcall==0.2.0; python_version >= "3.7" -bcrypt==4.0.0; python_version >= "3.7" +bcrypt==4.0.1; python_version >= "3.7" beautifulsoup4==4.11.1; python_version >= "3.7" bleach==5.0.1; python_version >= "3.7" -boto3==1.24.75; python_version >= "3.7" -botocore==1.27.75; python_version >= "3.7" +boto3==1.24.94; python_version >= "3.7" +botocore==1.27.94; python_version >= "3.7" cachecontrol==0.12.12; python_version >= "3.7" and python_version < "4.0" -cached-property==1.5.2; python_version < "3.8" and python_version >= "3.7" cachetools==5.2.0; python_version >= "3.7" and python_version < "4.0" cachy==0.3.0; python_version >= "3.7" and python_version < "4.0" -certifi==2022.9.14; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" +certifi==2022.9.24; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" cffi==1.15.1; python_version >= "3.7" charset-normalizer==2.1.1; python_version >= "3.7" and python_version < "4" cleo==1.0.0a5; python_version >= "3.7" and python_version < "4.0" -cloudflare==2.10.1; python_version >= "3.7" +cloudflare==2.10.2; python_version >= "3.7" colorama==0.4.4; python_version >= "3.7" configargparse==1.5.3; python_version >= "3.7" configobj==5.0.6; python_version >= "3.7" -coverage==6.4.4; python_version >= "3.7" +coverage==6.5.0; python_version >= "3.7" crashtest==0.3.1; python_version >= "3.7" and python_version < "4.0" -cryptography==38.0.1 -cryptography==38.0.1; python_version >= "3.7" +cryptography==38.0.2 +cryptography==38.0.2; python_version >= "3.7" cython==0.29.32 decorator==5.1.1; python_version >= "3.7" dill==0.3.5.1; python_version >= "3.7" distlib==0.3.6; python_version >= "3.7" -distro==1.7.0; python_version >= "3.7" +distro==1.8.0; python_version >= "3.7" dns-lexicon==3.11.1; python_version >= "3.7" and python_version < "4.0" dnspython==2.2.1; python_version >= "3.7" and python_version < "4.0" -docker-compose==1.29.2; python_version >= "3.7" -docker==6.0.0; python_version >= "3.7" -dockerpty==0.4.1; python_version >= "3.7" -docopt==0.6.2; python_version >= "3.7" docutils==0.16; python_version >= "3.7" entrypoints==0.3; python_version >= "3.7" and python_version < "4.0" execnet==1.9.0; python_version >= "3.7" fabric==2.7.1; python_version >= "3.7" filelock==3.8.0; python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" -google-api-core==2.10.1; python_version >= "3.7" -google-api-python-client==2.61.0; python_version >= "3.7" +google-api-core==2.10.2; python_version >= "3.7" +google-api-python-client==2.65.0; python_version >= "3.7" google-auth-httplib2==0.1.0; python_version >= "3.7" -google-auth==2.11.0; python_version >= "3.7" +google-auth==2.13.0; python_version >= "3.7" googleapis-common-protos==1.56.4; python_version >= "3.7" html5lib==1.1; python_version >= "3.7" and python_version < "4.0" httplib2==0.20.4; python_version >= "3.7" @@ -64,7 +59,7 @@ idna==3.4; python_version >= "3.7" and python_version < "4" or python_version >= imagesize==1.4.1; python_version >= "3.7" importlib-metadata==1.7.0; python_version >= "3.7" and python_version < "3.8" iniconfig==1.1.1; python_version >= "3.7" -invoke==1.7.1; python_version >= "3.7" +invoke==1.7.3; python_version >= "3.7" ipdb==0.13.9; python_version >= "3.7" ipython==7.34.0; python_version >= "3.7" isodate==0.6.1; python_version >= "3.7" @@ -76,7 +71,6 @@ jmespath==1.0.1; python_version >= "3.7" josepy==1.13.0; python_version >= "3.7" jsonlines==3.1.0; python_version >= "3.7" jsonpickle==2.2.0; python_version >= "3.7" -jsonschema==3.2.0; python_version >= "3.7" keyring==22.3.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" lazy-object-proxy==1.7.1; python_version >= "3.7" markupsafe==2.1.1; python_version >= "3.7" @@ -86,9 +80,9 @@ mock==4.0.3 msgpack==1.0.4; python_version >= "3.7" and python_version < "4.0" msrest==0.6.21; python_version >= "3.7" mypy-extensions==0.4.3; python_version >= "3.7" -mypy==0.971; python_version >= "3.7" +mypy==0.982; python_version >= "3.7" oauth2client==4.1.3; python_version >= "3.7" -oauthlib==3.2.1; python_version >= "3.7" +oauthlib==3.2.2; python_version >= "3.7" packaging==20.9; python_version >= "3.7" paramiko==2.11.0; python_version >= "3.7" parsedatetime==2.6; python_version >= "3.7" @@ -96,7 +90,7 @@ parso==0.8.3; python_version >= "3.7" pathlib2==2.3.7.post1; python_version >= "3.7" pexpect==4.8.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" and sys_platform != "win32" pickleshare==0.7.5; python_version >= "3.7" -pip==22.2.2; python_version >= "3.7" +pip==22.3; python_version >= "3.7" pkginfo==1.8.3; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" platformdirs==2.5.2; python_version >= "3.7" pluggy==1.0.0; python_version >= "3.7" @@ -104,7 +98,7 @@ ply==3.11; python_version >= "3.7" poetry-core==1.1.0a7 poetry==1.2.0a2 prompt-toolkit==3.0.31; python_version >= "3.7" -protobuf==4.21.6; python_version >= "3.7" +protobuf==4.21.8; python_version >= "3.7" ptyprocess==0.7.0; python_version >= "3.7" and python_version < "4.0" py==1.11.0; python_version >= "3.7" pyasn1-modules==0.2.8; python_version >= "3.7" @@ -115,23 +109,21 @@ pylev==1.4.0; python_version >= "3.7" and python_version < "4.0" pylint==2.13.9 pynacl==1.5.0; python_version >= "3.7" pynsist==2.7; python_version >= "3.7" -pyopenssl==22.0.0; python_version >= "3.7" +pyopenssl==22.1.0; python_version >= "3.7" pyparsing==3.0.9; python_version >= "3.7" pyrfc3339==1.1; python_version >= "3.7" -pyrsistent==0.18.1; python_version >= "3.7" -pytest-cov==3.0.0; python_version >= "3.7" +pytest-cov==4.0.0; python_version >= "3.7" pytest-forked==1.4.0; python_version >= "3.7" pytest-xdist==2.5.0; python_version >= "3.7" pytest==7.1.3; python_version >= "3.7" python-augeas==1.1.0; python_version >= "3.7" python-dateutil==2.8.2; python_version >= "3.7" python-digitalocean==1.17.0; python_version >= "3.7" -python-dotenv==0.21.0; python_version >= "3.7" -pytz==2022.2.1; python_version >= "3.7" +pytz==2022.5; python_version >= "3.7" pywin32-ctypes==0.2.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" pywin32==304; sys_platform == "win32" and python_version >= "3.7" pyyaml==5.4.1; python_version >= "3.7" -readme-renderer==37.1; python_version >= "3.7" +readme-renderer==37.2; python_version >= "3.7" requests-download==0.1.2; python_version >= "3.7" requests-file==1.5.1; python_version >= "3.7" and python_version < "4.0" requests-oauthlib==1.3.1; python_version >= "3.7" @@ -142,8 +134,8 @@ rsa==4.7.2; python_version >= "3.7" and python_version < "4" s3transfer==0.6.0; python_version >= "3.7" secretstorage==3.3.3; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" semantic-version==2.10.0; python_version >= "3.7" -setuptools-rust==1.5.1 -setuptools==65.3.0; python_version >= "3.7" +setuptools-rust==1.5.2 +setuptools==65.5.0; python_version >= "3.7" shellingham==1.5.0; python_version >= "3.7" and python_version < "4.0" six==1.16.0; python_version >= "3.7" snowballstemmer==2.2.0; python_version >= "3.7" @@ -156,38 +148,36 @@ sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.7" sphinxcontrib-jsmath==1.0.1; python_version >= "3.7" sphinxcontrib-qthelp==1.0.3; python_version >= "3.7" sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.7" -texttable==1.6.4; python_version >= "3.7" -tldextract==3.3.1; python_version >= "3.7" and python_version < "4.0" +tldextract==3.4.0; python_version >= "3.7" and python_version < "4.0" toml==0.10.2; python_version >= "3.7" tomli==2.0.1; python_version < "3.11" and python_version >= "3.7" or python_full_version <= "3.11.0a6" and python_version >= "3.7" or python_version >= "3.7" -tomlkit==0.11.4; python_version >= "3.7" and python_version < "4.0" +tomlkit==0.11.5; python_version >= "3.7" and python_version < "4.0" tox==3.26.0; python_version >= "3.7" tqdm==4.64.1; python_version >= "3.7" -traitlets==5.4.0; python_version >= "3.7" +traitlets==5.5.0; python_version >= "3.7" twine==3.3.0; python_version >= "3.7" typed-ast==1.5.4; python_version >= "3.7" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.7" -types-cryptography==3.3.23; python_version >= "3.7" -types-mock==4.0.15; python_version >= "3.7" -types-pyopenssl==22.0.10; python_version >= "3.7" +types-cryptography==3.3.23.1; python_version >= "3.7" +types-mock==4.0.15.1; python_version >= "3.7" +types-pyopenssl==22.1.0.1; python_version >= "3.7" types-pyrfc3339==1.1.1; python_version >= "3.7" -types-python-dateutil==2.8.19; python_version >= "3.7" -types-pytz==2022.2.1.0; python_version >= "3.7" -types-requests==2.28.10; python_version >= "3.7" -types-setuptools==65.3.0; python_version >= "3.7" -types-six==1.16.19; python_version >= "3.7" -types-urllib3==1.26.24; python_version >= "3.7" -typing-extensions==4.3.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" +types-python-dateutil==2.8.19.2; python_version >= "3.7" +types-pytz==2022.5.0.0; python_version >= "3.7" +types-requests==2.28.11.2; python_version >= "3.7" +types-setuptools==65.5.0.1; python_version >= "3.7" +types-six==1.16.21; python_version >= "3.7" +types-urllib3==1.26.25.1; python_version >= "3.7" +typing-extensions==4.4.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" uritemplate==4.1.1; python_version >= "3.7" urllib3==1.26.12; python_version >= "3.7" and python_version < "4" virtualenv==20.4.4; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" wcwidth==0.2.5; python_version >= "3.7" webencodings==0.5.1; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" -websocket-client==0.59.0; python_version >= "3.7" wheel==0.37.1; python_version >= "3.7" wrapt==1.14.1; python_version >= "3.7" yarg==0.1.9; python_version >= "3.7" -zipp==3.8.1; python_version >= "3.7" and python_version < "3.8" +zipp==3.9.0; python_version >= "3.7" and python_version < "3.8" zope.component==5.0.1; python_version >= "3.7" zope.event==4.5.0; python_version >= "3.7" zope.hookable==5.2; python_version >= "3.7" -zope.interface==5.4.0; python_version >= "3.7" +zope.interface==5.5.0; python_version >= "3.7" From 529942fe4b8f5000d801e1e99a2260850b05dd31 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Fri, 21 Oct 2022 01:59:33 -0700 Subject: [PATCH 05/16] Unpin poetry (#9438) * unpin poetry * export constraints --- certbot/setup.py | 6 +- tools/oldest_constraints.txt | 199 +++++----- .../common/export-pinned-dependencies.sh | 2 +- tools/pinning/current/pyproject.toml | 12 - tools/pinning/oldest/pyproject.toml | 2 +- tools/requirements.txt | 360 +++++++++--------- 6 files changed, 290 insertions(+), 291 deletions(-) diff --git a/certbot/setup.py b/certbot/setup.py index 8f1de50ca..144dca36a 100644 --- a/certbot/setup.py +++ b/certbot/setup.py @@ -69,7 +69,11 @@ dev_extras = [ 'ipdb', # poetry 1.2.0+ is required for it to pin pip, setuptools, and wheel. See # https://github.com/python-poetry/poetry/issues/1584. - 'poetry>=1.2.0a1', + 'poetry>=1.2.0', + # poetry-plugin-export>=1.1.0 is required to use the constraints.txt export + # format. See + # https://github.com/python-poetry/poetry-plugin-export/blob/efcfd34859e72f6a79a80398f197ce6eb2bbd7cd/CHANGELOG.md#added. + 'poetry-plugin-export>=1.1.0', 'twine', ] diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index e5f4db42f..75fc47aba 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -1,102 +1,101 @@ # This file was generated by tools/pinning/oldest/repin.sh and can be updated using # that script. -apacheconfig==0.3.2 -asn1crypto==0.24.0 -astroid==2.11.7; python_version >= "3.7" -attrs==22.1.0; python_version >= "3.7" -boto3==1.15.15 -botocore==1.18.15 -certifi==2022.9.24; python_version >= "3.7" -cffi==1.9.1 -chardet==3.0.4 -cloudflare==1.5.1 -colorama==0.4.5; sys_platform == "win32" and python_version >= "3.7" -configargparse==0.10.0 -configobj==5.0.6 -coverage==6.5.0; python_version >= "3.7" -cryptography==3.2.1 -cython==0.29.32 -dill==0.3.5.1; python_version >= "3.7" -distlib==0.3.6; python_version >= "3.7" -distro==1.0.1 -dns-lexicon==3.2.1 -dnspython==1.15.0 -execnet==1.9.0; python_version >= "3.7" -filelock==3.8.0; python_version >= "3.7" -funcsigs==0.4 -future==0.18.2; python_version >= "3.7" -google-api-python-client==1.5.5 -httplib2==0.9.2 -idna==2.6 -importlib-metadata==5.0.0; python_version < "3.8" and python_version >= "3.7" -iniconfig==1.1.1; python_version >= "3.7" -ipaddress==1.0.16 -isort==5.10.1; python_version >= "3.7" and python_version < "4.0" -jmespath==0.10.0; python_version >= "3.7" -josepy==1.13.0; python_version >= "3.7" -lazy-object-proxy==1.7.1; python_version >= "3.7" -logger==1.4; python_version >= "3.7" -mccabe==0.7.0; python_version >= "3.7" -mock==1.0.1 -mypy-extensions==0.4.3; python_version >= "3.7" -mypy==0.982; python_version >= "3.7" -ndg-httpsclient==0.3.2 -oauth2client==4.0.0 -packaging==21.3; python_version >= "3.7" -parsedatetime==2.4 -pbr==1.8.0 -pip==22.3; python_version >= "3.7" -platformdirs==2.5.2; python_version >= "3.7" -pluggy==1.0.0; python_version >= "3.7" -ply==3.4 -py==1.11.0; python_version >= "3.7" -pyasn1-modules==0.0.10; python_version >= "3.7" -pyasn1==0.1.9 -pycparser==2.14 -pylint==2.13.9 -pyopenssl==17.5.0 -pyparsing==2.2.1 -pyrfc3339==1.0 -pytest-cov==4.0.0; python_version >= "3.7" -pytest-forked==1.4.0; python_version >= "3.7" -pytest-xdist==2.5.0; python_version >= "3.7" -pytest==7.1.3; python_version >= "3.7" -python-augeas==0.5.0 -python-dateutil==2.8.2; python_version >= "3.7" -python-digitalocean==1.11 -pytz==2019.3 -pywin32==304; sys_platform == "win32" and python_version >= "3.7" -pyyaml==6.0; python_version >= "3.7" -requests-file==1.5.1; python_version >= "3.7" -requests-toolbelt==0.10.0; python_version >= "3.7" -requests==2.20.0 -rsa==4.9; python_version >= "3.7" and python_version < "4" -s3transfer==0.3.7; python_version >= "3.7" -setuptools==41.6.0 -six==1.11.0 -tldextract==3.4.0; python_version >= "3.7" -tomli==2.0.1; python_version < "3.11" and python_version >= "3.7" or python_full_version <= "3.11.0a6" and python_version >= "3.7" or python_version >= "3.7" -tox==1.9.2; python_version >= "3.7" -typed-ast==1.5.4; python_version >= "3.7" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.7" -types-cryptography==3.3.23.1; python_version >= "3.7" -types-mock==4.0.15.1; python_version >= "3.7" -types-pyopenssl==22.1.0.1; python_version >= "3.7" -types-pyrfc3339==1.1.1; python_version >= "3.7" -types-python-dateutil==2.8.19.2; python_version >= "3.7" -types-pytz==2022.5.0.0; python_version >= "3.7" -types-requests==2.28.11.2; python_version >= "3.7" -types-setuptools==65.5.0.1; python_version >= "3.7" -types-six==1.16.21; python_version >= "3.7" -types-urllib3==1.26.25.1; python_version >= "3.7" -typing-extensions==4.4.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" -uritemplate==3.0.1; python_version >= "3.7" -urllib3==1.24.2 -virtualenv==20.16.5; python_version >= "3.7" -wheel==0.33.6 -wheel==0.33.6; python_version >= "3.7" -wrapt==1.14.1; python_version >= "3.7" -zipp==3.9.0; python_version < "3.8" and python_version >= "3.7" -zope.component==4.1.0 -zope.event==4.0.3 -zope.hookable==4.0.4 -zope.interface==4.0.5 +apacheconfig==0.3.2 ; python_full_version < "3.8.0" and python_version >= "3.7" +asn1crypto==0.24.0 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +astroid==2.11.7 ; python_full_version < "3.8.0" and python_version >= "3.7" +attrs==22.1.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +boto3==1.15.15 ; python_full_version < "3.8.0" and python_version >= "3.7" +botocore==1.18.15 ; python_full_version < "3.8.0" and python_version >= "3.7" +certifi==2022.9.24 ; python_full_version < "3.8.0" and python_version >= "3.7" +cffi==1.9.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +chardet==3.0.4 ; python_full_version < "3.8.0" and python_version >= "3.7" +cloudflare==1.5.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +colorama==0.4.5 ; python_full_version < "3.8.0" and sys_platform == "win32" and python_version >= "3.7" +configargparse==0.10.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +configobj==5.0.6 ; python_full_version < "3.8.0" and python_version >= "3.7" +coverage==6.5.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +cryptography==3.2.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +cython==0.29.32 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +dill==0.3.5.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +distlib==0.3.6 ; python_version >= "3.7" and python_full_version < "3.8.0" +distro==1.0.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +dns-lexicon==3.2.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +dnspython==1.15.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +execnet==1.9.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +filelock==3.8.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +funcsigs==0.4 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +future==0.18.2 ; python_full_version < "3.8.0" and python_version >= "3.7" +google-api-python-client==1.5.5 ; python_full_version < "3.8.0" and python_version >= "3.7" +httplib2==0.9.2 ; python_full_version < "3.8.0" and python_version >= "3.7" +idna==2.6 ; python_full_version < "3.8.0" and python_version >= "3.7" +importlib-metadata==5.0.0 ; python_version >= "3.7" and python_version < "3.8" +iniconfig==1.1.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +ipaddress==1.0.16 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +isort==5.10.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +jmespath==0.10.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +josepy==1.13.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +lazy-object-proxy==1.7.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +logger==1.4 ; python_full_version < "3.8.0" and python_version >= "3.7" +mccabe==0.7.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +mock==1.0.1 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +mypy-extensions==0.4.3 ; python_version >= "3.7" and python_full_version < "3.8.0" +mypy==0.982 ; python_version >= "3.7" and python_full_version < "3.8.0" +ndg-httpsclient==0.3.2 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +oauth2client==4.0.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +packaging==21.3 ; python_version >= "3.7" and python_full_version < "3.8.0" +parsedatetime==2.4 ; python_full_version < "3.8.0" and python_version >= "3.7" +pbr==1.8.0 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +pip==22.3 ; python_version >= "3.7" and python_full_version < "3.8.0" +platformdirs==2.5.2 ; python_version >= "3.7" and python_full_version < "3.8.0" +pluggy==1.0.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +ply==3.4 ; python_full_version < "3.8.0" and python_version >= "3.7" +py==1.11.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +pyasn1-modules==0.0.10 ; python_full_version < "3.8.0" and python_version >= "3.7" +pyasn1==0.1.9 ; python_full_version < "3.8.0" and python_version >= "3.7" +pycparser==2.14 ; python_full_version < "3.8.0" and python_version >= "3.7" +pylint==2.13.9 ; python_full_version < "3.8.0" and python_version >= "3.7" +pyopenssl==17.5.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +pyparsing==2.2.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +pyrfc3339==1.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +pytest-cov==4.0.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +pytest-forked==1.4.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +pytest-xdist==2.5.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +pytest==7.1.3 ; python_version >= "3.7" and python_full_version < "3.8.0" +python-augeas==0.5.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +python-dateutil==2.8.2 ; python_full_version < "3.8.0" and python_version >= "3.7" +python-digitalocean==1.11 ; python_full_version < "3.8.0" and python_version >= "3.7" +pytz==2019.3 ; python_full_version < "3.8.0" and python_version >= "3.7" +pywin32==304 ; python_version >= "3.7" and python_full_version < "3.8.0" and sys_platform == "win32" +pyyaml==6.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +requests-file==1.5.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +requests-toolbelt==0.10.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +requests==2.20.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +rsa==4.9 ; python_full_version < "3.8.0" and python_version >= "3.7" +s3transfer==0.3.7 ; python_full_version < "3.8.0" and python_version >= "3.7" +setuptools==41.6.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +six==1.11.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +tldextract==3.4.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +tomli==2.0.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +tox==1.9.2 ; python_version >= "3.7" and python_full_version < "3.8.0" +typed-ast==1.5.4 ; python_version < "3.8" and python_version >= "3.7" +types-cryptography==3.3.23.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-mock==4.0.15.2 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-pyopenssl==22.1.0.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-pyrfc3339==1.1.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-python-dateutil==2.8.19.2 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-pytz==2022.5.0.0 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-requests==2.28.11.2 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-setuptools==65.5.0.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-six==1.16.21 ; python_version >= "3.7" and python_full_version < "3.8.0" +types-urllib3==1.26.25.1 ; python_version >= "3.7" and python_full_version < "3.8.0" +typing-extensions==4.4.0 ; python_version >= "3.7" and python_version < "3.8" +uritemplate==3.0.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +urllib3==1.24.2 ; python_full_version < "3.8.0" and python_version >= "3.7" +virtualenv==20.16.5 ; python_version >= "3.7" and python_full_version < "3.8.0" +wheel==0.33.6 ; python_full_version < "3.8.0" and python_version >= "3.7" +wrapt==1.14.1 ; python_full_version < "3.8.0" and python_version >= "3.7" +zipp==3.9.0 ; python_version >= "3.7" and python_version < "3.8" +zope-component==4.1.0 ; python_full_version < "3.8.0" and python_version >= "3.7" +zope-event==4.0.3 ; python_full_version < "3.8.0" and python_version >= "3.7" +zope-hookable==4.0.4 ; python_full_version >= "3.7.0" and python_full_version < "3.8.0" +zope-interface==4.0.5 ; python_full_version < "3.8.0" and python_version >= "3.7" diff --git a/tools/pinning/common/export-pinned-dependencies.sh b/tools/pinning/common/export-pinned-dependencies.sh index be6f0aa4e..c52c629ae 100755 --- a/tools/pinning/common/export-pinned-dependencies.sh +++ b/tools/pinning/common/export-pinned-dependencies.sh @@ -41,4 +41,4 @@ poetry lock >&2 trap 'rm poetry.lock' EXIT # We need to remove local packages from the output. -poetry export --without-hashes | sed '/^acme @/d; /certbot/d;' +poetry export --format constraints.txt --without-hashes | sed '/^acme @/d; /certbot/d;' diff --git a/tools/pinning/current/pyproject.toml b/tools/pinning/current/pyproject.toml index 99294c96e..ae3df1a01 100644 --- a/tools/pinning/current/pyproject.toml +++ b/tools/pinning/current/pyproject.toml @@ -58,18 +58,6 @@ cython = "*" # needed. This dependency can be removed here once Certbot's support for the # 3rd party mock library has been dropped. mock = "*" -# poetry 1.2.0+ is required for it to pin pip, setuptools, and wheel. See -# https://github.com/python-poetry/poetry/issues/1584. This version is required -# here in addition to certbot/setup.py because otherwise the pre-release -# version of poetry will not be installed. -# -# Additionally, newer versions of poetry/poetry-core include package extras -# (e.g. "docker[ssh]") in its `poetry export` output which is valid for -# requirements files, but not constraints files. We are currently using that -# output as constraints so let's also pin back poetry and poetry-core until we -# have a better workaround. -poetry = "1.2.0a2" -poetry-core = "1.1.0a7" # setuptools-rust is a build dependency of cryptography, and since we don't have # a great way of pinning build dependencies, we simply list it here to ensure a # working version. Note: if build dependencies of setuptools-rust break at some diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index 3a49b12ed..77721e259 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -10,7 +10,7 @@ license = "Apache License 2.0" [tool.poetry.dependencies] # The Python version here should be kept in sync with the one used in our # oldest tests in tox.ini. -python = "3.7" +python = "3.7.*" # Local dependencies # Any local packages that have dependencies on other local packages must be diff --git a/tools/requirements.txt b/tools/requirements.txt index 36c8bbf85..45f8b4a84 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -5,179 +5,187 @@ # requirements.txt so that is scanned by GitHub. See # https://docs.github.com/en/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems # for more info. -alabaster==0.7.12; python_version >= "3.7" -apacheconfig==0.3.2; python_version >= "3.7" -appdirs==1.4.4; python_version >= "3.7" and python_version < "4.0" -appnope==0.1.3; python_version >= "3.7" and sys_platform == "darwin" -astroid==2.11.7; python_version >= "3.7" -attrs==22.1.0; python_version >= "3.7" -awscli==1.25.95 -awscli==1.25.95; python_version >= "3.7" -azure-devops==6.0.0b4; python_version >= "3.7" -babel==2.10.3; python_version >= "3.7" -backcall==0.2.0; python_version >= "3.7" -bcrypt==4.0.1; python_version >= "3.7" -beautifulsoup4==4.11.1; python_version >= "3.7" -bleach==5.0.1; python_version >= "3.7" -boto3==1.24.94; python_version >= "3.7" -botocore==1.27.94; python_version >= "3.7" -cachecontrol==0.12.12; python_version >= "3.7" and python_version < "4.0" -cachetools==5.2.0; python_version >= "3.7" and python_version < "4.0" -cachy==0.3.0; python_version >= "3.7" and python_version < "4.0" -certifi==2022.9.24; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" -cffi==1.15.1; python_version >= "3.7" -charset-normalizer==2.1.1; python_version >= "3.7" and python_version < "4" -cleo==1.0.0a5; python_version >= "3.7" and python_version < "4.0" -cloudflare==2.10.2; python_version >= "3.7" -colorama==0.4.4; python_version >= "3.7" -configargparse==1.5.3; python_version >= "3.7" -configobj==5.0.6; python_version >= "3.7" -coverage==6.5.0; python_version >= "3.7" -crashtest==0.3.1; python_version >= "3.7" and python_version < "4.0" -cryptography==38.0.2 -cryptography==38.0.2; python_version >= "3.7" -cython==0.29.32 -decorator==5.1.1; python_version >= "3.7" -dill==0.3.5.1; python_version >= "3.7" -distlib==0.3.6; python_version >= "3.7" -distro==1.8.0; python_version >= "3.7" -dns-lexicon==3.11.1; python_version >= "3.7" and python_version < "4.0" -dnspython==2.2.1; python_version >= "3.7" and python_version < "4.0" -docutils==0.16; python_version >= "3.7" -entrypoints==0.3; python_version >= "3.7" and python_version < "4.0" -execnet==1.9.0; python_version >= "3.7" -fabric==2.7.1; python_version >= "3.7" -filelock==3.8.0; python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" -google-api-core==2.10.2; python_version >= "3.7" -google-api-python-client==2.65.0; python_version >= "3.7" -google-auth-httplib2==0.1.0; python_version >= "3.7" -google-auth==2.13.0; python_version >= "3.7" -googleapis-common-protos==1.56.4; python_version >= "3.7" -html5lib==1.1; python_version >= "3.7" and python_version < "4.0" -httplib2==0.20.4; python_version >= "3.7" -idna==3.4; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" and python_version < "4.0" -imagesize==1.4.1; python_version >= "3.7" -importlib-metadata==1.7.0; python_version >= "3.7" and python_version < "3.8" -iniconfig==1.1.1; python_version >= "3.7" -invoke==1.7.3; python_version >= "3.7" -ipdb==0.13.9; python_version >= "3.7" -ipython==7.34.0; python_version >= "3.7" -isodate==0.6.1; python_version >= "3.7" -isort==5.10.1; python_version >= "3.7" and python_version < "4.0" -jedi==0.18.1; python_version >= "3.7" -jeepney==0.8.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -jinja2==3.1.2; python_version >= "3.7" -jmespath==1.0.1; python_version >= "3.7" -josepy==1.13.0; python_version >= "3.7" -jsonlines==3.1.0; python_version >= "3.7" -jsonpickle==2.2.0; python_version >= "3.7" -keyring==22.3.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" -lazy-object-proxy==1.7.1; python_version >= "3.7" -markupsafe==2.1.1; python_version >= "3.7" -matplotlib-inline==0.1.6; python_version >= "3.7" -mccabe==0.7.0; python_version >= "3.7" -mock==4.0.3 -msgpack==1.0.4; python_version >= "3.7" and python_version < "4.0" -msrest==0.6.21; python_version >= "3.7" -mypy-extensions==0.4.3; python_version >= "3.7" -mypy==0.982; python_version >= "3.7" -oauth2client==4.1.3; python_version >= "3.7" -oauthlib==3.2.2; python_version >= "3.7" -packaging==20.9; python_version >= "3.7" -paramiko==2.11.0; python_version >= "3.7" -parsedatetime==2.6; python_version >= "3.7" -parso==0.8.3; python_version >= "3.7" -pathlib2==2.3.7.post1; python_version >= "3.7" -pexpect==4.8.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" and sys_platform != "win32" -pickleshare==0.7.5; python_version >= "3.7" -pip==22.3; python_version >= "3.7" -pkginfo==1.8.3; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" -platformdirs==2.5.2; python_version >= "3.7" -pluggy==1.0.0; python_version >= "3.7" -ply==3.11; python_version >= "3.7" -poetry-core==1.1.0a7 -poetry==1.2.0a2 -prompt-toolkit==3.0.31; python_version >= "3.7" -protobuf==4.21.8; python_version >= "3.7" -ptyprocess==0.7.0; python_version >= "3.7" and python_version < "4.0" -py==1.11.0; python_version >= "3.7" -pyasn1-modules==0.2.8; python_version >= "3.7" -pyasn1==0.4.8; python_version >= "3.7" -pycparser==2.21; python_version >= "3.7" -pygments==2.13.0; python_version >= "3.7" -pylev==1.4.0; python_version >= "3.7" and python_version < "4.0" -pylint==2.13.9 -pynacl==1.5.0; python_version >= "3.7" -pynsist==2.7; python_version >= "3.7" -pyopenssl==22.1.0; python_version >= "3.7" -pyparsing==3.0.9; python_version >= "3.7" -pyrfc3339==1.1; python_version >= "3.7" -pytest-cov==4.0.0; python_version >= "3.7" -pytest-forked==1.4.0; python_version >= "3.7" -pytest-xdist==2.5.0; python_version >= "3.7" -pytest==7.1.3; python_version >= "3.7" -python-augeas==1.1.0; python_version >= "3.7" -python-dateutil==2.8.2; python_version >= "3.7" -python-digitalocean==1.17.0; python_version >= "3.7" -pytz==2022.5; python_version >= "3.7" -pywin32-ctypes==0.2.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -pywin32==304; sys_platform == "win32" and python_version >= "3.7" -pyyaml==5.4.1; python_version >= "3.7" -readme-renderer==37.2; python_version >= "3.7" -requests-download==0.1.2; python_version >= "3.7" -requests-file==1.5.1; python_version >= "3.7" and python_version < "4.0" -requests-oauthlib==1.3.1; python_version >= "3.7" -requests-toolbelt==0.9.1; python_version >= "3.7" -requests==2.28.1; python_version >= "3.7" and python_version < "4" -rfc3986==2.0.0; python_version >= "3.7" -rsa==4.7.2; python_version >= "3.7" and python_version < "4" -s3transfer==0.6.0; python_version >= "3.7" -secretstorage==3.3.3; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -semantic-version==2.10.0; python_version >= "3.7" -setuptools-rust==1.5.2 -setuptools==65.5.0; python_version >= "3.7" -shellingham==1.5.0; python_version >= "3.7" and python_version < "4.0" -six==1.16.0; python_version >= "3.7" -snowballstemmer==2.2.0; python_version >= "3.7" -soupsieve==2.3.2.post1; python_version >= "3.7" -sphinx-rtd-theme==1.0.0; python_version >= "3.7" -sphinx==4.3.2; python_version >= "3.7" -sphinxcontrib-applehelp==1.0.2; python_version >= "3.7" -sphinxcontrib-devhelp==1.0.2; python_version >= "3.7" -sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.7" -sphinxcontrib-jsmath==1.0.1; python_version >= "3.7" -sphinxcontrib-qthelp==1.0.3; python_version >= "3.7" -sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.7" -tldextract==3.4.0; python_version >= "3.7" and python_version < "4.0" -toml==0.10.2; python_version >= "3.7" -tomli==2.0.1; python_version < "3.11" and python_version >= "3.7" or python_full_version <= "3.11.0a6" and python_version >= "3.7" or python_version >= "3.7" -tomlkit==0.11.5; python_version >= "3.7" and python_version < "4.0" -tox==3.26.0; python_version >= "3.7" -tqdm==4.64.1; python_version >= "3.7" -traitlets==5.5.0; python_version >= "3.7" -twine==3.3.0; python_version >= "3.7" -typed-ast==1.5.4; python_version >= "3.7" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.7" -types-cryptography==3.3.23.1; python_version >= "3.7" -types-mock==4.0.15.1; python_version >= "3.7" -types-pyopenssl==22.1.0.1; python_version >= "3.7" -types-pyrfc3339==1.1.1; python_version >= "3.7" -types-python-dateutil==2.8.19.2; python_version >= "3.7" -types-pytz==2022.5.0.0; python_version >= "3.7" -types-requests==2.28.11.2; python_version >= "3.7" -types-setuptools==65.5.0.1; python_version >= "3.7" -types-six==1.16.21; python_version >= "3.7" -types-urllib3==1.26.25.1; python_version >= "3.7" -typing-extensions==4.4.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" -uritemplate==4.1.1; python_version >= "3.7" -urllib3==1.26.12; python_version >= "3.7" and python_version < "4" -virtualenv==20.4.4; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" -wcwidth==0.2.5; python_version >= "3.7" -webencodings==0.5.1; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" -wheel==0.37.1; python_version >= "3.7" -wrapt==1.14.1; python_version >= "3.7" -yarg==0.1.9; python_version >= "3.7" -zipp==3.9.0; python_version >= "3.7" and python_version < "3.8" -zope.component==5.0.1; python_version >= "3.7" -zope.event==4.5.0; python_version >= "3.7" -zope.hookable==5.2; python_version >= "3.7" -zope.interface==5.5.0; python_version >= "3.7" +alabaster==0.7.12 ; python_version >= "3.7" and python_version < "4.0" +apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "4.0" +appnope==0.1.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" +astroid==2.11.7 ; python_version >= "3.7" and python_version < "4.0" +attrs==22.1.0 ; python_version >= "3.7" and python_version < "4.0" +awscli==1.25.96 ; python_version >= "3.7" and python_version < "4.0" +azure-devops==6.0.0b4 ; python_version >= "3.7" and python_version < "4.0" +babel==2.10.3 ; python_version >= "3.7" and python_version < "4.0" +backcall==0.2.0 ; python_version >= "3.7" and python_version < "4.0" +backports-cached-property==1.0.2 ; python_version >= "3.7" and python_version < "3.8" +bcrypt==4.0.1 ; python_version >= "3.7" and python_version < "4.0" +beautifulsoup4==4.11.1 ; python_version >= "3.7" and python_version < "4.0" +bleach==5.0.1 ; python_version >= "3.7" and python_version < "4.0" +boto3==1.24.95 ; python_version >= "3.7" and python_version < "4.0" +botocore==1.27.95 ; python_version >= "3.7" and python_version < "4.0" +cachecontrol==0.12.11 ; python_version >= "3.7" and python_version < "4.0" +cachetools==5.2.0 ; python_version >= "3.7" and python_version < "4.0" +cachy==0.3.0 ; python_version >= "3.7" and python_version < "4.0" +certifi==2022.9.24 ; python_version >= "3.7" and python_version < "4" +cffi==1.15.1 ; python_version >= "3.7" and python_version < "4.0" +charset-normalizer==2.1.1 ; python_version >= "3.7" and python_version < "4" +cleo==1.0.0a5 ; python_version >= "3.7" and python_version < "4.0" +cloudflare==2.10.2 ; python_version >= "3.7" and python_version < "4.0" +colorama==0.4.4 ; python_version >= "3.7" and python_version < "4.0" +commonmark==0.9.1 ; python_version >= "3.7" and python_version < "4.0" +configargparse==1.5.3 ; python_version >= "3.7" and python_version < "4.0" +configobj==5.0.6 ; python_version >= "3.7" and python_version < "4.0" +coverage==6.5.0 ; python_version >= "3.7" and python_version < "4.0" +crashtest==0.3.1 ; python_version >= "3.7" and python_version < "4.0" +cryptography==38.0.1 ; python_version >= "3.7" and python_version < "4.0" +cython==0.29.32 ; python_version >= "3.7" and python_version < "4.0" +decorator==5.1.1 ; python_version >= "3.7" and python_version < "4.0" +dill==0.3.5.1 ; python_version >= "3.7" and python_version < "4.0" +distlib==0.3.6 ; python_version >= "3.7" and python_version < "4.0" +distro==1.8.0 ; python_version >= "3.7" and python_version < "4.0" +dns-lexicon==3.11.6 ; python_version >= "3.7" and python_version < "4.0" +dnspython==2.2.1 ; python_version >= "3.7" and python_version < "4.0" +docutils==0.16 ; python_version >= "3.7" and python_version < "4.0" +dulwich==0.20.46 ; python_version >= "3.7" and python_version < "4.0" +execnet==1.9.0 ; python_version >= "3.7" and python_version < "4.0" +fabric==2.7.1 ; python_version >= "3.7" and python_version < "4.0" +filelock==3.8.0 ; python_version >= "3.7" and python_version < "4.0" +google-api-core==2.10.2 ; python_version >= "3.7" and python_version < "4.0" +google-api-python-client==2.65.0 ; python_version >= "3.7" and python_version < "4.0" +google-auth-httplib2==0.1.0 ; python_version >= "3.7" and python_version < "4.0" +google-auth==2.13.0 ; python_version >= "3.7" and python_version < "4.0" +googleapis-common-protos==1.56.4 ; python_version >= "3.7" and python_version < "4.0" +html5lib==1.1 ; python_version >= "3.7" and python_version < "4.0" +httplib2==0.20.4 ; python_version >= "3.7" and python_version < "4.0" +idna==3.4 ; python_version >= "3.7" and python_version < "4" +imagesize==1.4.1 ; python_version >= "3.7" and python_version < "4.0" +importlib-metadata==4.13.0 ; python_version >= "3.7" and python_version < "4.0" +importlib-resources==5.10.0 ; python_version >= "3.7" and python_version < "3.9" +iniconfig==1.1.1 ; python_version >= "3.7" and python_version < "4.0" +invoke==1.7.3 ; python_version >= "3.7" and python_version < "4.0" +ipdb==0.13.9 ; python_version >= "3.7" and python_version < "4.0" +ipython==7.34.0 ; python_version >= "3.7" and python_version < "4.0" +isodate==0.6.1 ; python_version >= "3.7" and python_version < "4.0" +isort==5.10.1 ; python_version >= "3.7" and python_version < "4.0" +jaraco-classes==3.2.3 ; python_version >= "3.7" and python_version < "4.0" +jedi==0.18.1 ; python_version >= "3.7" and python_version < "4.0" +jeepney==0.8.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" +jinja2==3.1.2 ; python_version >= "3.7" and python_version < "4.0" +jmespath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" +josepy==1.13.0 ; python_version >= "3.7" and python_version < "4.0" +jsonlines==3.1.0 ; python_version >= "3.7" and python_version < "4.0" +jsonpickle==2.2.0 ; python_version >= "3.7" and python_version < "4.0" +jsonschema==4.16.0 ; python_version >= "3.7" and python_version < "4.0" +keyring==23.9.3 ; python_version >= "3.7" and python_version < "4.0" +lazy-object-proxy==1.7.1 ; python_version >= "3.7" and python_version < "4.0" +lockfile==0.12.2 ; python_version >= "3.7" and python_version < "4.0" +markupsafe==2.1.1 ; python_version >= "3.7" and python_version < "4.0" +matplotlib-inline==0.1.6 ; python_version >= "3.7" and python_version < "4.0" +mccabe==0.7.0 ; python_version >= "3.7" and python_version < "4.0" +mock==4.0.3 ; python_version >= "3.7" and python_version < "4.0" +more-itertools==9.0.0 ; python_version >= "3.7" and python_version < "4.0" +msgpack==1.0.4 ; python_version >= "3.7" and python_version < "4.0" +msrest==0.6.21 ; python_version >= "3.7" and python_version < "4.0" +mypy-extensions==0.4.3 ; python_version >= "3.7" and python_version < "4.0" +mypy==0.982 ; python_version >= "3.7" and python_version < "4.0" +oauth2client==4.1.3 ; python_version >= "3.7" and python_version < "4.0" +oauthlib==3.2.2 ; python_version >= "3.7" and python_version < "4.0" +packaging==21.3 ; python_version >= "3.7" and python_version < "4.0" +paramiko==2.11.0 ; python_version >= "3.7" and python_version < "4.0" +parsedatetime==2.6 ; python_version >= "3.7" and python_version < "4.0" +parso==0.8.3 ; python_version >= "3.7" and python_version < "4.0" +pathlib2==2.3.7.post1 ; python_version >= "3.7" and python_version < "4.0" +pexpect==4.8.0 ; python_version >= "3.7" and python_version < "4.0" +pickleshare==0.7.5 ; python_version >= "3.7" and python_version < "4.0" +pip==22.3 ; python_version >= "3.7" and python_version < "4.0" +pkginfo==1.8.3 ; python_version >= "3.7" and python_version < "4.0" +pkgutil-resolve-name==1.3.10 ; python_version >= "3.7" and python_version < "3.9" +platformdirs==2.5.2 ; python_version >= "3.7" and python_version < "4.0" +pluggy==1.0.0 ; python_version >= "3.7" and python_version < "4.0" +ply==3.11 ; python_version >= "3.7" and python_version < "4.0" +poetry-core==1.3.2 ; python_version >= "3.7" and python_version < "4.0" +poetry-plugin-export==1.1.2 ; python_version >= "3.7" and python_version < "4.0" +poetry==1.2.2 ; python_version >= "3.7" and python_version < "4.0" +prompt-toolkit==3.0.31 ; python_version >= "3.7" and python_version < "4.0" +protobuf==4.21.8 ; python_version >= "3.7" and python_version < "4.0" +ptyprocess==0.7.0 ; python_version >= "3.7" and python_version < "4.0" +py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" +pyasn1-modules==0.2.8 ; python_version >= "3.7" and python_version < "4.0" +pyasn1==0.4.8 ; python_version >= "3.7" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0" +pygments==2.13.0 ; python_version >= "3.7" and python_version < "4.0" +pylev==1.4.0 ; python_version >= "3.7" and python_version < "4.0" +pylint==2.13.9 ; python_version >= "3.7" and python_version < "4.0" +pynacl==1.5.0 ; python_version >= "3.7" and python_version < "4.0" +pynsist==2.7 ; python_version >= "3.7" and python_version < "4.0" +pyopenssl==22.1.0 ; python_version >= "3.7" and python_version < "4.0" +pyparsing==3.0.9 ; python_version >= "3.7" and python_version < "4.0" +pyrfc3339==1.1 ; python_version >= "3.7" and python_version < "4.0" +pyrsistent==0.18.1 ; python_version >= "3.7" and python_version < "4.0" +pytest-cov==4.0.0 ; python_version >= "3.7" and python_version < "4.0" +pytest-forked==1.4.0 ; python_version >= "3.7" and python_version < "4.0" +pytest-xdist==2.5.0 ; python_version >= "3.7" and python_version < "4.0" +pytest==7.1.3 ; python_version >= "3.7" and python_version < "4.0" +python-augeas==1.1.0 ; python_version >= "3.7" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "4.0" +python-digitalocean==1.17.0 ; python_version >= "3.7" and python_version < "4.0" +pytz==2022.5 ; python_version >= "3.7" and python_version < "4.0" +pywin32-ctypes==0.2.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" +pywin32==304 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" +pyyaml==5.4.1 ; python_version >= "3.7" and python_version < "4.0" +readme-renderer==37.2 ; python_version >= "3.7" and python_version < "4.0" +requests-download==0.1.2 ; python_version >= "3.7" and python_version < "4.0" +requests-file==1.5.1 ; python_version >= "3.7" and python_version < "4.0" +requests-oauthlib==1.3.1 ; python_version >= "3.7" and python_version < "4.0" +requests-toolbelt==0.9.1 ; python_version >= "3.7" and python_version < "4.0" +requests==2.28.1 ; python_version >= "3.7" and python_version < "4" +rfc3986==2.0.0 ; python_version >= "3.7" and python_version < "4.0" +rich==12.6.0 ; python_version >= "3.7" and python_version < "4.0" +rsa==4.7.2 ; python_version >= "3.7" and python_version < "4" +s3transfer==0.6.0 ; python_version >= "3.7" and python_version < "4.0" +secretstorage==3.3.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" +semantic-version==2.10.0 ; python_version >= "3.7" and python_version < "4.0" +setuptools-rust==1.5.2 ; python_version >= "3.7" and python_version < "4.0" +setuptools==65.5.0 ; python_version >= "3.7" and python_version < "4.0" +shellingham==1.5.0 ; python_version >= "3.7" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.7" and python_version < "4.0" +snowballstemmer==2.2.0 ; python_version >= "3.7" and python_version < "4.0" +soupsieve==2.3.2.post1 ; python_version >= "3.7" and python_version < "4.0" +sphinx-rtd-theme==1.0.0 ; python_version >= "3.7" and python_version < "4.0" +sphinx==5.1.1 ; python_version >= "3.7" and python_version < "4.0" +sphinxcontrib-applehelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" +sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" +sphinxcontrib-htmlhelp==2.0.0 ; python_version >= "3.7" and python_version < "4.0" +sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" +sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.7" and python_version < "4.0" +sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.7" and python_version < "4.0" +tldextract==3.4.0 ; python_version >= "3.7" and python_version < "4.0" +toml==0.10.2 ; python_version >= "3.7" and python_version < "4.0" +tomli==2.0.1 ; python_version >= "3.7" and python_version < "4.0" +tomlkit==0.11.5 ; python_version >= "3.7" and python_version < "4.0" +tox==3.26.0 ; python_version >= "3.7" and python_version < "4.0" +traitlets==5.5.0 ; python_version >= "3.7" and python_version < "4.0" +twine==4.0.1 ; python_version >= "3.7" and python_version < "4.0" +typed-ast==1.5.4 ; python_version >= "3.7" and python_version < "3.8" +types-cryptography==3.3.23.1 ; python_version >= "3.7" and python_version < "4.0" +types-mock==4.0.15.2 ; python_version >= "3.7" and python_version < "4.0" +types-pyopenssl==22.1.0.1 ; python_version >= "3.7" and python_version < "4.0" +types-pyrfc3339==1.1.1 ; python_version >= "3.7" and python_version < "4.0" +types-python-dateutil==2.8.19.2 ; python_version >= "3.7" and python_version < "4.0" +types-pytz==2022.5.0.0 ; python_version >= "3.7" and python_version < "4.0" +types-requests==2.28.11.2 ; python_version >= "3.7" and python_version < "4.0" +types-setuptools==65.5.0.1 ; python_version >= "3.7" and python_version < "4.0" +types-six==1.16.21 ; python_version >= "3.7" and python_version < "4.0" +types-urllib3==1.26.25.1 ; python_version >= "3.7" and python_version < "4.0" +typing-extensions==4.4.0 ; python_version >= "3.7" and python_version < "4.0" +uritemplate==4.1.1 ; python_version >= "3.7" and python_version < "4.0" +urllib3==1.26.12 ; python_version >= "3.7" and python_version < "4" +virtualenv==20.16.5 ; python_version >= "3.7" and python_version < "4.0" +wcwidth==0.2.5 ; python_version >= "3.7" and python_version < "4.0" +webencodings==0.5.1 ; python_version >= "3.7" and python_version < "4.0" +wheel==0.37.1 ; python_version >= "3.7" and python_version < "4.0" +wrapt==1.14.1 ; python_version >= "3.7" and python_version < "4.0" +xattr==0.9.9 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" +yarg==0.1.9 ; python_version >= "3.7" and python_version < "4.0" +zipp==3.9.0 ; python_version >= "3.7" and python_version < "4.0" +zope-component==5.0.1 ; python_version >= "3.7" and python_version < "4.0" +zope-event==4.5.0 ; python_version >= "3.7" and python_version < "4.0" +zope-hookable==5.2 ; python_version >= "3.7" and python_version < "4.0" +zope-interface==5.5.0 ; python_version >= "3.7" and python_version < "4.0" From eed1afb8082518a5212a6d8016a4ccf44c5ad99e Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Wed, 26 Oct 2022 15:07:02 -0700 Subject: [PATCH 06/16] certbot-apache: use httpd by default for CentOS/RHEL (#9402) * certbot-apache: use httpd for newer RHEL derived distros A change in RHEL 9 is causing apachectl to error out when used with additional arguments, resulting in certbot errors. The CentOS configurator now uses httpd instead for RHEL 9 (and later) derived distros. * Single CentOS class which uses the apache_bin option * soothe mypy * Always call super()._override_cmds() --- .../certbot_apache/_internal/apache_util.py | 16 ++--- .../certbot_apache/_internal/configurator.py | 26 ++++++-- .../_internal/override_centos.py | 42 +++++++++--- .../certbot_apache/_internal/parser.py | 6 +- certbot-apache/tests/centos_test.py | 65 ++++++++++++++++--- certbot-apache/tests/util.py | 1 + certbot/CHANGELOG.md | 2 + 7 files changed, 119 insertions(+), 39 deletions(-) diff --git a/certbot-apache/certbot_apache/_internal/apache_util.py b/certbot-apache/certbot_apache/_internal/apache_util.py index a538d8f0d..54b9f9824 100644 --- a/certbot-apache/certbot_apache/_internal/apache_util.py +++ b/certbot-apache/certbot_apache/_internal/apache_util.py @@ -136,20 +136,18 @@ def included_in_paths(filepath: str, paths: Iterable[str]) -> bool: return any(fnmatch.fnmatch(filepath, path) for path in paths) -def parse_defines(apachectl: str) -> Dict[str, str]: +def parse_defines(define_cmd: List[str]) -> Dict[str, str]: """ Gets Defines from httpd process and returns a dictionary of the defined variables. - :param str apachectl: Path to apachectl executable + :param list define_cmd: httpd command to dump defines :returns: dictionary of defined variables :rtype: dict """ variables: Dict[str, str] = {} - define_cmd = [apachectl, "-t", "-D", - "DUMP_RUN_CFG"] matches = parse_from_subprocess(define_cmd, r"Define: ([^ \n]*)") try: matches.remove("DUMP_RUN_CFG") @@ -165,33 +163,31 @@ def parse_defines(apachectl: str) -> Dict[str, str]: return variables -def parse_includes(apachectl: str) -> List[str]: +def parse_includes(inc_cmd: List[str]) -> List[str]: """ Gets Include directives from httpd process and returns a list of their values. - :param str apachectl: Path to apachectl executable + :param list inc_cmd: httpd command to dump includes :returns: list of found Include directive values :rtype: list of str """ - inc_cmd: List[str] = [apachectl, "-t", "-D", "DUMP_INCLUDES"] return parse_from_subprocess(inc_cmd, r"\(.*\) (.*)") -def parse_modules(apachectl: str) -> List[str]: +def parse_modules(mod_cmd: List[str]) -> List[str]: """ Get loaded modules from httpd process, and return the list of loaded module names. - :param str apachectl: Path to apachectl executable + :param list mod_cmd: httpd command to dump loaded modules :returns: list of found LoadModule module names :rtype: list of str """ - mod_cmd = [apachectl, "-t", "-D", "DUMP_MODULES"] return parse_from_subprocess(mod_cmd, r"(.*)_module") diff --git a/certbot-apache/certbot_apache/_internal/configurator.py b/certbot-apache/certbot_apache/_internal/configurator.py index 82b3dcaec..db9eea444 100644 --- a/certbot-apache/certbot_apache/_internal/configurator.py +++ b/certbot-apache/certbot_apache/_internal/configurator.py @@ -85,6 +85,10 @@ class OsOptions: self.restart_cmd = ['apache2ctl', 'graceful'] if not restart_cmd else restart_cmd self.restart_cmd_alt = restart_cmd_alt self.conftest_cmd = ['apache2ctl', 'configtest'] if not conftest_cmd else conftest_cmd + syntax_tests_cmd_base = [ctl, '-t', '-D'] + self.get_defines_cmd = syntax_tests_cmd_base + ['DUMP_RUN_CFG'] + self.get_includes_cmd = syntax_tests_cmd_base + ['DUMP_INCLUDES'] + self.get_modules_cmd = syntax_tests_cmd_base + ['DUMP_MODULES'] self.enmod = enmod self.dismod = dismod self.le_vhost_ext = le_vhost_ext @@ -166,6 +170,17 @@ class ApacheConfigurator(common.Configurator): return apache_util.find_ssl_apache_conf("old") return apache_util.find_ssl_apache_conf("current") + def _override_cmds(self) -> None: + """ + Set our various command binaries to whatever the user has overridden for apachectl + """ + self.options.version_cmd[0] = self.options.ctl + self.options.restart_cmd[0] = self.options.ctl + self.options.conftest_cmd[0] = self.options.ctl + self.options.get_modules_cmd[0] = self.options.ctl + self.options.get_includes_cmd[0] = self.options.ctl + self.options.get_defines_cmd[0] = self.options.ctl + def _prepare_options(self) -> None: """ Set the values possibly changed by command line parameters to @@ -181,10 +196,7 @@ class ApacheConfigurator(common.Configurator): else: setattr(self.options, o, getattr(self.OS_DEFAULTS, o)) - # Special cases - self.options.version_cmd[0] = self.options.ctl - self.options.restart_cmd[0] = self.options.ctl - self.options.conftest_cmd[0] = self.options.ctl + self._override_cmds() @classmethod def add_parser_arguments(cls, add: Callable[..., None]) -> None: @@ -479,9 +491,9 @@ class ApacheConfigurator(common.Configurator): if HAS_APACHECONFIG: apache_vars = { - "defines": apache_util.parse_defines(self.options.ctl), - "includes": apache_util.parse_includes(self.options.ctl), - "modules": apache_util.parse_modules(self.options.ctl), + "defines": apache_util.parse_defines(self.options.get_defines_cmd), + "includes": apache_util.parse_includes(self.options.get_includes_cmd), + "modules": apache_util.parse_modules(self.options.get_modules_cmd), } metadata["apache_vars"] = apache_vars diff --git a/certbot-apache/certbot_apache/_internal/override_centos.py b/certbot-apache/certbot_apache/_internal/override_centos.py index a436e8457..583d30b98 100644 --- a/certbot-apache/certbot_apache/_internal/override_centos.py +++ b/certbot-apache/certbot_apache/_internal/override_centos.py @@ -25,6 +25,7 @@ class CentOSConfigurator(configurator.ApacheConfigurator): vhost_files="*.conf", logs_root="/var/log/httpd", ctl="apachectl", + apache_bin="httpd", version_cmd=['apachectl', '-v'], restart_cmd=['apachectl', 'graceful'], restart_cmd_alt=['apachectl', 'restart'], @@ -51,6 +52,37 @@ class CentOSConfigurator(configurator.ApacheConfigurator): else: raise + def _rhel9_or_newer(self) -> bool: + os_name, os_version = util.get_os_info() + rhel_derived = os_name in [ + "centos", "centos linux", + "cloudlinux", + "ol", "oracle", + "rhel", "redhatenterpriseserver", "red hat enterprise linux server", + "scientific", "scientific linux", + ] + at_least_v9 = util.parse_loose_version(os_version) >= util.parse_loose_version('9') + return rhel_derived and at_least_v9 + + def _override_cmds(self) -> None: + super()._override_cmds() + + # As of RHEL 9, apachectl can't be passed flags like "-v" or "-t -D", so + # instead use options.bin (i.e. httpd) for version_cmd and the various + # get_X commands + if self._rhel9_or_newer(): + if not self.options.bin: + raise ValueError("OS option apache_bin must be set for CentOS") # pragma: no cover + + self.options.version_cmd[0] = self.options.bin + self.options.get_modules_cmd[0] = self.options.bin + self.options.get_includes_cmd[0] = self.options.bin + self.options.get_defines_cmd[0] = self.options.bin + + if not self.options.restart_cmd_alt: # pragma: no cover + raise ValueError("OS option restart_cmd_alt must be set for CentOS.") + self.options.restart_cmd_alt[0] = self.options.ctl + def _try_restart_fedora(self) -> None: """ Tries to restart httpd using systemctl to generate the self signed key pair. @@ -64,16 +96,6 @@ class CentOSConfigurator(configurator.ApacheConfigurator): # Finish with actual config check to see if systemctl restart helped super().config_test() - def _prepare_options(self) -> None: - """ - Override the options dictionary initialization in order to support - alternative restart cmd used in CentOS. - """ - super()._prepare_options() - if not self.options.restart_cmd_alt: # pragma: no cover - raise ValueError("OS option restart_cmd_alt must be set for CentOS.") - self.options.restart_cmd_alt[0] = self.options.ctl - def get_parser(self) -> "CentOSParser": """Initializes the ApacheParser""" return CentOSParser( diff --git a/certbot-apache/certbot_apache/_internal/parser.py b/certbot-apache/certbot_apache/_internal/parser.py index 46e61843f..019172d37 100644 --- a/certbot-apache/certbot_apache/_internal/parser.py +++ b/certbot-apache/certbot_apache/_internal/parser.py @@ -302,7 +302,7 @@ class ApacheParser: def update_defines(self) -> None: """Updates the dictionary of known variables in the configuration""" - self.variables = apache_util.parse_defines(self.configurator.options.ctl) + self.variables = apache_util.parse_defines(self.configurator.options.get_defines_cmd) def update_includes(self) -> None: """Get includes from httpd process, and add them to DOM if needed""" @@ -312,7 +312,7 @@ class ApacheParser: # configuration files _ = self.find_dir("Include") - matches = apache_util.parse_includes(self.configurator.options.ctl) + matches = apache_util.parse_includes(self.configurator.options.get_includes_cmd) if matches: for i in matches: if not self.parsed_in_current(i): @@ -321,7 +321,7 @@ class ApacheParser: def update_modules(self) -> None: """Get loaded modules from httpd process, and add them to DOM""" - matches = apache_util.parse_modules(self.configurator.options.ctl) + matches = apache_util.parse_modules(self.configurator.options.get_modules_cmd) for mod in matches: self.add_mod(mod.strip()) diff --git a/certbot-apache/tests/centos_test.py b/certbot-apache/tests/centos_test.py index c9a820466..a9a7d8dcc 100644 --- a/certbot-apache/tests/centos_test.py +++ b/certbot-apache/tests/centos_test.py @@ -9,8 +9,8 @@ except ImportError: # pragma: no cover from certbot import errors from certbot.compat import filesystem from certbot.compat import os -from certbot_apache._internal import obj from certbot_apache._internal import override_centos +from certbot_apache._internal import obj import util @@ -88,10 +88,8 @@ class FedoraRestartTest(util.ApacheTest): ['systemctl', 'restart', 'httpd']) -class MultipleVhostsTestCentOS(util.ApacheTest): - """Multiple vhost tests for CentOS / RHEL family of distros""" - - _multiprocess_can_split_ = True +class UseCorrectApacheExecutableTest(util.ApacheTest): + """Make sure the various CentOS/RHEL versions use the right httpd executable""" def setUp(self): # pylint: disable=arguments-differ test_dir = "centos7_apache/apache" @@ -101,6 +99,55 @@ class MultipleVhostsTestCentOS(util.ApacheTest): config_root=config_root, vhost_root=vhost_root) + @mock.patch("certbot.util.get_os_info") + def test_old_centos_rhel_and_fedora(self, mock_get_os_info): + for os_info in [("centos", "7"), ("rhel", "7"), ("fedora", "28"), ("scientific", "6")]: + mock_get_os_info.return_value = os_info + config = util.get_apache_configurator( + self.config_path, self.vhost_path, self.config_dir, self.work_dir, + os_info="centos") + self.assertEqual(config.options.ctl, "apachectl") + self.assertEqual(config.options.bin, "httpd") + self.assertEqual(config.options.version_cmd, ["apachectl", "-v"]) + self.assertEqual(config.options.restart_cmd, ["apachectl", "graceful"]) + self.assertEqual(config.options.restart_cmd_alt, ["apachectl", "restart"]) + self.assertEqual(config.options.conftest_cmd, ["apachectl", "configtest"]) + self.assertEqual(config.options.get_defines_cmd, ["apachectl", "-t", "-D", "DUMP_RUN_CFG"]) + self.assertEqual(config.options.get_includes_cmd, ["apachectl", "-t", "-D", "DUMP_INCLUDES"]) + self.assertEqual(config.options.get_modules_cmd, ["apachectl", "-t", "-D", "DUMP_MODULES"]) + + @mock.patch("certbot.util.get_os_info") + def test_new_rhel_derived(self, mock_get_os_info): + for os_info in [("centos", "9"), ("rhel", "9"), ("oracle", "9")]: + mock_get_os_info.return_value = os_info + config = util.get_apache_configurator( + self.config_path, self.vhost_path, self.config_dir, self.work_dir, + os_info=os_info[0]) + self.assertEqual(config.options.ctl, "apachectl") + self.assertEqual(config.options.bin, "httpd") + self.assertEqual(config.options.version_cmd, ["httpd", "-v"]) + self.assertEqual(config.options.restart_cmd, ["apachectl", "graceful"]) + self.assertEqual(config.options.restart_cmd_alt, ["apachectl", "restart"]) + self.assertEqual(config.options.conftest_cmd, ["apachectl", "configtest"]) + self.assertEqual(config.options.get_defines_cmd, ["httpd", "-t", "-D", "DUMP_RUN_CFG"]) + self.assertEqual(config.options.get_includes_cmd, ["httpd", "-t", "-D", "DUMP_INCLUDES"]) + self.assertEqual(config.options.get_modules_cmd, ["httpd", "-t", "-D", "DUMP_MODULES"]) + + +class MultipleVhostsTestCentOS(util.ApacheTest): + """Multiple vhost tests for CentOS / RHEL family of distros""" + + _multiprocess_can_split_ = True + + @mock.patch("certbot.util.get_os_info") + def setUp(self, mock_get_os_info): # pylint: disable=arguments-differ + test_dir = "centos7_apache/apache" + config_root = "centos7_apache/apache/httpd" + vhost_root = "centos7_apache/apache/httpd/conf.d" + super().setUp(test_dir=test_dir, + config_root=config_root, + vhost_root=vhost_root) + mock_get_os_info.return_value = ("centos", "9") self.config = util.get_apache_configurator( self.config_path, self.vhost_path, self.config_dir, self.work_dir, os_info="centos") @@ -124,9 +171,9 @@ class MultipleVhostsTestCentOS(util.ApacheTest): ) def mock_get_cfg(command): """Mock httpd process stdout""" - if command == ['apachectl', '-t', '-D', 'DUMP_RUN_CFG']: + if command == ['httpd', '-t', '-D', 'DUMP_RUN_CFG']: return define_val - elif command == ['apachectl', '-t', '-D', 'DUMP_MODULES']: + elif command == ['httpd', '-t', '-D', 'DUMP_MODULES']: return mod_val return "" mock_get.side_effect = mock_get_cfg @@ -135,7 +182,7 @@ class MultipleVhostsTestCentOS(util.ApacheTest): with mock.patch("certbot.util.get_os_info") as mock_osi: # Make sure we have the have the CentOS httpd constants - mock_osi.return_value = ("centos", "7") + mock_osi.return_value = ("centos", "9") self.config.parser.update_runtime_variables() self.assertEqual(mock_get.call_count, 3) @@ -170,7 +217,7 @@ class MultipleVhostsTestCentOS(util.ApacheTest): with mock.patch("certbot.util.get_os_info") as mock_osi: # Make sure we have the have the CentOS httpd constants - mock_osi.return_value = ("centos", "7") + mock_osi.return_value = ("centos", "9") self.config.parser.update_runtime_variables() self.assertIn("mock_define", self.config.parser.variables) diff --git a/certbot-apache/tests/util.py b/certbot-apache/tests/util.py index a4191b3fe..2f119938b 100644 --- a/certbot-apache/tests/util.py +++ b/certbot-apache/tests/util.py @@ -123,6 +123,7 @@ def get_apache_configurator( # Custom virtualhost path was requested config.config.apache_vhost_root = conf_vhost_path config.config.apache_ctl = config_class.OS_DEFAULTS.ctl + config.config.apache_bin = config_class.OS_DEFAULTS.bin config.prepare() return config diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 9403209dc..a6b6705a1 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -176,6 +176,8 @@ More details about these changes can be found on our GitHub repo. * Updated dependencies to use new version of cryptography that uses OpenSSL 1.1.1n, in response to https://www.openssl.org/news/secadv/20220315.txt. +* CentOS 9 and other RHEL-derived OSes now correctly use httpd instead of apachectl for + various Apache-related commands More details about these changes can be found on our GitHub repo. From 7865bbd39a54863ca3b48af77a3da8da7b7d0226 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Wed, 26 Oct 2022 20:47:29 -0700 Subject: [PATCH 07/16] Add comment explainig the load-bearing debug flags (#9443) --- tools/docker/deploy.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/docker/deploy.sh b/tools/docker/deploy.sh index c173c4158..9b04f3e49 100755 --- a/tools/docker/deploy.sh +++ b/tools/docker/deploy.sh @@ -46,6 +46,10 @@ ParseRequestedArch "${2}" TagAndPushForAllRequestedArch() { DOCKER_REPO="${DOCKER_HUB_ORG}/${1}" for TARGET_ARCH in "${ALL_REQUESTED_ARCH[@]}"; do + # NOTE: In early 2022, we were experiencing regular "docker push" + # timeouts, so we added these "--debug" flags to learn more. Since we + # added them, we haven't had another timeout, so until we experience + # another timeout & can get the deubg logs, we're leaving them in. docker --debug push "${DOCKER_REPO}:${TARGET_ARCH}-${TAG_BASE}" if [[ "${TAG_BASE}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then From f73e062c7a3b4856bffe2a7c54ece64c2f1af265 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Mon, 31 Oct 2022 13:22:07 -0700 Subject: [PATCH 08/16] Fix changelog entry (#9444) * Fix changelog entry * move to 1.32.0 Co-authored-by: Brad Warren --- certbot/CHANGELOG.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index a6b6705a1..836ecc048 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -14,7 +14,8 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Fixed -* +* CentOS 9 and other RHEL-derived OSes now correctly use httpd instead of apachectl for + various Apache-related commands More details about these changes can be found on our GitHub repo. @@ -176,8 +177,6 @@ More details about these changes can be found on our GitHub repo. * Updated dependencies to use new version of cryptography that uses OpenSSL 1.1.1n, in response to https://www.openssl.org/news/secadv/20220315.txt. -* CentOS 9 and other RHEL-derived OSes now correctly use httpd instead of apachectl for - various Apache-related commands More details about these changes can be found on our GitHub repo. From 63de0ca9e6c838112664beedefd56abe361d20d6 Mon Sep 17 00:00:00 2001 From: Kevin Jones Date: Mon, 31 Oct 2022 17:17:50 -0400 Subject: [PATCH 09/16] Use https: protocol instead of deprecated git: protocol (#9452) --- tools/snap/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/snap/README.md b/tools/snap/README.md index e11b07db2..f6354f748 100644 --- a/tools/snap/README.md +++ b/tools/snap/README.md @@ -17,7 +17,7 @@ These steps need to be done once to set up your VM and do not need to be run aga 5. Add your current user to the lxd group and update your shell to have the new assignment by running `sudo usermod -a -G lxd ${USER} && newgrp lxd`. 6. Install snapcraft with `sudo snap install --classic snapcraft`. 7. `cd ~` (or any other directory where you want our source files to be) - 8. Run `git clone git://github.com/certbot/certbot` + 8. Run `git clone https://github.com/certbot/certbot` 9. `cd certbot` (All further instructions are relative to this directory.) ### Certbot Snap @@ -80,7 +80,7 @@ It is easiest to run this from a local machine. 2. Install git and python with `sudo apt update && sudo apt install -y git python`. 3. Install snapcraft with `sudo snap install --classic snapcraft`. 4. `cd ~` (or any other directory where you want our source files to be) - 5. Run `git clone git://github.com/certbot/certbot` + 5. Run `git clone https://github.com/certbot/certbot` 6. `cd certbot` (All further instructions are relative to this directory.) 7. To trigger `snapcraft` to request access to your Launchpad account, run `snapcraft remote-build --launchpad-accept-public-upload --status`. A URL where you need From 9cf062d8d454179b3d36f7ac67430904d49a1569 Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Wed, 2 Nov 2022 10:23:57 -0700 Subject: [PATCH 10/16] disable poetry's cache (#9453) --- tools/pinning/common/export-pinned-dependencies.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/pinning/common/export-pinned-dependencies.sh b/tools/pinning/common/export-pinned-dependencies.sh index c52c629ae..e1c93b0dc 100755 --- a/tools/pinning/common/export-pinned-dependencies.sh +++ b/tools/pinning/common/export-pinned-dependencies.sh @@ -37,7 +37,10 @@ if [ -f poetry.lock ]; then rm poetry.lock fi -poetry lock >&2 +# If you're running this with different Python versions (say to update both our +# "current" and "oldest" pinnings), poetry's cache can become corrupted causing +# poetry to hang indefinitely. --no-cache avoids this. +poetry lock --no-cache >&2 trap 'rm poetry.lock' EXIT # We need to remove local packages from the output. From 7ab82b6f64353349bcc1a1cc4b0c6b45d08965d8 Mon Sep 17 00:00:00 2001 From: alexzorin Date: Thu, 3 Nov 2022 06:32:00 +1100 Subject: [PATCH 11/16] repin dependencies (#9454) --- pytest.ini | 3 +++ tools/requirements.txt | 54 +++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/pytest.ini b/pytest.ini index 78710566b..84d1d398b 100644 --- a/pytest.ini +++ b/pytest.ini @@ -27,6 +27,8 @@ # 7) ACMEv1 deprecations in acme.client which will be resolved by Certbot 2.0. # 8) acme.mixins deprecation in acme.client which will be resolved by Certbot 2.0. # 9) acme.messages.Authorization.combinations which will be resolved by Certbot 2.0. +# 10) pytest-cov uses deprecated functionality in pytest-xdist, to be resolved by +# https://github.com/pytest-dev/pytest-cov/issues/557. filterwarnings = error ignore:The external mock module:PendingDeprecationWarning @@ -38,3 +40,4 @@ filterwarnings = ignore:.*attribute in acme.client is deprecated:DeprecationWarning ignore:.*acme.mixins is deprecated:DeprecationWarning ignore:.*Authorization.combinations is deprecated:DeprecationWarning + ignore:.*rsyncdir:DeprecationWarning diff --git a/tools/requirements.txt b/tools/requirements.txt index 45f8b4a84..cbfe6f865 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -10,16 +10,16 @@ apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "4.0" appnope==0.1.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" astroid==2.11.7 ; python_version >= "3.7" and python_version < "4.0" attrs==22.1.0 ; python_version >= "3.7" and python_version < "4.0" -awscli==1.25.96 ; python_version >= "3.7" and python_version < "4.0" +awscli==1.27.0 ; python_version >= "3.7" and python_version < "4.0" azure-devops==6.0.0b4 ; python_version >= "3.7" and python_version < "4.0" -babel==2.10.3 ; python_version >= "3.7" and python_version < "4.0" +babel==2.11.0 ; python_version >= "3.7" and python_version < "4.0" backcall==0.2.0 ; python_version >= "3.7" and python_version < "4.0" backports-cached-property==1.0.2 ; python_version >= "3.7" and python_version < "3.8" bcrypt==4.0.1 ; python_version >= "3.7" and python_version < "4.0" beautifulsoup4==4.11.1 ; python_version >= "3.7" and python_version < "4.0" bleach==5.0.1 ; python_version >= "3.7" and python_version < "4.0" -boto3==1.24.95 ; python_version >= "3.7" and python_version < "4.0" -botocore==1.27.95 ; python_version >= "3.7" and python_version < "4.0" +boto3==1.26.0 ; python_version >= "3.7" and python_version < "4.0" +botocore==1.29.0 ; python_version >= "3.7" and python_version < "4.0" cachecontrol==0.12.11 ; python_version >= "3.7" and python_version < "4.0" cachetools==5.2.0 ; python_version >= "3.7" and python_version < "4.0" cachy==0.3.0 ; python_version >= "3.7" and python_version < "4.0" @@ -34,26 +34,27 @@ configargparse==1.5.3 ; python_version >= "3.7" and python_version < "4.0" configobj==5.0.6 ; python_version >= "3.7" and python_version < "4.0" coverage==6.5.0 ; python_version >= "3.7" and python_version < "4.0" crashtest==0.3.1 ; python_version >= "3.7" and python_version < "4.0" -cryptography==38.0.1 ; python_version >= "3.7" and python_version < "4.0" +cryptography==38.0.3 ; python_version >= "3.7" and python_version < "4.0" cython==0.29.32 ; python_version >= "3.7" and python_version < "4.0" decorator==5.1.1 ; python_version >= "3.7" and python_version < "4.0" -dill==0.3.5.1 ; python_version >= "3.7" and python_version < "4.0" +dill==0.3.6 ; python_version >= "3.7" and python_version < "4.0" distlib==0.3.6 ; python_version >= "3.7" and python_version < "4.0" distro==1.8.0 ; python_version >= "3.7" and python_version < "4.0" -dns-lexicon==3.11.6 ; python_version >= "3.7" and python_version < "4.0" +dns-lexicon==3.11.7 ; python_version >= "3.7" and python_version < "4.0" dnspython==2.2.1 ; python_version >= "3.7" and python_version < "4.0" docutils==0.16 ; python_version >= "3.7" and python_version < "4.0" -dulwich==0.20.46 ; python_version >= "3.7" and python_version < "4.0" +dulwich==0.20.50 ; python_version >= "3.7" and python_version < "4.0" +exceptiongroup==1.0.0 ; python_version >= "3.7" and python_version < "3.11" execnet==1.9.0 ; python_version >= "3.7" and python_version < "4.0" fabric==2.7.1 ; python_version >= "3.7" and python_version < "4.0" filelock==3.8.0 ; python_version >= "3.7" and python_version < "4.0" google-api-core==2.10.2 ; python_version >= "3.7" and python_version < "4.0" google-api-python-client==2.65.0 ; python_version >= "3.7" and python_version < "4.0" google-auth-httplib2==0.1.0 ; python_version >= "3.7" and python_version < "4.0" -google-auth==2.13.0 ; python_version >= "3.7" and python_version < "4.0" +google-auth==2.14.0 ; python_version >= "3.7" and python_version < "4.0" googleapis-common-protos==1.56.4 ; python_version >= "3.7" and python_version < "4.0" html5lib==1.1 ; python_version >= "3.7" and python_version < "4.0" -httplib2==0.20.4 ; python_version >= "3.7" and python_version < "4.0" +httplib2==0.21.0 ; python_version >= "3.7" and python_version < "4.0" idna==3.4 ; python_version >= "3.7" and python_version < "4" imagesize==1.4.1 ; python_version >= "3.7" and python_version < "4.0" importlib-metadata==4.13.0 ; python_version >= "3.7" and python_version < "4.0" @@ -72,9 +73,9 @@ jmespath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" josepy==1.13.0 ; python_version >= "3.7" and python_version < "4.0" jsonlines==3.1.0 ; python_version >= "3.7" and python_version < "4.0" jsonpickle==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -jsonschema==4.16.0 ; python_version >= "3.7" and python_version < "4.0" +jsonschema==4.17.0 ; python_version >= "3.7" and python_version < "4.0" keyring==23.9.3 ; python_version >= "3.7" and python_version < "4.0" -lazy-object-proxy==1.7.1 ; python_version >= "3.7" and python_version < "4.0" +lazy-object-proxy==1.8.0 ; python_version >= "3.7" and python_version < "4.0" lockfile==0.12.2 ; python_version >= "3.7" and python_version < "4.0" markupsafe==2.1.1 ; python_version >= "3.7" and python_version < "4.0" matplotlib-inline==0.1.6 ; python_version >= "3.7" and python_version < "4.0" @@ -104,7 +105,7 @@ poetry-core==1.3.2 ; python_version >= "3.7" and python_version < "4.0" poetry-plugin-export==1.1.2 ; python_version >= "3.7" and python_version < "4.0" poetry==1.2.2 ; python_version >= "3.7" and python_version < "4.0" prompt-toolkit==3.0.31 ; python_version >= "3.7" and python_version < "4.0" -protobuf==4.21.8 ; python_version >= "3.7" and python_version < "4.0" +protobuf==4.21.9 ; python_version >= "3.7" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.7" and python_version < "4.0" py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" pyasn1-modules==0.2.8 ; python_version >= "3.7" and python_version < "4.0" @@ -118,19 +119,18 @@ pynsist==2.7 ; python_version >= "3.7" and python_version < "4.0" pyopenssl==22.1.0 ; python_version >= "3.7" and python_version < "4.0" pyparsing==3.0.9 ; python_version >= "3.7" and python_version < "4.0" pyrfc3339==1.1 ; python_version >= "3.7" and python_version < "4.0" -pyrsistent==0.18.1 ; python_version >= "3.7" and python_version < "4.0" +pyrsistent==0.19.1 ; python_version >= "3.7" and python_version < "4.0" pytest-cov==4.0.0 ; python_version >= "3.7" and python_version < "4.0" -pytest-forked==1.4.0 ; python_version >= "3.7" and python_version < "4.0" -pytest-xdist==2.5.0 ; python_version >= "3.7" and python_version < "4.0" -pytest==7.1.3 ; python_version >= "3.7" and python_version < "4.0" +pytest-xdist==3.0.2 ; python_version >= "3.7" and python_version < "4.0" +pytest==7.2.0 ; python_version >= "3.7" and python_version < "4.0" python-augeas==1.1.0 ; python_version >= "3.7" and python_version < "4.0" python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "4.0" python-digitalocean==1.17.0 ; python_version >= "3.7" and python_version < "4.0" -pytz==2022.5 ; python_version >= "3.7" and python_version < "4.0" +pytz==2022.6 ; python_version >= "3.7" and python_version < "4.0" pywin32-ctypes==0.2.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" pywin32==304 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" pyyaml==5.4.1 ; python_version >= "3.7" and python_version < "4.0" -readme-renderer==37.2 ; python_version >= "3.7" and python_version < "4.0" +readme-renderer==37.3 ; python_version >= "3.7" and python_version < "4.0" requests-download==0.1.2 ; python_version >= "3.7" and python_version < "4.0" requests-file==1.5.1 ; python_version >= "3.7" and python_version < "4.0" requests-oauthlib==1.3.1 ; python_version >= "3.7" and python_version < "4.0" @@ -148,7 +148,7 @@ shellingham==1.5.0 ; python_version >= "3.7" and python_version < "4.0" six==1.16.0 ; python_version >= "3.7" and python_version < "4.0" snowballstemmer==2.2.0 ; python_version >= "3.7" and python_version < "4.0" soupsieve==2.3.2.post1 ; python_version >= "3.7" and python_version < "4.0" -sphinx-rtd-theme==1.0.0 ; python_version >= "3.7" and python_version < "4.0" +sphinx-rtd-theme==1.1.0 ; python_version >= "3.7" and python_version < "4.0" sphinx==5.1.1 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-applehelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" @@ -158,9 +158,9 @@ sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.7" and python_version < "4.0" tldextract==3.4.0 ; python_version >= "3.7" and python_version < "4.0" toml==0.10.2 ; python_version >= "3.7" and python_version < "4.0" -tomli==2.0.1 ; python_version >= "3.7" and python_version < "4.0" -tomlkit==0.11.5 ; python_version >= "3.7" and python_version < "4.0" -tox==3.26.0 ; python_version >= "3.7" and python_version < "4.0" +tomli==2.0.1 ; python_version >= "3.7" and python_full_version <= "3.11.0a6" +tomlkit==0.11.6 ; python_version >= "3.7" and python_version < "4.0" +tox==3.27.0 ; python_version >= "3.7" and python_version < "4.0" traitlets==5.5.0 ; python_version >= "3.7" and python_version < "4.0" twine==4.0.1 ; python_version >= "3.7" and python_version < "4.0" typed-ast==1.5.4 ; python_version >= "3.7" and python_version < "3.8" @@ -169,22 +169,22 @@ types-mock==4.0.15.2 ; python_version >= "3.7" and python_version < "4.0" types-pyopenssl==22.1.0.1 ; python_version >= "3.7" and python_version < "4.0" types-pyrfc3339==1.1.1 ; python_version >= "3.7" and python_version < "4.0" types-python-dateutil==2.8.19.2 ; python_version >= "3.7" and python_version < "4.0" -types-pytz==2022.5.0.0 ; python_version >= "3.7" and python_version < "4.0" +types-pytz==2022.6.0.1 ; python_version >= "3.7" and python_version < "4.0" types-requests==2.28.11.2 ; python_version >= "3.7" and python_version < "4.0" -types-setuptools==65.5.0.1 ; python_version >= "3.7" and python_version < "4.0" +types-setuptools==65.5.0.2 ; python_version >= "3.7" and python_version < "4.0" types-six==1.16.21 ; python_version >= "3.7" and python_version < "4.0" types-urllib3==1.26.25.1 ; python_version >= "3.7" and python_version < "4.0" typing-extensions==4.4.0 ; python_version >= "3.7" and python_version < "4.0" uritemplate==4.1.1 ; python_version >= "3.7" and python_version < "4.0" urllib3==1.26.12 ; python_version >= "3.7" and python_version < "4" -virtualenv==20.16.5 ; python_version >= "3.7" and python_version < "4.0" +virtualenv==20.16.6 ; python_version >= "3.7" and python_version < "4.0" wcwidth==0.2.5 ; python_version >= "3.7" and python_version < "4.0" webencodings==0.5.1 ; python_version >= "3.7" and python_version < "4.0" wheel==0.37.1 ; python_version >= "3.7" and python_version < "4.0" wrapt==1.14.1 ; python_version >= "3.7" and python_version < "4.0" xattr==0.9.9 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" yarg==0.1.9 ; python_version >= "3.7" and python_version < "4.0" -zipp==3.9.0 ; python_version >= "3.7" and python_version < "4.0" +zipp==3.10.0 ; python_version >= "3.7" and python_version < "4.0" zope-component==5.0.1 ; python_version >= "3.7" and python_version < "4.0" zope-event==4.5.0 ; python_version >= "3.7" and python_version < "4.0" zope-hookable==5.2 ; python_version >= "3.7" and python_version < "4.0" From dd2df866258790301df7f31b4b89c6316a02096d Mon Sep 17 00:00:00 2001 From: Erica Portnoy Date: Tue, 8 Nov 2022 15:22:20 -0800 Subject: [PATCH 12/16] Update changelog for 1.32.0 release --- certbot/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 836ecc048..2fcb78c99 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -2,7 +2,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). -## 1.32.0 - master +## 1.32.0 - 2022-11-08 ### Added From d88b9a5d1108dc398d8dcb65e9ef483ae68ba517 Mon Sep 17 00:00:00 2001 From: Erica Portnoy Date: Tue, 8 Nov 2022 15:23:34 -0800 Subject: [PATCH 13/16] Release 1.32.0 --- acme/setup.py | 2 +- certbot-apache/setup.py | 2 +- certbot-compatibility-test/setup.py | 2 +- certbot-dns-cloudflare/setup.py | 2 +- certbot-dns-cloudxns/setup.py | 2 +- certbot-dns-digitalocean/setup.py | 2 +- certbot-dns-dnsimple/setup.py | 2 +- certbot-dns-dnsmadeeasy/setup.py | 2 +- certbot-dns-gehirn/setup.py | 2 +- certbot-dns-google/setup.py | 2 +- certbot-dns-linode/setup.py | 2 +- certbot-dns-luadns/setup.py | 2 +- certbot-dns-nsone/setup.py | 2 +- certbot-dns-ovh/setup.py | 2 +- certbot-dns-rfc2136/setup.py | 2 +- certbot-dns-route53/setup.py | 2 +- certbot-dns-sakuracloud/setup.py | 2 +- certbot-nginx/setup.py | 2 +- certbot/certbot/__init__.py | 2 +- certbot/docs/cli-help.txt | 4 ++-- 20 files changed, 21 insertions(+), 21 deletions(-) diff --git a/acme/setup.py b/acme/setup.py index 7533ffdac..fad414ea7 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -3,7 +3,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'cryptography>=2.5.0', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 9e8ac2d58..464fe17e0 100644 --- a/certbot-apache/setup.py +++ b/certbot-apache/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot-compatibility-test/setup.py b/certbot-compatibility-test/setup.py index 84dc88f9b..fe1c99b58 100644 --- a/certbot-compatibility-test/setup.py +++ b/certbot-compatibility-test/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index 8d59ea38d..f7aeb44de 100644 --- a/certbot-dns-cloudflare/setup.py +++ b/certbot-dns-cloudflare/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'cloudflare>=1.5.1', diff --git a/certbot-dns-cloudxns/setup.py b/certbot-dns-cloudxns/setup.py index 89c6b21f5..fed7cac6d 100644 --- a/certbot-dns-cloudxns/setup.py +++ b/certbot-dns-cloudxns/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index 5f7c46b12..afc39a27b 100644 --- a/certbot-dns-digitalocean/setup.py +++ b/certbot-dns-digitalocean/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'python-digitalocean>=1.11', # 1.15.0 or newer is recommended for TTL support diff --git a/certbot-dns-dnsimple/setup.py b/certbot-dns-dnsimple/setup.py index b8a9f23b4..d8c6c2d3c 100644 --- a/certbot-dns-dnsimple/setup.py +++ b/certbot-dns-dnsimple/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ # This version of lexicon is required to address the problem described in diff --git a/certbot-dns-dnsmadeeasy/setup.py b/certbot-dns-dnsmadeeasy/setup.py index 92ac1beac..05af9c1c5 100644 --- a/certbot-dns-dnsmadeeasy/setup.py +++ b/certbot-dns-dnsmadeeasy/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index 800b98c79..a774c037e 100644 --- a/certbot-dns-gehirn/setup.py +++ b/certbot-dns-gehirn/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index 88fe1e382..360a52440 100644 --- a/certbot-dns-google/setup.py +++ b/certbot-dns-google/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'google-api-python-client>=1.5.5', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index f33593127..4ae442a0c 100644 --- a/certbot-dns-linode/setup.py +++ b/certbot-dns-linode/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index e97f64dba..c4111f0fe 100644 --- a/certbot-dns-luadns/setup.py +++ b/certbot-dns-luadns/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index 9a400bb90..35c08e879 100644 --- a/certbot-dns-nsone/setup.py +++ b/certbot-dns-nsone/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 608789859..17833baf3 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index 670654c42..e90824776 100644 --- a/certbot-dns-rfc2136/setup.py +++ b/certbot-dns-rfc2136/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dnspython>=1.15.0', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index f15152e31..e58f5f75d 100644 --- a/certbot-dns-route53/setup.py +++ b/certbot-dns-route53/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'boto3>=1.15.15', diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index b52ba1bd2..ee0711737 100644 --- a/certbot-dns-sakuracloud/setup.py +++ b/certbot-dns-sakuracloud/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index eaa317fa8..e6ed45780 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '1.32.0.dev0' +version = '1.32.0' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot/certbot/__init__.py b/certbot/certbot/__init__.py index 7e1c39776..ca4eab55b 100644 --- a/certbot/certbot/__init__.py +++ b/certbot/certbot/__init__.py @@ -1,3 +1,3 @@ """Certbot client.""" # version number like 1.2.3a0, must have at least 2 parts, like 1.2 -__version__ = '1.32.0.dev0' +__version__ = '1.32.0' diff --git a/certbot/docs/cli-help.txt b/certbot/docs/cli-help.txt index aadfb67cb..3c0538b72 100644 --- a/certbot/docs/cli-help.txt +++ b/certbot/docs/cli-help.txt @@ -35,7 +35,7 @@ manage your account: --agree-tos Agree to the ACME server's Subscriber Agreement -m EMAIL Email address for important account notifications -options: +optional arguments: -h, --help show this help message and exit -c CONFIG_FILE, --config CONFIG_FILE path to config file (default: /etc/letsencrypt/cli.ini @@ -126,7 +126,7 @@ options: case, and to know when to deprecate support for past Python versions and flags. If you wish to hide this information from the Let's Encrypt server, set this to - "". (default: CertbotACMEClient/1.31.0 (certbot; + "". (default: CertbotACMEClient/1.32.0 (certbot; OS_NAME OS_VERSION) Authenticator/XXX Installer/YYY (SUBCOMMAND; flags: FLAGS) Py/major.minor.patchlevel). The flags encoded in the user agent are: --duplicate, From c087b6f6c92678db108bf48f144969d6be78c6fc Mon Sep 17 00:00:00 2001 From: Erica Portnoy Date: Tue, 8 Nov 2022 15:23:35 -0800 Subject: [PATCH 14/16] Add contents to certbot/CHANGELOG.md for next version --- certbot/CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 2fcb78c99..d74cb1cb2 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -2,6 +2,22 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). +## 1.33.0 - master + +### Added + +* + +### Changed + +* + +### Fixed + +* + +More details about these changes can be found on our GitHub repo. + ## 1.32.0 - 2022-11-08 ### Added From fd22bd0f6615c25dbb657319e3f13a8fc60dade0 Mon Sep 17 00:00:00 2001 From: Erica Portnoy Date: Tue, 8 Nov 2022 15:23:35 -0800 Subject: [PATCH 15/16] Bump version to 1.33.0 --- acme/docs/jws-help.txt | 2 +- acme/setup.py | 2 +- certbot-apache/setup.py | 2 +- certbot-compatibility-test/setup.py | 2 +- certbot-dns-cloudflare/setup.py | 2 +- certbot-dns-cloudxns/setup.py | 2 +- certbot-dns-digitalocean/setup.py | 2 +- certbot-dns-dnsimple/setup.py | 2 +- certbot-dns-dnsmadeeasy/setup.py | 2 +- certbot-dns-gehirn/setup.py | 2 +- certbot-dns-google/setup.py | 2 +- certbot-dns-linode/setup.py | 2 +- certbot-dns-luadns/setup.py | 2 +- certbot-dns-nsone/setup.py | 2 +- certbot-dns-ovh/setup.py | 2 +- certbot-dns-rfc2136/setup.py | 2 +- certbot-dns-route53/setup.py | 2 +- certbot-dns-sakuracloud/setup.py | 2 +- certbot-nginx/setup.py | 2 +- certbot/certbot/__init__.py | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/acme/docs/jws-help.txt b/acme/docs/jws-help.txt index bfd16dff4..34cf5ce23 100644 --- a/acme/docs/jws-help.txt +++ b/acme/docs/jws-help.txt @@ -3,6 +3,6 @@ usage: jws [-h] [--compact] {sign,verify} ... positional arguments: {sign,verify} -options: +optional arguments: -h, --help show this help message and exit --compact diff --git a/acme/setup.py b/acme/setup.py index fad414ea7..657e197db 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -3,7 +3,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'cryptography>=2.5.0', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 464fe17e0..5074e7e2f 100644 --- a/certbot-apache/setup.py +++ b/certbot-apache/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot-compatibility-test/setup.py b/certbot-compatibility-test/setup.py index fe1c99b58..4ab06571d 100644 --- a/certbot-compatibility-test/setup.py +++ b/certbot-compatibility-test/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'certbot', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index f7aeb44de..cd95a7706 100644 --- a/certbot-dns-cloudflare/setup.py +++ b/certbot-dns-cloudflare/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'cloudflare>=1.5.1', diff --git a/certbot-dns-cloudxns/setup.py b/certbot-dns-cloudxns/setup.py index fed7cac6d..2d73ad0c3 100644 --- a/certbot-dns-cloudxns/setup.py +++ b/certbot-dns-cloudxns/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index afc39a27b..1f0018209 100644 --- a/certbot-dns-digitalocean/setup.py +++ b/certbot-dns-digitalocean/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'python-digitalocean>=1.11', # 1.15.0 or newer is recommended for TTL support diff --git a/certbot-dns-dnsimple/setup.py b/certbot-dns-dnsimple/setup.py index d8c6c2d3c..9f8fbcc94 100644 --- a/certbot-dns-dnsimple/setup.py +++ b/certbot-dns-dnsimple/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ # This version of lexicon is required to address the problem described in diff --git a/certbot-dns-dnsmadeeasy/setup.py b/certbot-dns-dnsmadeeasy/setup.py index 05af9c1c5..b343cedc2 100644 --- a/certbot-dns-dnsmadeeasy/setup.py +++ b/certbot-dns-dnsmadeeasy/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index a774c037e..b2d4df20d 100644 --- a/certbot-dns-gehirn/setup.py +++ b/certbot-dns-gehirn/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index 360a52440..c6c1827ea 100644 --- a/certbot-dns-google/setup.py +++ b/certbot-dns-google/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'google-api-python-client>=1.5.5', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index 4ae442a0c..6ccb87756 100644 --- a/certbot-dns-linode/setup.py +++ b/certbot-dns-linode/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index c4111f0fe..c43dd9f32 100644 --- a/certbot-dns-luadns/setup.py +++ b/certbot-dns-luadns/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index 35c08e879..5120fd9b0 100644 --- a/certbot-dns-nsone/setup.py +++ b/certbot-dns-nsone/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 17833baf3..6b273b53c 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index e90824776..d365c3b74 100644 --- a/certbot-dns-rfc2136/setup.py +++ b/certbot-dns-rfc2136/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dnspython>=1.15.0', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index e58f5f75d..cf36e523f 100644 --- a/certbot-dns-route53/setup.py +++ b/certbot-dns-route53/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'boto3>=1.15.15', diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index ee0711737..846e8777c 100644 --- a/certbot-dns-sakuracloud/setup.py +++ b/certbot-dns-sakuracloud/setup.py @@ -4,7 +4,7 @@ import sys from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ 'dns-lexicon>=3.2.1', diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index e6ed45780..cb8461e70 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -1,7 +1,7 @@ from setuptools import find_packages from setuptools import setup -version = '1.32.0' +version = '1.33.0.dev0' install_requires = [ # We specify the minimum acme and certbot version as the current plugin diff --git a/certbot/certbot/__init__.py b/certbot/certbot/__init__.py index ca4eab55b..d0c848320 100644 --- a/certbot/certbot/__init__.py +++ b/certbot/certbot/__init__.py @@ -1,3 +1,3 @@ """Certbot client.""" # version number like 1.2.3a0, must have at least 2 parts, like 1.2 -__version__ = '1.32.0' +__version__ = '1.33.0.dev0' From 202db15274e8129dca7d87ef3116db351984c36e Mon Sep 17 00:00:00 2001 From: Alex Zorin Date: Fri, 11 Nov 2022 18:03:57 +1100 Subject: [PATCH 16/16] fix new mypy complaints --- certbot-apache/certbot_apache/_internal/apacheparser.py | 3 ++- certbot-apache/certbot_apache/_internal/configurator.py | 2 +- .../certbot_integration_tests/certbot_tests/context.py | 4 ++-- .../certbot_integration_tests/rfc2136_tests/context.py | 2 +- certbot-nginx/certbot_nginx/_internal/configurator.py | 2 +- certbot/certbot/_internal/account.py | 2 +- certbot/certbot/_internal/display/dummy_readline.py | 1 + certbot/certbot/_internal/main.py | 2 +- certbot/certbot/tests/util.py | 8 ++++---- 9 files changed, 14 insertions(+), 12 deletions(-) diff --git a/certbot-apache/certbot_apache/_internal/apacheparser.py b/certbot-apache/certbot_apache/_internal/apacheparser.py index 0aba0cb3c..8d2a79754 100644 --- a/certbot-apache/certbot_apache/_internal/apacheparser.py +++ b/certbot-apache/certbot_apache/_internal/apacheparser.py @@ -118,7 +118,8 @@ class ApacheBlockNode(ApacheDirectiveNode): # pylint: disable=unused-argument def add_child_directive(self, name: str, parameters: Optional[List[str]] = None, - position: int = None) -> ApacheDirectiveNode: # pragma: no cover + position: Optional[int] = None + ) -> ApacheDirectiveNode: # pragma: no cover """Adds a new DirectiveNode to the sequence of children""" new_dir = ApacheDirectiveNode(name=assertions.PASS, parameters=assertions.PASS, diff --git a/certbot-apache/certbot_apache/_internal/configurator.py b/certbot-apache/certbot_apache/_internal/configurator.py index 0b54271be..41209deb4 100644 --- a/certbot-apache/certbot_apache/_internal/configurator.py +++ b/certbot-apache/certbot_apache/_internal/configurator.py @@ -812,7 +812,7 @@ class ApacheConfigurator(common.Configurator): return self._find_best_vhost(target, filtered_vhosts, filter_defaults) def _find_best_vhost( - self, target_name: str, vhosts: List[obj.VirtualHost] = None, + self, target_name: str, vhosts: Optional[List[obj.VirtualHost]] = None, filter_defaults: bool = True ) -> Optional[obj.VirtualHost]: """Finds the best vhost for a target_name. diff --git a/certbot-ci/certbot_integration_tests/certbot_tests/context.py b/certbot-ci/certbot_integration_tests/certbot_tests/context.py index 0dc732880..6b7407e50 100644 --- a/certbot-ci/certbot_integration_tests/certbot_tests/context.py +++ b/certbot-ci/certbot_integration_tests/certbot_tests/context.py @@ -17,8 +17,8 @@ class IntegrationTestsContext: self.request = request if hasattr(request.config, 'workerinput'): # Worker node - self.worker_id = request.config.workerinput['workerid'] # type: ignore[attr-defined] - acme_xdist = request.config.workerinput['acme_xdist'] # type: ignore[attr-defined] + self.worker_id = request.config.workerinput['workerid'] + acme_xdist = request.config.workerinput['acme_xdist'] else: # Primary node self.worker_id = 'primary' acme_xdist = request.config.acme_xdist # type: ignore[attr-defined] diff --git a/certbot-ci/certbot_integration_tests/rfc2136_tests/context.py b/certbot-ci/certbot_integration_tests/rfc2136_tests/context.py index dde41f367..4a383fe56 100644 --- a/certbot-ci/certbot_integration_tests/rfc2136_tests/context.py +++ b/certbot-ci/certbot_integration_tests/rfc2136_tests/context.py @@ -21,7 +21,7 @@ class IntegrationTestsContext(certbot_context.IntegrationTestsContext): self.request = request if hasattr(request.config, 'workerinput'): # Worker node - self._dns_xdist = request.config.workerinput['dns_xdist'] # type: ignore[attr-defined] + self._dns_xdist = request.config.workerinput['dns_xdist'] else: # Primary node self._dns_xdist = request.config.dns_xdist # type: ignore[attr-defined] diff --git a/certbot-nginx/certbot_nginx/_internal/configurator.py b/certbot-nginx/certbot_nginx/_internal/configurator.py index 39784110c..2786e5e8e 100644 --- a/certbot-nginx/certbot_nginx/_internal/configurator.py +++ b/certbot-nginx/certbot_nginx/_internal/configurator.py @@ -1112,7 +1112,7 @@ class NginxConfigurator(common.Configurator): ################################################### # Wrapper functions for Reverter class (Installer) ################################################### - def save(self, title: str = None, temporary: bool = False) -> None: + def save(self, title: Optional[str] = None, temporary: bool = False) -> None: """Saves all changes to the configuration files. :param str title: The title of the save. If a title is given, the diff --git a/certbot/certbot/_internal/account.py b/certbot/certbot/_internal/account.py index 8ebc71de3..eb2466f32 100644 --- a/certbot/certbot/_internal/account.py +++ b/certbot/certbot/_internal/account.py @@ -108,7 +108,7 @@ class Account: class AccountMemoryStorage(interfaces.AccountStorage): """In-memory account storage.""" - def __init__(self, initial_accounts: Dict[str, Account] = None) -> None: + def __init__(self, initial_accounts: Optional[Dict[str, Account]] = None) -> None: self.accounts = initial_accounts if initial_accounts is not None else {} def find_all(self) -> List[Account]: diff --git a/certbot/certbot/_internal/display/dummy_readline.py b/certbot/certbot/_internal/display/dummy_readline.py index 2b6e4c310..62152b050 100644 --- a/certbot/certbot/_internal/display/dummy_readline.py +++ b/certbot/certbot/_internal/display/dummy_readline.py @@ -11,6 +11,7 @@ def get_completer() -> Optional[Callable[[], str]]: def get_completer_delims() -> List[str]: """An empty implementation of readline.get_completer_delims.""" + return [] def parse_and_bind(unused_command: str) -> None: diff --git a/certbot/certbot/_internal/main.py b/certbot/certbot/_internal/main.py index 2ece86517..d72fa4d06 100644 --- a/certbot/certbot/_internal/main.py +++ b/certbot/certbot/_internal/main.py @@ -1683,7 +1683,7 @@ def make_displayer(config: configuration.NamespaceConfig devnull.close() -def main(cli_args: List[str] = None) -> Optional[Union[str, int]]: +def main(cli_args: Optional[List[str]] = None) -> Optional[Union[str, int]]: """Run Certbot. :param cli_args: command line to Certbot, defaults to ``sys.argv[1:]`` diff --git a/certbot/certbot/tests/util.py b/certbot/certbot/tests/util.py index 3509f360f..772fcd5a5 100644 --- a/certbot/certbot/tests/util.py +++ b/certbot/certbot/tests/util.py @@ -39,7 +39,7 @@ from certbot.plugins import common class DummyInstaller(common.Installer): """Dummy installer plugin for test purpose.""" def get_all_names(self) -> Iterable[str]: - pass + return [] def deploy_cert(self, domain: str, cert_path: str, key_path: str, chain_path: str, fullchain_path: str) -> None: @@ -50,7 +50,7 @@ class DummyInstaller(common.Installer): pass def supported_enhancements(self) -> List[str]: - pass + return [] def save(self, title: Optional[str] = None, temporary: bool = False) -> None: pass @@ -69,7 +69,7 @@ class DummyInstaller(common.Installer): pass def more_info(self) -> str: - pass + return "" def vector_path(*names: str) -> str: @@ -253,7 +253,7 @@ class FreezableMock: value of func is ignored. """ - def __init__(self, frozen: bool = False, func: Callable[..., Any] = None, + def __init__(self, frozen: bool = False, func: Optional[Callable[..., Any]] = None, return_value: Any = mock.sentinel.DEFAULT) -> None: self._frozen_set = set() if frozen else {'freeze', } self._func = func