From eb1a8ece555d753887305c281f87109431ebd348 Mon Sep 17 00:00:00 2001 From: Spitap Date: Mon, 25 Sep 2023 11:40:26 +0200 Subject: [PATCH] Updated config and interactive mode --- .gitignore | 5 ++- modoboa_installer/config_dict_template.py | 32 ++++++++++++++--- modoboa_installer/scripts/rspamd.py | 2 +- modoboa_installer/utils.py | 44 ++++++++++++++--------- 4 files changed, 61 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 2a204ee..3f88a5e 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,7 @@ target/ # PyCharm .idea/ -installer.cfg \ No newline at end of file +#KDE +*.kdev4 + +installer.cfg diff --git a/modoboa_installer/config_dict_template.py b/modoboa_installer/config_dict_template.py index 48fc84b..c6a449c 100644 --- a/modoboa_installer/config_dict_template.py +++ b/modoboa_installer/config_dict_template.py @@ -27,6 +27,22 @@ ConfigDictTemplate = [ } ] }, + { + "name": "antispam", + "values": [ + { + "option": "enabled", + "default": "true", + "question": "Do you want to setup an antispam utility?" + }, + { + "option": "type", + "default": "rspamd", + "question": "Please select your antispam utility", + "values": ["rspamd", "amavis"] + } + ] + }, { "name": "certificate", "values": [ @@ -50,7 +66,7 @@ ConfigDictTemplate = [ }, { "name": "letsencrypt", - "if": "certificate.type=letsencrypt", + "if": ["certificate.type=letsencrypt"], "values": [ { "option": "email", @@ -85,7 +101,7 @@ ConfigDictTemplate = [ }, { "name": "postgres", - "if": "database.engine=postgres", + "if": ["database.engine=postgres"], "values": [ { "option": "user", @@ -101,7 +117,7 @@ ConfigDictTemplate = [ }, { "name": "mysql", - "if": "database.engine=mysql", + "if": ["database.engine=mysql"], "values": [ { "option": "user", @@ -271,9 +287,11 @@ ConfigDictTemplate = [ }, { "name": "amavis", + "if": ["antispam.enabled=true", "antispam.type=amavis"], "values": [ { "option": "enabled", + "default-if": "true", "default": "false", }, { @@ -362,7 +380,7 @@ ConfigDictTemplate = [ "values": [ { "option": "enabled", - "default": "true", + "default": "false", }, { "option": "config_dir", @@ -393,9 +411,11 @@ ConfigDictTemplate = [ }, { "name": "postwhite", + "if": ["antispam.enabled=true", "antispam.type=amavis"], "values": [ { "option": "enabled", + "default-if": "true", "default": "false", }, { @@ -406,9 +426,11 @@ ConfigDictTemplate = [ }, { "name": "spamassassin", + "if": ["antispam.enabled=true", "antispam.type=amavis"], "values": [ { "option": "enabled", + "default-if": "true", "default": "false", }, { @@ -475,9 +497,11 @@ ConfigDictTemplate = [ }, { "name": "opendkim", + "if": ["antispam.enabled=true", "antispam.type=amavis"], "values": [ { "option": "enabled", + "default-if": "true", "default": "false", }, { diff --git a/modoboa_installer/scripts/rspamd.py b/modoboa_installer/scripts/rspamd.py index 105f036..4fcd9c9 100644 --- a/modoboa_installer/scripts/rspamd.py +++ b/modoboa_installer/scripts/rspamd.py @@ -1,4 +1,4 @@ -"""Amavis related functions.""" +"""Rspamd related functions.""" import os import pwd diff --git a/modoboa_installer/utils.py b/modoboa_installer/utils.py index 61143e5..d8ca3ee 100644 --- a/modoboa_installer/utils.py +++ b/modoboa_installer/utils.py @@ -185,25 +185,29 @@ def copy_from_template(template, dest, context): fp.write(ConfigFileTemplate(buf).substitute(context)) -def check_config_file(dest, interactive=False, upgrade=False, backup=False, restore=False): +def check_config_file(dest, + interactive=False, + upgrade=False, + backup=False, + restore=False): """Create a new installer config file if needed.""" is_present = True if os.path.exists(dest): return is_present, update_config(dest, False) if upgrade: - printcolor( + error( "You cannot upgrade an existing installation without a " - "configuration file.", RED) + "configuration file.") sys.exit(1) elif backup: is_present = False - printcolor( + error( "Your configuration file hasn't been found. A new one will be generated. " - "Please edit it with correct password for the databases !", RED) + "Please edit it with correct password for the databases !") elif restore: - printcolor( + error( "You cannot restore an existing installation without a " - f"configuration file. (file : {dest} has not been found...", RED) + f"configuration file. (file : {dest} has not been found...") sys.exit(1) printcolor( @@ -310,10 +314,17 @@ def validate(value, config_entry): def get_entry_value(entry, interactive): - if callable(entry["default"]): - default_value = entry["default"]() + if entry.get("default-if") is not None and interactive: + # In case in interactive we try to look for a default-if + default_entry = entry["default-if"] else: - default_value = entry["default"] + default_entry = entry["default"] + + if callable(default_entry): + default_value = default_entry() + else: + default_value = default_entry + user_value = None if entry.get("customizable") and interactive: while (user_value != '' and not validate(user_value, entry)): @@ -349,13 +360,14 @@ def load_config_template(interactive): config = configparser.ConfigParser() # only ask about options we need, else still generate default for section in tpl_dict: + interactive_section = interactive if "if" in section: - config_key, value = section.get("if").split("=") - section_name, option = config_key.split(".") - interactive_section = ( - config.get(section_name, option) == value and interactive) - else: - interactive_section = interactive + for condition in section.get("if"): + config_key, value = condition.split("=") + section_name, option = config_key.split(".") + interactive_section = interactive_section and ( + config.get(section_name, option) == value) + config.add_section(section["name"]) for config_entry in section["values"]: value = get_entry_value(config_entry, interactive_section)