Esempio n. 1
0
    def _get_runtime_cfg(self):  # pylint: disable=no-self-use
        """Get runtime configuration info.

        :returns: stdout from DUMP_RUN_CFG

        """
        try:
            proc = subprocess.Popen(constants.os_constant("define_cmd"), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout, stderr = proc.communicate()

        except (OSError, ValueError):
            logger.error(
                "Error running command %s for runtime parameters!%s", constants.os_constant("define_cmd"), os.linesep
            )
            raise errors.MisconfigurationError(
                "Error accessing loaded Apache parameters: %s", constants.os_constant("define_cmd")
            )
        # Small errors that do not impede
        if proc.returncode != 0:
            logger.warn("Error in checking parameter list: %s", stderr)
            raise errors.MisconfigurationError(
                "Apache is unable to check whether or not the module is " "loaded because Apache is misconfigured."
            )

        return stdout
Esempio n. 2
0
    def _get_runtime_cfg(self):  # pylint: disable=no-self-use
        """Get runtime configuration info.

        :returns: stdout from DUMP_RUN_CFG

        """
        try:
            proc = subprocess.Popen(constants.os_constant("define_cmd"),
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE)
            stdout, stderr = proc.communicate()

        except (OSError, ValueError):
            logger.error("Error running command %s for runtime parameters!%s",
                         constants.os_constant("define_cmd"), os.linesep)
            raise errors.MisconfigurationError(
                "Error accessing loaded Apache parameters: %s",
                constants.os_constant("define_cmd"))
        # Small errors that do not impede
        if proc.returncode != 0:
            logger.warn("Error in checking parameter list: %s", stderr)
            raise errors.MisconfigurationError(
                "Apache is unable to check whether or not the module is "
                "loaded because Apache is misconfigured.")

        return stdout
Esempio n. 3
0
    def setUp(
        self,
        test_dir="debian_apache_2_4/multiple_vhosts",
        config_root="debian_apache_2_4/multiple_vhosts/apache2",
        vhost_root="debian_apache_2_4/multiple_vhosts/apache2/sites-available"
    ):
        # pylint: disable=arguments-differ
        super(ApacheTest, self).setUp()

        self.temp_dir, self.config_dir, self.work_dir = common.dir_setup(
            test_dir=test_dir, pkg="letsencrypt_apache.tests")

        self.ssl_options = common.setup_ssl_options(
            self.config_dir, constants.os_constant("MOD_SSL_CONF_SRC"),
            constants.MOD_SSL_CONF_DEST)

        self.config_path = os.path.join(self.temp_dir, config_root)
        self.vhost_path = os.path.join(self.temp_dir, vhost_root)

        self.rsa512jwk = jose.JWKRSA.load(
            test_util.load_vector("rsa512_key.pem"))

        # Make sure all vhosts in sites-enabled are symlinks (Python packaging
        # does not preserve symlinks)
        sites_enabled = os.path.join(self.config_path, "sites-enabled")
        if not os.path.exists(sites_enabled):
            return

        for vhost_basename in os.listdir(sites_enabled):
            vhost = os.path.join(sites_enabled, vhost_basename)
            if not os.path.islink(vhost):  # pragma: no cover
                os.remove(vhost)
                target = os.path.join(os.path.pardir, "sites-available",
                                      vhost_basename)
                os.symlink(target, vhost)
Esempio n. 4
0
    def setUp(self, test_dir="debian_apache_2_4/multiple_vhosts",
              config_root="debian_apache_2_4/multiple_vhosts/apache2",
              vhost_root="debian_apache_2_4/multiple_vhosts/apache2/sites-available"):
        # pylint: disable=arguments-differ
        super(ApacheTest, self).setUp()

        self.temp_dir, self.config_dir, self.work_dir = common.dir_setup(
            test_dir=test_dir,
            pkg="letsencrypt_apache.tests")

        self.ssl_options = common.setup_ssl_options(
            self.config_dir, constants.os_constant("MOD_SSL_CONF_SRC"),
            constants.MOD_SSL_CONF_DEST)

        self.config_path = os.path.join(self.temp_dir, config_root)
        self.vhost_path = os.path.join(self.temp_dir, vhost_root)

        self.rsa512jwk = jose.JWKRSA.load(test_util.load_vector(
            "rsa512_key.pem"))

        # Make sure all vhosts in sites-enabled are symlinks (Python packaging
        # does not preserve symlinks)
        sites_enabled = os.path.join(self.config_path, "sites-enabled")
        if not os.path.exists(sites_enabled):
            return

        for vhost_basename in os.listdir(sites_enabled):
            vhost = os.path.join(sites_enabled, vhost_basename)
            if not os.path.islink(vhost):  # pragma: no cover
                os.remove(vhost)
                target = os.path.join(
                    os.path.pardir, "sites-available", vhost_basename)
                os.symlink(target, vhost)
Esempio n. 5
0
def get_apache_configurator(config_path, vhost_path, config_dir, work_dir, version=(2, 4, 7), conf=None):
    """Create an Apache Configurator with the specified options.

    :param conf: Function that returns binary paths. self.conf in Configurator

    """
    backups = os.path.join(work_dir, "backups")
    mock_le_config = mock.MagicMock(
        apache_server_root=config_path,
        apache_vhost_root=vhost_path,
        apache_le_vhost_ext=constants.os_constant("le_vhost_ext"),
        apache_challenge_location=config_path,
        backup_dir=backups,
        config_dir=config_dir,
        temp_checkpoint_dir=os.path.join(work_dir, "temp_checkpoints"),
        in_progress_dir=os.path.join(backups, "IN_PROGRESS"),
        work_dir=work_dir,
    )

    with mock.patch("letsencrypt_apache.configurator.le_util.run_script"):
        with mock.patch("letsencrypt_apache.configurator.le_util." "exe_exists") as mock_exe_exists:
            mock_exe_exists.return_value = True
            with mock.patch("letsencrypt_apache.parser.ApacheParser." "update_runtime_variables"):
                config = configurator.ApacheConfigurator(config=mock_le_config, name="apache", version=version)
                # This allows testing scripts to set it a bit more quickly
                if conf is not None:
                    config.conf = conf  # pragma: no cover

                config.prepare()

    return config
Esempio n. 6
0
    def __init__(self, aug, root, vhostroot, version=(2, 4)):
        # Note: Order is important here.

        # This uses the binary, so it can be done first.
        # https://httpd.apache.org/docs/2.4/mod/core.html#define
        # https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine
        # This only handles invocation parameters and Define directives!
        self.parser_paths = {}
        self.variables = {}
        if version >= (2, 4):
            self.update_runtime_variables()

        self.aug = aug
        # Find configuration root and make sure augeas can parse it.
        self.root = os.path.abspath(root)
        self.loc = {"root": self._find_config_root()}
        self._parse_file(self.loc["root"])

        self.vhostroot = os.path.abspath(vhostroot)

        # This problem has been fixed in Augeas 1.0
        self.standardize_excl()

        # Temporarily set modules to be empty, so that find_dirs can work
        # https://httpd.apache.org/docs/2.4/mod/core.html#ifmodule
        # This needs to come before locations are set.
        self.modules = set()
        self.init_modules()

        # Set up rest of locations
        self.loc.update(self._set_locations())

        # Must also attempt to parse virtual host root
        self._parse_file(self.vhostroot + "/" +
                         constants.os_constant("vhost_files"))

        # check to see if there were unparsed define statements
        if version < (2, 4):
            if self.find_dir("Define", exclude=False):
                raise errors.PluginError("Error parsing runtime variables")
Esempio n. 7
0
    def __init__(self, aug, root, vhostroot, version=(2, 4)):
        # Note: Order is important here.

        # This uses the binary, so it can be done first.
        # https://httpd.apache.org/docs/2.4/mod/core.html#define
        # https://httpd.apache.org/docs/2.4/mod/core.html#ifdefine
        # This only handles invocation parameters and Define directives!
        self.parser_paths = {}
        self.variables = {}
        if version >= (2, 4):
            self.update_runtime_variables()

        self.aug = aug
        # Find configuration root and make sure augeas can parse it.
        self.root = os.path.abspath(root)
        self.loc = {"root": self._find_config_root()}
        self._parse_file(self.loc["root"])

        self.vhostroot = os.path.abspath(vhostroot)

        # This problem has been fixed in Augeas 1.0
        self.standardize_excl()

        # Temporarily set modules to be empty, so that find_dirs can work
        # https://httpd.apache.org/docs/2.4/mod/core.html#ifmodule
        # This needs to come before locations are set.
        self.modules = set()
        self.init_modules()

        # Set up rest of locations
        self.loc.update(self._set_locations())

        # Must also attempt to parse virtual host root
        self._parse_file(self.vhostroot + "/" +
                         constants.os_constant("vhost_files"))

        # check to see if there were unparsed define statements
        if version < (2, 4):
            if self.find_dir("Define", exclude=False):
                raise errors.PluginError("Error parsing runtime variables")
Esempio n. 8
0
def get_apache_configurator(config_path,
                            vhost_path,
                            config_dir,
                            work_dir,
                            version=(2, 4, 7),
                            conf=None):
    """Create an Apache Configurator with the specified options.

    :param conf: Function that returns binary paths. self.conf in Configurator

    """
    backups = os.path.join(work_dir, "backups")
    mock_le_config = mock.MagicMock(
        apache_server_root=config_path,
        apache_vhost_root=vhost_path,
        apache_le_vhost_ext=constants.os_constant("le_vhost_ext"),
        apache_challenge_location=config_path,
        backup_dir=backups,
        config_dir=config_dir,
        temp_checkpoint_dir=os.path.join(work_dir, "temp_checkpoints"),
        in_progress_dir=os.path.join(backups, "IN_PROGRESS"),
        work_dir=work_dir)

    with mock.patch("letsencrypt_apache.configurator.le_util.run_script"):
        with mock.patch("letsencrypt_apache.configurator.le_util."
                        "exe_exists") as mock_exe_exists:
            mock_exe_exists.return_value = True
            with mock.patch("letsencrypt_apache.parser.ApacheParser."
                            "update_runtime_variables"):
                config = configurator.ApacheConfigurator(config=mock_le_config,
                                                         name="apache",
                                                         version=version)
                # This allows testing scripts to set it a bit more quickly
                if conf is not None:
                    config.conf = conf  # pragma: no cover

                config.prepare()

    return config
Esempio n. 9
0
 def test_get_debian_value(self, os_info):
     os_info.return_value = ('Debian', '', '')
     self.assertEqual(constants.os_constant("vhost_root"),
                      "/etc/apache2/sites-available")
Esempio n. 10
0
 def test_get_default_value(self, os_info):
     os_info.return_value = ('Nonexistent Linux', '', '')
     self.assertEqual(constants.os_constant("vhost_root"),
                      "/etc/apache2/sites-available")
Esempio n. 11
0
 def test_get_default_value(self, os_info):
     os_info.return_value = ('Nonexistent Linux', '', '')
     self.assertEqual(constants.os_constant("ctl"), "apache2ctl")
Esempio n. 12
0
 def test_get_centos_value(self, os_info):
     os_info.return_value = ('CentOS Linux', '', '')
     self.assertEqual(constants.os_constant("ctl"), "apachectl")
Esempio n. 13
0
 def test_get_debian_value(self, os_info):
     os_info.return_value = ('Debian', '', '')
     self.assertEqual(constants.os_constant("ctl"), "apache2ctl")
Esempio n. 14
0
 def test_get_default_value(self, os_info):
     os_info.return_value = ('Nonexistent Linux', '', '')
     self.assertEqual(constants.os_constant("vhost_root"),
                      "/etc/apache2/sites-available")
Esempio n. 15
0
 def test_get_centos_value(self, os_info):
     os_info.return_value = ('CentOS Linux', '', '')
     self.assertEqual(constants.os_constant("vhost_root"),
                      "/etc/httpd/conf.d")
Esempio n. 16
0
 def test_get_debian_value(self, os_info):
     os_info.return_value = ("Debian", "", "")
     self.assertEqual(constants.os_constant("ctl"), "apache2ctl")
Esempio n. 17
0
 def test_get_default_value(self, os_info):
     os_info.return_value = ("Nonexistent Linux", "", "")
     self.assertEqual(constants.os_constant("ctl"), "apache2ctl")
Esempio n. 18
0
 def test_get_centos_value(self, os_info):
     os_info.return_value = ("CentOS Linux", "", "")
     self.assertEqual(constants.os_constant("ctl"), "apachectl")
Esempio n. 19
0
 def test_get_centos_value(self, os_info):
     os_info.return_value = ('CentOS Linux', '', '')
     self.assertEqual(constants.os_constant("vhost_root"),
                      "/etc/httpd/conf.d")
Esempio n. 20
0
 def test_get_debian_value(self, os_info):
     os_info.return_value = ('Debian', '', '')
     self.assertEqual(constants.os_constant("vhost_root"),
                      "/etc/apache2/sites-available")