diff --git a/tests/plugins/Dockerfile b/tests/plugins/Dockerfile new file mode 100644 index 000000000..93541408f --- /dev/null +++ b/tests/plugins/Dockerfile @@ -0,0 +1,20 @@ +# https://github.com/letsencrypt/letsencrypt/pull/431#issuecomment-103659297 +# it is more likely developers will already have ubuntu:trusty rather +# than e.g. debian:jessie and image size differences are negligible +FROM httpd +MAINTAINER Brad Warren + +RUN mkdir /var/run/apache2 && \ + ln -s /usr/local/apache2/conf/mime.types /etc/mime.types + +ENV APACHE_CONFDIR=/tmp/apache2 \ + APACHE_RUN_USER=daemon \ + APACHE_RUN_GROUP=daemon \ + APACHE_PID_FILE=/var/run/apache2/apache2.pid \ + APACHE_RUN_DIR=/var/run/apache2 \ + APACHE_LOCK_DIR=/var/lock \ + APACHE_LOG_DIR=/usr/local/apache2/logs + +COPY a2enmod.sh /usr/local/bin/ + +CMD [ "httpd-foreground" ] diff --git a/tests/plugins/a2enmod.sh b/tests/plugins/a2enmod.sh new file mode 100755 index 000000000..9c36c44cc --- /dev/null +++ b/tests/plugins/a2enmod.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# An extremely simplified version of 'a2enmod' for the httpd docker image + +enable () { + echo "LoadModule "$1"_module /usr/local/apache2/modules/mod_"$1".so" >> \ + $APACHE_CONFDIR"/modules.load" + available_base="/mods-available/"$1".conf" + available_conf=$APACHE_CONFDIR$available_base + enabled_dir=$APACHE_CONFDIR"/mods-enabled" + enabled_conf=$enabled_dir"/"$1".conf" + if [ -e "$available_conf" -a -e "$enabled_dir" -a ! -e "$enabled_conf" ] + then + ln -s "..$available_base" $enabled_conf + fi +} + +if [ $1 == "ssl" ] +then + # Enables ssl and all its dependencies + enable "setenvif" + enable "mime" + enable "socache_shmcb" + enable "ssl" +elif [ $1 == "rewrite" ] +then + enable "rewrite"; +else + exit 1; +fi diff --git a/tests/plugins/parser.py b/tests/plugins/parser.py new file mode 100644 index 000000000..5946f15be --- /dev/null +++ b/tests/plugins/parser.py @@ -0,0 +1,49 @@ +"""Module for parsing command line arguments and config files.""" +import argparse + + +DESCRIPTION = """ +Tests Let's Encrypt plugins against different web servers and configurations +using Docker images. It is assumed that Docker is already installed. + +""" + +def parse_args(): + """Returns parsed command line arguments.""" + parser = argparse.ArgumentParser(description=DESCRIPTION) + + add_args(parser) + args = parser.parse_args() + + if args.redirect: + args.names = True + args.install = True + elif args.install: + args.names = True + + return args + + +def add_args(parser): + """Adds general/program wide arguments to the group.""" + group = parser.add_argument_group("general") + group.add_argument( + "-t", "--tar", default="configs.tar.gz", + help="a gzipped tarball containing server configurations") + group.add_argument( + "-p", "--plugin", default="apache", + help="the plugin to be tested") + group.add_argument( + "-n", "--names", action="store_true", help="tests installer's domain " + "name identification") + group.add_argument( + "-a", "--auth", action="store_true", help="tests authenticators") + group.add_argument( + "-i", "--install", action="store_true", help="tests installer's " + "certificate installation (implicitly includes -d)") + group.add_argument( + "-r", "--redirect", action="store_true", help="tests installer's " + "redirecting HTTP to HTTPS (implicitly includes -di)") + group.add_argument( + "--no-simple-http-tls", action="store_true", help="do not use TLS " + "when solving SimpleHTTP challenges") diff --git a/tests/plugins/test.py b/tests/plugins/test.py new file mode 100644 index 000000000..3fe5e33a3 --- /dev/null +++ b/tests/plugins/test.py @@ -0,0 +1,13 @@ +"""Tests Let's Encrypt plugins against different server configurations.""" +import parser +import util + + +def main(): + """Main test script execution.""" + args = parser.parse_args() + + print util.setup_tmp_dir(args.tar) + +if __name__ == "__main__": + main() diff --git a/tests/plugins/util.py b/tests/plugins/util.py new file mode 100644 index 000000000..07b47cb25 --- /dev/null +++ b/tests/plugins/util.py @@ -0,0 +1,21 @@ +"""Utility functions for Let's Encrypt plugin tests.""" +import os +import tarfile +import tempfile + + +TEMP_DIRECTORY = tempfile.mkdtemp() +# Location of decompressed server root configurations +CONFIGS = os.path.join(TEMP_DIRECTORY, "configs") +SCRIPTS = os.path.join(TEMP_DIRECTORY, "scripts") + + +def setup_tmp_dir(tar_path): + """Sets up a temporary directory for this run and returns its path.""" + tar = tarfile.open(tar_path, "r:gz") + tar.extractall(os.path.join(tmp_dir, SERVER_ROOTS)) + + os.makedirs(os.path.join(tmp_dir, "mnt")) + os.makedirs(os.path.join(tmp_dir, "scripts")) + + return tmp_dir