#!/bin/bash # # Do a system upgrade, from a version to the next. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as # published by the Free Software Foundation, either version 3 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public # License along with this program. If not, see # . # Load source $APP_BASE/lib/hydra/functions || exit 1 hydra_config_load # Parameters TMP="/tmp" STATE="$TMP/system-upgrade" ENV="$TMP/system-upgrade-env" # Command line arguments BASENAME="`basename $0`" NEXTRELEASE="$1" # Proceed to the next upgrade stage function hydra_system_upgrade_stage { STAGE="$1" echo $STAGE > $STATE hydra_system_upgrade_$STAGE } # Set and check upgrade environment function hydra_system_upgrade_env { # Set initial state hydra_system_upgrade_stage env # Available releases #release="`facter lsbdistcodename`" # this doesn't work on squeeze release="`facter 2> /dev/null | grep lsbdistcodename | sed -e 's/lsbdistcodename => //'`" nextrelease="`hydra_next_debian_release $release`" # Is a virtual machine? virtual="`facter 2> /dev/null | grep virtual | grep -v '^is_virtual' | sed -e 's/virtual => //'`" # Save environment echo "release=$release" > $ENV echo "nextrelease=$nextrelease" >> $ENV echo "nextrelease=$nextrelease" >> $ENV echo "virtual=$virtual" >> $ENV # Check release if [ "$?" != "0" ]; then echo "Unsupported release" exit 1 fi # Check optional parameter if [ ! -z "$NEXTRELEASE" ]; then if [ "$NEXTRELEASE" == "$release" ]; then echo "System is already upgraded to $NEXTRELEASE" exit 1 fi if [ "$NEXTRELEASE" != "$nextrelease" ]; then echo "Cannot upgrade: next release for this system is $nextrelease" exit 1 fi fi # Set next state hydra_system_upgrade_stage prepare } # Prepare the environment for a system upgrade function hydra_system_upgrade_prepare { # Ensure puppet is stopped during the process echo "Disabling puppet during the upgrade..." hydractl puppet-disable # Configure apt for the next debian release echo "" echo "Updating apt configuration..." sed -i -e "s/$release/$nextrelease/g" /etc/apt/sources.list sed -i -e "s/$release/$nextrelease/g" /etc/apt/preferences sed -i -e 's|^deb http://backports.debian.org/debian-backports|#deb http://backports.debian.org/debian-backports|' /etc/apt/sources.list # These will be generated by puppet and can be safely removed rm -f /etc/apt/sources.list.d/* rm -f /etc/apt/preferences.d/* # These might lead in upgrade errors if [ "$virtual" == "vserver" ] && [ "$nextrelease" == "wheezy" ]; then apt-get remove makedev -y apt-get remove colord -y fi # Set next state hydra_system_upgrade_stage download } # Update package listing and download new packages function hydra_system_upgrade_download { echo "" echo "Updating package listing..." apt-get update echo "" echo "Downloading packages..." apt-get dist-upgrade -d -y hydra_system_upgrade_stage upgrade } # Proceed with the actual upgrade function hydra_system_upgrade_upgrade { echo "" echo "Upgrading the system..." DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade if [ "$?" != "0" ]; then echo "Upgrade failed. Please fix it manually and run this command again." exit 1 fi hydra_system_upgrade_stage cleanup } # Cleanup procedures function hydra_system_upgrade_cleanup { apt-get autoremove -y apt-get clean hydra_system_upgrade_stage custom } # Custom upgrade procedures function hydra_system_upgrade_custom { if [ "$nextrelease" == "wheezy" ]; then # Old suhosin config rm -f /etc/php5/conf.d/suhosin.ini # This has to be manually installed again if [ -f "/etc/php5/cli/conf.d/uploadprogress.ini" ]; then pecl uninstall uploadprogress pecl install uploadprogress fi fi hydractl trac-upgrade hydra_system_upgrade_stage puppet } # Enable puppet again function hydra_system_upgrade_puppet { echo "" echo "Starting puppet again..." hydractl puppet-enable } # Initialize if [ ! -e "$STATE" ]; then hydra_system_upgrade_env else # Resume from the previous state STAGE="`cat $STATE`" # Restore environment if [ -e "$ENV" ]; then source $ENV fi hydra_system_upgrade_$STAGE fi # Teardown rm -f $STATE rm -f $ENV