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 255c2521..6dc0380b 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 7ba8dcba..6bda7aa5 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 OpenSSL # noqa diff --git a/plugins/module_utils/crypto/cryptography_support.py b/plugins/module_utils/crypto/cryptography_support.py index bf6bde29..004d5f2f 100644 --- a/plugins/module_utils/crypto/cryptography_support.py +++ b/plugins/module_utils/crypto/cryptography_support.py @@ -23,11 +23,11 @@ import base64 import binascii import re -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 dbf2936c..557daede 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 bd24f67f..8da72d4a 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 af28bec0..c0a44ea8 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 1c11131d..129debe9 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_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 bad68d9b..2b3f550c 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 ffeea026..474738bc 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 c5431473..52bd2c1f 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 345a1bb7..a51363f0 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 3fd5fb90..d793a1b4 100644 --- a/plugins/modules/get_certificate.py +++ b/plugins/modules/get_certificate.py @@ -167,7 +167,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 @@ -175,6 +174,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 0f2e2850..57cb50d7 100644 --- a/plugins/modules/openssl_publickey.py +++ b/plugins/modules/openssl_publickey.py @@ -182,11 +182,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 24a5fa7b..26db52cd 100644 --- a/plugins/modules/openssl_signature.py +++ b/plugins/modules/openssl_signature.py @@ -96,9 +96,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_PYOPENSSL_VERSION = '0.11' MINIMAL_CRYPTOGRAPHY_VERSION = '1.4' diff --git a/plugins/modules/openssl_signature_info.py b/plugins/modules/openssl_signature_info.py index 9b248f88..28e94259 100644 --- a/plugins/modules/openssl_signature_info.py +++ b/plugins/modules/openssl_signature_info.py @@ -96,9 +96,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_PYOPENSSL_VERSION = '0.11' MINIMAL_CRYPTOGRAPHY_VERSION = '1.4' diff --git a/plugins/modules/x509_crl.py b/plugins/modules/x509_crl.py index f9997d85..e34a1fd3 100644 --- a/plugins/modules/x509_crl.py +++ b/plugins/modules/x509_crl.py @@ -367,11 +367,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, )