source: trunk/debathena/scripts/installer/install-debathena.beta.sh @ 25160

Revision 25160, 12.9 KB checked in by jdreed, 13 years ago (diff)
* Support natty * Be clearer about what "not up to date" means
Line 
1#!/bin/sh
2# Athena installer script.
3# Maintainer: debathena@mit.edu
4# Based on original Debathena installer script by: Tim Abbott <tabbott@mit.edu>
5
6# Download this to a Debian or Ubuntu machine and run it as root.  It can
7# be downloaded with:
8#   wget -N http://debathena.mit.edu/install-debathena.sh
9
10set -e
11
12# If we run with the noninteractive frontend, mark Debconf questions as
13# seen, so you don't see all the suppressed questions next time you
14# upgrade that package, or worse, upgrade releases.
15export DEBCONF_NONINTERACTIVE_SEEN=true
16
17output() {
18  printf '\033[38m'; echo "$@"; printf '\033[0m'
19}
20
21error() {
22  printf '\033[31m'; echo "$@"; printf '\033[0m'
23}
24
25ask() {
26  answer=''
27  while [ y != "$answer" -a n != "$answer" ]; do
28    printf '\033[38m'; echo -n "$1"; printf '\033[0m'
29    read answer
30    [ Y = "$answer" ] && answer=y
31    [ N = "$answer" ] && answer=n
32    [ -z "$answer" ] && answer=$2
33  done
34  output ""
35}
36
37if [ `id -u` != "0" ]; then
38  error "You must run the Debathena installer as root."
39  if [ -x /usr/bin/sudo ]; then
40    error "Try running 'sudo $0'."
41  fi
42  exit 1
43fi
44
45echo "Welcome to the Debathena installer."
46echo ""
47echo "Please choose the category which best suits your needs.  Each category"
48echo "in this list includes the functionality of the previous ones.  See the"
49echo "documentation at http://debathena.mit.edu for more information."
50echo ""
51echo "  standard:        Athena client software and customizations"
52echo "                   Recommended for laptops and single-user computers."
53echo "  login:           Allow Athena accounts to log into your machine"
54echo "                   Recommended for private remote-access servers."
55echo "  login-graphical: Athena graphical login customizations"
56echo "                   Recommended for private multi-user desktops."
57echo "  workstation:     Graphical workstation with automatic updates"
58echo "                   Recommended for auto-managed cluster-like systems."
59echo ""
60
61category=""
62if test -f /root/pxe-install-flag ; then
63  pxetype=`head -1 /root/pxe-install-flag`
64  if [ cluster = "$pxetype" ] ; then
65    category=cluster ;
66    echo "PXE cluster install detected, so installing \"cluster\"."
67  fi
68fi
69while [ standard != "$category" -a login != "$category" -a \
70        login-graphical != "$category" -a workstation != "$category" -a \
71        cluster != "$category" ]; do
72  output -n "Please choose a category or press control-C to abort: "
73  read category
74done
75mainpackage=debathena-$category
76
77csoft=no
78tsoft=no
79resolvconfhack=no
80echo "The extra-software package installs a standard set of software"
81echo "determined to be of interest to MIT users, such as LaTeX.  It is pretty"
82echo "big (several gigabytes, possibly more)."
83echo ""
84echo "Note: This package may include software with additional license terms."
85echo "      By installing it, you are agreeing to the terms of these licenses."
86echo "      For more information, please see http://debathena.mit.edu/licensing"
87echo ""
88if [ cluster = $category -o workstation = $category ] ; then
89  # See Trac #648 and LP:471975
90  resolvconfhack=yes
91  echo "The extra-software package is required for '$category' and will be installed."
92  csoft=yes
93  # Not setting tsoft=yes here; -cluster will pull it in anyway.
94else
95  ask "Do you want the extra-software package [y/N]? " n
96  if [ y = "$answer" ]; then
97    csoft=yes
98  fi
99fi
100if [ yes = "$csoft" ]; then
101    # Preseed an answer to the java license query, which license was already accepted
102    # at install time:
103    echo "sun-java6-bin shared/accepted-sun-dlj-v1-1 boolean true" |debconf-set-selections
104fi
105
106echo "A summary of your choices:"
107echo "  Category: $category"
108echo "  Extra-software package: $csoft"
109echo "  Third-party software package: $tsoft"
110echo ""
111if [ "$pxetype" = "cluster" ] ; then
112  if wget -q http://athena10.mit.edu/installer/installing.txt; then
113     cat installing.txt > /dev/tty6
114     chvt 6
115  fi
116  # Divert the default background and install our own so that failed machines
117  # are more conspicuous
118  echo "Diverting default background..."
119  bgimage=/usr/share/backgrounds/warty-final-ubuntu.png
120  divertedbg=no
121  if dpkg-divert --divert ${bgimage}.debathena --rename $bgimage; then
122      divertedbg=yes
123      if ! wget -N -O $bgimage http://debathena.mit.edu/error-background.png; then
124          echo "Hrm, that didn't work.  Oh well..."
125          dpkg-divert --rename --remove $bgimage
126          divertedbg=no
127      fi
128  fi
129
130  # Setup for package installs in a chrooted immediately-postinstall environment.
131  echo "Setting locale."
132  export LANG
133  . /etc/default/locale
134  echo "LANG set to $LANG."
135  echo "Mounting /proc."
136  mount /proc 2> /dev/null || :
137  # Clear toxic environment settings inherited from the installer.
138  unset DEBCONF_REDIR
139  unset DEBIAN_HAS_FRONTEND
140  if [ cluster = "$pxetype" ] ; then
141    # Network, LVM, and display config that's specific to PXE cluster installs.
142    # If someone is installing -cluster on an already-installed machine, it's
143    # assumed that this config has already happened and shouldn't be stomped on.
144
145    # Configure network based on the preseed file settings, if present.
146    if test -f /root/debathena.preseed ; then
147      # Switch to canonical hostname.
148      ohostname=`cat /etc/hostname`
149      # Hack to avoid installing debconf-get for just this.
150      ipaddr=`grep netcfg/get_ipaddress /root/debathena.preseed|sed -e 's/.* //'`
151      netmask=`grep netcfg/get_netmask /root/debathena.preseed|sed -e 's/.* //'`
152      gateway=`grep netcfg/get_gateway /root/debathena.preseed|sed -e 's/.* //'`
153
154      hostname=`host $ipaddr | \
155          sed 's#^.*domain name pointer \(.*\)$#\1#' | sed 's;\.*$;;' | \
156          tr '[A-Z]' '[a-z]'`
157      if echo $hostname|grep -q "not found" ; then
158        hostname=""
159        printf "\a"; sleep 1 ; printf "\a"; sleep 1 ;printf "\a"
160        echo "The IP address you selected, $ipaddr, does not have an associated"
161        echo "hostname.  Please confirm that you're using the correct address."
162        while [ -z "$hostname" ] ; do
163          echo -n "Enter fully qualified hostname [no default]: "
164          read hostname
165        done
166      fi
167      echo ${hostname%%.*} > /etc/hostname
168      sed -e 's/\(127\.0\.1\.1[         ]*\).*/\1'"$hostname ${hostname%%.*}/" < /etc/hosts > /etc/hosts.new
169      mv -f /etc/hosts.new /etc/hosts
170      if grep -q dhcp /etc/network/interfaces ; then
171        sed -e s/dhcp/static/ < /etc/network/interfaces > /etc/network/interfaces.new
172        echo "  address $ipaddr" >> /etc/network/interfaces.new
173        echo "  netmask $netmask" >> /etc/network/interfaces.new
174        echo "  gateway $gateway" >> /etc/network/interfaces.new
175        echo "  dns-nameservers 18.72.0.3 18.70.0.160 18.71.0.151" >> /etc/network/interfaces.new
176        mv -f /etc/network/interfaces.new /etc/network/interfaces
177      fi
178      hostname ${hostname%%.*}
179    fi
180
181    # Free up designated LVM overhead.
182    lvremove -f /dev/athena/keep_2 || :
183
184  fi
185else
186  output "Press return to begin or control-C to abort"
187  read dummy
188fi
189
190apt-get update
191
192output "Verifying machine is up to date..."
193pattern='^0 upgraded, 0 newly installed, 0 to remove'
194if ! apt-get --simulate --assume-yes dist-upgrade | grep -q "$pattern"; then
195    if [ -n "$pxetype" ] ; then
196        output "Forcing an upgrade"
197        apt-get --assume-yes dist-upgrade
198    else
199        error "Your system is not up to date.  Proceeding with an install at"
200        error "this time could render your system unusable."
201        error "Please run 'apt-get dist-upgrade' as root or use the GUI update"
202        error "manager to ensure your system is up to date before continuing."
203        error "NOTE: You do NOT need to upgrade to a newer release of Ubuntu",
204        error "you merely need to ensure you have the latest software updates"
205        error "for the current version."
206        exit 1
207    fi
208fi
209
210if ! hash aptitude >/dev/null 2>&1; then
211  output "Installing Debathena installer dependency: aptitude"
212  apt-get -y install aptitude
213fi
214
215output "Installing Debathena installer dependencies: lsb-release, wget, and dnsutils"
216aptitude -y install lsb-release wget dnsutils
217if [ yes = "$resolvconfhack" ]; then
218  output "Installing resolvconf ahead of time"
219  aptitude -y install resolvconf
220fi
221distro=`lsb_release -cs`
222case $distro in
223lenny|squeeze)
224  ;;
225hardy|intrepid|jaunty|karmic|lucid|maverick|natty)
226  ubuntu=yes
227  ;;
228*)
229  error "Your machine seems to not be running a supported Debian/Ubuntu release."
230  error "(New releases may not be supported immediately after their release)."
231  error "If you believe you are running a supported release, contact debathena@mit.edu"
232  exit 1
233  ;;
234esac
235
236if aptitude show openafs-modules-dkms > /dev/null; then
237  openafs_component=" openafs"
238  modules="openafs-modules-dkms"
239fi
240
241output "Adding the Debathena repository to the apt sources"
242output "(This may cause the update manager to claim new upgrades are available."
243output "Ignore them until this script is complete.)"
244sourceslist=/etc/apt/sources.list.d/debathena.list
245clustersourceslist=/etc/apt/sources.list.d/debathena.clusterinfo.list
246if [ -z "$hostname" ] ; then hostname=`hostname` ; fi
247hescluster=$(dig +short +bufsize=2048 ${hostname}.cluster.ns.athena.mit.edu TXT \
248    |sed -e 's/"$//' -ne 's/^"apt_release //p') || hescluster=""
249
250if [ ! -e "$sourceslist" ] || ! grep -q debathena "$sourceslist"; then
251  if [ -e "$sourceslist" ]; then
252    echo "" >> $sourceslist
253  fi
254  echo "deb http://debathena.mit.edu/apt $distro debathena debathena-config debathena-system$openafs_component" >> $sourceslist
255  echo "deb-src http://debathena.mit.edu/apt $distro debathena debathena-config debathena-system$openafs_component" >> $sourceslist
256fi
257
258if [ development = "$hescluster" -o proposed = "$hescluster" ] ; then
259  echo "Adding $distro-proposed apt repository."
260  echo "# This file is automatically updated by debathena-auto-update" >> $clustersourceslist
261  echo "# based on your Hesiod cluster information. If you want to" >> $clustersourceslist
262  echo "# make changes, do so in another file." >> $clustersourceslist
263  echo "" >> $clustersourceslist
264
265  echo "deb http://debathena.mit.edu/apt $distro-proposed debathena debathena-config debathena-system$openafs_component" >> $clustersourceslist
266  echo "deb-src http://debathena.mit.edu/apt $distro-proposed debathena debathena-config debathena-system$openafs_component" >> $clustersourceslist
267fi
268
269if [ development = "$hescluster" ] ; then
270  echo "Adding $distro-development apt repository."
271  echo "deb http://debathena.mit.edu/apt $distro-development debathena debathena-config debathena-system$openafs_component" >> $clustersourceslist
272  echo "deb-src http://debathena.mit.edu/apt $distro-development debathena debathena-config debathena-system$openafs_component" >> $clustersourceslist
273fi
274
275if [ "$ubuntu" = "yes" ]; then
276  output "Making sure the universe repository is enabled"
277  sed -i 's,^# \(deb\(\-src\)* http://archive.ubuntu.com/ubuntu [[:alnum:]]* universe\)$,\1,' /etc/apt/sources.list
278fi
279
280output "Downloading the Debathena archive signing key"
281if ! wget -N http://debathena.mit.edu/apt/debathena-archive-keyring.asc ; then
282  error "Download failed; terminating."
283  exit 1
284fi
285echo "fa787714d1ea439c28458aab64962f755e2bdee7a3520919a72b641458757fa3586fd269cc1dae8d99047e00b3df88db0826f0c99a1f5a8771618b3c0be8e3bd  ./debathena-archive-keyring.asc" | \
286  sha512sum -c
287apt-key add debathena-archive-keyring.asc
288rm ./debathena-archive-keyring.asc
289
290apt-get update
291
292if [ -z "$modules" ]; then
293  modules_want=$(dpkg-query -W -f '${Source}\t${Package}\n' 'linux-image-*' | \
294   sed -nre 's/^linux-(meta|latest[^\t]*)\tlinux-image-(.*)$/openafs-modules-\2/p')
295  modules=
296  for m in $modules_want; do
297    aptitude show $m > /dev/null && modules="$modules $m"
298  done
299fi
300
301if [ -z "$modules" ]; then
302  error "An OpenAFS modules metapackage for your kernel is not available."
303  error "Please use the manual installation instructions at"
304  error "http://debathena.mit.edu/install"
305  error "You will need to compile your own AFS modules as described at:"
306  error "http://debathena.mit.edu/troubleshooting#openafs-custom"
307  exit 1
308fi
309
310output "Installing OpenAFS kernel metapackage"
311apt-get -y install $modules
312
313# Use the noninteractive frontend to install the main package.  This
314# is so that AFS and Zephyr don't ask questions of the user which
315# debathena packages will later stomp on anyway.
316output "Installing main Debathena metapackage $mainpackage"
317
318DEBIAN_FRONTEND=noninteractive aptitude -y install "$mainpackage"
319
320# Use the default front end and allow questions to be asked; otherwise
321# Java will fail to install since it has to present its license.
322if [ yes = "$csoft" ]; then
323  output "Installing debathena-extra-software"
324  DEBIAN_PRIORITY=critical aptitude -y install debathena-extra-software
325fi
326if [ yes = "$tsoft" ]; then
327  output "Installing debathena-thirdparty"
328  DEBIAN_PRIORITY=critical aptitude -y install debathena-thirdparty
329fi
330
331# Post-install cleanup for cluster systems.
332if [ "$divertedbg" = "yes" ]; then
333    rm -f $bgimage
334    if ! dpkg-divert --rename --remove $bgimage; then
335        echo "Failed to remove diversion of background.  You probably don't care."
336    fi
337fi
338
339if [ cluster = "$category" ] ; then
340  # Force an /etc/adjtime entry so there's no confusion about whether the
341  # hardware clock is UTC or local.
342  echo "Setting hardware clock to UTC."
343  hwclock --systohc --utc
344fi
Note: See TracBrowser for help on using the repository browser.