Updated for 2.2
This commit is contained in:
@@ -45,6 +45,29 @@ def install_packages(names, venv=None, upgrade=False, **kwargs):
|
|||||||
utils.exec_cmd(cmd, **kwargs)
|
utils.exec_cmd(cmd, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def get_package_version(name, venv=None, **kwargs):
|
||||||
|
"""Returns the version of an installed package."""
|
||||||
|
cmd = "{} show {}".format(
|
||||||
|
get_pip_path(venv),
|
||||||
|
name
|
||||||
|
)
|
||||||
|
status, output = utils.exec_cmd(cmd, **kwargs)
|
||||||
|
|
||||||
|
output_list = output.split("\n")
|
||||||
|
version_item_list = output_list[1].split(":")
|
||||||
|
version_list = version_item_list[1].split(".")
|
||||||
|
version_list_clean = []
|
||||||
|
for element in version_list:
|
||||||
|
try:
|
||||||
|
version_list_clean.append(int(version_list[i]))
|
||||||
|
except ValueError:
|
||||||
|
utils.printcolor(
|
||||||
|
f"Failed to decode some part of the version of {name}",
|
||||||
|
utils.YELLOW)
|
||||||
|
version_list_clean.append(element)
|
||||||
|
return version_list_clean
|
||||||
|
|
||||||
|
|
||||||
def install_package_from_repository(name, url, vcs="git", venv=None, **kwargs):
|
def install_package_from_repository(name, url, vcs="git", venv=None, **kwargs):
|
||||||
"""Install a Python package from its repository."""
|
"""Install a Python package from its repository."""
|
||||||
if vcs == "git":
|
if vcs == "git":
|
||||||
|
|||||||
@@ -30,6 +30,17 @@ class Dovecot(base.Installer):
|
|||||||
"conf.d/10-master.conf", "conf.d/20-lmtp.conf", "conf.d/10-ssl-keys.try"]
|
"conf.d/10-master.conf", "conf.d/20-lmtp.conf", "conf.d/10-ssl-keys.try"]
|
||||||
with_user = True
|
with_user = True
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super.__init__(*args, **kwargs)
|
||||||
|
# Check if modoboa version > 2.2
|
||||||
|
self.modoboa_2_2_or_greater = False
|
||||||
|
condition = (
|
||||||
|
(modoboa_version[0] == 2 and modoboa_version[1] >= 2) or
|
||||||
|
modoboa_version[0] > 2
|
||||||
|
)
|
||||||
|
if condition:
|
||||||
|
self.modoboa_2_2_or_greater = True
|
||||||
|
|
||||||
def setup_user(self):
|
def setup_user(self):
|
||||||
"""Setup mailbox user."""
|
"""Setup mailbox user."""
|
||||||
super().setup_user()
|
super().setup_user()
|
||||||
@@ -83,6 +94,7 @@ class Dovecot(base.Installer):
|
|||||||
else:
|
else:
|
||||||
# Protocols are automatically guessed on debian/ubuntu
|
# Protocols are automatically guessed on debian/ubuntu
|
||||||
protocols = ""
|
protocols = ""
|
||||||
|
|
||||||
context.update({
|
context.update({
|
||||||
"db_driver": self.db_driver,
|
"db_driver": self.db_driver,
|
||||||
"mailboxes_owner_uid": pw_mailbox[2],
|
"mailboxes_owner_uid": pw_mailbox[2],
|
||||||
@@ -97,7 +109,9 @@ class Dovecot(base.Installer):
|
|||||||
"ssl_protocol_parameter": ssl_protocol_parameter,
|
"ssl_protocol_parameter": ssl_protocol_parameter,
|
||||||
"radicale_user": self.config.get("radicale", "user"),
|
"radicale_user": self.config.get("radicale", "user"),
|
||||||
"radicale_auth_socket_path": os.path.basename(
|
"radicale_auth_socket_path": os.path.basename(
|
||||||
self.config.get("dovecot", "radicale_auth_socket_path"))
|
self.config.get("dovecot", "radicale_auth_socket_path")),
|
||||||
|
"modoboa_2_2_or_greater": "" if self.modoboa_2_2_or_greater else "#",
|
||||||
|
"not_modoboa_2_2_or_greater": "" if not self.modoboa_2_2_or_greater else "#"
|
||||||
})
|
})
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|||||||
@@ -123,7 +123,8 @@ connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser
|
|||||||
#user_query = \
|
#user_query = \
|
||||||
# SELECT home, uid, gid \
|
# SELECT home, uid, gid \
|
||||||
# FROM users WHERE username = '%%n' AND domain = '%%d'
|
# FROM users WHERE username = '%%n' AND domain = '%%d'
|
||||||
user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid, %mailboxes_owner_gid as gid, CONCAT('*:bytes=', mb.quota, 'M') AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN core_user u ON u.id=mb.user_id WHERE mb.address='%%n' AND dom.name='%%d'
|
%{not_modoboa_2_2_or_greater}user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid, %mailboxes_owner_gid as gid, CONCAT('*:bytes=', mb.quota, 'M') AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN core_user u ON u.id=mb.user_id WHERE mb.address='%%n' AND dom.name='%%d'
|
||||||
|
%{modoboa_2_2_or_greater}user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid, %mailboxes_owner_gid as gid, CONCAT('*:bytes=', mb.quota, 'M') AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN core_user u ON u.id=mb.user_id WHERE (mb.is_send_only=0 OR '%s' NOT IN ('imap', 'pop3', 'lmtp')) AND mb.address='%%n' AND dom.name='%%d'
|
||||||
|
|
||||||
# If you wish to avoid two SQL lookups (passdb + userdb), you can use
|
# If you wish to avoid two SQL lookups (passdb + userdb), you can use
|
||||||
# userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll
|
# userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll
|
||||||
@@ -133,7 +134,8 @@ user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid,
|
|||||||
# SELECT userid AS user, password, \
|
# SELECT userid AS user, password, \
|
||||||
# home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
|
# home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
|
||||||
# FROM users WHERE userid = '%%u'
|
# FROM users WHERE userid = '%%u'
|
||||||
password_query = SELECT email AS user, password, '%{home_dir}/%%d/%%n' AS userdb_home, %mailboxes_owner_uid AS userdb_uid, %mailboxes_owner_gid AS userdb_gid, CONCAT('*:bytes=', mb.quota, 'M') AS userdb_quota_rule FROM core_user u INNER JOIN admin_mailbox mb ON u.id=mb.user_id INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE u.email='%%u' AND u.is_active=1 AND dom.enabled=1
|
%{not_modoboa_2_2_or_greater}password_query = SELECT email AS user, password, '%{home_dir}/%%d/%%n' AS userdb_home, %mailboxes_owner_uid AS userdb_uid, %mailboxes_owner_gid AS userdb_gid, CONCAT('*:bytes=', mb.quota, 'M') AS userdb_quota_rule FROM core_user u INNER JOIN admin_mailbox mb ON u.id=mb.user_id INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE u.email='%%u' AND u.is_active=1 AND dom.enabled=1
|
||||||
|
%{modoboa_2_2_or_greater}password_query = SELECT email AS user, password, '%{home_dir}/%%d/%%n' AS userdb_home, %mailboxes_owner_uid AS userdb_uid, %mailboxes_owner_gid AS userdb_gid, CONCAT('*:bytes=', mb.quota, 'M') AS userdb_quota_rule FROM core_user u INNER JOIN admin_mailbox mb ON u.id=mb.user_id INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE (mb.is_send_only=0 OR '%s' NOT IN ('imap', 'pop3')) AND u.email='%%u' AND u.is_active=1 AND dom.enabled=1
|
||||||
|
|
||||||
# Query to get a list of all usernames.
|
# Query to get a list of all usernames.
|
||||||
#iterate_query = SELECT username AS user FROM users
|
#iterate_query = SELECT username AS user FROM users
|
||||||
|
|||||||
@@ -123,7 +123,8 @@ connect = host=%dbhost port=%dbport dbname=%modoboa_dbname user=%modoboa_dbuser
|
|||||||
#user_query = \
|
#user_query = \
|
||||||
# SELECT home, uid, gid \
|
# SELECT home, uid, gid \
|
||||||
# FROM users WHERE username = '%%n' AND domain = '%%d'
|
# FROM users WHERE username = '%%n' AND domain = '%%d'
|
||||||
user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid, %mailboxes_owner_gid as gid, '*:bytes=' || mb.quota || 'M' AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN core_user u ON u.id=mb.user_id WHERE mb.address='%%n' AND dom.name='%%d'
|
%{not_modoboa_2_2_or_greater}user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid, %mailboxes_owner_gid as gid, '*:bytes=' || mb.quota || 'M' AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN core_user u ON u.id=mb.user_id WHERE mb.address='%%n' AND dom.name='%%d'
|
||||||
|
%{modoboa_2_2_or_greater}user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid, %mailboxes_owner_gid as gid, '*:bytes=' || mb.quota || 'M' AS quota_rule FROM admin_mailbox mb INNER JOIN admin_domain dom ON mb.domain_id=dom.id INNER JOIN core_user u ON u.id=mb.user_id WHERE (mb.is_send_only IS NOT TRUE OR '%s' NOT IN ('imap', 'pop3', 'lmtp')) AND mb.address='%%n' AND dom.name='%%d'
|
||||||
|
|
||||||
# If you wish to avoid two SQL lookups (passdb + userdb), you can use
|
# If you wish to avoid two SQL lookups (passdb + userdb), you can use
|
||||||
# userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll
|
# userdb prefetch instead of userdb sql in dovecot.conf. In that case you'll
|
||||||
@@ -133,7 +134,8 @@ user_query = SELECT '%{home_dir}/%%d/%%n' AS home, %mailboxes_owner_uid as uid,
|
|||||||
# SELECT userid AS user, password, \
|
# SELECT userid AS user, password, \
|
||||||
# home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
|
# home AS userdb_home, uid AS userdb_uid, gid AS userdb_gid \
|
||||||
# FROM users WHERE userid = '%%u'
|
# FROM users WHERE userid = '%%u'
|
||||||
password_query = SELECT email AS user, password, '%{home_dir}/%%d/%%n' AS userdb_home, %mailboxes_owner_uid AS userdb_uid, %mailboxes_owner_gid AS userdb_gid, CONCAT('*:bytes=', mb.quota, 'M') AS userdb_quota_rule FROM core_user u INNER JOIN admin_mailbox mb ON u.id=mb.user_id INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE email='%%u' AND is_active AND dom.enabled
|
%{not_modoboa_2_2_or_greater}password_query = SELECT email AS user, password, '%{home_dir}/%%d/%%n' AS userdb_home, %mailboxes_owner_uid AS userdb_uid, %mailboxes_owner_gid AS userdb_gid, CONCAT('*:bytes=', mb.quota, 'M') AS userdb_quota_rule FROM core_user u INNER JOIN admin_mailbox mb ON u.id=mb.user_id INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE email='%%u' AND is_active AND dom.enabled
|
||||||
|
%{modoboa_2_2_or_greater}password_query = SELECT email AS user, password, '%{home_dir}/%%d/%%n' AS userdb_home, %mailboxes_owner_uid AS userdb_uid, %mailboxes_owner_gid AS userdb_gid, CONCAT('*:bytes=', mb.quota, 'M') AS userdb_quota_rule FROM core_user u INNER JOIN admin_mailbox mb ON u.id=mb.user_id INNER JOIN admin_domain dom ON mb.domain_id=dom.id WHERE (mb.is_send_only IS NOT TRUE OR '%s' NOT IN ('imap', 'pop3')) AND email='%%u' AND is_active AND dom.enabled
|
||||||
|
|
||||||
# Query to get a list of all usernames.
|
# Query to get a list of all usernames.
|
||||||
#iterate_query = SELECT username AS user FROM users
|
#iterate_query = SELECT username AS user FROM users
|
||||||
|
|||||||
@@ -33,4 +33,4 @@ INSTANCE=%{instance_path}
|
|||||||
%{minutes} %{hours} * * * root $PYTHON $INSTANCE/manage.py communicate_with_public_api
|
%{minutes} %{hours} * * * root $PYTHON $INSTANCE/manage.py communicate_with_public_api
|
||||||
|
|
||||||
# Generate DKIM keys (they will belong to the user running this job)
|
# Generate DKIM keys (they will belong to the user running this job)
|
||||||
%{opendkim_enabled}* * * * * %{opendkim_user} umask 077 && $PYTHON $INSTANCE/manage.py modo manage_dkim_keys
|
%{dkim_cron_enabled}* * * * * %{opendkim_user} umask 077 && $PYTHON $INSTANCE/manage.py modo manage_dkim_keys
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[program:modoboa-dkim-worker]
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
command=%{venv_path}/bin/python %{home_dir}/instance/manage.py rqworker dkim
|
||||||
|
directory=%{home_dir}
|
||||||
|
user=%{dkim_user}
|
||||||
|
redirect_stderr=true
|
||||||
|
numprocs=1
|
||||||
|
stopsignal=TERM
|
||||||
@@ -6,3 +6,4 @@ directory=%{home_dir}
|
|||||||
redirect_stderr=true
|
redirect_stderr=true
|
||||||
user=%{user}
|
user=%{user}
|
||||||
numprocs=1
|
numprocs=1
|
||||||
|
|
||||||
|
|||||||
@@ -45,6 +45,15 @@ class Modoboa(base.Installer):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
"""Get configuration."""
|
"""Get configuration."""
|
||||||
super(Modoboa, self).__init__(*args, **kwargs)
|
super(Modoboa, self).__init__(*args, **kwargs)
|
||||||
|
# Check if modoboa version > 2.2
|
||||||
|
self.modoboa_2_2_or_greater = False
|
||||||
|
condition = (
|
||||||
|
(modoboa_version[0] == 2 and modoboa_version[1] >= 2) or
|
||||||
|
modoboa_version[0] > 2
|
||||||
|
)
|
||||||
|
if condition:
|
||||||
|
self.modoboa_2_2_or_greater = True
|
||||||
|
|
||||||
self.venv_path = self.config.get("modoboa", "venv_path")
|
self.venv_path = self.config.get("modoboa", "venv_path")
|
||||||
self.instance_path = self.config.get("modoboa", "instance_path")
|
self.instance_path = self.config.get("modoboa", "instance_path")
|
||||||
self.extensions = self.config.get("modoboa", "extensions").split()
|
self.extensions = self.config.get("modoboa", "extensions").split()
|
||||||
@@ -61,6 +70,9 @@ class Modoboa(base.Installer):
|
|||||||
self.extensions.remove("modoboa-radicale")
|
self.extensions.remove("modoboa-radicale")
|
||||||
self.dovecot_enabled = self.config.getboolean("dovecot", "enabled")
|
self.dovecot_enabled = self.config.getboolean("dovecot", "enabled")
|
||||||
self.opendkim_enabled = self.config.getboolean("opendkim", "enabled")
|
self.opendkim_enabled = self.config.getboolean("opendkim", "enabled")
|
||||||
|
self.dkim_cron_enabled = False
|
||||||
|
if not self.modoboa_2_2_or_greater and self.opendkim_enabled:
|
||||||
|
self.dkim_cron_enabled = True
|
||||||
|
|
||||||
def is_extension_ok_for_version(self, extension, version):
|
def is_extension_ok_for_version(self, extension, version):
|
||||||
"""Check if extension can be installed with this modo version."""
|
"""Check if extension can be installed with this modo version."""
|
||||||
@@ -214,6 +226,20 @@ class Modoboa(base.Installer):
|
|||||||
else:
|
else:
|
||||||
path = "supervisor=/etc/supervisord.d/policyd.ini"
|
path = "supervisor=/etc/supervisord.d/policyd.ini"
|
||||||
config_files.append(path)
|
config_files.append(path)
|
||||||
|
|
||||||
|
# Add worker for dkim if needed
|
||||||
|
modoboa_version = python.get_package_version(
|
||||||
|
"modoboa",
|
||||||
|
self.venv_path,
|
||||||
|
sudo_user=self.user
|
||||||
|
)
|
||||||
|
condition = (
|
||||||
|
(modoboa_version[0] == 2 and modoboa_version[1] >= 2) or
|
||||||
|
modoboa_version[0] > 2
|
||||||
|
)
|
||||||
|
if condition:
|
||||||
|
config_files.append(
|
||||||
|
"supervisor-rq=/etc/supervisor/conf.d/modoboa-worker.conf")
|
||||||
return config_files
|
return config_files
|
||||||
|
|
||||||
def get_template_context(self):
|
def get_template_context(self):
|
||||||
@@ -232,7 +258,9 @@ class Modoboa(base.Installer):
|
|||||||
"" if "modoboa-radicale" in extensions else "#"),
|
"" if "modoboa-radicale" in extensions else "#"),
|
||||||
"opendkim_user": self.config.get("opendkim", "user"),
|
"opendkim_user": self.config.get("opendkim", "user"),
|
||||||
"minutes": random.randint(1, 59),
|
"minutes": random.randint(1, 59),
|
||||||
"hours" : f"{random_hour},{random_hour+12}"
|
"hours": f"{random_hour},{random_hour+12}",
|
||||||
|
"modoboa_2_2_or_greater": "" if self.modoboa_2_2_or_greater else "#",
|
||||||
|
"dkim_cron_enabled": "" if self.dkim_cron_enabled else "#"
|
||||||
})
|
})
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user