#!/bin/sh #set -e # initramfs-tools header PREREQ="" prereqs() { echo "${PREREQ}" } case "${1}" in prereqs) prereqs exit 0 ;; esac # live-initramfs header if [ -n "${NOUSER}" ] then exit 0 fi . /scripts/live-functions . /scripts/live-helpers log_begin_msg "Adding live session user..." # live-initramfs script mountpoint=/cdrom is_updates_path () { # Driver packages are stored in ubuntu-drivers// # 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 if [ -x /usr/bin/eject ] then eject fi 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 if [ -x /usr/bin/eject ] then eject fi log_end_msg log_wait_msg "Re-insert install CD and press ENTER."