source: trunk/debathena/config/auto-update/debian/athena-auto-upgrade @ 25959

Revision 25959, 7.9 KB checked in by jdreed, 11 years ago (diff)
Clean up logic, and ensure that upgrader exits if reinstalls are possible but the machine is too new.
Line 
1#!/bin/bash
2#
3# This is designed to be called from cron
4
5DEBUG=0
6FORCE=0
7# You can set DEBUG_RELEASE in the environment for testing
8DEBUG_RELEASE=""
9VERBOSE=0
10FAKE=0
11UPGRADE_TO_TESTING=no
12UPGRADE_ANYWAY=no
13
14# Read defaults here so as not to clobber command-line args later
15[ -f /etc/default/debathena-auto-update ] && . /etc/default/debathena-auto-update
16
17while getopts "vfdt" opt; do
18    case "$opt" in
19        d)
20            DEBUG=1
21            FAKE=1
22            UPGRADE_ANYWAY=yes
23            ;;
24        f)
25            FORCE=1
26            UPGRADE_ANYWAY=yes
27            ;;
28        t)
29            UPGRADE_TO_TESTING=yes
30            ;;
31        v) # Spam level
32            VERBOSE=1
33            ;;
34        \?)
35            cat<<END
36    Usage: $0 [OPTION]
37
38            -d         debug mode, bypasses all checks, only prints
39            -t         upgrade to testing
40            -f         bypasses login checks
41            -v         echo the cmds that are run
42
43END
44           
45            ;;
46    esac
47done
48
49
50if [ $DEBUG -eq 1 ] && [ $FORCE -eq 1 ]; then
51    echo "ERROR: -d and -f are mutually exclusive."
52    exit 2
53fi
54if [ $FORCE -eq 1 ]; then
55    echo "Using -f is a terrible idea.  Press Ctrl-C to reconsider and"
56    echo "save your machine, or Enter to continue."
57    read r
58fi
59
60function pie_grub() {
61    # change DEFAULT in /etc/grub to SAVED
62    if [[ $FAKE == 1 ]]; then
63        echo perl -i.bak -pe 's/^GRUB_DEFAULT=.*$/GRUB_DEFAULT=saved/' /etc/default/grub
64    elif [[ $VERBOSE == 0 ]]; then
65        perl -i.bak -pe 's/^GRUB_DEFAULT=.*$/GRUB_DEFAULT=saved/' /etc/default/grub >/dev/null 2>&1
66    else
67        echo perl -i.bak -pe 's/^GRUB_DEFAULT=.*$/GRUB_DEFAULT=saved/' /etc/default/grub
68        perl -i.bak -pe 's/^GRUB_DEFAULT=.*$/GRUB_DEFAULT=saved/' /etc/default/grub
69    fi
70    if [[ $? -ne 0 ]]; then
71        complain "Setting DEFAULT in /etc/default/grub returned a non-zero exit status"
72        exit 1
73    fi
74
75}
76
77
78function complain() {
79    echo "ERROR: $*"
80    if [ $DEBUG -ne 1 ]; then
81        logger -t "athena-auto-upgrade" -p user.notice "$*"
82    fi
83}
84
85
86
87function runcmd()
88{
89    CMD=$1
90    if [[ $FAKE == 1 ]]; then
91        echo $CMD
92    elif [[ $VERBOSE == 0 ]]; then
93        $CMD > /dev/null 2>&1
94    else
95        echo $CMD
96        $CMD
97    fi
98    if [[ $? -ne 0 ]]; then
99        complain "$CMD returned a non-zero exit status"
100        exit 1
101    fi
102}
103
104function debug() {
105    [ $DEBUG -eq 1 ] && echo "DEBUG: $*"
106}
107
108function maybe_quit() {
109    if [ $FORCE -eq 1 ]; then
110        echo "Would normally quit here, but you passed -f, so we keep going..."
111    else
112        echo "Ending upgrade at $(date)"
113        exit 0
114    fi
115}
116
117if [ $DEBUG -ne 1 ]; then
118    # Redirect output to a log file
119    # Unless we're in debug mode
120    exec >>/var/log/athena-upgrade 2>&1
121fi
122
123echo
124echo "Starting upgrade at $(date)"
125
126# Not supported on Debian
127if [ "$(lsb_release -si)" != "Ubuntu" ]; then
128    debug "Only supported on Ubuntu.".
129    exit 0
130fi
131# Skip other sanity checks in debug mode
132if [ $DEBUG -ne 1 ]; then
133    # Only run this on cluster
134    if [ "$(machtype -L)" != "debathena-cluster" ] && \
135       [ "$UPGRADE_ANYWAY" != "yes" ]; then
136        debug "Not a cluster machine and UPGRADE_ANYWAY != yes.".
137        exit 0
138    fi
139   
140    # Bail if someone is logged in (stolen from auto-update)
141    ttys=$(w -h -s | awk '{print $2}')
142    for tty in $ttys; do
143        pids=$(ps --no-heading -j -t "$tty" 2>/dev/null \
144            | awk '($1 == $3) {print $1}')
145        if [ -n "$pids" ]; then
146            debug "Users logged in, won't continue."
147            debug "PIDs: $pids"
148            maybe_quit
149        fi
150    done
151
152    # screen processes count as logins.
153    if pgrep '^screen' > /dev/null; then
154        debug "Screen processes found, won't continue."
155        maybe_quit
156    fi
157fi
158export CLUSTERINFO=$(getcluster -b $(lsb_release -sr))
159[ $? != 0 ] && complain "Failed to get clusterinfo" && exit 1
160eval $CLUSTERINFO
161REINSTALL=no
162UBUNTU_RELEASE=
163if [ ! -z "$NEW_PRODUCTION_RELEASE" ]; then
164    debug "Taking new production release: $NEW_PRODUCTION_RELEASE"
165    NEWCLUSTER=`getcluster -b $NEW_PRODUCTION_RELEASE`
166    [ $? != 0 ] && complain "Failed to get clusterinfo" && exit 1
167    # This will set UBUNTU_RELEASE
168    eval $NEWCLUSTER
169elif [ ! -z "$NEW_TESTING_RELEASE" ] && \
170    [ "$UPGRADE_TO_TESTING" = "yes" ]; then
171    debug "Taking new testing release: $NEW_TESTING_RELEASE"
172    NEWCLUSTER=`getcluster -b $NEW_TESTING_RELEASE`
173    [ $? != 0 ] && complain "Failed to get clusterinfo" && exit 1
174    # This will set UBUNTU_RELEASE
175    eval $NEWCLUSTER
176elif [ ! -z "$REINSTALL_AT" ] && echo $REINSTALL_AT | grep -qx '[0-9]*'; then
177    debug "Found REINSTALL_AT = $REINSTALL_AT ..."
178    installtime=$(stat -c "%Y" /var/log/athena-install.log 2>/dev/null)
179    debug "Machine was last installed at $installtime"
180    if [ -z "$installtime" ]; then
181        echo "W: Could not stat /var/log/athena-install.log, forcing reinstall."
182        installtime=0
183    fi
184    if [ $installtime -lt $REINSTALL_AT ]; then
185        debug "$installtime less than $REINSTALL_AT, so reinstalling"
186        REINSTALL=yes
187        UBUNTU_RELEASE="$(lsb_release -sc)"
188    fi
189fi
190if [ "$(lsb_release -sc)" = "$UBUNTU_RELEASE" ] && \
191   [ "$REINSTALL" = "no" ]; then
192    complain "Tried to upgrade to already running release; shouldn't happen"
193    exit 1
194fi
195if [ -z "$UBUNTU_RELEASE" ]; then
196    if [ -n "$DEBUG_RELEASE" ]; then
197        UBUNTU_RELEASE=$DEBUG_RELEASE
198    else
199        echo "No new releases found."
200        exit 0
201    fi
202fi
203echo "Found $UBUNTU_RELEASE, starting upgrade"
204
205# That's a space and then a tab inside the brackets
206if egrep -q '^flags[    ].* lm( |$)' /proc/cpuinfo; then
207    arch=amd64
208else
209    arch=i386
210fi
211debug "Arch: $arch"
212IPADDR=
213NETMASK=
214eval `ifconfig eth0 |perl -ne'/^\s+inet addr:([\d\.]+).*? Mask:([\d\.]+)/ && print "IPADDR=$1 NETMASK=$2"'`
215if [ -z "$IPADDR" ]; then
216    complain "Couldn't get IPADDR from ifconfig!"
217    exit 0
218fi
219GATEWAY=`route -n | awk '/^0\.0\.0\.0/ { print $2 }'`
220debug "Using IPADDR=$IPADDR"
221debug "Using NETMASK=$NETMASK"
222debug "Using GATEWAY=$GATEWAY"
223
224if [ -n "$NETMASK" ] && [ -n "$GATEWAY" ]; then
225  knetinfo="netcfg/get_hostname=$(hostname) \
226            netcfg/disable_autoconfig=true \
227            netcfg/get_domain=mit.edu \
228            netcfg/get_nameservers=\"18.72.0.3 18.71.0.151 18.70.0.160\"\
229            netcfg/get_ipaddress=$IPADDR \
230            netcfg/get_netmask=$NETMASK \
231            netcfg/get_gateway=$GATEWAY \
232            netcfg/confirm_static=true"
233else
234  knetinfo="netcfg/dhcp_timeout=60 netcfg/get_hostname=$(hostname)"
235fi
236
237runcmd "rm -rf /auto-upgrade"
238runcmd "mkdir -p /auto-upgrade"
239runcmd "wget http://debathena.mit.edu/net-install/${UBUNTU_RELEASE}/${arch}/initrd.gz -O /auto-upgrade/initrd.gz"
240runcmd "wget http://debathena.mit.edu/net-install/${UBUNTU_RELEASE}/${arch}/linux -O /auto-upgrade/linux"
241
242# This is just the guts of the hackboot script:
243dkargs="DEBCONF_DEBUG=5"
244kargs="$knetinfo locale=en_US \
245       keyboard-configuration/layoutcode=us \
246       quiet \
247       panic=5 \
248       interface=auto \
249       url=http://18.9.60.73/installer/${UBUNTU_RELEASE}/debathena.preseed \
250       da/pxe=cluster --"
251
252debug "USING kargs=$kargs"
253
254if [ $(echo $kargs | wc -c) -ge 512 ]; then
255    complain "kargs exceeds 512 bytes.  That's not good."
256    exit 1
257fi
258
259tmpfile="/tmp/$(basename $0).$RANDOM.tmp"
260
261cat >"$tmpfile"<<END
262#!/bin/sh
263
264echo "Adding auto-upgrade /auto-upgrade/linux" >&2
265cat<<EOF
266menuentry "auto-upgrade" {
267  insmod ext2
268  insmod part_msdos
269  insmod lvm
270  search --no-floppy --fs-uuid --set=root \${GRUB_DEVICE_UUID}
271  echo "Loading auto-upgrade kernel for ${UBUNTU_RELEASE}"
272  linux /auto-upgrade/linux $kargs
273  echo "Loading auto-upgrade ramdisk for ${UBUNTU_RELEASE}"
274  initrd /auto-upgrade/initrd.gz
275}
276EOF
277
278END
279
280
281debug "$(cat $tmpfile)"
282runcmd "cp $tmpfile /etc/grub.d/49_auto-upgrade"
283rm -f $tmpfile
284runcmd "chmod 755 /etc/grub.d/49_auto-upgrade"
285
286pie_grub
287
288runcmd "/usr/sbin/grub-set-default 0"
289runcmd "/usr/sbin/grub-reboot auto-upgrade"
290runcmd "/usr/sbin/update-grub"
291
292# rebooting into the installer kernel
293runcmd "/sbin/reboot"
Note: See TracBrowser for help on using the repository browser.