[Petter Reinholdtsen] > One way to do this would be to look for the requested firmware files > in the Contents file available from the APT mirrors.
I wrote a script to test this approach. It is attached, and seem to be working fairly well. It is also included in svn for debian-edu-config. -- Happy hacking Petter Reinholdtsen
#!/bin/sh # # Find missing firmware files requested by the kernel, and install the # binary packages with the files from the non-free section. tmpdir=$(mktemp -d) cd $tmpdir || exit 1 dist=$(lsb_release -cs) arch=$(dpkg --print-architecture) mirror=http://cdn.debian.net/debian # Find firmware files requested by kernel drivers fwfiles=$(dmesg |grep "firmware: requesting"|rev|awk '{print $1}'|rev|sort -u) if [ -z "$fwfiles" ] ; then echo "info: did not find any firmware files requested by the kernel in dmesg. exiting" exit fi GET $mirror/dists/$dist/Contents-$arch.gz | gunzip | grep ^lib/firmware > Fw-Contents-$arch binpkginfos="" binpkgs="" for fwfile in $fwfiles ; do fwfilere=$(echo $fwfile | sed -e 's%/%\\/%g' -e 's/\./\\./g') binpkginfo="$(awk "/^lib\/firmware\/$fwfilere/ {print \$2}" Fw-Contents-$arch)" if [ -z "$binpkginfo" ] ; then # Special case for b43 where the firmware is undistributable # by Debian. # FIXME verify that this is the correct of the three firmware # packages for b43. if echo $fwfile |grep -q b43-open ; then binpkgs="firmware-b43-installer $binpkgs" fi else binpkginfos="$binpkginfos $binpkginfo" fi done binpkgs="$( for binpkginfo in $binpkginfos ; do echo $binpkginfo | while IFS=/ read section srcpkg binpkg ; do echo $binpkg # Enable the non-free section if it is needed if [ non-free = "$section" ] ; then cat <<EOF > /etc/apt/sources.list.d/auto-addfirmware.list deb $mirror $dist non-free deb-src $mirror $dist non-free EOF fi done done) $binpkgs" # Fetch updated package lists apt-get update # Install firmware packages apt-get install -y $binpkgs cd / rm -rf $tmpdir