summaryrefslogtreecommitdiff
path: root/scripts/casper-premount/10driver_updates
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/casper-premount/10driver_updates')
-rwxr-xr-xscripts/casper-premount/10driver_updates163
1 files changed, 163 insertions, 0 deletions
diff --git a/scripts/casper-premount/10driver_updates b/scripts/casper-premount/10driver_updates
new file mode 100755
index 0000000..8009849
--- /dev/null
+++ b/scripts/casper-premount/10driver_updates
@@ -0,0 +1,163 @@
+#!/bin/sh
+
+PREREQ=""
+. /scripts/casper-functions
+. /scripts/casper-helpers
+
+prereqs()
+{
+ echo "$PREREQ"
+}
+
+case $1 in
+# get pre-requisites
+prereqs)
+ prereqs
+ exit 0
+ ;;
+esac
+
+mountpoint=/cdrom
+
+is_updates_path() {
+ # Driver packages are stored in ubuntu-drivers/<kver>/
+ # subdirectory. Each package contains a module for a specific
+ # kernel flavour.
+ path=$1
+ kbase=$(uname -r | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\)-.*/\1/')
+ update_dir="$path/ubuntu-drivers/$kbase"
+ if [ -d "$update_dir" ]; then
+ if [ "$(echo $update_dir/*_$DPKG_ARCH.deb)" != \
+ "$update_dir/*_$DPKG_ARCH.deb" ]; then
+ echo "$update_dir"
+ return 0;
+ fi
+ fi
+ return 1;
+}
+
+is_nice_device() {
+ sysfs_path="${1#/sys}"
+ if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-[ide|scsi|usb])"; then
+ return 0
+ fi
+ return 1
+}
+
+is_supported_fs () {
+ # FIXME: do something better like the scan of supported filesystems
+ fstype="${1}"
+ case ${fstype} in
+ vfat|iso9660|udf|ext2|ext3|ntfs)
+ return 0
+ ;;
+ esac
+ return 1
+}
+
+check_dev_updates ()
+{
+ sysdev="${1}"
+ devname="${2}"
+ if [ -z "${devname}" ]; then
+ devname=$(sys2dev "${sysdev}")
+ fi
+
+ fstype=$(get_fstype "${devname}")
+ if is_supported_fs ${fstype}; then
+ mount -t ${fstype} -o ro "${devname}" $mountpoint || continue
+ if is_updates_path $mountpoint; then
+ return 0
+ else
+ umount $mountpoint
+ fi
+ fi
+
+ return 1
+}
+
+find_driver_updates() {
+ for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
+ devname=$(sys2dev "${sysblock}")
+ fstype=$(get_fstype "${devname}")
+ if /lib/udev/cdrom_id ${devname} > /dev/null; then
+ if check_dev_updates "null" "${devname}" ; then
+ return 0
+ fi
+ elif is_nice_device "${sysblock}" ; then
+ for dev in $(subdevices "${sysblock}"); do
+ if check_dev_updates "${dev}" ; then
+ return 0
+ fi
+ done
+ fi
+ done
+ return 1
+}
+
+pulsate() {
+ if [ -x /sbin/usplash_write ]; then
+ /sbin/usplash_write "PULSATE"
+ fi
+}
+
+
+updates="false"
+
+for x in $(cat /proc/cmdline); do
+ case $x in
+ debian-installer/driver-update=*)
+ updates=${x#debian-installer/driver-update=}
+ ;;
+ esac
+done
+
+if [ "$updates" != "true" ]; then
+ log_end_msg
+ exit 0
+fi
+
+# Not sure what to do for network installs. I assume there isn't even a CD
+# for this anyway, so fail.
+if [ -n "${NETBOOT}" ]; then
+ log_end_msg
+ exit 0;
+fi
+
+#if chroot /root [ -f /etc/gdm/gdm-cdd.conf ]; then
+# GDMCONF=/etc/gdm/gdm-cdd.conf
+#else
+# GDMCONF=/etc/gdm/gdm.conf
+#fi
+
+eject
+log_wait_msg "Insert a driver CD and press ENTER ($DPKG_ARCH)"
+
+log_begin_msg "Looking for driver update CD"
+
+for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
+ updates_root=$(find_driver_updates)
+ if [ "${updates_root}" ]; then
+ break;
+ fi
+ sleep 1
+done
+
+log_end_msg
+
+if [ -z "${updates_root}" ]; then
+ log_begin_msg "Could not find driver updates"
+ log_wait_msg "Re-insert install CD and press ENTER"
+ exit 0
+fi
+
+log_begin_msg "Copying driver updates to temporary location"
+
+mkdir -p /tmp/driver-updates
+cp $updates_root/*_$DPKG_ARCH.deb /tmp/driver-updates/
+umount $mountpoint
+eject
+
+log_end_msg
+
+log_wait_msg "Re-insert install CD and press ENTER."