Update from master
This commit is contained in:
@@ -13,6 +13,7 @@ class Database(object):
|
||||
|
||||
"""Common database backend."""
|
||||
|
||||
default_port = None
|
||||
packages = None
|
||||
service = None
|
||||
|
||||
@@ -21,6 +22,8 @@ class Database(object):
|
||||
self.config = config
|
||||
engine = self.config.get("database", "engine")
|
||||
self.dbhost = self.config.get("database", "host")
|
||||
self.dbport = self.config.getint(
|
||||
"database", "port", fallback=self.default_port)
|
||||
self.dbuser = config.get(engine, "user")
|
||||
self.dbpassword = config.get(engine, "password")
|
||||
if self.config.getboolean("database", "install"):
|
||||
@@ -36,6 +39,7 @@ class PostgreSQL(Database):
|
||||
|
||||
"""Postgres."""
|
||||
|
||||
default_port = 5432
|
||||
packages = {
|
||||
"deb": ["postgresql", "postgresql-server-dev-all"],
|
||||
"rpm": ["postgresql-server", "postgresql-devel"]
|
||||
@@ -43,7 +47,7 @@ class PostgreSQL(Database):
|
||||
service = "postgresql"
|
||||
|
||||
def __init__(self, config):
|
||||
super(PostgreSQL, self).__init__(config)
|
||||
super().__init__(config)
|
||||
self._pgpass_done = False
|
||||
|
||||
def install_package(self):
|
||||
@@ -79,7 +83,8 @@ class PostgreSQL(Database):
|
||||
cmd += " -d {}".format(dbname)
|
||||
if dbuser:
|
||||
self._setup_pgpass(dbname, dbuser, dbpassword)
|
||||
cmd += " -h {} -U {} -w".format(self.dbhost, dbuser)
|
||||
cmd += " -h {} -p {} -U {} -w".format(
|
||||
self.dbhost, self.dbport, dbuser)
|
||||
query = query.replace("'", "'\"'\"'")
|
||||
cmd = "{} -c '{}' ".format(cmd, query)
|
||||
utils.exec_cmd(cmd, sudo_user=self.dbuser)
|
||||
@@ -137,8 +142,8 @@ class PostgreSQL(Database):
|
||||
def load_sql_file(self, dbname, dbuser, dbpassword, path):
|
||||
"""Load SQL file."""
|
||||
self._setup_pgpass(dbname, dbuser, dbpassword)
|
||||
cmd = "psql -h {} -d {} -U {} -w < {}".format(
|
||||
self.dbhost, dbname, dbuser, path)
|
||||
cmd = "psql -h {} -p {} -d {} -U {} -w < {}".format(
|
||||
self.dbhost, self.dbport, dbname, dbuser, path)
|
||||
utils.exec_cmd(cmd, sudo_user=self.dbuser)
|
||||
|
||||
def dump_database(self, dbname, dbuser, dbpassword, path):
|
||||
@@ -155,6 +160,7 @@ class MySQL(Database):
|
||||
|
||||
"""MySQL backend."""
|
||||
|
||||
default_port = 3306
|
||||
packages = {
|
||||
"deb": ["mariadb-server"],
|
||||
"rpm": ["mariadb", "mariadb-devel", "mariadb-server"],
|
||||
@@ -211,7 +217,8 @@ class MySQL(Database):
|
||||
if dbuser is None and dbpassword is None:
|
||||
dbuser = self.dbuser
|
||||
dbpassword = self.dbpassword
|
||||
cmd = "mysql -h {} -u {}".format(self.dbhost, dbuser)
|
||||
cmd = "mysql -h {} -P {} -u {}".format(
|
||||
self.dbhost, self.dbport, dbuser)
|
||||
if dbpassword:
|
||||
cmd += " -p{}".format(dbpassword)
|
||||
if dbname:
|
||||
@@ -256,8 +263,8 @@ class MySQL(Database):
|
||||
def load_sql_file(self, dbname, dbuser, dbpassword, path):
|
||||
"""Load SQL file."""
|
||||
utils.exec_cmd(
|
||||
"mysql -h {} -u {} -p{} {} < {}".format(
|
||||
self.dbhost, dbuser, dbpassword, dbname, path)
|
||||
"mysql -h {} -P {} -u {} -p{} {} < {}".format(
|
||||
self.dbhost, self.dbport, dbuser, dbpassword, dbname, path)
|
||||
)
|
||||
|
||||
def dump_database(self, dbname, dbuser, dbpassword, path):
|
||||
|
||||
@@ -33,11 +33,12 @@ class Automx(base.Installer):
|
||||
def get_template_context(self):
|
||||
"""Additional variables."""
|
||||
context = super(Automx, self).get_template_context()
|
||||
sql_dsn = "{}://{}:{}@{}/{}".format(
|
||||
sql_dsn = "{}://{}:{}@{}:{}/{}".format(
|
||||
"postgresql" if self.dbengine == "postgres" else self.dbengine,
|
||||
self.config.get("modoboa", "dbuser"),
|
||||
self.config.get("modoboa", "dbpassword"),
|
||||
self.dbhost,
|
||||
self.dbport,
|
||||
self.config.get("modoboa", "dbname"))
|
||||
if self.db_driver == "pgsql":
|
||||
sql_query = (
|
||||
|
||||
@@ -31,7 +31,10 @@ class Installer(object):
|
||||
# Used to install system packages
|
||||
self.db_driver = (
|
||||
"pgsql" if self.dbengine == "postgres" else self.dbengine)
|
||||
self.backend = database.get_backend(self.config)
|
||||
self.dbhost = self.config.get("database", "host")
|
||||
self.dbport = self.config.get(
|
||||
"database", "port", fallback=self.backend.default_port)
|
||||
self._config_dir = None
|
||||
if not self.with_db:
|
||||
return
|
||||
@@ -62,7 +65,6 @@ class Installer(object):
|
||||
"""Setup a database."""
|
||||
if not self.with_db:
|
||||
return
|
||||
self.backend = database.get_backend(self.config)
|
||||
self.backend.create_user(self.dbuser, self.dbpasswd)
|
||||
self.backend.create_database(self.dbname, self.dbuser)
|
||||
schema = self.get_sql_schema_path()
|
||||
@@ -87,6 +89,7 @@ class Installer(object):
|
||||
"dbengine": (
|
||||
"Pg" if self.dbengine == "postgres" else self.dbengine),
|
||||
"dbhost": self.dbhost,
|
||||
"dbport": self.dbport,
|
||||
}
|
||||
for option, value in self.config.items("general"):
|
||||
context[option] = value
|
||||
|
||||
@@ -124,6 +124,12 @@ class Dovecot(base.Installer):
|
||||
utils.copy_file(f, "{}/conf.d".format(self.config_dir))
|
||||
# Make postlogin script executable
|
||||
utils.exec_cmd("chmod +x /usr/local/bin/postlogin.sh")
|
||||
# Add mailboxes user to dovecot group for modoboa mailbox commands.
|
||||
# See https://github.com/modoboa/modoboa/issues/2157.
|
||||
system.add_user_to_group(
|
||||
self.config.get("dovecot", "mailboxes_owner"),
|
||||
'dovecot'
|
||||
)
|
||||
|
||||
def restart_daemon(self):
|
||||
"""Restart daemon process.
|
||||
|
||||
@@ -112,7 +112,7 @@ $sa_local_tests_only = 0; # only tests which do not require internet access?
|
||||
# @storage_redis_dsn = ( {server=>'127.0.0.1:6379', db_id=>1} );
|
||||
# $redis_logging_key = 'amavis-log';
|
||||
# $redis_logging_queue_size_limit = 300000; # about 250 MB / 100000
|
||||
@lookup_sql_dsn = ( [ 'DBI:%dbengine:database=%dbname;host=%dbhost', '%dbuser', '%dbpassword' ]);
|
||||
@lookup_sql_dsn = ( [ 'DBI:%dbengine:database=%dbname;host=%dbhost;port=%dbport', '%dbuser', '%dbpassword' ]);
|
||||
@storage_sql_dsn = @lookup_sql_dsn;
|
||||
$sql_allow_8bit_address = 1;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ $max_servers = %max_servers;
|
||||
|
||||
# SQL configuration
|
||||
#
|
||||
@lookup_sql_dsn = ( [ 'DBI:%dbengine:database=%dbname;host=%dbhost', '%dbuser', '%dbpassword' ]);
|
||||
@lookup_sql_dsn = ( [ 'DBI:%dbengine:database=%dbname;host=%dbhost;port=%dbport', '%dbuser', '%dbpassword' ]);
|
||||
@storage_sql_dsn = @lookup_sql_dsn;
|
||||
$sql_allow_8bit_address = 1;
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
connect = host=%dbhost dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
|
||||
# CREATE TABLE quota (
|
||||
# username varchar(100) not null,
|
||||
|
||||
@@ -64,7 +64,7 @@ driver = %db_driver
|
||||
# connect = /etc/dovecot/authdb.sqlite
|
||||
#
|
||||
#connect =
|
||||
connect = host=%dbhost dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
|
||||
# Default password scheme.
|
||||
#
|
||||
|
||||
@@ -64,7 +64,7 @@ driver = %db_driver
|
||||
# connect = /etc/dovecot/authdb.sqlite
|
||||
#
|
||||
#connect =
|
||||
connect = host=%dbhost dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
|
||||
# Default password scheme.
|
||||
#
|
||||
|
||||
@@ -64,7 +64,7 @@ driver = %db_driver
|
||||
# connect = /etc/dovecot/authdb.sqlite
|
||||
#
|
||||
#connect =
|
||||
connect = host=%dbhost dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
|
||||
# Default password scheme.
|
||||
#
|
||||
|
||||
@@ -64,7 +64,7 @@ driver = %db_driver
|
||||
# connect = /etc/dovecot/authdb.sqlite
|
||||
#
|
||||
#connect =
|
||||
connect = host=%dbhost dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser password=%modoboa_dbpassword
|
||||
|
||||
# Default password scheme.
|
||||
#
|
||||
|
||||
@@ -18,8 +18,8 @@ UMask 007
|
||||
#KeyFile /etc/dkimkeys/dkim.key
|
||||
#Selector 2007
|
||||
|
||||
KeyTable dsn:%{db_driver}://%{db_user}:%{db_password}@%{dbhost}/%{db_name}/table=dkim?keycol=id?datacol=domain_name,selector,private_key_path
|
||||
SigningTable dsn:%db_driver://%{db_user}:%{db_password}@%{dbhost}/%{db_name}/table=dkim?keycol=domain_name?datacol=id
|
||||
KeyTable dsn:%{db_driver}://%{db_user}:%{db_password}@%{dbhost}:%{dbport}/%{db_name}/table=dkim?keycol=id?datacol=domain_name,selector,private_key_path
|
||||
SigningTable dsn:%db_driver://%{db_user}:%{db_password}@%{dbhost}:%{dbport}/%{db_name}/table=dkim?keycol=domain_name?datacol=id
|
||||
|
||||
# Commonly-used options; the commented-out versions show the defaults.
|
||||
#Canonicalization simple
|
||||
|
||||
@@ -3,7 +3,7 @@ inet_protocols = all
|
||||
myhostname = %hostname
|
||||
myorigin = $myhostname
|
||||
mydestination = $myhostname
|
||||
mynetworks = 127.0.0.0/8
|
||||
mynetworks = 127.0.0.0/8 [::1]/128
|
||||
smtpd_banner = $myhostname ESMTP
|
||||
biff = no
|
||||
unknown_local_recipient_reject_code = 550
|
||||
@@ -142,10 +142,10 @@ postscreen_blacklist_action = enforce
|
||||
|
||||
# Use some DNSBL
|
||||
postscreen_dnsbl_sites =
|
||||
zen.spamhaus.org*3
|
||||
bl.spameatingmonkey.net*2
|
||||
bl.spamcop.net
|
||||
dnsbl.sorbs.net
|
||||
zen.spamhaus.org=127.0.0.[2..11]*3
|
||||
bl.spameatingmonkey.net=127.0.0.2*2
|
||||
bl.spamcop.net=127.0.0.2
|
||||
dnsbl.sorbs.net=127.0.0.[2..15]
|
||||
postscreen_dnsbl_threshold = 3
|
||||
postscreen_dnsbl_action = enforce
|
||||
|
||||
|
||||
@@ -144,20 +144,22 @@ class Modoboa(base.Installer):
|
||||
"--domain", self.config.get("general", "hostname"),
|
||||
"--extensions", " ".join(self.extensions),
|
||||
"--dont-install-extensions",
|
||||
"--dburl", "'default:{}://{}:{}@{}/{}'".format(
|
||||
"--dburl", "'default:{}://{}:{}@{}:{}/{}'".format(
|
||||
self.config.get("database", "engine"),
|
||||
self.dbuser, self.dbpasswd, self.dbhost, self.dbname
|
||||
self.dbuser, self.dbpasswd, self.dbhost, self.dbport,
|
||||
self.dbname
|
||||
)
|
||||
]
|
||||
if self.devmode:
|
||||
args = ["--devel"] + args
|
||||
if self.amavis_enabled:
|
||||
args += [
|
||||
"'amavis:{}://{}:{}@{}/{}'".format(
|
||||
"'amavis:{}://{}:{}@{}:{}/{}'".format(
|
||||
self.config.get("database", "engine"),
|
||||
self.config.get("amavis", "dbuser"),
|
||||
self.config.get("amavis", "dbpassword"),
|
||||
self.dbhost,
|
||||
self.dbport,
|
||||
self.config.get("amavis", "dbname")
|
||||
)
|
||||
]
|
||||
|
||||
@@ -20,6 +20,7 @@ class Postwhite(base.Installer):
|
||||
]
|
||||
no_daemon = True
|
||||
packages = {
|
||||
"deb": ["bind9-host"],
|
||||
"rpm": ["bind-utils"]
|
||||
}
|
||||
|
||||
|
||||
@@ -57,10 +57,12 @@ class Spamassassin(base.Installer):
|
||||
context = super(Spamassassin, self).get_template_context()
|
||||
if self.dbengine == "postgres":
|
||||
store_module = "Mail::SpamAssassin::BayesStore::PgSQL"
|
||||
dsn = "DBI:Pg:dbname={};host={}".format(self.dbname, self.dbhost)
|
||||
dsn = "DBI:Pg:dbname={};host={};port={}".format(
|
||||
self.dbname, self.dbhost, self.dbport)
|
||||
else:
|
||||
store_module = "Mail::SpamAssassin::BayesStore::MySQL"
|
||||
dsn = "DBI:mysql:{}:{}".format(self.dbname, self.dbhost)
|
||||
dsn = "DBI:mysql:{}:{}:{}".format(
|
||||
self.dbname, self.dbhost, self.dbport)
|
||||
context.update({
|
||||
"store_module": store_module, "dsn": dsn, "dcc_enabled": "#"})
|
||||
return context
|
||||
|
||||
@@ -92,6 +92,12 @@ class LetsEncryptCertificate(CertificateBackend):
|
||||
else:
|
||||
utils.printcolor("Failed to install certbot, aborting.", utils.RED)
|
||||
sys.exit(1)
|
||||
#Nginx plugin certbot
|
||||
if (self.config.has_option("nginx", "enabled") and
|
||||
self.config.getboolean("nginx", "enabled")):
|
||||
package.backend.update()
|
||||
package.backend.install("python3-certbot-nginx")
|
||||
|
||||
|
||||
def generate_cert(self):
|
||||
"""Create a certificate."""
|
||||
|
||||
Reference in New Issue
Block a user