diff --git a/modoboa_installer/database.py b/modoboa_installer/database.py index bb0ec2c..0242800 100644 --- a/modoboa_installer/database.py +++ b/modoboa_installer/database.py @@ -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): diff --git a/modoboa_installer/scripts/automx.py b/modoboa_installer/scripts/automx.py index b086e9e..7b9ed56 100644 --- a/modoboa_installer/scripts/automx.py +++ b/modoboa_installer/scripts/automx.py @@ -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 = ( diff --git a/modoboa_installer/scripts/base.py b/modoboa_installer/scripts/base.py index d56fdb0..43e7939 100644 --- a/modoboa_installer/scripts/base.py +++ b/modoboa_installer/scripts/base.py @@ -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 diff --git a/modoboa_installer/scripts/dovecot.py b/modoboa_installer/scripts/dovecot.py index cc353ed..3bb2518 100644 --- a/modoboa_installer/scripts/dovecot.py +++ b/modoboa_installer/scripts/dovecot.py @@ -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. diff --git a/modoboa_installer/scripts/files/amavis/amavisd.conf.tpl b/modoboa_installer/scripts/files/amavis/amavisd.conf.tpl index b29cac2..659d738 100644 --- a/modoboa_installer/scripts/files/amavis/amavisd.conf.tpl +++ b/modoboa_installer/scripts/files/amavis/amavisd.conf.tpl @@ -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; diff --git a/modoboa_installer/scripts/files/amavis/conf.d/50-user.tpl b/modoboa_installer/scripts/files/amavis/conf.d/50-user.tpl index e1ef878..d6a2370 100644 --- a/modoboa_installer/scripts/files/amavis/conf.d/50-user.tpl +++ b/modoboa_installer/scripts/files/amavis/conf.d/50-user.tpl @@ -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; diff --git a/modoboa_installer/scripts/files/dovecot/dovecot-dict-sql.conf.ext.tpl b/modoboa_installer/scripts/files/dovecot/dovecot-dict-sql.conf.ext.tpl index 8221655..aadba2f 100644 --- a/modoboa_installer/scripts/files/dovecot/dovecot-dict-sql.conf.ext.tpl +++ b/modoboa_installer/scripts/files/dovecot/dovecot-dict-sql.conf.ext.tpl @@ -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, diff --git a/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-mysql.conf.ext.tpl b/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-mysql.conf.ext.tpl index 353b4e5..cfeabbf 100644 --- a/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-mysql.conf.ext.tpl +++ b/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-mysql.conf.ext.tpl @@ -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. # diff --git a/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-postgres.conf.ext.tpl b/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-postgres.conf.ext.tpl index 6e12586..03b4995 100644 --- a/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-postgres.conf.ext.tpl +++ b/modoboa_installer/scripts/files/dovecot/dovecot-sql-master-postgres.conf.ext.tpl @@ -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. # diff --git a/modoboa_installer/scripts/files/dovecot/dovecot-sql-mysql.conf.ext.tpl b/modoboa_installer/scripts/files/dovecot/dovecot-sql-mysql.conf.ext.tpl index 4af0d86..4538b9a 100644 --- a/modoboa_installer/scripts/files/dovecot/dovecot-sql-mysql.conf.ext.tpl +++ b/modoboa_installer/scripts/files/dovecot/dovecot-sql-mysql.conf.ext.tpl @@ -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. # diff --git a/modoboa_installer/scripts/files/dovecot/dovecot-sql-postgres.conf.ext.tpl b/modoboa_installer/scripts/files/dovecot/dovecot-sql-postgres.conf.ext.tpl index e6328a5..abb5379 100644 --- a/modoboa_installer/scripts/files/dovecot/dovecot-sql-postgres.conf.ext.tpl +++ b/modoboa_installer/scripts/files/dovecot/dovecot-sql-postgres.conf.ext.tpl @@ -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. # diff --git a/modoboa_installer/scripts/files/opendkim/opendkim.conf.tpl b/modoboa_installer/scripts/files/opendkim/opendkim.conf.tpl index 9f689fc..c38b94c 100644 --- a/modoboa_installer/scripts/files/opendkim/opendkim.conf.tpl +++ b/modoboa_installer/scripts/files/opendkim/opendkim.conf.tpl @@ -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 diff --git a/modoboa_installer/scripts/files/postfix/main.cf.tpl b/modoboa_installer/scripts/files/postfix/main.cf.tpl index 7af5487..9bc9b44 100644 --- a/modoboa_installer/scripts/files/postfix/main.cf.tpl +++ b/modoboa_installer/scripts/files/postfix/main.cf.tpl @@ -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 diff --git a/modoboa_installer/scripts/modoboa.py b/modoboa_installer/scripts/modoboa.py index d9e7ad0..c14888b 100644 --- a/modoboa_installer/scripts/modoboa.py +++ b/modoboa_installer/scripts/modoboa.py @@ -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") ) ] diff --git a/modoboa_installer/scripts/postwhite.py b/modoboa_installer/scripts/postwhite.py index 040a212..4a36182 100644 --- a/modoboa_installer/scripts/postwhite.py +++ b/modoboa_installer/scripts/postwhite.py @@ -20,6 +20,7 @@ class Postwhite(base.Installer): ] no_daemon = True packages = { + "deb": ["bind9-host"], "rpm": ["bind-utils"] } diff --git a/modoboa_installer/scripts/spamassassin.py b/modoboa_installer/scripts/spamassassin.py index 150f238..9f6e45d 100644 --- a/modoboa_installer/scripts/spamassassin.py +++ b/modoboa_installer/scripts/spamassassin.py @@ -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 diff --git a/modoboa_installer/ssl.py b/modoboa_installer/ssl.py index 8df9b30..a0cd4d0 100644 --- a/modoboa_installer/ssl.py +++ b/modoboa_installer/ssl.py @@ -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."""