#! /bin/sh
#
# Copyright (C) 2014 Petter Reinholdtsen <pere@hungry.com>
#
# Licensed under the GNU General Public License Version 2
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.

set -e

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

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

Install packages based on detected hardware.  It will use the isenkram
system to map from hardware to debian packages and install the
packages by default.  Packages using module-assistant will be
automatically built and the result installed if module-assistant is
installed or pulled in as a dependency.

  -l  list packages
  -v  be verbose
  -n  only echo commands, do not run them

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 64
    esac
done
shift $((${OPTIND} - 1))

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

# Build kernel modules from all module-assistant packages.
assist_modules() {
    # Check if any packages supported by module-assistant is installed
    if [ ! -x /usr/bin/module-assistant ] ; then
	return # module-assistant not installed, no need to continue
    fi
    prepared=false
    for pkg in $packages ; do
	# Check if this package is supported by module-assistant
	if module-assistant --text-mode --non-inter list $pkg |
	    grep -q 'package not installed' ; then
	    :
	else
	    if [ false = "$prepared" ] ; then
                # Would like to use --non-inter here, but then prepare
                # exits using 254
		if module-assistant --text-mode prepare ; then
		    prepared=true
		else
		    echo error: Failed to prepare module-assistant.
		    return
		fi
	    fi
	    ${verbose} && echo "info: invoking module-assistant to handle $pkg."
	    $nop module-assistant --text-mode --non-inter \
		build,install,clean $pkg
	fi
    done
}

${verbose} && printf "Discovering packages for the current hardware: "
packages=$( (isenkram-lookup -l || true ; \
    isenkram-autoinstall-firmware -l 2>/dev/null || true ) | sort -u)
${verbose} && echo ${packages}

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)
        LOOKUP_PKGINSTALL_ASKING=true $0 $packages 8>$tempfile
        packages=$(cat $tempfile)
        rm $tempfile

        if [ "$packages" ] ; then
            if [ -x /usr/bin/debconf-apt-progress ] ; then
                if [ "$DI_PROGRESS_BAR_VISIBLE" ]; then
                    debconf_apt_progress_opts=--no-progress
                else
                    debconf_apt_progress_opts=
                fi
                $nop debconf-apt-progress $debconf_apt_progress_opts -- apt-get install -q -y $packages
            else
                $nop apt-get install -y $packages
            fi
            assist_modules
        fi
    fi
else
    ${verbose} && echo "info: no hardware specific packages found for this machine"
fi

exit 0
