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

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