Your IP : 3.138.199.24


Current Path : /sbin/
Upload File :
Current File : //sbin/discover-pkginstall

#! /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>&8
    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]

Install packages based on detected hardware.  It will use the
discover-data database to map from hardware to debian packages, 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 ${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() {
    # 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
	    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."
	    module-assistant --text-mode --non-inter \
		build,install,clean $pkg
	fi
    done
}

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 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