diff options
Diffstat (limited to 'scripts/casper-premount/10driver_updates')
-rwxr-xr-x | scripts/casper-premount/10driver_updates | 163 |
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." |