aboutsummaryrefslogtreecommitdiff
path: root/share/hydractl/dist-upgrade
blob: b5720e2405339bad4eba1523553e40dbc4fbe3b5 (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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
#!/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 {
  # Check for requirements
  for req in facter; do
    hydra_install_package $req
  done

  # Available releases
  #release="`facter lsbdistcodename`" # this doesn't work on squeeze
  release="`facter 2> /dev/null | grep lsbdistcodename | sed -e 's/lsbdistcodename => //'`"

  # Since buster
  if [ -z "$release" ]; then
    release="`facter 2> /dev/null | grep codename | sed -e 's/codename => //' | cut -d '"' -f 2`"
  fi

  nextrelease="`hydra_next_debian_release $release`"

  if [ "$nextrelease" == "Unsupported release" ]; then
    echo "$nextrelease after $release"
    exit 1
  fi

  # 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

  # Update APT Preferences with the next debian release
  if [ -e "/etc/apt/preferences" ]; then
    sed -i -e "s/$release/$nextrelease/g" /etc/apt/preferences
  fi

  # Disable backports during the upgrade
  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

  # Handles component migration
  if [ "$nextrelease" == "bookworm" ]; then
    sed -i -e 's|main contrib non-free$|main contrib non-free non-free-firmware|' /etc/apt/sources.list
  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 -y puppet-common
    apt-get purge -y 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 {
  # Check for requirements
  for req in apt-show-versions; do
    hydra_install_package $req
  done

  apt-get autoremove --purge -y
  apt-get clean

  local obsolete="`apt-show-versions | grep 'No available version'`"

  if [ ! -z "$obsolete" ]; then
    echo "Please check and remove the following obsolete packages:"
    echo ""
    apt-show-versions | grep 'No available version'
  fi
}

# 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