diff --git a/modoboa_installer/scripts/__init__.py b/modoboa_installer/scripts/__init__.py index 3b8fd1a..219d255 100644 --- a/modoboa_installer/scripts/__init__.py +++ b/modoboa_installer/scripts/__init__.py @@ -6,12 +6,16 @@ import sys from .. import utils -def install(appname, config, upgrade): +def install(appname, config, upgrade, restore): """Install an application.""" if (config.has_option(appname, "enabled") and not config.getboolean(appname, "enabled")): return - utils.printcolor("Installing {}".format(appname), utils.MAGENTA) + + if not restore: + utils.printcolor("Installing {}".format(appname), utils.MAGENTA) + else: + utils.printcolor("Restoring {}".format(appname), utils.MAGENTA) try: script = importlib.import_module( "modoboa_installer.scripts.{}".format(appname)) @@ -19,7 +23,7 @@ def install(appname, config, upgrade): print("Unknown application {}".format(appname)) sys.exit(1) try: - getattr(script, appname.capitalize())(config, upgrade).run() + getattr(script, appname.capitalize())(config, upgrade, restore).run() except utils.FatalError as inst: utils.printcolor(u"{}".format(inst), utils.RED) sys.exit(1) diff --git a/modoboa_installer/scripts/base.py b/modoboa_installer/scripts/base.py index 8f61e5d..d56fdb0 100644 --- a/modoboa_installer/scripts/base.py +++ b/modoboa_installer/scripts/base.py @@ -20,10 +20,11 @@ class Installer(object): with_db = False config_files = [] - def __init__(self, config, upgrade): + def __init__(self, config, upgrade, restore): """Get configuration.""" self.config = config self.upgrade = upgrade + self.restore = restore if self.config.has_section(self.appname): self.app_config = dict(self.config.items(self.appname)) self.dbengine = self.config.get("database", "engine") diff --git a/modoboa_installer/utils.py b/modoboa_installer/utils.py index 78d9d67..48260d2 100644 --- a/modoboa_installer/utils.py +++ b/modoboa_installer/utils.py @@ -168,7 +168,7 @@ def copy_from_template(template, dest, context): fp.write(ConfigFileTemplate(buf).substitute(context)) -def check_config_file(dest, interactive=False, upgrade=False, backup=False): +def check_config_file(dest, interactive=False, upgrade=False, backup=False, restore=False): """Create a new installer config file if needed.""" isPresent = True if os.path.exists(dest): @@ -183,6 +183,12 @@ def check_config_file(dest, interactive=False, upgrade=False, backup=False): printcolor( "Your configuration file hasn't been found. A new one will be generated. " "Please edit it with correct password for the databases !", RED) + elif restore: + printcolor( + "You cannot restore an existing installation without a " + f"configuration file. (file : {dest} has not been found...", RED) + sys.exit(1) + printcolor( "Configuration file {} not found, creating new one." .format(dest), YELLOW) diff --git a/run.py b/run.py index ec67264..901bfdc 100755 --- a/run.py +++ b/run.py @@ -3,6 +3,8 @@ """An installer for Modoboa.""" import argparse +from ast import parse +from ctypes import util try: import configparser except ImportError: @@ -50,6 +52,12 @@ def backup_disclamer(): " !! You should really transfer the backup somewhere else..." " Custom configuration (like to postfix) won't be saved.", utils.BLUE) +def restore_disclamer(path): + """Display restore disclamer. """ + utils.printcolor( + "You are about to restore a previous installation of Modoboa." + "Is a new version has been released in between, please update your database !", + utils.BLUE) def main(input_args): """Install process.""" @@ -89,6 +97,10 @@ def main(input_args): parser.add_argument( "--no-mail", action="store_true", default=False, help="Disable mail backup (save space)") + parser.add_argument( + "--restore", type=str, metavar="path", + help="Restore a previously backup up modoboa instance on a NEW machine. You Must provide backup directory" + ) parser.add_argument("domain", type=str, help="The main domain of your future mail server") args = parser.parse_args(input_args) @@ -106,9 +118,17 @@ def main(input_args): return elif args.bash == "TRUE": utils.printcolor("You can't pick *TRUE* as backup directory !", utils.RED) + + #Restore prep + isRestoring = False + if args.restore != None: + isRestoring = True + if args.restore[-1] != "/": + args.restore += "/" + args.configfile = args.restore + "installer.cfg" utils.printcolor("Welcome to Modoboa installer!\n", utils.GREEN) - wasConfigFileAlreadyThere = utils.check_config_file(args.configfile, args.interactive, args.upgrade, args.backup) + wasConfigFileAlreadyThere = utils.check_config_file(args.configfile, args.interactive, args.upgrade, args.backup, isRestoring) if args.stop_after_configfile_check or (not wasConfigFileAlreadyThere and args.backup): return @@ -134,6 +154,8 @@ def main(input_args): bashArg = "TRUE" scripts.backup(config, bashArg, args.no_mail) return + elif args.restore: + restore_disclamer() else: installation_disclaimer(args, config) @@ -162,22 +184,27 @@ def main(input_args): ssl_backend = ssl.get_backend(config) if ssl_backend and not args.upgrade: ssl_backend.generate_cert() - scripts.install("amavis", config, args.upgrade) - scripts.install("modoboa", config, args.upgrade) - scripts.install("automx", config, args.upgrade) - scripts.install("radicale", config, args.upgrade) - scripts.install("uwsgi", config, args.upgrade) - scripts.install("nginx", config, args.upgrade) - scripts.install("opendkim", config, args.upgrade) - scripts.install("postfix", config, args.upgrade) - scripts.install("dovecot", config, args.upgrade) + scripts.install("amavis", config, args.upgrade, args.restore) + scripts.install("modoboa", config, args.upgrade, args.restore) + scripts.install("automx", config, args.upgrade, args.restore) + scripts.install("radicale", config, args.upgrade, args.restore) + scripts.install("uwsgi", config, args.upgrade, args.restore) + scripts.install("nginx", config, args.upgrade, args.restore) + scripts.install("opendkim", config, args.upgrade, args.restore) + scripts.install("postfix", config, args.upgrade, args.restore) + scripts.install("dovecot", config, args.upgrade, args.restore) system.restart_service("cron") package.backend.restore_system() - utils.printcolor( - "Congratulations! You can enjoy Modoboa at https://{} (admin:password)" - .format(config.get("general", "hostname")), - utils.GREEN) - + if not args.restore: + utils.printcolor( + "Congratulations! You can enjoy Modoboa at https://{} (admin:password)" + .format(config.get("general", "hostname")), + utils.GREEN) + else: + utils.printcolor( + "Resotre complete! You can enjoy Modoboa at https://{} (same credentials as before)" + .format(config.get("general", "hostname")), + utils.GREEN) if __name__ == "__main__": main(sys.argv[1:])