Adding live-initramfs 1.87.2-1.
[live-boot-grml.git] / scripts / live-premount / 10driver_updates
1 #!/bin/sh
2
3 PREREQ=""
4 . /scripts/live-functions
5 . /scripts/live-helpers
6
7 prereqs()
8 {
9        echo "$PREREQ"
10 }
11
12 case $1 in
13 # get pre-requisites
14 prereqs)
15        prereqs
16        exit 0
17        ;;
18 esac
19
20 mountpoint=/cdrom
21
22 is_updates_path() {
23         # Driver packages are stored in ubuntu-drivers/<kver>/
24         # subdirectory. Each package contains a module for a specific
25         # kernel flavour.
26         path=$1
27         kbase=$(uname -r | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\)-.*/\1/')
28         update_dir="$path/ubuntu-drivers/$kbase"
29         if [ -d "$update_dir" ]; then
30                 if [ "$(echo $update_dir/*_$DPKG_ARCH.deb)" != \
31                         "$update_dir/*_$DPKG_ARCH.deb" ]; then
32                         echo "$update_dir"
33                         return 0;
34                 fi
35         fi
36         return 1;
37 }
38
39 is_nice_device() {
40     sysfs_path="${1#/sys}"
41     if /lib/udev/path_id "${sysfs_path}" | grep -E -q "ID_PATH=(usb|pci-[^-]*-[ide|scsi|usb])"; then
42         return 0
43     fi
44     return 1
45 }
46
47 is_supported_fs () {
48     # FIXME: do something better like the scan of supported filesystems
49     fstype="${1}"
50     case ${fstype} in
51         vfat|iso9660|udf|ext2|ext3|ntfs)
52             return 0
53             ;;
54     esac
55     return 1
56 }
57
58 check_dev_updates ()
59 {
60     sysdev="${1}"
61     devname="${2}"
62     if [ -z "${devname}" ]; then
63         devname=$(sys2dev "${sysdev}")
64     fi
65
66     fstype=$(get_fstype "${devname}")
67     if is_supported_fs ${fstype}; then
68         mount -t ${fstype} -o ro "${devname}" $mountpoint || continue
69         if is_updates_path $mountpoint; then
70             return 0
71         else
72             umount $mountpoint
73         fi
74     fi
75
76     return 1
77 }
78
79 find_driver_updates() {
80     for sysblock in $(echo /sys/block/* | tr ' ' '\n' | grep -v loop | grep -v ram); do
81         devname=$(sys2dev "${sysblock}")
82         fstype=$(get_fstype "${devname}")
83         if /lib/udev/cdrom_id ${devname} > /dev/null; then
84             if check_dev_updates "null" "${devname}" ; then
85                 return 0
86             fi
87         elif is_nice_device "${sysblock}" ; then
88             for dev in $(subdevices "${sysblock}"); do
89                 if check_dev_updates "${dev}" ; then
90                     return 0
91                 fi
92             done
93         fi
94     done
95     return 1
96 }
97
98 pulsate() {
99     if [ -x /sbin/usplash_write ]; then
100         /sbin/usplash_write "PULSATE"
101     fi
102 }
103
104
105 updates="false"
106
107 for x in $(cat /proc/cmdline); do
108         case $x in
109                 debian-installer/driver-update=*)
110                         updates=${x#debian-installer/driver-update=}
111                         ;;
112         esac
113 done
114
115 if [ "$updates" != "true" ]; then
116         log_end_msg
117         exit 0
118 fi
119
120 # Not sure what to do for network installs. I assume there isn't even a CD
121 # for this anyway, so fail.
122 if [ -n "${NETBOOT}" ]; then
123         log_end_msg
124         exit 0;
125 fi
126
127 #if chroot /root [ -f /etc/gdm/gdm-cdd.conf ]; then
128 #    GDMCONF=/etc/gdm/gdm-cdd.conf
129 #else
130 #    GDMCONF=/etc/gdm/gdm.conf
131 #fi
132
133 eject
134 log_wait_msg "Insert a driver CD and press ENTER ($DPKG_ARCH)"
135
136 log_begin_msg "Looking for driver update CD"
137
138 for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f 10 11 12 13; do
139         updates_root=$(find_driver_updates)
140         if [ "${updates_root}" ]; then
141                 break;
142         fi
143         sleep 1
144 done
145
146 log_end_msg
147
148 if [ -z "${updates_root}" ]; then
149         log_begin_msg "Could not find driver updates"
150         log_wait_msg "Re-insert install CD and press ENTER"
151         exit 0
152 fi
153
154 log_begin_msg "Copying driver updates to temporary location"
155
156 mkdir -p /tmp/driver-updates
157 cp $updates_root/*_$DPKG_ARCH.deb /tmp/driver-updates/
158 umount $mountpoint
159 eject
160
161 log_end_msg
162
163 log_wait_msg "Re-insert install CD and press ENTER."