mirror of
https://github.com/nginx-proxy/docker-letsencrypt-nginx-proxy-companion
synced 2026-11-05 07:20:19 +01:00
172 lines
8.3 KiB
Bash
Executable File
172 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
## Test for automatic location configuration.
|
|
|
|
# Set variables
|
|
test_comment='### This is a test comment'
|
|
vhost_path='/etc/nginx/vhost.d'
|
|
|
|
# Create custom location configuration file to be bind mounted
|
|
location_file="${GITHUB_WORKSPACE}/test/tests/location_config/le2.wtf"
|
|
echo "${test_comment}" > "${location_file}"
|
|
|
|
# Create le1.wtf configuration file, *.le3.wtf and test.* from inside the nginx container
|
|
docker exec "${NGINX_CONTAINER_NAME}" sh -c "echo '### This is a test comment' > /etc/nginx/vhost.d/le1.wtf"
|
|
docker exec "${NGINX_CONTAINER_NAME}" sh -c "echo '### This is a test comment' > /etc/nginx/vhost.d/\*.example.com"
|
|
docker exec "${NGINX_CONTAINER_NAME}" sh -c "echo '### This is a test comment' > /etc/nginx/vhost.d/test.\*"
|
|
|
|
# Zero the default configuration file.
|
|
docker exec "${NGINX_CONTAINER_NAME}" sh -c "echo '' > /etc/nginx/vhost.d/default"
|
|
|
|
if [[ -z ${GITHUB_ACTIONS} ]]; then
|
|
le_container_name="$(basename "${0%/*}")_$(date "+%Y-%m-%d_%H.%M.%S")"
|
|
else
|
|
le_container_name="$(basename "${0%/*}")"
|
|
fi
|
|
run_le_container "${1:?}" "${le_container_name}" "--volume ${location_file}:${vhost_path}/le2.wtf"
|
|
|
|
# Create the ${domains} array from comma separated domains in TEST_DOMAINS.
|
|
IFS=',' read -r -a domains <<< "${TEST_DOMAINS}"
|
|
|
|
# Cleanup function with EXIT trap
|
|
function cleanup {
|
|
# Cleanup the files created by this run of the test to avoid foiling following test(s).
|
|
docker exec "${le_container_name}" cleanup_test_artifacts --location-config
|
|
# Stop the LE container
|
|
docker stop "${le_container_name}" > /dev/null
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
# Check if the ACME location configuration was correctly applied (ie only once) to the target file
|
|
function check_location {
|
|
local container="${1:?}"
|
|
local path="${2:?}"
|
|
local start_comment='## Start of configuration add by letsencrypt container'
|
|
local end_comment='## End of configuration add by letsencrypt container'
|
|
|
|
if [[ "$(docker exec "${container}" grep -c "${start_comment}" "${path}")" != 1 ]]; then
|
|
return 1
|
|
elif [[ "$(docker exec "${container}" grep -c "${end_comment}" "${path}")" != 1 ]]; then
|
|
return 1
|
|
else
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# check the wildcard location enumeration function
|
|
docker exec "${le_container_name}" bash -c 'source /app/functions.sh; enumerate_wildcard_locations foo.bar.baz.com.example.com'
|
|
|
|
# default configuration file should be empty
|
|
config_path="${vhost_path}/default"
|
|
if docker exec "${le_container_name}" [ ! -s "${config_path}" ]; then
|
|
echo "${config_path} should be empty at container startup:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
# custom configuration files should only contains the test comment
|
|
for domain in "${domains[@]:0:2}" '*.example.com' 'test.*'; do
|
|
config_path="${vhost_path}/${domain}"
|
|
if check_location "${le_container_name}" "${config_path}"; then
|
|
echo "Unexpected location configuration on ${config_path} at container startup:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
elif ! docker exec "${le_container_name}" grep -q "${test_comment}" "${config_path}"; then
|
|
echo "${config_path} should have test comment at container startup:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
done
|
|
|
|
# le3.wtf configuration file should not exist
|
|
config_path="${vhost_path}/${domains[2]}"
|
|
if docker exec "${le_container_name}" [ -e "${config_path}" ]; then
|
|
echo "${config_path} should not exist at container startup :"
|
|
docker exec "${le_container_name}" ls -lh "${config_path}"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
# Add default location configuration then check
|
|
config_path="${vhost_path}/default"
|
|
docker exec "${le_container_name}" bash -c 'source /app/functions.sh; add_location_configuration'
|
|
if ! check_location "${le_container_name}" "${config_path}" ; then
|
|
echo "Unexpected location configuration on ${config_path} after call to add_location_configuration:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
# Add le1.wtf and le2.wtf location configurations then check
|
|
for domain in "${domains[@]:0:2}"; do
|
|
config_path="${vhost_path}/${domain}"
|
|
docker exec "${le_container_name}" bash -c "source /app/functions.sh; add_location_configuration ${domain}"
|
|
if ! check_location "${le_container_name}" "${config_path}" ; then
|
|
echo "Unexpected location configuration on ${config_path} after call to add_location_configuration ${domain}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
elif ! docker exec "${le_container_name}" grep -q "${test_comment}" "${config_path}"; then
|
|
echo "${config_path} should still have test comment after call to add_location_configuration ${domain}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
done
|
|
|
|
# Adding subdomain.example.com location configurations should use the *.example.com file
|
|
domain="subdomain.example.com"
|
|
config_path="${vhost_path}/*.example.com"
|
|
docker exec "${le_container_name}" bash -c "source /app/functions.sh; add_location_configuration ${domain}"
|
|
if ! check_location "${le_container_name}" "${config_path}" ; then
|
|
echo "Unexpected location configuration on ${config_path} after call to add_location_configuration ${domain}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
elif ! docker exec "${le_container_name}" grep -q "${test_comment}" "${config_path}"; then
|
|
echo "${config_path} should still have test comment after call to add_location_configuration ${domain}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
# Adding test.domain.tld location configurations should use the test.* file
|
|
domain="test.domain.tld"
|
|
config_path="${vhost_path}/test.*"
|
|
docker exec "${le_container_name}" bash -c "source /app/functions.sh; add_location_configuration ${domain}"
|
|
if ! check_location "${le_container_name}" "${config_path}" ; then
|
|
echo "Unexpected location configuration on ${config_path} after call to add_location_configuration ${domain}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
elif ! docker exec "${le_container_name}" grep -q "${test_comment}" "${config_path}"; then
|
|
echo "${config_path} should still have test comment after call to add_location_configuration ${domain}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
# Remove all location configurations
|
|
docker exec "${le_container_name}" bash -c "source /app/functions.sh; remove_all_location_configurations"
|
|
|
|
# default configuration file should be empty again
|
|
config_path="${vhost_path}/default"
|
|
if docker exec "${le_container_name}" [ ! -s "${config_path}" ]; then
|
|
echo "${config_path} should be empty after call to remove_all_location_configurations:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
# Custom configuration files should have reverted to only containing the test comment
|
|
for domain in "${domains[@]:0:2}" '*.example.com' 'test.*'; do
|
|
config_path="${vhost_path}/${domain}"
|
|
if check_location "${le_container_name}" "${config_path}"; then
|
|
echo "Unexpected location configuration on ${config_path} after call to remove_all_location_configurations:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
elif ! docker exec "${le_container_name}" grep -q "${test_comment}" "${config_path}"; then
|
|
echo "${config_path} should still have test comment after call to remove_all_location_configurations:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
done
|
|
|
|
# Should not be used by anything, but potentially matches an enumerate_wildcard_locations file glob.
|
|
docker exec "${NGINX_CONTAINER_NAME}" touch /etc/nginx/vhost.d/le3.pizza
|
|
docker exec "${le_container_name}" touch le3.pizza
|
|
|
|
# Trying to add location configuration to non existing le3.wtf should only configure default
|
|
docker exec "${le_container_name}" bash -c "source /app/functions.sh; add_location_configuration ${domains[2]}"
|
|
|
|
config_path="${vhost_path}/${domains[2]}"
|
|
if docker exec "${le_container_name}" [ -e "${config_path}" ]; then
|
|
echo "${config_path} should not exist after call to add_location_configuration ${domains[2]}:"
|
|
docker exec "${le_container_name}" ls -lh "${config_path}"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|
|
|
|
config_path="${vhost_path}/default"
|
|
if ! check_location "${le_container_name}" "${config_path}" ; then
|
|
echo "Unexpected location configuration on ${config_path} after call to add_location_configuration ${domains[2]}:"
|
|
docker exec "${le_container_name}" cat "${config_path}"
|
|
fi
|