#!/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 { # 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 if [ -e "/etc/default/puppet" ]; then echo "Disabling puppet agent..." sed -i -e 's/START=yes/START=no/' /etc/default/puppet service puppet stop fi # Configure apt for the next debian release echo "" echo "Updating apt configuration..." sed -i -e "s/$release/$nextrelease/g" /etc/apt/sources.list if [ -e "/etc/apt/preferences" ]; then sed -i -e "s/$release/$nextrelease/g" /etc/apt/preferences fi 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 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 if [ "$nextrelease" == "jessie" ]; then # We're using a masterless puppet setup, so no agent apt-get install puppet-common apt-get purge puppet # Purge old monitoring infrastructure apt-get purge 'munin*' 'nagios*' rm -rf /etc/nagios* /etc/munin* /etc/munin* /usr/share/munin* # Cleanup old scripts rm -f /usr/local/sbin/check-puppetd.sh rm -f remove /etc/cron.d/puppetd fi hydractl trac-upgrade hydra_system_upgrade_stage cleanup } # Cleanup procedures function hydra_system_upgrade_cleanup { apt-get autoremove --purge -y apt-get clean } # Check for root user if [ "`whoami`" != "root" ]; then echo "please run this command as root" exit 1 fi # 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_install_package facter hydra_system_upgrade_$STAGE fi # Teardown rm -f $STATE rm -f $ENV