mirror of
https://github.com/certbot/certbot.git
synced 2026-05-28 04:34:11 -04:00
* Revert change to NamespaceConfig's constructor NamespaceConfig's argument sources dict is now set with a method, and raises a runtime error if one isn't set when set_by_user() is called. * Actually update CHANGELOG to reflect the set_by_user changes * linter appeasement * configuration: update docs, add test This test ensures that calling `set_by_user` without an initialized sources dict raises a RuntimeError.
89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
"""Provides a common base for Nginx proxies"""
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
from typing import Set
|
|
from typing import Tuple
|
|
|
|
from certbot import configuration
|
|
from certbot_compatibility_test import errors
|
|
from certbot_compatibility_test import util
|
|
from certbot_compatibility_test.configurators import common as configurators_common
|
|
from certbot_nginx._internal import configurator
|
|
from certbot_nginx._internal import constants
|
|
|
|
|
|
class Proxy(configurators_common.Proxy):
|
|
"""A common base for Nginx test configurators"""
|
|
|
|
def load_config(self) -> str:
|
|
"""Loads the next configuration for the plugin to test"""
|
|
config = super().load_config()
|
|
self._all_names, self._test_names = _get_names(config)
|
|
|
|
server_root = _get_server_root(config)
|
|
|
|
# XXX: Deleting all of this is kind of scary unless the test
|
|
# instances really each have a complete configuration!
|
|
shutil.rmtree("/etc/nginx")
|
|
shutil.copytree(server_root, "/etc/nginx", symlinks=True)
|
|
|
|
self._prepare_configurator()
|
|
|
|
try:
|
|
subprocess.check_call("service nginx reload".split())
|
|
except errors.Error:
|
|
raise errors.Error(
|
|
"Nginx failed to load {0} before tests started".format(
|
|
config))
|
|
|
|
return config
|
|
|
|
def _prepare_configurator(self) -> None:
|
|
"""Prepares the Nginx plugin for testing"""
|
|
for k in constants.CLI_DEFAULTS:
|
|
setattr(self.le_config, "nginx_" + k, constants.os_constant(k))
|
|
|
|
conf = configuration.NamespaceConfig(self.le_config)
|
|
self._configurator = configurator.NginxConfigurator(config=conf, name="nginx")
|
|
self._configurator.prepare()
|
|
|
|
def cleanup_from_tests(self) -> None:
|
|
"""Performs any necessary cleanup from running plugin tests"""
|
|
|
|
|
|
def _get_server_root(config: str) -> str:
|
|
"""Returns the server root directory in config"""
|
|
subdirs = [
|
|
name for name in os.listdir(config)
|
|
if os.path.isdir(os.path.join(config, name))]
|
|
|
|
if len(subdirs) != 1:
|
|
raise errors.Error("Malformed configuration directory {0}".format(config))
|
|
|
|
return os.path.join(config, subdirs[0].rstrip())
|
|
|
|
|
|
def _get_names(config: str) -> Tuple[Set[str], Set[str]]:
|
|
"""Returns all and testable domain names in config"""
|
|
all_names: Set[str] = set()
|
|
for root, _dirs, files in os.walk(config):
|
|
for this_file in files:
|
|
update_names = _get_server_names(root, this_file)
|
|
all_names.update(update_names)
|
|
non_ip_names = {n for n in all_names if not util.IP_REGEX.match(n)}
|
|
return all_names, non_ip_names
|
|
|
|
|
|
def _get_server_names(root: str, filename: str) -> Set[str]:
|
|
"""Returns all names in a config file path"""
|
|
all_names = set()
|
|
with open(os.path.join(root, filename)) as f:
|
|
for line in f:
|
|
if line.strip().startswith("server_name"):
|
|
names = line.partition("server_name")[2].rpartition(";")[0]
|
|
for n in names.split():
|
|
# Filter out wildcards in both all_names and test_names
|
|
if not n.startswith("*."):
|
|
all_names.add(n)
|
|
return all_names
|