aboutsummaryrefslogtreecommitdiff
path: root/share/hydractl/system-upgrade
blob: bd40343544a934467408a6197331b0a88d9b5c8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/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
# <http://www.gnu.org/licenses/>.

# Load
source $APP_BASE/lib/hydra/functions || exit 1
hydra_config_load

# Parameters
TMP="/tmp"
STATE="$TMP/system-upgrade"

# Command line arguments
BASENAME="`basename $0`"
NEXTRELEASE="$1"

# Record current state of the upgrade
function hydra_system_upgrade_stage {
  STAGE="$1"
  echo $STAGE > $STATE
}

# Prepare the environment for a system upgrade
function hydra_system_upgrade_prepare {
  # Set initial state
  hydra_system_upgrade_stage prepare

  # 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`"

  # 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

  # 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/*

  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
}

# Prepare for the upgrade
if [ ! -e "$STATE" ]; then
  hydra_system_upgrade_prepare $*
else
  # Resume from the previous state
  STAGE="`cat $STATE`"
fi

# Download packages
if [ "$STAGE" == "download" ]; then
  hydra_system_upgrade_download
fi

# Upgrade the system
if [ "$STAGE" == "upgrade" ]; then
  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
fi

# Cleanup
if [ "$STAGE" == "cleanup" ]; then
  apt-get autoremove
  apt-get clean
  hydra_system_upgrade_stage custom
fi

# Custom procedures
if [ "$STAGE" == "custom" ]; then
  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 upgrade uploadprogress
    fi
  fi

  hydra_system_upgrade_stage puppet
fi

# Enable puppet again
if [ "$STAGE" == "puppet" ]; then
  echo ""
  echo "Starting puppet again..."
  hydractl puppet-enable
fi

# Teardown
rm -f $STATE