예제 #1
0
    def enable_site(self, vhost):
        """Enables an available site, Apache restart required.

        .. note:: Does not make sure that the site correctly works or that all
                  modules are enabled appropriately.

        .. todo:: This function should number subdomains before the domain vhost

        .. todo:: Make sure link is not broken...

        :param vhost: vhost to enable
        :type vhost: :class:`~letsencrypt_apache.obj.VirtualHost`

        :raises .errors.NotSupportedError: If filesystem layout is not
            supported.

        """
        if self.is_site_enabled(vhost.filep):
            return

        if "/sites-available/" in vhost.filep:
            enabled_path = ("%s/sites-enabled/%s" %
                            (self.parser.root, os.path.basename(vhost.filep)))
            self.reverter.register_file_creation(False, enabled_path)
            os.symlink(vhost.filep, enabled_path)
            vhost.enabled = True
            logger.info("Enabling available site: %s", vhost.filep)
            self.save_notes += "Enabled site %s\n" % vhost.filep
        else:
            raise errors.NotSupportedError(
                "Unsupported filesystem layout. "
                "sites-available/enabled expected.")
예제 #2
0
    def prepare(self):
        """Prepare the authenticator/installer.

        :raises .errors.NoInstallationError: If Apache configs cannot be found
        :raises .errors.MisconfigurationError: If Apache is misconfigured
        :raises .errors.NotSupportedError: If Apache version is not supported
        :raises .errors.PluginError: If there is any other error

        """
        # Verify Apache is installed
        for exe in (self.conf("ctl"), self.conf("enmod"),
                    self.conf("dismod"), self.conf("init-script")):
            if not le_util.exe_exists(exe):
                raise errors.NoInstallationError

        # Make sure configuration is valid
        self.config_test()

        self.parser = parser.ApacheParser(
            self.aug, self.conf("server-root"), self.conf("ctl"))
        # Check for errors in parsing files with Augeas
        self.check_parsing_errors("httpd.aug")

        # Set Version
        if self.version is None:
            self.version = self.get_version()
        if self.version < (2, 2):
            raise errors.NotSupportedError(
                "Apache Version %s not supported.", str(self.version))

        # Get all of the available vhosts
        self.vhosts = self.get_virtual_hosts()

        temp_install(self.mod_ssl_conf)
예제 #3
0
    def enable_mod(self, mod_name, temp=False):
        """Enables module in Apache.

        Both enables and restarts Apache so module is active.

        :param str mod_name: Name of the module to enable. (e.g. 'ssl')
        :param bool temp: Whether or not this is a temporary action.

        :raises .errors.NotSupportedError: If the filesystem layout is not
            supported.
        :raises .errors.MisconfigurationError: If a2enmod or a2dismod cannot be
            run.

        """
        # Support Debian specific setup
        if (not os.path.isdir(os.path.join(self.parser.root, "mods-available"))
                or not os.path.isdir(
                    os.path.join(self.parser.root, "mods-enabled"))):
            raise errors.NotSupportedError(
                "Unsupported directory layout. You may try to enable mod %s "
                "and try again." % mod_name)

        self._enable_mod_debian(mod_name, temp)
        self.save_notes += "Enabled %s module in Apache" % mod_name
        logger.debug("Enabled Apache %s module", mod_name)

        # Modules can enable additional config files. Variables may be defined
        # within these new configuration sections.
        # Restart is not necessary as DUMP_RUN_CFG uses latest config.
        self.parser.update_runtime_variables(self.conf("ctl"))

        self.parser.modules.add(mod_name + "_module")
        self.parser.modules.add("mod_" + mod_name + ".c")
예제 #4
0
 def check_version(self):
     """Check Plesk installed and version is supported"""
     if self.secret_key:
         return
     version = os.path.join(self.PSA_PATH, "version")
     if not os.path.exists(version):
         raise errors.NoInstallationError('Plesk is not installed')
     with open(version, 'r') as f:
         version_data = f.read()
         major, _ = version_data.split('.', 1)
         if int(major) < 12:
             raise errors.NotSupportedError(
                 'Plesk version is not supported: %s' % version_data)
예제 #5
0
    def get_version(self):
        """Return version of Nginx Server.

        Version is returned as tuple. (ie. 2.4.7 = (2, 4, 7))

        :returns: version
        :rtype: tuple

        :raises .PluginError:
            Unable to find Nginx version or version is unsupported

        """
        try:
            proc = subprocess.Popen(
                [self.conf('ctl'), "-c", self.nginx_conf, "-V"],
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE)
            text = proc.communicate()[1]  # nginx prints output to stderr
        except (OSError, ValueError) as error:
            logging.debug(error, exc_info=True)
            raise errors.PluginError(
                "Unable to run %s -V" % self.conf('ctl'))

        version_regex = re.compile(r"nginx/([0-9\.]*)", re.IGNORECASE)
        version_matches = version_regex.findall(text)

        sni_regex = re.compile(r"TLS SNI support enabled", re.IGNORECASE)
        sni_matches = sni_regex.findall(text)

        ssl_regex = re.compile(r" --with-http_ssl_module")
        ssl_matches = ssl_regex.findall(text)

        if not version_matches:
            raise errors.PluginError("Unable to find Nginx version")
        if not ssl_matches:
            raise errors.PluginError(
                "Nginx build is missing SSL module (--with-http_ssl_module).")
        if not sni_matches:
            raise errors.PluginError("Nginx build doesn't support SNI")

        nginx_version = tuple([int(i) for i in version_matches[0].split(".")])

        # nginx < 0.8.48 uses machine hostname as default server_name instead of
        # the empty string
        if nginx_version < (0, 8, 48):
            raise errors.NotSupportedError("Nginx version must be 0.8.48+")

        return nginx_version
예제 #6
0
    def enable_mod(self, mod_name, temp=False):
        """Enables module in Apache.

        Both enables and restarts Apache so module is active.

        :param str mod_name: Name of the module to enable. (e.g. 'ssl')
        :param bool temp: Whether or not this is a temporary action.

        :raises .errors.NotSupportedError: If the filesystem layout is not
            supported.
        :raises .errors.MisconfigurationError: If a2enmod or a2dismod cannot be
            run.

        """
        # Support Debian specific setup
        avail_path = os.path.join(self.parser.root, "mods-available")
        enabled_path = os.path.join(self.parser.root, "mods-enabled")
        if not os.path.isdir(avail_path) or not os.path.isdir(enabled_path):
            raise errors.NotSupportedError(
                "Unsupported directory layout. You may try to enable mod %s "
                "and try again." % mod_name)

        deps = _get_mod_deps(mod_name)

        # Enable all dependencies
        for dep in deps:
            if (dep + "_module") not in self.parser.modules:
                self._enable_mod_debian(dep, temp)
                self._add_parser_mod(dep)

                note = "Enabled dependency of %s module - %s" % (mod_name, dep)
                if not temp:
                    self.save_notes += note + os.linesep
                logger.debug(note)

        # Enable actual module
        self._enable_mod_debian(mod_name, temp)
        self._add_parser_mod(mod_name)

        if not temp:
            self.save_notes += "Enabled %s module in Apache\n" % mod_name
        logger.info("Enabled Apache %s module", mod_name)

        # Modules can enable additional config files. Variables may be defined
        # within these new configuration sections.
        # Restart is not necessary as DUMP_RUN_CFG uses latest config.
        self.parser.update_runtime_variables(self.conf("ctl"))
예제 #7
0
 def view_config_changes():
     """No ability to preview configs generated by Plesk."""
     raise errors.NotSupportedError(
         'No ability to preview configs generated by Plesk')
예제 #8
0
 def enhance(unused_domain, unused_enhancement, unused_options=None):
     """No enhancements are supported now."""
     raise errors.NotSupportedError('No enhancements are supported now.')
예제 #9
0
 def rollback_checkpoints(unused_rollback=1):
     """Revert deployer state to the previous."""
     raise errors.NotSupportedError()