#! /bin/sh

# $Progeny$

# Copyright 2002 Hewlett-Packard Company
# Copyright 2004 Progeny Linux Systems, Inc.
# Copyright 2006 Petter Reinholdtsen
#
# Based on discover-modprobe, modified to install debian packages instead
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

set -e

# Make sure the debconf question is asked in a sub-process, to avoid
# locking the debconf database when installing packages.
if [ true = "$DISCOVER_PKGINSTALL_ASKING" ] ; then
    . /usr/share/debconf/confmodule
    pkglist="`echo $@ | sed 's/ /, /g'`"
    db_subst discover/install_hw_packages PACKAGES "$pkglist"
    db_set discover/install_hw_packages "$pkglist"
    db_fset discover/install_hw_packages seen false
    db_input medium discover/install_hw_packages || [ $? -eq 30 ]
    db_go
    db_get discover/install_hw_packages
    db_stop
    echo $RET | sed 's/,//g' 1>&15
    exit 0
fi

# Too bad we don't have something like sysexits.h for POSIX sh...

EX_USAGE=64

# These defaults are only used if discover-config can not be found.
# This is the case if /usr isn't mounted yet.

sysconfdir=/etc
discover=discover
types="all"

if [ -x /usr/bin/discover-config ]; then
    sysconfdir="$(discover-config --sysconfdir)"
fi

if [ -x /sbin/discover ]; then
    discover=/sbin/discover
elif [ -x /usr/bin/discover ]; then
    discover=/usr/bin/discover
elif [ -x /bin/discover-static ]; then
    discover=/bin/discover-static
fi

conf="${sysconfdir}/discover-pkginstall.conf"

[ -e ${conf} ] && . "${conf}"

usage ()
{
    cat <<EOF
usage: $0 [-lnv]
EOF
}

###############################################################################

nop=
verbose=false
listonly=false
while getopts lnv ch; do
    case $ch in
    l)
        listonly=true
        ;;
    n)
        nop=echo
        ;;
    v)
        verbose=true
        ;;
    ?)
        usage
        exit ${EX_USAGE}
    esac
done
shift $((${OPTIND} - 1))

###############################################################################

${verbose} && printf "Discovering hardware: "

if [ -e /etc/debian_version ] ; then
    version="$(cat /etc/debian_version)"
    if [ testing/unstable != "$version" ] &&
       [ lenny/sid != "$version" ] ; then 
        dataversion="--data-version=$(cat /etc/debian_version)"
    fi
fi

packages=$(${discover} --data-path=package/debian/name \
	${dataversion} ${types} | grep -E -v '^ *$' | sort -u)

${verbose} && echo ${packages}

# Build kernel modules from all module-assistant packages.
assist_modules() {
    if [ -d /usr/share/modass/overrides ] ; then
	echo "Invoking module-assistant to build kernel modules"
	module-assistant prepare
	for pkg in $packages ; do
	    if [ -f /usr/share/modass/overrides/$pkg ] ; then
		module-assistant build $pkg
		module-assistant install $pkg
		module-assistant clean $pkg
	    fi
	done
    fi
}

if [ "$packages" ] ; then
    if [ true = "$listonly" ] ; then
        echo $packages
    else
        # Trick to avoid locking the debconf database when installing
        # packages.  The redirects are gross hacks to work around
        # debconf file descriptor handling
        tempfile=$(tempfile)
        DISCOVER_PKGINSTALL_ASKING=true $0 $packages 15>$tempfile
        packages=$(cat $tempfile)
        rm $tempfile

        if [ "$packages" ] ; then
            $nop aptitude install -y $packages
            assist_modules
        fi
    fi
else
    ${verbose} && echo "No hardware specific packages found for this machine"
fi

exit 0
