From a539cd6939ad37d8aaa240c544a503f13f600a7d Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Fri, 24 Dec 2021 11:28:14 +0100 Subject: [PATCH] Prepare for distutils.version being removed in Python 3.12 (#353) * Prepare for distutils.version being removed in Python 2.12. * Fix copy'n'paste error. * Re-add Loose prefix. * Fix Python version typo. * Improve formulation. * Move message into own line. * Fix casing, now that the object is no longer called Version. --- .../fragments/353-distutils.version.yml | 2 ++ .../module_utils/acme/backend_cryptography.py | 3 ++- plugins/module_utils/crypto/basic.py | 2 +- .../crypto/cryptography_support.py | 4 ++-- .../crypto/module_backends/certificate.py | 4 ++-- .../module_backends/certificate_info.py | 4 ++-- .../module_backends/certificate_ownca.py | 3 ++- .../crypto/module_backends/crl_info.py | 4 ++-- .../crypto/module_backends/csr.py | 4 ++-- .../crypto/module_backends/csr_info.py | 4 ++-- .../crypto/module_backends/privatekey.py | 4 ++-- .../crypto/module_backends/privatekey_info.py | 4 ++-- .../crypto/module_backends/publickey_info.py | 4 ++-- .../openssh/backends/keypair_backend.py | 3 ++- plugins/module_utils/openssh/cryptography.py | 3 ++- plugins/module_utils/version.py | 20 +++++++++++++++++++ plugins/modules/acme_challenge_cert_helper.py | 3 ++- plugins/modules/certificate_complete_chain.py | 3 ++- plugins/modules/ecs_certificate.py | 4 ++-- plugins/modules/get_certificate.py | 3 ++- plugins/modules/openssh_cert.py | 3 ++- plugins/modules/openssl_dhparam.py | 4 ++-- plugins/modules/openssl_pkcs12.py | 4 ++-- plugins/modules/openssl_publickey.py | 4 ++-- plugins/modules/openssl_signature.py | 3 ++- plugins/modules/openssl_signature_info.py | 3 ++- plugins/modules/x509_crl.py | 4 ++-- 27 files changed, 71 insertions(+), 39 deletions(-) create mode 100644 changelogs/fragments/353-distutils.version.yml create mode 100644 plugins/module_utils/version.py diff --git a/changelogs/fragments/353-distutils.version.yml b/changelogs/fragments/353-distutils.version.yml new file mode 100644 index 00000000..ce0ed82d --- /dev/null +++ b/changelogs/fragments/353-distutils.version.yml @@ -0,0 +1,2 @@ +bugfixes: + - "Various modules and plugins - use vendored version of ``distutils.version`` included in ansible-core 2.12 if available. This avoids breakage when ``distutils`` is removed from the standard library of Python 3.12. Note that ansible-core 2.11, ansible-base 2.10 and Ansible 2.9 are right now not compatible with Python 3.12, hence this fix does not target these ansible-core/-base/2.9 versions (https://github.com/ansible-collections/community.crypto/pull/353)." diff --git a/plugins/module_utils/acme/backend_cryptography.py b/plugins/module_utils/acme/backend_cryptography.py index 8f0a35dc..32a21b2c 100644 --- a/plugins/module_utils/acme/backend_cryptography.py +++ b/plugins/module_utils/acme/backend_cryptography.py @@ -16,6 +16,8 @@ import sys from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.acme.backends import ( CryptoBackend, ) @@ -57,7 +59,6 @@ try: import cryptography.hazmat.primitives.serialization import cryptography.x509 import cryptography.x509.oid - from distutils.version import LooseVersion CRYPTOGRAPHY_VERSION = cryptography.__version__ HAS_CURRENT_CRYPTOGRAPHY = (LooseVersion(CRYPTOGRAPHY_VERSION) >= LooseVersion('1.5')) if HAS_CURRENT_CRYPTOGRAPHY: diff --git a/plugins/module_utils/crypto/basic.py b/plugins/module_utils/crypto/basic.py index a7ebb3d2..5c88f7c2 100644 --- a/plugins/module_utils/crypto/basic.py +++ b/plugins/module_utils/crypto/basic.py @@ -20,7 +20,7 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type -from distutils.version import LooseVersion +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion try: import cryptography diff --git a/plugins/module_utils/crypto/cryptography_support.py b/plugins/module_utils/crypto/cryptography_support.py index 0aeef377..d1430324 100644 --- a/plugins/module_utils/crypto/cryptography_support.py +++ b/plugins/module_utils/crypto/cryptography_support.py @@ -24,11 +24,11 @@ import binascii import re import sys -from distutils.version import LooseVersion - from ansible.module_utils.common.text.converters import to_text, to_bytes from ._asn1 import serialize_asn1_string_as_der +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + try: import cryptography from cryptography import x509 diff --git a/plugins/module_utils/crypto/module_backends/certificate.py b/plugins/module_utils/crypto/module_backends/certificate.py index b2769c1e..81f1898b 100644 --- a/plugins/module_utils/crypto/module_backends/certificate.py +++ b/plugins/module_utils/crypto/module_backends/certificate.py @@ -11,11 +11,11 @@ __metaclass__ = type import abc import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.module_backends.common import ArgumentSpec from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import ( diff --git a/plugins/module_utils/crypto/module_backends/certificate_info.py b/plugins/module_utils/crypto/module_backends/certificate_info.py index 9aedf5d9..49247c0d 100644 --- a/plugins/module_utils/crypto/module_backends/certificate_info.py +++ b/plugins/module_utils/crypto/module_backends/certificate_info.py @@ -15,12 +15,12 @@ import datetime import re import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.support import ( load_certificate, get_fingerprint_of_bytes, diff --git a/plugins/module_utils/crypto/module_backends/certificate_ownca.py b/plugins/module_utils/crypto/module_backends/certificate_ownca.py index 1f20b54f..46c0aeff 100644 --- a/plugins/module_utils/crypto/module_backends/certificate_ownca.py +++ b/plugins/module_utils/crypto/module_backends/certificate_ownca.py @@ -10,11 +10,12 @@ __metaclass__ = type import os -from distutils.version import LooseVersion from random import randrange from ansible.module_utils.common.text.converters import to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import ( OpenSSLBadPassphraseError, ) diff --git a/plugins/module_utils/crypto/module_backends/crl_info.py b/plugins/module_utils/crypto/module_backends/crl_info.py index 3f15b9cf..cf1e6e93 100644 --- a/plugins/module_utils/crypto/module_backends/crl_info.py +++ b/plugins/module_utils/crypto/module_backends/crl_info.py @@ -9,10 +9,10 @@ __metaclass__ = type import traceback -from distutils.version import LooseVersion - from ansible.module_utils.basic import missing_required_lib +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import ( cryptography_oid_to_name, ) diff --git a/plugins/module_utils/crypto/module_backends/csr.py b/plugins/module_utils/crypto/module_backends/csr.py index 5acfea32..449e3bea 100644 --- a/plugins/module_utils/crypto/module_backends/csr.py +++ b/plugins/module_utils/crypto/module_backends/csr.py @@ -12,12 +12,12 @@ import abc import binascii import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_bytes, to_native, to_text +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import ( OpenSSLObjectError, OpenSSLBadPassphraseError, diff --git a/plugins/module_utils/crypto/module_backends/csr_info.py b/plugins/module_utils/crypto/module_backends/csr_info.py index e7a26f36..6d4962f1 100644 --- a/plugins/module_utils/crypto/module_backends/csr_info.py +++ b/plugins/module_utils/crypto/module_backends/csr_info.py @@ -13,12 +13,12 @@ import abc import binascii import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.support import ( load_certificate_request, get_fingerprint_of_bytes, diff --git a/plugins/module_utils/crypto/module_backends/privatekey.py b/plugins/module_utils/crypto/module_backends/privatekey.py index 4beed041..ce72276c 100644 --- a/plugins/module_utils/crypto/module_backends/privatekey.py +++ b/plugins/module_utils/crypto/module_backends/privatekey.py @@ -12,12 +12,12 @@ import abc import base64 import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import ( CRYPTOGRAPHY_HAS_X25519, CRYPTOGRAPHY_HAS_X25519_FULL, diff --git a/plugins/module_utils/crypto/module_backends/privatekey_info.py b/plugins/module_utils/crypto/module_backends/privatekey_info.py index 05c687d5..146f455b 100644 --- a/plugins/module_utils/crypto/module_backends/privatekey_info.py +++ b/plugins/module_utils/crypto/module_backends/privatekey_info.py @@ -12,12 +12,12 @@ __metaclass__ = type import abc import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_native, to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import ( CRYPTOGRAPHY_HAS_ED25519, CRYPTOGRAPHY_HAS_ED448, diff --git a/plugins/module_utils/crypto/module_backends/publickey_info.py b/plugins/module_utils/crypto/module_backends/publickey_info.py index 00d19d38..55a46776 100644 --- a/plugins/module_utils/crypto/module_backends/publickey_info.py +++ b/plugins/module_utils/crypto/module_backends/publickey_info.py @@ -10,12 +10,12 @@ __metaclass__ = type import abc import traceback -from distutils.version import LooseVersion - from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_native +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.basic import ( CRYPTOGRAPHY_HAS_X25519, CRYPTOGRAPHY_HAS_X448, diff --git a/plugins/module_utils/openssh/backends/keypair_backend.py b/plugins/module_utils/openssh/backends/keypair_backend.py index bf434e68..7fef744b 100644 --- a/plugins/module_utils/openssh/backends/keypair_backend.py +++ b/plugins/module_utils/openssh/backends/keypair_backend.py @@ -21,12 +21,13 @@ __metaclass__ = type import abc import os -from distutils.version import LooseVersion from ansible.module_utils import six from ansible.module_utils.basic import missing_required_lib from ansible.module_utils.common.text.converters import to_native, to_text, to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.openssh.cryptography import ( HAS_OPENSSH_SUPPORT, HAS_OPENSSH_PRIVATE_FORMAT, diff --git a/plugins/module_utils/openssh/cryptography.py b/plugins/module_utils/openssh/cryptography.py index 5bd506e3..2e136563 100644 --- a/plugins/module_utils/openssh/cryptography.py +++ b/plugins/module_utils/openssh/cryptography.py @@ -20,10 +20,11 @@ __metaclass__ = type import os from base64 import b64encode, b64decode -from distutils.version import LooseVersion from getpass import getuser from socket import gethostname +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + try: from cryptography import __version__ as CRYPTOGRAPHY_VERSION from cryptography.exceptions import InvalidSignature, UnsupportedAlgorithm diff --git a/plugins/module_utils/version.py b/plugins/module_utils/version.py new file mode 100644 index 00000000..d1769e17 --- /dev/null +++ b/plugins/module_utils/version.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +# Copyright: (c) 2021, Felix Fontein +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +"""Provide version object to compare version numbers.""" + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +from ansible.module_utils.six import raise_from + +try: + from ansible.module_utils.compat.version import LooseVersion +except ImportError: + try: + from distutils.version import LooseVersion + except ImportError as exc: + msg = 'To use this plugin or module with ansible-core < 2.11, you need to use Python < 3.12 with distutils.version present' + raise_from(ImportError(msg), exc) diff --git a/plugins/modules/acme_challenge_cert_helper.py b/plugins/modules/acme_challenge_cert_helper.py index 93b765eb..d654f30d 100644 --- a/plugins/modules/acme_challenge_cert_helper.py +++ b/plugins/modules/acme_challenge_cert_helper.py @@ -145,6 +145,8 @@ import traceback from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_bytes, to_text +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.acme.errors import ModuleFailException from ansible_collections.community.crypto.plugins.module_utils.acme.io import ( @@ -164,7 +166,6 @@ try: import cryptography.x509 import cryptography.x509.oid import ipaddress - from distutils.version import LooseVersion HAS_CRYPTOGRAPHY = (LooseVersion(cryptography.__version__) >= LooseVersion('1.3')) _cryptography_backend = cryptography.hazmat.backends.default_backend() except ImportError as dummy: diff --git a/plugins/modules/certificate_complete_chain.py b/plugins/modules/certificate_complete_chain.py index 654c2fc4..8c96ba9e 100644 --- a/plugins/modules/certificate_complete_chain.py +++ b/plugins/modules/certificate_complete_chain.py @@ -124,6 +124,8 @@ import traceback from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.pem import ( split_pem_list, ) @@ -140,7 +142,6 @@ try: import cryptography.hazmat.primitives.asymmetric.utils import cryptography.x509 import cryptography.x509.oid - from distutils.version import LooseVersion HAS_CRYPTOGRAPHY = (LooseVersion(cryptography.__version__) >= LooseVersion('1.5')) _cryptography_backend = cryptography.hazmat.backends.default_backend() except ImportError as dummy: diff --git a/plugins/modules/ecs_certificate.py b/plugins/modules/ecs_certificate.py index 8f21c878..1eca89aa 100644 --- a/plugins/modules/ecs_certificate.py +++ b/plugins/modules/ecs_certificate.py @@ -519,11 +519,11 @@ import re import time import traceback -from distutils.version import LooseVersion - from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_native, to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.io import ( write_file, ) diff --git a/plugins/modules/get_certificate.py b/plugins/modules/get_certificate.py index fbc6e472..dba84615 100644 --- a/plugins/modules/get_certificate.py +++ b/plugins/modules/get_certificate.py @@ -169,7 +169,6 @@ import base64 import datetime import traceback -from distutils.version import LooseVersion from os.path import isfile from socket import create_connection, setdefaulttimeout, socket from ssl import get_server_certificate, DER_cert_to_PEM_cert, CERT_NONE, CERT_REQUIRED @@ -177,6 +176,8 @@ from ssl import get_server_certificate, DER_cert_to_PEM_cert, CERT_NONE, CERT_RE from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_bytes +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.crypto.cryptography_support import ( cryptography_oid_to_name, cryptography_get_extensions_from_cert, diff --git a/plugins/modules/openssh_cert.py b/plugins/modules/openssh_cert.py index c1bed019..e79b09a4 100644 --- a/plugins/modules/openssh_cert.py +++ b/plugins/modules/openssh_cert.py @@ -258,11 +258,12 @@ info: ''' import os -from distutils.version import LooseVersion from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.common.text.converters import to_native, to_text +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.openssh.backends.common import ( KeygenCommand, OpensshModule, diff --git a/plugins/modules/openssl_dhparam.py b/plugins/modules/openssl_dhparam.py index 8d45d939..1ba647d7 100644 --- a/plugins/modules/openssl_dhparam.py +++ b/plugins/modules/openssl_dhparam.py @@ -128,11 +128,11 @@ import re import tempfile import traceback -from distutils.version import LooseVersion - from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_native +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.io import ( load_file_if_exists, write_file, diff --git a/plugins/modules/openssl_pkcs12.py b/plugins/modules/openssl_pkcs12.py index 75e591ca..d891c9cd 100644 --- a/plugins/modules/openssl_pkcs12.py +++ b/plugins/modules/openssl_pkcs12.py @@ -239,11 +239,11 @@ import os import stat import traceback -from distutils.version import LooseVersion - from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_bytes, to_native +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.io import ( load_file_if_exists, write_file, diff --git a/plugins/modules/openssl_publickey.py b/plugins/modules/openssl_publickey.py index 00196778..7f597ca6 100644 --- a/plugins/modules/openssl_publickey.py +++ b/plugins/modules/openssl_publickey.py @@ -175,11 +175,11 @@ publickey: import os import traceback -from distutils.version import LooseVersion - from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_native +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.io import ( load_file_if_exists, write_file, diff --git a/plugins/modules/openssl_signature.py b/plugins/modules/openssl_signature.py index 971ee505..93cd29f0 100644 --- a/plugins/modules/openssl_signature.py +++ b/plugins/modules/openssl_signature.py @@ -91,9 +91,10 @@ signature: import os import traceback -from distutils.version import LooseVersion import base64 +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + MINIMAL_CRYPTOGRAPHY_VERSION = '1.4' CRYPTOGRAPHY_IMP_ERR = None diff --git a/plugins/modules/openssl_signature_info.py b/plugins/modules/openssl_signature_info.py index b3d0c795..4813c286 100644 --- a/plugins/modules/openssl_signature_info.py +++ b/plugins/modules/openssl_signature_info.py @@ -91,9 +91,10 @@ valid: import os import traceback -from distutils.version import LooseVersion import base64 +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + MINIMAL_CRYPTOGRAPHY_VERSION = '1.4' CRYPTOGRAPHY_IMP_ERR = None diff --git a/plugins/modules/x509_crl.py b/plugins/modules/x509_crl.py index 714db997..ce07ef49 100644 --- a/plugins/modules/x509_crl.py +++ b/plugins/modules/x509_crl.py @@ -380,11 +380,11 @@ import base64 import os import traceback -from distutils.version import LooseVersion - from ansible.module_utils.basic import AnsibleModule, missing_required_lib from ansible.module_utils.common.text.converters import to_native, to_text +from ansible_collections.community.crypto.plugins.module_utils.version import LooseVersion + from ansible_collections.community.crypto.plugins.module_utils.io import ( write_file, )