From 3ffaf913c5dfbe28ec8851f1b1d994053f43c5d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Lebleu?= Date: Mon, 16 May 2016 13:04:56 +0200 Subject: [PATCH] [enh] Catch each command error and be more verbose in upgrade_v24 --- lib/yunohost/tools.py | 58 ++++++++++++++++++++++++++++++++----------- locales/en.json | 7 ++++++ 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lib/yunohost/tools.py b/lib/yunohost/tools.py index 59db44406..c8e937155 100644 --- a/lib/yunohost/tools.py +++ b/lib/yunohost/tools.py @@ -35,6 +35,8 @@ import logging import apt import apt.progress import platform +import shutil +import subprocess from moulinette.core import MoulinetteError from moulinette.utils.log import getActionLogger @@ -481,19 +483,33 @@ def tools_upgrade_v24(auth): """ YunoHost upgrade to new Yunohost version (on jessie) """ - - # Retrieve interface - is_api = True if msettings.get('interface') == 'api' else False - # Get Debian major version debian_major_version = platform.linux_distribution()[1].split('.')[0] - if debian_major_version is not '8': + if debian_major_version != '8': msignals.display(m18n.n('upgrade_24_not_jessie'), 'error') return + # Prepare environment and commands + env = os.environ.copy() + env['DEBIAN_FRONTEND'] = 'noninteractive' + env['DEBIAN_PRIORITY'] = 'critical' + apt_cmd = ['apt-get', '-y', '--force-yes', '-qq', + '-o', 'Dpkg::Options::=--force-confdef', + '-o', 'Dpkg::Options::=--force-confold'] + _call = lambda cmd: subprocess.call(cmd, env=env) + _apt = lambda cmd: _call(apt_cmd + cmd) + # Upgrade with current sources - os.system('apt-get update') - os.system('yes "q" | DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get -y --force-yes -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade') + if _apt(['update',]) != 0: + raise MoulinetteError(errno.EIO, + m18n.n('upgrade_24_update_failed')) + if _apt(['upgrade',]) != 0: + msignals.display(m18n.n('upgrade_24_system_failed'), 'error') + # Attempt to repair the system + if _apt(['-f', 'install']) != 0 or _apt(['upgrade',]) != 0: + raise MoulinetteError(errno.EIO, + m18n.n('packages_upgrade_failed')) + msignals.display(m18n.n('upgrade_24_system_done'), 'success') # Remove old repo in sources.list file with open('/etc/apt/sources.list', "r") as sources: @@ -508,18 +524,32 @@ def tools_upgrade_v24(auth): sources.write('deb http://repo.yunohost.org/debian/ jessie stable') # Upgrade with new sources - os.system('apt-get update') - os.system('yes "q" | DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get install -y --force-yes -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" yunohost') - os.system('yes "q" | DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get -y --force-yes -qq -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade') - os.system('yes "q" | DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get remove -y --force-yes amavisd-new') - os.system('yes "q" | DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get -y --force-yes autoremove') - os.system('yunohost service regen-conf -f') + if _apt(['update',]) != 0: + raise MoulinetteError(errno.EIO, + m18n.n('upgrade_24_update_failed')) + if _apt(['install', 'yunohost',]) != 0: + raise MoulinetteError(errno.EIO, + m18n.n('upgrade_24_yunohost_install_failed')) + msignals.display(m18n.n('upgrade_24_yunohost_installed')) + + # Remove unused packages and folders + if _apt(['autoremove',]) != 0: + msignals.display(m18n.n('upgrade_24_autoremove_failed'), 'error') + # Remove at least amavis and spamassassin + _apt(['remove', 'amavisd-new', 'spamassassin']) + shutil.rmtree('/usr/share/yunohost/miniupnp-src', ignore_errors=True) + + # Regenerate configuration + if _call(['yunohost', 'service', 'regen-conf', '-f']) != 0: + msignals.display(m18n.n('upgrade_24_regenconf_failed')) msignals.display(m18n.n('system_upgraded'), 'success') # Prepare systemctl with open('/etc/cron.d/yunohost-regenconf', 'w+') as f: - f.write('* * * * * root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin systemctl start yunohost-api && rm -f /etc/cron.d/yunohost-regenconf\n' ) + f.write('* * * * * root PATH=/usr/sbin:/usr/bin:/sbin:/bin ' + 'systemctl start yunohost-api && ' + 'rm -f /etc/cron.d/yunohost-regenconf\n') # Reboot user notice msignals.display(m18n.n('upgrade_24_reboot'), 'warning') diff --git a/locales/en.json b/locales/en.json index b96612f77..9498ecb88 100644 --- a/locales/en.json +++ b/locales/en.json @@ -198,6 +198,13 @@ "format_datetime_short" : "%m/%d/%Y %I:%M %p", "upgrade_24_not_jessie" : "Upgrading to YunoHost v2.4 will only work on Debian Jessie. Please upgrade your system before upgrading YunoHost.", + "upgrade_24_update_failed" : "An error occurred while updating the packages list, you should maybe check your network connection.", + "upgrade_24_system_failed" : "An error occurred while upgrading your system, we will try to fix broken packages...", + "upgrade_24_system_done" : "Your system has been upgraded, the new YunoHost version can be installed...", + "upgrade_24_yunohost_install_failed" : "An error occurred while installing new yunohost package version. Please see the log and ask for help on the forum or the support chat room.", + "upgrade_24_yunohost_installed" : "The new YunoHost version has been installed! Now removing unused packages and regenerate the configuration...", + "upgrade_24_autoremove_failed" : "An error occurred while removing unused packages, you should check what failed.", + "upgrade_24_regenconf_failed" : "The configuration regeneration for services failed", "upgrade_24_reboot" : "You must reboot your server for the changes to take effect. Enter the 'reboot' command right now." }