App incompatibility detection, updated for 2.2.0

This commit is contained in:
Spitap
2023-09-06 12:46:20 +02:00
committed by Antoine Nguyen
parent df23f4e181
commit 70e9cffd87
7 changed files with 40 additions and 8 deletions

View File

@@ -37,3 +37,10 @@ REMOVED_EXTENSIONS = {
"modoboa-radicale": "2.4.0", "modoboa-radicale": "2.4.0",
"modoboa-webmail": "2.4.0", "modoboa-webmail": "2.4.0",
} }
APP_INCOMPATIBILITY = {
"opendkim": ["rspamd"],
"amavis": ["rspamd"],
"postwhite": ["rspamd"],
"spamassassin": ["rspamd"]
}

View File

@@ -244,11 +244,11 @@ ConfigDictTemplate = [
"default": "/var/lib/dkim" "default": "/var/lib/dkim"
}, },
{ {
"option": "keys_path_map", "option": "key_map_path",
"default": "/var/lib/dkim/keys.path.map" "default": "/var/lib/dkim/keys.path.map"
}, },
{ {
"option": "selectors_path_map", "option": "selector_map_path",
"default": "/var/lib/dkim/selectors.path.map" "default": "/var/lib/dkim/selectors.path.map"
}, },
{ {
@@ -392,7 +392,7 @@ ConfigDictTemplate = [
"values": [ "values": [
{ {
"option": "enabled", "option": "enabled",
"default": "true", "default": "false",
}, },
{ {
"option": "config_dir", "option": "config_dir",

View File

@@ -3,7 +3,7 @@ autostart=true
autorestart=true autorestart=true
command=%{venv_path}/bin/python %{home_dir}/instance/manage.py rqworker dkim command=%{venv_path}/bin/python %{home_dir}/instance/manage.py rqworker dkim
directory=%{home_dir} directory=%{home_dir}
user=%{opendkim_user} user=%{dkim_user}
redirect_stderr=true redirect_stderr=true
numprocs=1 numprocs=1
stopsignal=TERM stopsignal=TERM

View File

@@ -248,6 +248,7 @@ class Modoboa(base.Installer):
"dovecot_mailboxes_owner": ( "dovecot_mailboxes_owner": (
self.config.get("dovecot", "mailboxes_owner")), self.config.get("dovecot", "mailboxes_owner")),
"opendkim_user": self.config.get("opendkim", "user"), "opendkim_user": self.config.get("opendkim", "user"),
"dkim_user": "_rspamd" if self.config.getboolean("rspamd", "enabled") else 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 "#", "modoboa_2_2_or_greater": "" if self.modoboa_2_2_or_greater else "#",
@@ -291,6 +292,15 @@ class Modoboa(base.Installer):
if self.config.getboolean("opendkim", "enabled"): if self.config.getboolean("opendkim", "enabled"):
settings["admin"]["dkim_keys_storage_dir"] = ( settings["admin"]["dkim_keys_storage_dir"] = (
self.config.get("opendkim", "keys_storage_dir")) self.config.get("opendkim", "keys_storage_dir"))
if self.config.getboolean("rspamd", "enabled"):
settings["admin"]["dkim_keys_storage_dir"] = (
self.config.get("rspamd", "dkim_keys_storage_dir"))
settings["modoboa_rspamd"]["key_map_path"] = (
self.config.get("rspamd", "key_map_path"))
settings["modoboa_rspamd"]["selector_map_path"] = (
self.config.get("rspamd", "selector_map_path"))
settings = json.dumps(settings) settings = json.dumps(settings)
query = ( query = (
"UPDATE core_localconfig SET _parameters='{}'" "UPDATE core_localconfig SET _parameters='{}'"

View File

@@ -60,8 +60,7 @@ class Rspamd(base.Installer):
def install_config_files(self): def install_config_files(self):
"""Make sure config directory exists.""" """Make sure config directory exists."""
user = self.config.get("modoboa", "user") pw = pwd.getpwnam("_rspamd")
pw = pwd.getpwnam(user)
targets = [ targets = [
[self.app_config["dkim_keys_storage_dir"], pw[2], pw[3]] [self.app_config["dkim_keys_storage_dir"], pw[2], pw[3]]
] ]

View File

@@ -19,6 +19,7 @@ except ImportError:
import ConfigParser as configparser import ConfigParser as configparser
from . import config_dict_template from . import config_dict_template
from . import compatibility_matrix.APP_INCOMPATIBILITY
ENV = {} ENV = {}
@@ -504,3 +505,15 @@ def create_oauth2_app(app_name: str, client_id: str, config) -> tuple[str, str]:
) )
exec_cmd(cmd) exec_cmd(cmd)
return client_id, client_secret return client_id, client_secret
def check_app_compatibility(section, config):
"""Check that the app can be installed in regards to other enabled apps."""
incompatible_app = []
if section in APP_INCOMPATIBILITY.keys():
for app in APP_INCOMPATIBILITY[section]:
if config.getboolean(app, "enabled"):
error(f"{section} cannont be installed if {app} is enabled. "
"Please disable one of them.")
incompatible_app.append(app)
return len(incompatible_app) == 0

7
run.py
View File

@@ -22,14 +22,13 @@ from modoboa_installer import utils
PRIMARY_APPS = [ PRIMARY_APPS = [
"amavis",
"fail2ban", "fail2ban",
"modoboa", "modoboa",
"automx", "automx",
"radicale", "radicale",
"uwsgi", "uwsgi",
"nginx", "nginx",
"opendkim", "rspamd",
"postfix", "postfix",
"dovecot" "dovecot"
] ]
@@ -261,6 +260,7 @@ def main(input_args):
# Show concerned components # Show concerned components
components = [] components = []
incompatible_app_detected = False
for section in config.sections(): for section in config.sections():
if section in ["general", "database", "mysql", "postgres", if section in ["general", "database", "mysql", "postgres",
"certificate", "letsencrypt", "backup"]: "certificate", "letsencrypt", "backup"]:
@@ -268,7 +268,10 @@ def main(input_args):
if (config.has_option(section, "enabled") and if (config.has_option(section, "enabled") and
not config.getboolean(section, "enabled")): not config.getboolean(section, "enabled")):
continue continue
incompatible_app_detected = utils.check_app_compatibility(section, config)
components.append(section) components.append(section)
if incompatible_app_detected:
sys.exit(0)
utils.printcolor(" ".join(components), utils.YELLOW) utils.printcolor(" ".join(components), utils.YELLOW)
if not args.force: if not args.force:
answer = utils.user_input("Do you confirm? (Y/n) ") answer = utils.user_input("Do you confirm? (Y/n) ")