Added postwhite support. (#171)

* Added postwhite support.

see #109

* Fixed unit test.
This commit is contained in:
Antoine Nguyen
2017-12-07 17:42:38 +01:00
committed by GitHub
parent 2c206a52b1
commit 0ceea13d4b
7 changed files with 424 additions and 346 deletions

View File

@@ -16,347 +16,360 @@ def is_email(user_input):
ConfigDictTemplate = [ ConfigDictTemplate = [
{ {
"name": "general", "name": "general",
"values": [ "values": [
{ {
"option": "hostname", "option": "hostname",
"default": "mail.%(domain)s", "default": "mail.%(domain)s",
} }
] ]
}, },
{ {
"name": "certificate", "name": "certificate",
"values": [ "values": [
{ {
"option": "generate", "option": "generate",
"default": "true", "default": "true",
}, },
{ {
"option": "type", "option": "type",
"default": "self-signed", "default": "self-signed",
"customizable": True, "customizable": True,
"question": "Please choose your certificate type", "question": "Please choose your certificate type",
"values": ["self-signed", "letsencrypt"], "values": ["self-signed", "letsencrypt"],
} }
], ],
}, },
{ {
"name": "letsencrypt", "name": "letsencrypt",
"if": "certificate.type=letsencrypt", "if": "certificate.type=letsencrypt",
"values": [ "values": [
{ {
"option": "email", "option": "email",
"default": "admin@example.com", "default": "admin@example.com",
"question": ( "question": (
"Please enter the mail you wish to use for " "Please enter the mail you wish to use for "
"letsencrypt"), "letsencrypt"),
"customizable": True, "customizable": True,
"validators": [is_email] "validators": [is_email]
} }
] ]
}, },
{ {
"name": "database", "name": "database",
"values": [ "values": [
{ {
"option": "engine", "option": "engine",
"default": "postgres", "default": "postgres",
"customizable": True, "customizable": True,
"question": "Please choose your database engine", "question": "Please choose your database engine",
"values": ["postgres", "mysql"], "values": ["postgres", "mysql"],
}, },
{ {
"option": "host", "option": "host",
"default": "127.0.0.1", "default": "127.0.0.1",
}, },
{ {
"option": "install", "option": "install",
"default": "true", "default": "true",
} }
] ]
}, },
{ {
"name": "postgres", "name": "postgres",
"if": "database.engine=postgres", "if": "database.engine=postgres",
"values": [ "values": [
{ {
"option": "user", "option": "user",
"default": "postgres", "default": "postgres",
}, },
{ {
"option": "password", "option": "password",
"default": "", "default": "",
"customizable": True, "customizable": True,
"question": "Please enter postgres password", "question": "Please enter postgres password",
}, },
] ]
}, },
{ {
"name": "mysql", "name": "mysql",
"if": "database.engine=mysql", "if": "database.engine=mysql",
"values": [ "values": [
{ {
"option": "user", "option": "user",
"default": "root", "default": "root",
}, },
{ {
"option": "password", "option": "password",
"default": make_password, "default": make_password,
"customizable": True, "customizable": True,
"question": "Please enter mysql root password" "question": "Please enter mysql root password"
}, },
{ {
"option": "charset", "option": "charset",
"default": "utf8", "default": "utf8",
}, },
{ {
"option": "collation", "option": "collation",
"default": "utf8_general_ci", "default": "utf8_general_ci",
} }
] ]
}, },
{ {
"name": "modoboa", "name": "modoboa",
"values": [ "values": [
{ {
"option": "user", "option": "user",
"default": "modoboa", "default": "modoboa",
}, },
{ {
"option": "home_dir", "option": "home_dir",
"default": "/srv/modoboa", "default": "/srv/modoboa",
}, },
{ {
"option": "venv_path", "option": "venv_path",
"default": "%(home_dir)s/env", "default": "%(home_dir)s/env",
}, },
{ {
"option": "instance_path", "option": "instance_path",
"default": "%(home_dir)s/instance", "default": "%(home_dir)s/instance",
}, },
{ {
"option": "timezone", "option": "timezone",
"default": "Europe/Paris", "default": "Europe/Paris",
}, },
{ {
"option": "dbname", "option": "dbname",
"default": "modoboa", "default": "modoboa",
}, },
{ {
"option": "dbuser", "option": "dbuser",
"default": "modoboa", "default": "modoboa",
}, },
{ {
"option": "dbpassword", "option": "dbpassword",
"default": make_password, "default": make_password,
"customizable": True, "customizable": True,
"question": "Please enter Modoboa db password", "question": "Please enter Modoboa db password",
}, },
{ {
"option": "extensions", "option": "extensions",
"default": ( "default": (
"modoboa-amavis modoboa-pdfcredentials " "modoboa-amavis modoboa-pdfcredentials "
"modoboa-postfix-autoreply modoboa-sievefilters " "modoboa-postfix-autoreply modoboa-sievefilters "
"modoboa-stats modoboa-webmail modoboa-contacts"), "modoboa-stats modoboa-webmail modoboa-contacts"),
}, },
{ {
"option": "devmode", "option": "devmode",
"default": "false", "default": "false",
}, },
] ]
}, },
{ {
"name": "automx", "name": "automx",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "user", "option": "user",
"default": "automx", "default": "automx",
}, },
{ {
"option": "config_dir", "option": "config_dir",
"default": "/etc", "default": "/etc",
}, },
{ {
"option": "home_dir", "option": "home_dir",
"default": "/srv/automx", "default": "/srv/automx",
}, },
{ {
"option": "venv_path", "option": "venv_path",
"default": "%(home_dir)s/env", "default": "%(home_dir)s/env",
}, },
{ {
"option": "instance_path", "option": "instance_path",
"default": "%(home_dir)s/instance", "default": "%(home_dir)s/instance",
}, },
] ]
}, },
{ {
"name": "amavis", "name": "amavis",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "user", "option": "user",
"default": "amavis", "default": "amavis",
}, },
{ {
"option": "max_servers", "option": "max_servers",
"default": "1", "default": "1",
}, },
{ {
"option": "dbname", "option": "dbname",
"default": "amavis", "default": "amavis",
}, },
{ {
"option": "dbuser", "option": "dbuser",
"default": "amavis", "default": "amavis",
}, },
{ {
"option": "dbpassword", "option": "dbpassword",
"default": make_password, "default": make_password,
"customizable": True, "customizable": True,
"question": "Please enter amavis db password" "question": "Please enter amavis db password"
}, },
], ],
}, },
{ {
"name": "clamav", "name": "clamav",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "user", "option": "user",
"default": "clamav", "default": "clamav",
}, },
] ]
}, },
{ {
"name": "dovecot", "name": "dovecot",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "config_dir", "option": "config_dir",
"default": "/etc/dovecot", "default": "/etc/dovecot",
}, },
{ {
"option": "user", "option": "user",
"default": "vmail", "default": "vmail",
}, },
{ {
"option": "home_dir", "option": "home_dir",
"default": "/srv/vmail", "default": "/srv/vmail",
}, },
{ {
"option": "mailboxes_owner", "option": "mailboxes_owner",
"default": "vmail", "default": "vmail",
}, },
{ {
"option": "extra_protocols", "option": "extra_protocols",
"default": "", "default": "",
}, },
{ {
"option": "postmaster_address", "option": "postmaster_address",
"default": "postmaster@%(domain)s", "default": "postmaster@%(domain)s",
}, },
] ]
}, },
{ {
"name": "nginx", "name": "nginx",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "config_dir", "option": "config_dir",
"default": "/etc/nginx", "default": "/etc/nginx",
}, },
], ],
}, },
{ {
"name": "razor", "name": "razor",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "config_dir", "option": "config_dir",
"default": "/etc/razor", "default": "/etc/razor",
}, },
] ]
}, },
{ {
"name": "postfix", "name": "postfix",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "config_dir", "option": "config_dir",
"default": "/etc/postfix", "default": "/etc/postfix",
}, },
{ {
"option": "message_size_limit", "option": "message_size_limit",
"default": "11534336", "default": "11534336",
}, },
] ]
}, },
{ {
"name": "spamassassin", "name": "postwhite",
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "true",
}, },
{ {
"option": "config_dir", "option": "config_dir",
"default": "/etc/mail/spamassassin", "default": "/etc",
}, },
{ ]
"option": "dbname", },
"default": "spamassassin", {
}, "name": "spamassassin",
{ "values": [
"option": "dbuser", {
"default": "spamassassin", "option": "enabled",
}, "default": "true",
{ },
"option": "dbpassword", {
"default": make_password, "option": "config_dir",
"customizable": True, "default": "/etc/mail/spamassassin",
"question": "Please enter spamassassin db password" },
}, {
] "option": "dbname",
}, "default": "spamassassin",
{ },
"name": "uwsgi", {
"values": [ "option": "dbuser",
{ "default": "spamassassin",
"option": "enabled", },
"default": "true", {
}, "option": "dbpassword",
{ "default": make_password,
"option": "config_dir", "customizable": True,
"default": "/etc/uwsgi", "question": "Please enter spamassassin db password"
}, },
{ ]
"option": "nb_processes", },
"default": "2", {
}, "name": "uwsgi",
] "values": [
}, {
"option": "enabled",
"default": "true",
},
{
"option": "config_dir",
"default": "/etc/uwsgi",
},
{
"option": "nb_processes",
"default": "2",
},
]
},
] ]

View File

@@ -14,7 +14,7 @@ class Installer(object):
appname = None appname = None
no_daemon = False no_daemon = False
daemon_name = None daemon_name = None
packages = [] packages = {}
with_user = False with_user = False
with_db = False with_db = False
config_files = [] config_files = []
@@ -97,7 +97,7 @@ class Installer(object):
def get_packages(self): def get_packages(self):
"""Return the list of packages to install.""" """Return the list of packages to install."""
return self.packages[package.backend.FORMAT] return self.packages.get(package.backend.FORMAT, {})
def install_packages(self): def install_packages(self):
"""Install required packages.""" """Install required packages."""

View File

@@ -135,6 +135,7 @@ smtpd_recipient_restrictions =
# #
postscreen_access_list = postscreen_access_list =
permit_mynetworks permit_mynetworks
cidr:/etc/postfix/postscreen_spf_whitelist.cidr
postscreen_blacklist_action = enforce postscreen_blacklist_action = enforce
# Use some DNSBL # Use some DNSBL

View File

@@ -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

View File

@@ -10,6 +10,7 @@ from .. import package
from .. import utils from .. import utils
from . import base from . import base
from . import install
class Postfix(base.Installer): class Postfix(base.Installer):
@@ -92,3 +93,6 @@ class Postfix(base.Installer):
aliases_file = "/etc/aliases" aliases_file = "/etc/aliases"
if os.path.exists(aliases_file): if os.path.exists(aliases_file):
utils.exec_cmd("postalias {}".format(aliases_file)) utils.exec_cmd("postalias {}".format(aliases_file))
# Postwhite
install("postwhite", self.config)

View File

@@ -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))

View File

@@ -87,7 +87,7 @@ class ConfigFileTestCase(unittest.TestCase):
self.assertTrue(os.path.exists(self.cfgfile)) self.assertTrue(os.path.exists(self.cfgfile))
self.assertIn( self.assertIn(
"modoboa automx amavis clamav dovecot nginx razor postfix" "modoboa automx amavis clamav dovecot nginx razor postfix"
" spamassassin uwsgi", " postwhite spamassassin uwsgi",
out.getvalue() out.getvalue()
) )