From 8186f044dced4bd91069ef39ab799359f24de0ff Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Fri, 11 May 2018 03:32:54 +0200 Subject: [PATCH] Replace the nginx.conf thing with a function called at the beginning of the migration that restore the original file if it was modified --- locales/en.json | 2 +- .../0003_migrate_to_stretch.py | 62 +++++++++++++++++-- 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/locales/en.json b/locales/en.json index ff1616c79..978465b67 100644 --- a/locales/en.json +++ b/locales/en.json @@ -230,7 +230,7 @@ "migration_0003_patching_sources_list": "Patching the sources.lists ...", "migration_0003_main_upgrade": "Starting main upgrade ...", "migration_0003_fail2ban_upgrade": "Starting the fail2ban upgrade ...", - "migration_0003_nginx_upgrade": "Starting the nginx-common upgrade ...", + "migration_0003_restoring_origin_nginx_conf": "Your file /etc/nginx/nginx.conf was edited somehow. The migration is going to reset back to its original state first... The previous file will be available as {backup_dest}.", "migration_0003_yunohost_upgrade": "Starting the yunohost package upgrade ... The migration will end, but the actual upgrade will happen right after. After the operation is complete, you might have to re-log on the webadmin.", "migration_0003_not_jessie": "The current debian distribution is not Jessie !", "migration_0003_system_not_fully_up_to_date": "Your system is not fully up to date. Please perform a regular upgrade before running the migration to stretch.", diff --git a/src/yunohost/data_migrations/0003_migrate_to_stretch.py b/src/yunohost/data_migrations/0003_migrate_to_stretch.py index faf324303..b2fcd08ac 100644 --- a/src/yunohost/data_migrations/0003_migrate_to_stretch.py +++ b/src/yunohost/data_migrations/0003_migrate_to_stretch.py @@ -39,6 +39,8 @@ class MyMigration(Migration): logger.warning(m18n.n("migration_0003_start", logfile=self.logfile)) # Preparing the upgrade + self.restore_original_nginx_conf_if_needed() + logger.warning(m18n.n("migration_0003_patching_sources_list")) self.patch_apt_sources_list() self.backup_files_to_keep() @@ -46,10 +48,6 @@ class MyMigration(Migration): apps_packages = self.get_apps_equivs_packages() self.unhold(["metronome"]) self.hold(YUNOHOST_PACKAGES + apps_packages + ["fail2ban"]) - if "/etc/nginx/nginx.conf" in manually_modified_files_compared_to_debian_default() \ - and os.path.exists("/etc/nginx/nginx.conf"): - os.system("mv /etc/nginx/nginx.conf \ - /home/yunohost.conf/backup/nginx.conf.bkp_before_stretch") # Main dist-upgrade logger.warning(m18n.n("migration_0003_main_upgrade")) @@ -296,3 +294,59 @@ class MyMigration(Migration): for f in self.files_to_keep: dest_file = f.strip('/').replace("/", "_") copy2(os.path.join(tmp_dir, dest_file), f) + + # On some setups, /etc/nginx/nginx.conf got edited. But this file needs + # to be upgraded because of the way the new module system works for nginx. + # (in particular, having the line that include the modules at the top) + # + # So here, if it got edited, we force the restore of the original conf + # *before* starting the actual upgrade... + # + # An alternative strategy that was attempted was to hold the nginx-common + # package and have a specific upgrade for it like for fail2ban, but that + # leads to apt complaining about not being able to upgrade for shitty + # reasons >.> + def restore_original_nginx_conf_if_needed(self): + if "/etc/nginx/nginx.conf" not in manually_modified_files_compared_to_debian_default(): + return + + if not os.path.exists("/etc/nginx/nginx.conf"): + return + + # If stretch is in the sources.list, we already started migrating on + # stretch so we don't re-do this + if " stretch " in read_file("/etc/apt/sources.list"): + return + + backup_dest = "/home/yunohost.conf/backup/nginx.conf.bkp_before_stretch" + + logger.warning(m18n.n("migration_0003_restoring_origin_nginx_conf", + backup_dest=backup_dest)) + + os.system("mv /etc/nginx/nginx.conf %s" % backup_dest) + + command = "" + command += " DEBIAN_FRONTEND=noninteractive" + command += " APT_LISTCHANGES_FRONTEND=none" + command += " apt-get" + command += " --fix-broken --show-upgraded --assume-yes" + command += ' -o Dpkg::Options::="--force-confmiss"' + command += " install --reinstall" + command += " nginx-common" + + logger.debug("Running apt command :\n{}".format(command)) + + command += " 2>&1 | tee -a {}".format(self.logfile) + + is_api = msettings.get('interface') == 'api' + if is_api: + callbacks = ( + lambda l: logger.info(l.rstrip()), + lambda l: logger.warning(l.rstrip()), + ) + call_async_output(command, callbacks, shell=True) + else: + # We do this when running from the cli to have the output of the + # command showing in the terminal, since 'info' channel is only + # enabled if the user explicitly add --verbose ... + os.system(command)