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

Revision 25955, 7.8 KB checked in by jdreed, 11 years ago (diff)
In auto-update: * Provide a mechanism for reinstallation (Trac: #1305) and document it
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
162if [ ! -z "$NEW_PRODUCTION_RELEASE" ]; then
163    debug "Taking new production release: $NEW_PRODUCTION_RELEASE"
164    NEWCLUSTER=`getcluster -b $NEW_PRODUCTION_RELEASE`
165    [ $? != 0 ] && complain "Failed to get clusterinfo" && exit 1
166    eval $NEWCLUSTER
167elif [ ! -z "$NEW_TESTING_RELEASE" ] && \
168    [ "$UPGRADE_TO_TESTING" = "yes" ]; then
169    debug "Taking new testing release: $NEW_TESTING_RELEASE"
170    NEWCLUSTER=`getcluster -b $NEW_TESTING_RELEASE`
171    [ $? != 0 ] && complain "Failed to get clusterinfo" && exit 1
172    eval $NEWCLUSTER
173elif [ ! -z "$REINSTALL_AT" ] && echo $REINSTALL_AT | grep -qx '[0-9]*'; then
174    debug "Found REINSTALL_AT = $REINSTALL_AT ..."
175    installtime=$(stat -c "%Y" /var/log/athena-install.log 2>/dev/null)
176    debug "Machine was last installed at $installtime"
177    if [ -z "$installtime" ]; then
178        echo "W: Could not stat /var/log/athena-install.log, forcing reinstall."
179        installtime=0
180    fi
181    if [ $installtime -lt $REINSTALL_AT ]; then
182        debug "$installtime less than $REINSTALL_AT, so reinstalling"
183        REINSTALL=yes
184        UBUNTU_RELEASE="$(lsb_release -sc)"
185    fi
186else
187    if [[ ! -z "$DEBUG_RELEASE" ]]; then
188        UBUNTU_RELEASE=$DEBUG_RELEASE
189    else
190        echo "No new releases found."
191        exit 0
192    fi
193fi
194if [ "$(lsb_release -sc)" = "$UBUNTU_RELEASE" ]; then
195    if [ "$REINSTALL" = "no" ]; then
196        complain "Tried to upgrade to already running release; shouldn't happen"
197        exit 1
198    fi
199fi
200echo "Found $UBUNTU_RELEASE, starting upgrade"
201
202# That's a space and then a tab inside the brackets
203if egrep -q '^flags[    ].* lm( |$)' /proc/cpuinfo; then
204    arch=amd64
205else
206    arch=i386
207fi
208debug "Arch: $arch"
209IPADDR=
210NETMASK=
211eval `ifconfig eth0 |perl -ne'/^\s+inet addr:([\d\.]+).*? Mask:([\d\.]+)/ && print "IPADDR=$1 NETMASK=$2"'`
212if [ -z "$IPADDR" ]; then
213    complain "Couldn't get IPADDR from ifconfig!"
214    exit 0
215fi
216GATEWAY=`route -n | awk '/^0\.0\.0\.0/ { print $2 }'`
217debug "Using IPADDR=$IPADDR"
218debug "Using NETMASK=$NETMASK"
219debug "Using GATEWAY=$GATEWAY"
220
221if [ -n "$NETMASK" ] && [ -n "$GATEWAY" ]; then
222  knetinfo="netcfg/get_hostname=$(hostname) \
223            netcfg/disable_autoconfig=true \
224            netcfg/get_domain=mit.edu \
225            netcfg/get_nameservers=\"18.72.0.3 18.71.0.151 18.70.0.160\"\
226            netcfg/get_ipaddress=$IPADDR \
227            netcfg/get_netmask=$NETMASK \
228            netcfg/get_gateway=$GATEWAY \
229            netcfg/confirm_static=true"
230else
231  knetinfo="netcfg/dhcp_timeout=60 netcfg/get_hostname=$(hostname)"
232fi
233
234runcmd "rm -rf /auto-upgrade"
235runcmd "mkdir -p /auto-upgrade"
236runcmd "wget http://debathena.mit.edu/net-install/${UBUNTU_RELEASE}/${arch}/initrd.gz -O /auto-upgrade/initrd.gz"
237runcmd "wget http://debathena.mit.edu/net-install/${UBUNTU_RELEASE}/${arch}/linux -O /auto-upgrade/linux"
238
239# This is just the guts of the hackboot script:
240dkargs="DEBCONF_DEBUG=5"
241kargs="$knetinfo locale=en_US \
242       keyboard-configuration/layoutcode=us \
243       quiet \
244       panic=5 \
245       interface=auto \
246       url=http://18.9.60.73/installer/${UBUNTU_RELEASE}/debathena.preseed \
247       da/pxe=cluster --"
248
249debug "USING kargs=$kargs"
250
251if [ $(echo $kargs | wc -c) -ge 512 ]; then
252    complain "kargs exceeds 512 bytes.  That's not good."
253    exit 1
254fi
255
256tmpfile="/tmp/$(basename $0).$RANDOM.tmp"
257
258cat >"$tmpfile"<<END
259#!/bin/sh
260
261echo "Adding auto-upgrade /auto-upgrade/linux" >&2
262cat<<EOF
263menuentry "auto-upgrade" {
264  insmod ext2
265  insmod part_msdos
266  insmod lvm
267  search --no-floppy --fs-uuid --set=root \${GRUB_DEVICE_UUID}
268  echo "Loading auto-upgrade kernel for ${UBUNTU_RELEASE}"
269  linux /auto-upgrade/linux $kargs
270  echo "Loading auto-upgrade ramdisk for ${UBUNTU_RELEASE}"
271  initrd /auto-upgrade/initrd.gz
272}
273EOF
274
275END
276
277
278debug "$(cat $tmpfile)"
279runcmd "cp $tmpfile /etc/grub.d/49_auto-upgrade"
280rm -f $tmpfile
281runcmd "chmod 755 /etc/grub.d/49_auto-upgrade"
282
283pie_grub
284
285runcmd "/usr/sbin/grub-set-default 0"
286runcmd "/usr/sbin/grub-reboot auto-upgrade"
287runcmd "/usr/sbin/update-grub"
288
289# rebooting into the installer kernel
290runcmd "/sbin/reboot"
Note: See TracBrowser for help on using the repository browser.