#!/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} abi="$(uname -r)" kver="$(echo "$abi" | cut -d- -f1,2)" kbase="$(echo "$abi" | cut -d- -f1)" for leaf in "$abi" "$kver" "$kbase" do update_dir="$path/ubuntu-drivers/$leaf" [ -d "$update_dir" ] || continue if [ "$(echo ${update_dir}/*_${DPKG_ARCH}.deb)" != \ "${update_dir}/*_${DPKG_ARCH}.deb" ] then echo "${update_dir}" return 0 fi done 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."