Added postwhite support. (#171)
* Added postwhite support. see #109 * Fixed unit test.
This commit is contained in:
@@ -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",
|
||||
},
|
||||
]
|
||||
},
|
||||
]
|
||||
|
||||
@@ -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."""
|
||||
|
||||
@@ -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
|
||||
|
||||
9
modoboa_installer/scripts/files/postwhite/crontab.tpl
Normal file
9
modoboa_installer/scripts/files/postwhite/crontab.tpl
Normal 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
|
||||
@@ -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)
|
||||
|
||||
51
modoboa_installer/scripts/postwhite.py
Normal file
51
modoboa_installer/scripts/postwhite.py
Normal 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))
|
||||
Reference in New Issue
Block a user