diff --git a/modoboa_installer/config_dict_template.py b/modoboa_installer/config_dict_template.py index 933fae5..6f39dc9 100644 --- a/modoboa_installer/config_dict_template.py +++ b/modoboa_installer/config_dict_template.py @@ -16,347 +16,360 @@ def is_email(user_input): ConfigDictTemplate = [ - { - "name": "general", - "values": [ - { - "option": "hostname", - "default": "mail.%(domain)s", - } - ] - }, - { - "name": "certificate", - "values": [ - { - "option": "generate", - "default": "true", - }, - { - "option": "type", - "default": "self-signed", - "customizable": True, - "question": "Please choose your certificate type", - "values": ["self-signed", "letsencrypt"], - } - ], - }, - { - "name": "letsencrypt", - "if": "certificate.type=letsencrypt", - "values": [ - { - "option": "email", - "default": "admin@example.com", - "question": ( - "Please enter the mail you wish to use for " - "letsencrypt"), - "customizable": True, - "validators": [is_email] - } - ] - }, - { - "name": "database", - "values": [ - { - "option": "engine", - "default": "postgres", - "customizable": True, - "question": "Please choose your database engine", - "values": ["postgres", "mysql"], - }, - { - "option": "host", - "default": "127.0.0.1", - }, - { - "option": "install", - "default": "true", - } - ] - }, - { - "name": "postgres", - "if": "database.engine=postgres", - "values": [ - { - "option": "user", - "default": "postgres", - }, - { - "option": "password", - "default": "", - "customizable": True, - "question": "Please enter postgres password", - }, - ] - }, - { - "name": "mysql", - "if": "database.engine=mysql", - "values": [ - { - "option": "user", - "default": "root", - }, - { - "option": "password", - "default": make_password, - "customizable": True, - "question": "Please enter mysql root password" - }, - { - "option": "charset", - "default": "utf8", - }, - { - "option": "collation", - "default": "utf8_general_ci", - } - ] - }, - { - "name": "modoboa", - "values": [ - { - "option": "user", - "default": "modoboa", - }, - { - "option": "home_dir", - "default": "/srv/modoboa", - }, - { - "option": "venv_path", - "default": "%(home_dir)s/env", - }, - { - "option": "instance_path", - "default": "%(home_dir)s/instance", - }, - { - "option": "timezone", - "default": "Europe/Paris", - }, - { - "option": "dbname", - "default": "modoboa", - }, - { - "option": "dbuser", - "default": "modoboa", - }, - { - "option": "dbpassword", - "default": make_password, - "customizable": True, - "question": "Please enter Modoboa db password", - }, - { - "option": "extensions", - "default": ( - "modoboa-amavis modoboa-pdfcredentials " - "modoboa-postfix-autoreply modoboa-sievefilters " - "modoboa-stats modoboa-webmail modoboa-contacts"), - }, - { - "option": "devmode", - "default": "false", - }, - ] - }, - { - "name": "automx", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "user", - "default": "automx", - }, - { - "option": "config_dir", - "default": "/etc", - }, - { - "option": "home_dir", - "default": "/srv/automx", - }, - { - "option": "venv_path", - "default": "%(home_dir)s/env", - }, - { - "option": "instance_path", - "default": "%(home_dir)s/instance", - }, - ] - }, - { - "name": "amavis", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "user", - "default": "amavis", - }, - { - "option": "max_servers", - "default": "1", - }, - { - "option": "dbname", - "default": "amavis", - }, - { - "option": "dbuser", - "default": "amavis", - }, - { - "option": "dbpassword", - "default": make_password, - "customizable": True, - "question": "Please enter amavis db password" - }, - ], - }, - { - "name": "clamav", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "user", - "default": "clamav", - }, - ] - }, - { - "name": "dovecot", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "config_dir", - "default": "/etc/dovecot", - }, - { - "option": "user", - "default": "vmail", - }, - { - "option": "home_dir", - "default": "/srv/vmail", - }, - { - "option": "mailboxes_owner", - "default": "vmail", - }, - { - "option": "extra_protocols", - "default": "", - }, - { - "option": "postmaster_address", - "default": "postmaster@%(domain)s", - }, - ] - }, - { - "name": "nginx", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "config_dir", - "default": "/etc/nginx", - }, - ], - }, - { - "name": "razor", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "config_dir", - "default": "/etc/razor", - }, - ] - }, - { - "name": "postfix", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "config_dir", - "default": "/etc/postfix", - }, - { - "option": "message_size_limit", - "default": "11534336", - }, - ] - }, - { - "name": "spamassassin", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "config_dir", - "default": "/etc/mail/spamassassin", - }, - { - "option": "dbname", - "default": "spamassassin", - }, - { - "option": "dbuser", - "default": "spamassassin", - }, - { - "option": "dbpassword", - "default": make_password, - "customizable": True, - "question": "Please enter spamassassin db password" - }, - ] - }, - { - "name": "uwsgi", - "values": [ - { - "option": "enabled", - "default": "true", - }, - { - "option": "config_dir", - "default": "/etc/uwsgi", - }, - { - "option": "nb_processes", - "default": "2", - }, - ] - }, + { + "name": "general", + "values": [ + { + "option": "hostname", + "default": "mail.%(domain)s", + } + ] + }, + { + "name": "certificate", + "values": [ + { + "option": "generate", + "default": "true", + }, + { + "option": "type", + "default": "self-signed", + "customizable": True, + "question": "Please choose your certificate type", + "values": ["self-signed", "letsencrypt"], + } + ], + }, + { + "name": "letsencrypt", + "if": "certificate.type=letsencrypt", + "values": [ + { + "option": "email", + "default": "admin@example.com", + "question": ( + "Please enter the mail you wish to use for " + "letsencrypt"), + "customizable": True, + "validators": [is_email] + } + ] + }, + { + "name": "database", + "values": [ + { + "option": "engine", + "default": "postgres", + "customizable": True, + "question": "Please choose your database engine", + "values": ["postgres", "mysql"], + }, + { + "option": "host", + "default": "127.0.0.1", + }, + { + "option": "install", + "default": "true", + } + ] + }, + { + "name": "postgres", + "if": "database.engine=postgres", + "values": [ + { + "option": "user", + "default": "postgres", + }, + { + "option": "password", + "default": "", + "customizable": True, + "question": "Please enter postgres password", + }, + ] + }, + { + "name": "mysql", + "if": "database.engine=mysql", + "values": [ + { + "option": "user", + "default": "root", + }, + { + "option": "password", + "default": make_password, + "customizable": True, + "question": "Please enter mysql root password" + }, + { + "option": "charset", + "default": "utf8", + }, + { + "option": "collation", + "default": "utf8_general_ci", + } + ] + }, + { + "name": "modoboa", + "values": [ + { + "option": "user", + "default": "modoboa", + }, + { + "option": "home_dir", + "default": "/srv/modoboa", + }, + { + "option": "venv_path", + "default": "%(home_dir)s/env", + }, + { + "option": "instance_path", + "default": "%(home_dir)s/instance", + }, + { + "option": "timezone", + "default": "Europe/Paris", + }, + { + "option": "dbname", + "default": "modoboa", + }, + { + "option": "dbuser", + "default": "modoboa", + }, + { + "option": "dbpassword", + "default": make_password, + "customizable": True, + "question": "Please enter Modoboa db password", + }, + { + "option": "extensions", + "default": ( + "modoboa-amavis modoboa-pdfcredentials " + "modoboa-postfix-autoreply modoboa-sievefilters " + "modoboa-stats modoboa-webmail modoboa-contacts"), + }, + { + "option": "devmode", + "default": "false", + }, + ] + }, + { + "name": "automx", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "user", + "default": "automx", + }, + { + "option": "config_dir", + "default": "/etc", + }, + { + "option": "home_dir", + "default": "/srv/automx", + }, + { + "option": "venv_path", + "default": "%(home_dir)s/env", + }, + { + "option": "instance_path", + "default": "%(home_dir)s/instance", + }, + ] + }, + { + "name": "amavis", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "user", + "default": "amavis", + }, + { + "option": "max_servers", + "default": "1", + }, + { + "option": "dbname", + "default": "amavis", + }, + { + "option": "dbuser", + "default": "amavis", + }, + { + "option": "dbpassword", + "default": make_password, + "customizable": True, + "question": "Please enter amavis db password" + }, + ], + }, + { + "name": "clamav", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "user", + "default": "clamav", + }, + ] + }, + { + "name": "dovecot", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc/dovecot", + }, + { + "option": "user", + "default": "vmail", + }, + { + "option": "home_dir", + "default": "/srv/vmail", + }, + { + "option": "mailboxes_owner", + "default": "vmail", + }, + { + "option": "extra_protocols", + "default": "", + }, + { + "option": "postmaster_address", + "default": "postmaster@%(domain)s", + }, + ] + }, + { + "name": "nginx", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc/nginx", + }, + ], + }, + { + "name": "razor", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc/razor", + }, + ] + }, + { + "name": "postfix", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc/postfix", + }, + { + "option": "message_size_limit", + "default": "11534336", + }, + ] + }, + { + "name": "postwhite", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc", + }, + ] + }, + { + "name": "spamassassin", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc/mail/spamassassin", + }, + { + "option": "dbname", + "default": "spamassassin", + }, + { + "option": "dbuser", + "default": "spamassassin", + }, + { + "option": "dbpassword", + "default": make_password, + "customizable": True, + "question": "Please enter spamassassin db password" + }, + ] + }, + { + "name": "uwsgi", + "values": [ + { + "option": "enabled", + "default": "true", + }, + { + "option": "config_dir", + "default": "/etc/uwsgi", + }, + { + "option": "nb_processes", + "default": "2", + }, + ] + }, ] diff --git a/modoboa_installer/scripts/base.py b/modoboa_installer/scripts/base.py index 7fdb89a..0b897fb 100644 --- a/modoboa_installer/scripts/base.py +++ b/modoboa_installer/scripts/base.py @@ -14,7 +14,7 @@ class Installer(object): appname = None no_daemon = False daemon_name = None - packages = [] + packages = {} with_user = False with_db = False config_files = [] @@ -97,7 +97,7 @@ class Installer(object): def get_packages(self): """Return the list of packages to install.""" - return self.packages[package.backend.FORMAT] + return self.packages.get(package.backend.FORMAT, {}) def install_packages(self): """Install required packages.""" diff --git a/modoboa_installer/scripts/files/postfix/main.cf.tpl b/modoboa_installer/scripts/files/postfix/main.cf.tpl index fc87268..174a654 100644 --- a/modoboa_installer/scripts/files/postfix/main.cf.tpl +++ b/modoboa_installer/scripts/files/postfix/main.cf.tpl @@ -135,6 +135,7 @@ smtpd_recipient_restrictions = # postscreen_access_list = permit_mynetworks + cidr:/etc/postfix/postscreen_spf_whitelist.cidr postscreen_blacklist_action = enforce # Use some DNSBL diff --git a/modoboa_installer/scripts/files/postwhite/crontab.tpl b/modoboa_installer/scripts/files/postwhite/crontab.tpl new file mode 100644 index 0000000..ffc6626 --- /dev/null +++ b/modoboa_installer/scripts/files/postwhite/crontab.tpl @@ -0,0 +1,9 @@ +# +# Postwhite specific cron jobs +# + +# Update Postscreen Whitelists +@daily root /usr/local/bin/postwhite/postwhite > /dev/null 2>&1 + +# Update Yahoo! IPs for Postscreen Whitelists +@weekly root /usr/local/bin/postwhite/scrape_yahoo > /dev/null 2>&1 diff --git a/modoboa_installer/scripts/postfix.py b/modoboa_installer/scripts/postfix.py index 4271ce9..5c95c84 100644 --- a/modoboa_installer/scripts/postfix.py +++ b/modoboa_installer/scripts/postfix.py @@ -10,6 +10,7 @@ from .. import package from .. import utils from . import base +from . import install class Postfix(base.Installer): @@ -92,3 +93,6 @@ class Postfix(base.Installer): aliases_file = "/etc/aliases" if os.path.exists(aliases_file): utils.exec_cmd("postalias {}".format(aliases_file)) + + # Postwhite + install("postwhite", self.config) diff --git a/modoboa_installer/scripts/postwhite.py b/modoboa_installer/scripts/postwhite.py new file mode 100644 index 0000000..239d2d3 --- /dev/null +++ b/modoboa_installer/scripts/postwhite.py @@ -0,0 +1,51 @@ +"""postwhite related functions.""" + +import os +import shutil + +from .. import utils + +from . import base + +POSTWHITE_REPOSITORY = "https://github.com/stevejenkins/postwhite" +SPF_TOOLS_REPOSITORY = "https://github.com/jsarenik/spf-tools" + + +class Postwhite(base.Installer): + """Postwhite installer.""" + + appname = "postwhite" + config_files = [ + "crontab=/etc/cron.d/postwhite", + ] + no_daemon = True + packages = { + "rpm": ["bind-utils"] + } + + def install_from_archive(self, repository, target_dir): + """Install from an archive.""" + url = "{}/archive/master.zip".format(repository) + target = os.path.join(target_dir, os.path.basename(url)) + if os.path.exists(target): + os.unlink(target) + utils.exec_cmd("wget {}".format(url), cwd=target_dir) + app_name = os.path.basename(repository) + archive_dir = os.path.join(target_dir, app_name) + if os.path.exists(archive_dir): + shutil.rmtree(archive_dir) + utils.exec_cmd("unzip master.zip", cwd=target_dir) + utils.exec_cmd( + "mv {name}-master {name}".format(name=app_name), cwd=target_dir) + os.unlink(target) + return archive_dir + + def post_run(self): + """Additionnal tasks.""" + install_dir = "/usr/local/bin" + self.install_from_archive(SPF_TOOLS_REPOSITORY, install_dir) + postw_dir = self.install_from_archive( + POSTWHITE_REPOSITORY, install_dir) + utils.copy_file(os.path.join(postw_dir, "postwhite.conf"), "/etc") + postw_bin = os.path.join(postw_dir, "postwhite") + utils.exec_cmd("{} /etc/postwhite.conf".format(postw_bin)) diff --git a/tests.py b/tests.py index 7b86310..67068bd 100644 --- a/tests.py +++ b/tests.py @@ -87,7 +87,7 @@ class ConfigFileTestCase(unittest.TestCase): self.assertTrue(os.path.exists(self.cfgfile)) self.assertIn( "modoboa automx amavis clamav dovecot nginx razor postfix" - " spamassassin uwsgi", + " postwhite spamassassin uwsgi", out.getvalue() )