diff --git a/modoboa_installer/scripts/__init__.py b/modoboa_installer/scripts/__init__.py index 219d255..fa87c54 100644 --- a/modoboa_installer/scripts/__init__.py +++ b/modoboa_installer/scripts/__init__.py @@ -40,3 +40,16 @@ def backup(config, bashArg, nomail): except utils.FatalError as inst: utils.printcolor(u"{}".format(inst), utils.RED) sys.exit(1) + +def restore(restore): + """Restore instance""" + try: + script = importlib.import_module( + "modoboa_installer.scripts.restore") + except ImportError: + print("Error importing restore") + try: + getattr(script, "Restore")(restore) + except utils.FatalError as inst: + utils.printcolor(u"{}".format(inst), utils.RED) + sys.exit(1) \ No newline at end of file diff --git a/modoboa_installer/scripts/amavis.py b/modoboa_installer/scripts/amavis.py index 4fdc187..d679c98 100644 --- a/modoboa_installer/scripts/amavis.py +++ b/modoboa_installer/scripts/amavis.py @@ -1,7 +1,6 @@ """Amavis related functions.""" import os -import platform from .. import package from .. import utils @@ -43,6 +42,10 @@ class Amavis(base.Installer): def get_config_files(self): """Return appropriate config files.""" if package.backend.FORMAT == "deb": + amavisCustomConf = self.restore + "custom/99-custom" + if self.restore and os.path.isfile(amavisCustomConf): + utils.printcolor("Restoring custom Amavis configuration", utils.MAGENTA) + utils.copy_file(amavisCustomConf, self.config_dir) return [ "conf.d/05-node_id", "conf.d/15-content_filter_mode", "conf.d/50-user"] @@ -70,6 +73,14 @@ class Amavis(base.Installer): def get_sql_schema_path(self): """Return schema path.""" + if self.restore: + utils.printcolor("Trying to restore amavis database from backup", utils.MAGENTA) + amavisDbBackupPath = self.restore + "databases/amavis.sql" + if os.path.isfile(amavisDbBackupPath): + utils.printcolor("Amavis database backup found ! Restoring...", utils.GREEN) + return amavisDbBackupPath + utils.printcolor("Amavis database backup not found, creating empty database", utils.RED) + version = package.backend.get_installed_version("amavisd-new") if version is None: # Fallback to amavis... diff --git a/modoboa_installer/scripts/dovecot.py b/modoboa_installer/scripts/dovecot.py index 3830216..c5a3e45 100644 --- a/modoboa_installer/scripts/dovecot.py +++ b/modoboa_installer/scripts/dovecot.py @@ -3,6 +3,7 @@ import glob import os import pwd +import shutil from .. import database from .. import package @@ -87,6 +88,12 @@ class Dovecot(base.Installer): def post_run(self): """Additional tasks.""" + if self.restore and len(os.listdir(self.restore + "mails")) > 0: + utils.printcolor("Copying mail backup over dovecot directory", utils.MAGENTA) + shutil.copytree(self.restore+"mails/vmails", self.home_dir, dirs_exist_ok=True) + elif self.restore: + utils.printcolor("It seems that mails were not backed up, skipping mail restoration.", utils.MAGENTA) + if self.dbengine == "postgres": dbname = self.config.get("modoboa", "dbname") dbuser = self.config.get("modoboa", "dbuser") diff --git a/modoboa_installer/scripts/modoboa.py b/modoboa_installer/scripts/modoboa.py index adfd9e4..7caa571 100644 --- a/modoboa_installer/scripts/modoboa.py +++ b/modoboa_installer/scripts/modoboa.py @@ -1,5 +1,6 @@ """Modoboa related tasks.""" +from genericpath import isfile import json import os import pwd @@ -176,6 +177,18 @@ class Modoboa(base.Installer): self.backend.grant_access( self.config.get("amavis", "dbname"), self.dbuser) + + def get_sql_schema_path(self): + if self.restore: + utils.printcolor("Trying to restore modoboa database from backup", utils.MAGENTA) + modoboaDbBackupPath = self.restore + "databases/modoboa.sql" + if os.path.isfile(modoboaDbBackupPath): + utils.printcolor("Modoboa database backup found ! Restoring...", utils.GREEN) + return modoboaDbBackupPath + utils.printcolor("Modoboa database backup not found, creating empty database", utils.RED) + + return super().get_sql_schema_path()() + def get_packages(self): """Include extra packages if needed.""" packages = super(Modoboa, self).get_packages() diff --git a/modoboa_installer/scripts/postwhite.py b/modoboa_installer/scripts/postwhite.py index 239d2d3..c534205 100644 --- a/modoboa_installer/scripts/postwhite.py +++ b/modoboa_installer/scripts/postwhite.py @@ -46,6 +46,11 @@ class Postwhite(base.Installer): self.install_from_archive(SPF_TOOLS_REPOSITORY, install_dir) postw_dir = self.install_from_archive( POSTWHITE_REPOSITORY, install_dir) - utils.copy_file(os.path.join(postw_dir, "postwhite.conf"), "/etc") + postwhiteBackupConf = self.restore+"custom/postwhite.conf" + if self.restore and os.path.isfile(postwhiteBackupConf): + utils.printcolor("Restoring postwhite.conf backup.", utils.MAGENTA) + utils.copy_file(postwhiteBackupConf, "/etc") + else: + utils.copy_file(os.path.join(postw_dir, "postwhite.conf"), "/etc") postw_bin = os.path.join(postw_dir, "postwhite") utils.exec_cmd("{} /etc/postwhite.conf".format(postw_bin)) diff --git a/modoboa_installer/scripts/restore.py b/modoboa_installer/scripts/restore.py new file mode 100644 index 0000000..5a5e690 --- /dev/null +++ b/modoboa_installer/scripts/restore.py @@ -0,0 +1,29 @@ +from ctypes import util +import os +import sys +from .. import utils + +class Restore: + def __init__(self, restore): + """Restoring pre-check (backup integriety)""" + """REQUIRED : modoboa.sql""" + """OPTIONAL : mails/, custom/, amavis.sql, spamassassin.sql""" + """Only checking required""" + + try: + if not os.path.isdir(restore): + utils.printcolor("Provided path is not a directory !", utils.RED) + sys.exit(1) + except: + utils.printcolor("Provided path is not right...", utils.RED) + sys.exit(1) + + try: + if not os.path.isfile(restore+"databases/modoboa.sql"): + utils.printcolor(restore+"databases/modoboa.sql not found, please check your backup", utils.RED) + sys.exit(1) + except: + utils.printcolor(restore+"databases/modoboa.sql not found, please check your backup", utils.RED) + sys.exit(1) + + #Everything seems allright here, proceding... \ No newline at end of file diff --git a/modoboa_installer/scripts/spamassassin.py b/modoboa_installer/scripts/spamassassin.py index 49186f4..4466e79 100644 --- a/modoboa_installer/scripts/spamassassin.py +++ b/modoboa_installer/scripts/spamassassin.py @@ -25,6 +25,14 @@ class Spamassassin(base.Installer): def get_sql_schema_path(self): """Return SQL schema.""" + if self.restore: + utils.printcolor("Trying to restore spamassassin database from backup", utils.MAGENTA) + amavisDbBackupPath = self.restore + "databases/spamassassin.sql" + if os.path.isfile(amavisDbBackupPath): + utils.printcolor("Spamassassin database backup found ! Restoring...", utils.GREEN) + return amavisDbBackupPath + utils.printcolor("Spamassassin database backup not found, creating empty database", utils.RED) + if self.dbengine == "postgres": fname = "bayes_pg.sql" else: diff --git a/run.py b/run.py index 901bfdc..6fd95dc 100755 --- a/run.py +++ b/run.py @@ -156,6 +156,7 @@ def main(input_args): return elif args.restore: restore_disclamer() + scripts.restore(restore) else: installation_disclaimer(args, config)