1
0
mirror of https://github.com/certbot/certbot.git synced 2025-08-08 04:02:10 +03:00

Drop support for EOL Python 2.6 and 3.3

* Drop support for EOL Python 2.6

* Use more helpful assertIn/NotIn instead of assertTrue/False

* Drop support for EOL Python 3.3

* Remove redundant Python 3.3 code

* Restore code for RHEL 6 and virtualenv for Py2.7

* Revert pipstrap.py to upstream

* Merge py26_packages and non_py26_packages into all_packages

* Revert changes to *-auto in root

* Update by calling letsencrypt-auto-source/build.py

* Revert permissions for pipstrap.py
This commit is contained in:
Hugo
2018-01-26 11:47:25 +02:00
committed by Brad Warren
parent 932ecbb9c2
commit 42638afc75
32 changed files with 56 additions and 228 deletions

View File

@@ -25,18 +25,10 @@ matrix:
addons: addons:
- python: "2.7" - python: "2.7"
env: TOXENV=lint env: TOXENV=lint
- python: "2.6"
env: TOXENV=py26
sudo: required
services: docker
- python: "2.7" - python: "2.7"
env: TOXENV=py27-oldest env: TOXENV=py27-oldest
sudo: required sudo: required
services: docker services: docker
- python: "3.3"
env: TOXENV=py33
sudo: required
services: docker
- python: "3.6" - python: "3.6"
env: TOXENV=py36 env: TOXENV=py36
sudo: required sudo: required

View File

@@ -10,13 +10,3 @@ supported version: `draft-ietf-acme-01`_.
https://github.com/ietf-wg-acme/acme/tree/draft-ietf-acme-acme-01 https://github.com/ietf-wg-acme/acme/tree/draft-ietf-acme-acme-01
""" """
import sys
import warnings
for (major, minor) in [(2, 6), (3, 3)]:
if sys.version_info[:2] == (major, minor):
warnings.warn(
"Python {0}.{1} support will be dropped in the next release of "
"acme. Please upgrade your Python version.".format(major, minor),
DeprecationWarning,
) #pragma: no cover

View File

@@ -5,7 +5,6 @@ import logging
import os import os
import re import re
import socket import socket
import sys
import OpenSSL import OpenSSL
@@ -130,8 +129,7 @@ def probe_sni(name, host, port=443, timeout=300,
context = OpenSSL.SSL.Context(method) context = OpenSSL.SSL.Context(method)
context.set_timeout(timeout) context.set_timeout(timeout)
socket_kwargs = {} if sys.version_info < (2, 7) else { socket_kwargs = {'source_address': source_address}
'source_address': source_address}
host_protocol_agnostic = None if host == '::' or host == '0' else host host_protocol_agnostic = None if host == '::' or host == '0' else host

View File

@@ -170,9 +170,9 @@ class MakeCSRTest(unittest.TestCase):
self.assertTrue(b'--END CERTIFICATE REQUEST--' in csr_pem) self.assertTrue(b'--END CERTIFICATE REQUEST--' in csr_pem)
csr = OpenSSL.crypto.load_certificate_request( csr = OpenSSL.crypto.load_certificate_request(
OpenSSL.crypto.FILETYPE_PEM, csr_pem) OpenSSL.crypto.FILETYPE_PEM, csr_pem)
# In pyopenssl 0.13 (used with TOXENV=py26-oldest and py27-oldest), csr # In pyopenssl 0.13 (used with TOXENV=py27-oldest), csr objects don't
# objects don't have a get_extensions() method, so we skip this test if # have a get_extensions() method, so we skip this test if the method
# the method isn't available. # isn't available.
if hasattr(csr, 'get_extensions'): if hasattr(csr, 'get_extensions'):
self.assertEquals(len(csr.get_extensions()), 1) self.assertEquals(len(csr.get_extensions()), 1)
self.assertEquals(csr.get_extensions()[0].get_data(), self.assertEquals(csr.get_extensions()[0].get_data(),
@@ -188,9 +188,9 @@ class MakeCSRTest(unittest.TestCase):
csr = OpenSSL.crypto.load_certificate_request( csr = OpenSSL.crypto.load_certificate_request(
OpenSSL.crypto.FILETYPE_PEM, csr_pem) OpenSSL.crypto.FILETYPE_PEM, csr_pem)
# In pyopenssl 0.13 (used with TOXENV=py26-oldest and py27-oldest), csr # In pyopenssl 0.13 (used with TOXENV=py27-oldest), csr objects don't
# objects don't have a get_extensions() method, so we skip this test if # have a get_extensions() method, so we skip this test if the method
# the method isn't available. # isn't available.
if hasattr(csr, 'get_extensions'): if hasattr(csr, 'get_extensions'):
self.assertEquals(len(csr.get_extensions()), 2) self.assertEquals(len(csr.get_extensions()), 2)
# NOTE: Ideally we would filter by the TLS Feature OID, but # NOTE: Ideally we would filter by the TLS Feature OID, but

View File

@@ -25,13 +25,6 @@ install_requires = [
'six>=1.9.0', # needed for python_2_unicode_compatible 'six>=1.9.0', # needed for python_2_unicode_compatible
] ]
# env markers cause problems with older pip and setuptools
if sys.version_info < (2, 7):
install_requires.extend([
'argparse',
'ordereddict',
])
dev_extras = [ dev_extras = [
'pytest', 'pytest',
'pytest-xdist', 'pytest-xdist',
@@ -58,10 +51,8 @@ setup(
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -40,10 +40,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -40,10 +40,8 @@ setup(
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -39,10 +39,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -41,7 +41,6 @@ setup(
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -40,10 +40,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -41,7 +41,6 @@ setup(
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -41,7 +41,6 @@ setup(
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -44,10 +44,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -41,7 +41,6 @@ setup(
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -41,7 +41,6 @@ setup(
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -39,10 +39,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -32,10 +32,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -40,10 +40,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -165,11 +165,6 @@ class ColoredStreamHandler(logging.StreamHandler):
""" """
def __init__(self, stream=None): def __init__(self, stream=None):
# logging handlers use old style classes in Python 2.6 so
# super() cannot be used
if sys.version_info < (2, 7): # pragma: no cover
logging.StreamHandler.__init__(self, stream)
else:
super(ColoredStreamHandler, self).__init__(stream) super(ColoredStreamHandler, self).__init__(stream)
self.colored = (sys.stderr.isatty() if stream is None else self.colored = (sys.stderr.isatty() if stream is None else
stream.isatty()) stream.isatty())
@@ -184,9 +179,7 @@ class ColoredStreamHandler(logging.StreamHandler):
:rtype: str :rtype: str
""" """
out = (logging.StreamHandler.format(self, record) out = super(ColoredStreamHandler, self).format(record)
if sys.version_info < (2, 7)
else super(ColoredStreamHandler, self).format(record))
if self.colored and record.levelno >= self.red_level: if self.colored and record.levelno >= self.red_level:
return ''.join((util.ANSI_SGR_RED, out, util.ANSI_SGR_RESET)) return ''.join((util.ANSI_SGR_RED, out, util.ANSI_SGR_RESET))
else: else:
@@ -203,12 +196,6 @@ class MemoryHandler(logging.handlers.MemoryHandler):
def __init__(self, target=None): def __init__(self, target=None):
# capacity doesn't matter because should_flush() is overridden # capacity doesn't matter because should_flush() is overridden
capacity = float('inf') capacity = float('inf')
# logging handlers use old style classes in Python 2.6 so
# super() cannot be used
if sys.version_info < (2, 7): # pragma: no cover
logging.handlers.MemoryHandler.__init__(
self, capacity, target=target)
else:
super(MemoryHandler, self).__init__(capacity, target=target) super(MemoryHandler, self).__init__(capacity, target=target)
def close(self): def close(self):
@@ -216,9 +203,6 @@ class MemoryHandler(logging.handlers.MemoryHandler):
# This allows the logging module which may only have a weak # This allows the logging module which may only have a weak
# reference to the target handler to properly flush and close it. # reference to the target handler to properly flush and close it.
target = self.target target = self.target
if sys.version_info < (2, 7): # pragma: no cover
logging.handlers.MemoryHandler.close(self)
else:
super(MemoryHandler, self).close() super(MemoryHandler, self).close()
self.target = target self.target = target
@@ -233,9 +217,6 @@ class MemoryHandler(logging.handlers.MemoryHandler):
# This method allows flush() calls in logging.shutdown to be a # This method allows flush() calls in logging.shutdown to be a
# noop so we can control when this handler is flushed. # noop so we can control when this handler is flushed.
if force: if force:
if sys.version_info < (2, 7): # pragma: no cover
logging.handlers.MemoryHandler.flush(self)
else:
super(MemoryHandler, self).flush() super(MemoryHandler, self).flush()
def shouldFlush(self, record): def shouldFlush(self, record):
@@ -262,11 +243,6 @@ class TempHandler(logging.StreamHandler):
""" """
def __init__(self): def __init__(self):
stream = tempfile.NamedTemporaryFile('w', delete=False) stream = tempfile.NamedTemporaryFile('w', delete=False)
# logging handlers use old style classes in Python 2.6 so
# super() cannot be used
if sys.version_info < (2, 7): # pragma: no cover
logging.StreamHandler.__init__(self, stream)
else:
super(TempHandler, self).__init__(stream) super(TempHandler, self).__init__(stream)
self.path = stream.name self.path = stream.name
self._delete = True self._delete = True
@@ -278,11 +254,6 @@ class TempHandler(logging.StreamHandler):
""" """
self._delete = False self._delete = False
# logging handlers use old style classes in Python 2.6 so
# super() cannot be used
if sys.version_info < (2, 7): # pragma: no cover
logging.StreamHandler.emit(self, record)
else:
super(TempHandler, self).emit(record) super(TempHandler, self).emit(record)
def close(self): def close(self):
@@ -299,9 +270,6 @@ class TempHandler(logging.StreamHandler):
if self._delete: if self._delete:
os.remove(self.path) os.remove(self.path)
self._delete = False self._delete = False
if sys.version_info < (2, 7): # pragma: no cover
logging.StreamHandler.close(self)
else:
super(TempHandler, self).close() super(TempHandler, self).close()
finally: finally:
self.release() self.release()

View File

@@ -4,7 +4,6 @@ import functools
import logging.handlers import logging.handlers
import os import os
import sys import sys
import warnings
import configobj import configobj
import josepy as jose import josepy as jose
@@ -1218,17 +1217,6 @@ def main(cli_args=sys.argv[1:]):
# Let plugins_cmd be run as un-privileged user. # Let plugins_cmd be run as un-privileged user.
if config.func != plugins_cmd: if config.func != plugins_cmd:
raise raise
deprecation_fmt = (
"Python %s.%s support will be dropped in the next "
"release of Certbot - please upgrade your Python version.")
# We use the warnings system for Python 2.6 and logging for Python 3
# because DeprecationWarnings are only reported by default in Python <= 2.6
# and warnings can be disabled by the user.
if sys.version_info[:2] == (2, 6):
warning = deprecation_fmt % sys.version_info[:2]
warnings.warn(warning, DeprecationWarning)
elif sys.version_info[:2] == (3, 3):
logger.warning(deprecation_fmt, *sys.version_info[:2])
set_displayer(config) set_displayer(config)

View File

@@ -422,7 +422,7 @@ OS-level dependencies can be installed like so:
In general... In general...
* ``sudo`` is required as a suggested way of running privileged process * ``sudo`` is required as a suggested way of running privileged process
* `Python`_ 2.6/2.7 is required * `Python`_ 2.7 is required
* `Augeas`_ is required for the Python bindings * `Augeas`_ is required for the Python bindings
* ``virtualenv`` and ``pip`` are used for managing other python library * ``virtualenv`` and ``pip`` are used for managing other python library
dependencies dependencies

View File

@@ -22,7 +22,7 @@ your system.
System Requirements System Requirements
=================== ===================
Certbot currently requires Python 2.6, 2.7, or 3.3+. By default, it requires Certbot currently requires Python 2.7, or 3.4+. By default, it requires
root access in order to write to ``/etc/letsencrypt``, root access in order to write to ``/etc/letsencrypt``,
``/var/log/letsencrypt``, ``/var/lib/letsencrypt``; to bind to ports 80 and 443 ``/var/log/letsencrypt``, ``/var/lib/letsencrypt``; to bind to ports 80 and 443
(if you use the ``standalone`` plugin) and to read and modify webserver (if you use the ``standalone`` plugin) and to read and modify webserver

View File

@@ -246,7 +246,7 @@ DeprecationBootstrap() {
fi fi
} }
MIN_PYTHON_VERSION="2.6" MIN_PYTHON_VERSION="2.7"
MIN_PYVER=$(echo "$MIN_PYTHON_VERSION" | sed 's/\.//') MIN_PYVER=$(echo "$MIN_PYTHON_VERSION" | sed 's/\.//')
# Sets LE_PYTHON to Python version string and PYVER to the first two # Sets LE_PYTHON to Python version string and PYVER to the first two
# digits of the python version # digits of the python version
@@ -781,20 +781,11 @@ elif [ -f /etc/redhat-release ]; then
prev_le_python="$LE_PYTHON" prev_le_python="$LE_PYTHON"
unset LE_PYTHON unset LE_PYTHON
DeterminePythonVersion "NOCRASH" DeterminePythonVersion "NOCRASH"
if [ "$PYVER" -eq 26 ]; then
Bootstrap() {
BootstrapMessage "RedHat-based OSes that will use Python3"
BootstrapRpmPython3
}
USE_PYTHON_3=1
BOOTSTRAP_VERSION="BootstrapRpmPython3 $BOOTSTRAP_RPM_PYTHON3_VERSION"
else
Bootstrap() { Bootstrap() {
BootstrapMessage "RedHat-based OSes" BootstrapMessage "RedHat-based OSes"
BootstrapRpmCommon BootstrapRpmCommon
} }
BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION" BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
fi
LE_PYTHON="$prev_le_python" LE_PYTHON="$prev_le_python"
elif [ -f /etc/os-release ] && `grep -q openSUSE /etc/os-release` ; then elif [ -f /etc/os-release ] && `grep -q openSUSE /etc/os-release` ; then
Bootstrap() { Bootstrap() {
@@ -965,19 +956,11 @@ if [ "$1" = "--le-auto-phase2" ]; then
say "Creating virtual environment..." say "Creating virtual environment..."
DeterminePythonVersion DeterminePythonVersion
rm -rf "$VENV_PATH" rm -rf "$VENV_PATH"
if [ "$PYVER" -le 27 ]; then
if [ "$VERBOSE" = 1 ]; then
virtualenv --no-site-packages --python "$LE_PYTHON" "$VENV_PATH"
else
virtualenv --no-site-packages --python "$LE_PYTHON" "$VENV_PATH" > /dev/null
fi
else
if [ "$VERBOSE" = 1 ]; then if [ "$VERBOSE" = 1 ]; then
"$LE_PYTHON" -m venv "$VENV_PATH" "$LE_PYTHON" -m venv "$VENV_PATH"
else else
"$LE_PYTHON" -m venv "$VENV_PATH" > /dev/null "$LE_PYTHON" -m venv "$VENV_PATH" > /dev/null
fi fi
fi
if [ -n "$BOOTSTRAP_VERSION" ]; then if [ -n "$BOOTSTRAP_VERSION" ]; then
echo "$BOOTSTRAP_VERSION" > "$BOOTSTRAP_VERSION_PATH" echo "$BOOTSTRAP_VERSION" > "$BOOTSTRAP_VERSION_PATH"

View File

@@ -246,7 +246,7 @@ DeprecationBootstrap() {
fi fi
} }
MIN_PYTHON_VERSION="2.6" MIN_PYTHON_VERSION="2.7"
MIN_PYVER=$(echo "$MIN_PYTHON_VERSION" | sed 's/\.//') MIN_PYVER=$(echo "$MIN_PYTHON_VERSION" | sed 's/\.//')
# Sets LE_PYTHON to Python version string and PYVER to the first two # Sets LE_PYTHON to Python version string and PYVER to the first two
# digits of the python version # digits of the python version
@@ -320,20 +320,11 @@ elif [ -f /etc/redhat-release ]; then
prev_le_python="$LE_PYTHON" prev_le_python="$LE_PYTHON"
unset LE_PYTHON unset LE_PYTHON
DeterminePythonVersion "NOCRASH" DeterminePythonVersion "NOCRASH"
if [ "$PYVER" -eq 26 ]; then
Bootstrap() {
BootstrapMessage "RedHat-based OSes that will use Python3"
BootstrapRpmPython3
}
USE_PYTHON_3=1
BOOTSTRAP_VERSION="BootstrapRpmPython3 $BOOTSTRAP_RPM_PYTHON3_VERSION"
else
Bootstrap() { Bootstrap() {
BootstrapMessage "RedHat-based OSes" BootstrapMessage "RedHat-based OSes"
BootstrapRpmCommon BootstrapRpmCommon
} }
BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION" BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
fi
LE_PYTHON="$prev_le_python" LE_PYTHON="$prev_le_python"
elif [ -f /etc/os-release ] && `grep -q openSUSE /etc/os-release` ; then elif [ -f /etc/os-release ] && `grep -q openSUSE /etc/os-release` ; then
Bootstrap() { Bootstrap() {
@@ -504,19 +495,11 @@ if [ "$1" = "--le-auto-phase2" ]; then
say "Creating virtual environment..." say "Creating virtual environment..."
DeterminePythonVersion DeterminePythonVersion
rm -rf "$VENV_PATH" rm -rf "$VENV_PATH"
if [ "$PYVER" -le 27 ]; then
if [ "$VERBOSE" = 1 ]; then
virtualenv --no-site-packages --python "$LE_PYTHON" "$VENV_PATH"
else
virtualenv --no-site-packages --python "$LE_PYTHON" "$VENV_PATH" > /dev/null
fi
else
if [ "$VERBOSE" = 1 ]; then if [ "$VERBOSE" = 1 ]; then
"$LE_PYTHON" -m venv "$VENV_PATH" "$LE_PYTHON" -m venv "$VENV_PATH"
else else
"$LE_PYTHON" -m venv "$VENV_PATH" > /dev/null "$LE_PYTHON" -m venv "$VENV_PATH" > /dev/null
fi fi
fi
if [ -n "$BOOTSTRAP_VERSION" ]; then if [ -n "$BOOTSTRAP_VERSION" ]; then
echo "$BOOTSTRAP_VERSION" > "$BOOTSTRAP_VERSION_PATH" echo "$BOOTSTRAP_VERSION" > "$BOOTSTRAP_VERSION_PATH"

View File

@@ -287,8 +287,8 @@ class AutoTests(TestCase):
self.assertTrue(re.match(r'letsencrypt \d+\.\d+\.\d+', self.assertTrue(re.match(r'letsencrypt \d+\.\d+\.\d+',
err.strip().splitlines()[-1])) err.strip().splitlines()[-1]))
# Make a few assertions to test the validity of the next tests: # Make a few assertions to test the validity of the next tests:
self.assertTrue('Upgrading certbot-auto ' in out) self.assertIn('Upgrading certbot-auto ', out)
self.assertTrue('Creating virtual environment...' in out) self.assertIn('Creating virtual environment...', out)
# Now we have le-auto 99.9.9 and LE 99.9.9 installed. This # Now we have le-auto 99.9.9 and LE 99.9.9 installed. This
# conveniently sets us up to test the next 2 cases. # conveniently sets us up to test the next 2 cases.
@@ -296,8 +296,8 @@ class AutoTests(TestCase):
# Test when neither phase-1 upgrade nor phase-2 upgrade is # Test when neither phase-1 upgrade nor phase-2 upgrade is
# needed (probably a common case): # needed (probably a common case):
out, err = run_letsencrypt_auto() out, err = run_letsencrypt_auto()
self.assertFalse('Upgrading certbot-auto ' in out) self.assertNotIn('Upgrading certbot-auto ', out)
self.assertFalse('Creating virtual environment...' in out) self.assertNotIn('Creating virtual environment...', out)
def test_phase2_upgrade(self): def test_phase2_upgrade(self):
"""Test a phase-2 upgrade without a phase-1 upgrade.""" """Test a phase-2 upgrade without a phase-1 upgrade."""
@@ -312,8 +312,8 @@ class AutoTests(TestCase):
# Create venv saving the correct bootstrap script version # Create venv saving the correct bootstrap script version
out, err = run_le_auto(le_auto_path, venv_dir, base_url, out, err = run_le_auto(le_auto_path, venv_dir, base_url,
PIP_FIND_LINKS=pip_find_links) PIP_FIND_LINKS=pip_find_links)
self.assertFalse('Upgrading certbot-auto ' in out) self.assertNotIn('Upgrading certbot-auto ', out)
self.assertTrue('Creating virtual environment...' in out) self.assertIn('Creating virtual environment...', out)
with open(join(venv_dir, BOOTSTRAP_FILENAME)) as f: with open(join(venv_dir, BOOTSTRAP_FILENAME)) as f:
bootstrap_version = f.read() bootstrap_version = f.read()
@@ -329,8 +329,8 @@ class AutoTests(TestCase):
out, err = run_le_auto(le_auto_path, venv_dir, base_url, out, err = run_le_auto(le_auto_path, venv_dir, base_url,
PIP_FIND_LINKS=pip_find_links) PIP_FIND_LINKS=pip_find_links)
self.assertFalse('Upgrading certbot-auto ' in out) self.assertNotIn('Upgrading certbot-auto ', out)
self.assertTrue('Creating virtual environment...' in out) self.assertIn('Creating virtual environment...', out)
def test_openssl_failure(self): def test_openssl_failure(self):
"""Make sure we stop if the openssl signature check fails.""" """Make sure we stop if the openssl signature check fails."""

View File

@@ -5,7 +5,6 @@ from __future__ import print_function
import argparse import argparse
import atexit import atexit
import contextlib
import os import os
import re import re
import shutil import shutil
@@ -302,8 +301,7 @@ def main():
make_and_verify_selection(args.server_root, tempdir) make_and_verify_selection(args.server_root, tempdir)
tarpath = os.path.join(tempdir, "config.tar.gz") tarpath = os.path.join(tempdir, "config.tar.gz")
# contextlib.closing used for py26 support with tarfile.open(tarpath, mode="w:gz") as tar:
with contextlib.closing(tarfile.open(tarpath, mode="w:gz")) as tar:
tar.add(tempdir, arcname=".") tar.add(tempdir, arcname=".")
# TODO: Submit tarpath # TODO: Submit tarpath

View File

@@ -31,10 +31,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -52,13 +52,6 @@ install_requires = [
'zope.interface', 'zope.interface',
] ]
# env markers cause problems with older pip and setuptools
if sys.version_info < (2, 7):
install_requires.extend([
'argparse',
'ordereddict',
])
dev_extras = [ dev_extras = [
# Pin astroid==1.3.5, pylint==1.4.2 as a workaround for #289 # Pin astroid==1.3.5, pylint==1.4.2 as a workaround for #289
'astroid==1.3.5', 'astroid==1.3.5',
@@ -98,10 +91,8 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.6',

View File

@@ -15,10 +15,4 @@ VENV_BIN=${VENV_PATH}/bin
cd letsencrypt cd letsencrypt
./tools/venv.sh ./tools/venv.sh
PYVER=`python --version 2>&1 | cut -d" " -f 2 | cut -d. -f1,2 | sed 's/\.//'`
if [ $PYVER -eq 26 ] ; then
venv/bin/tox -e py26
else
venv/bin/tox -e py27 venv/bin/tox -e py27
fi

View File

@@ -3,7 +3,7 @@ import sys
# Run Python's built-in HTTP server # Run Python's built-in HTTP server
# Usage: python ./tests/run_http_server.py port_num # Usage: python ./tests/run_http_server.py port_num
# NOTE: This script should be compatible with 2.6, 2.7, 3.3+ # NOTE: This script should be compatible with 2.7, 3.4+
# sys.argv (port number) is passed as-is to the HTTP server module # sys.argv (port number) is passed as-is to the HTTP server module
runpy.run_module( runpy.run_module(

View File

@@ -18,10 +18,6 @@ for requirement in "$@" ; do
pkg=$(echo $requirement | cut -f1 -d\[) # remove any extras such as [dev] pkg=$(echo $requirement | cut -f1 -d\[) # remove any extras such as [dev]
if [ $pkg = "." ]; then if [ $pkg = "." ]; then
pkg="certbot" pkg="certbot"
else
# Work around a bug in pytest/importlib for the deprecated Python 3.3.
# See https://travis-ci.org/certbot/certbot/jobs/308774157#L1333.
pkg=$(echo "$pkg" | tr - _)
fi fi
"$(dirname $0)/pytest.sh" --pyargs $pkg "$(dirname $0)/pytest.sh" --pyargs $pkg
done done

41
tox.ini
View File

@@ -4,7 +4,7 @@
[tox] [tox]
skipsdist = true skipsdist = true
envlist = modification,py{26,33,34,35,36},cover,lint envlist = modification,py{34,35,36},cover,lint
[base] [base]
# pip installs the requested packages in editable mode # pip installs the requested packages in editable mode
@@ -14,25 +14,22 @@ pip_install = {toxinidir}/tools/pip_install_editable.sh
# before the script moves on to the next package. All dependencies are pinned # before the script moves on to the next package. All dependencies are pinned
# to a specific version for increased stability for developers. # to a specific version for increased stability for developers.
install_and_test = {toxinidir}/tools/install_and_test.sh install_and_test = {toxinidir}/tools/install_and_test.sh
py26_packages = all_packages =
acme[dev] \ acme[dev] \
.[dev] \ .[dev] \
certbot-apache \ certbot-apache \
certbot-dns-cloudflare \ certbot-dns-cloudflare \
certbot-dns-cloudxns \
certbot-dns-digitalocean \ certbot-dns-digitalocean \
certbot-dns-dnsimple \
certbot-dns-dnsmadeeasy \
certbot-dns-google \ certbot-dns-google \
certbot-dns-luadns \
certbot-dns-nsone \
certbot-dns-rfc2136 \ certbot-dns-rfc2136 \
certbot-dns-route53 \ certbot-dns-route53 \
certbot-nginx \ certbot-nginx \
letshelp-certbot letshelp-certbot
non_py26_packages =
certbot-dns-cloudxns \
certbot-dns-dnsimple \
certbot-dns-dnsmadeeasy \
certbot-dns-luadns \
certbot-dns-nsone
all_packages =
{[base]py26_packages} {[base]non_py26_packages}
install_packages = install_packages =
{toxinidir}/tools/pip_install_editable.sh {[base]all_packages} {toxinidir}/tools/pip_install_editable.sh {[base]all_packages}
source_paths = source_paths =
@@ -54,32 +51,15 @@ source_paths =
letshelp-certbot/letshelp_certbot letshelp-certbot/letshelp_certbot
tests/lock_test.py tests/lock_test.py
[testenv:py26]
commands =
{[base]install_and_test} {[base]py26_packages}
python tests/lock_test.py
deps =
setuptools==36.8.0
wheel==0.29.0
passenv = TRAVIS
[testenv] [testenv]
commands = commands =
{[testenv:py26]commands} {[base]install_and_test} {[base]all_packages}
{[base]install_and_test} {[base]non_py26_packages} python tests/lock_test.py
setenv = setenv =
PYTHONPATH = {toxinidir} PYTHONPATH = {toxinidir}
PYTHONHASHSEED = 0 PYTHONHASHSEED = 0
passenv = passenv =
{[testenv:py26]passenv} TRAVIS
[testenv:py33]
commands =
{[testenv]commands}
deps =
wheel==0.29.0
passenv =
{[testenv]passenv}
[testenv:py27-oldest] [testenv:py27-oldest]
commands = commands =
@@ -104,7 +84,6 @@ passenv =
{[testenv]passenv} {[testenv]passenv}
[testenv:lint] [testenv:lint]
# recent versions of pylint do not support Python 2.6 (#97, #187)
basepython = python2.7 basepython = python2.7
# separating into multiple invocations disables cross package # separating into multiple invocations disables cross package
# duplicate code checking; if one of the commands fails, others will # duplicate code checking; if one of the commands fails, others will