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