blob: c94216a6b302ce99e3ca0e60ede7f75ebdcc3a74 (
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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
#!/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"
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
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 --purge
apt-get clean
hydra_system_upgrade_stage custom
}
# Custom upgrade procedures
function hydra_system_upgrade_custom {
# Custom jessie stuff
if [ "$nextrelease" == "jessie" ]; then
# We're going masterless, so no puppet service
apt-get remove puppet
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_stage env
else
# Resume from the previous state
STAGE="`cat $STATE`"
# Restore environment
if [ -e "$ENV" ]; then
source $ENV
fi
if [ ! -z "$STAGE" ]; then
hydra_system_upgrade_stage $STAGE
fi
fi
# Teardown
rm -f $STATE
rm -f $ENV
|