#!/bin/bash
#
# Download drivers for kernels.
#
# This script determines whether the sepcified kernel(s) need a driver
# or a driver update and installs the driver(s) appropriately.
#
# This is only for RPM-based systems, as it uses RPM queries.
#
# The kernel(s) can be specified on the command line.  The '-a' option
# will use all installed kernels.  If no kernel is specified, the currently
# running kernel will be chosen.
#
# If a kernel already has a driver, the '-u' option will upgrade the driver
# to the latest available version.
#
# Because it attempts to be generic and usable for more than one driver,
# it gets the driver name from $(basename $0).
#

# Force LC_ALL=C
export LC_ALL=C
 
# Detected distribution vendor
VENDOR=rhel6

USAGE="[-n] [-d] [-u] [-a | <kernel_version> ...]"

DRIVER="$(basename $0 | sed -e 's/-get-driver$//')"

exec 3>/dev/null

help=
verbose=
version=
usage=
dry_run=
download_only=
detect_kernels=
update_driver=
kernel_versions=
install_versions=
while case "$#" in 0) break ;; esac
do
    case "$1" in
    -n|--dry-run)
        dry_run=--dry-run
        ;;
    -d|--download-only)
        download_only=--download-only
        ;;
    -a|--all)
        [ -n "$kernel_versions" ] && usage=t
        detect_kernels=t
        ;;
    -u|--update)
        update_driver=t
        ;;
    -v|--verbose)
        verbose=-v
        exec 3>&2
        ;;
    -V|--version)
        version=t
        ;;
    -h|--help)
        help=t
        ;;
    -*)
        usage=t
        ;;
    *)
        [ -n "$detect_kernels" ] && usage=t
        kernel_versions="$kernel_versions $1"
        ;;
    esac
    shift
done

#
# Some basic functions
#
error()
{
    if [ $# -gt 0 ]
    then
        echo >&2 "$@"
    fi
}

die()
{
    error "$@"
    exit 1
}

usage()
{
    die "Usage: $(basename $0) $USAGE"
}


version()
{
    die "$0 version 2.1.8"
}


if [ "$help" = "t" -o "$usage" = "t" ]
then
    usage
fi

if [ "$version" = "t" ]
then
    version
fi


#
# Now let's actually do something
#

: detect_kernels
# Determine the kernel versions installed on the system
detect_kernels()
{
    rpm -ql --whatprovides kernel |
        awk '/System.map/{sub(/^.*System.map-/,""); print;}'
}

if [ "$detect_kernels" = "t" ]
then
    kernel_versions="$(detect_kernels)"
fi

#
# If no kernel versions were specified, let's do the currently running
# kernel.
#
if [ -z "$kernel_versions" ]
then
    kernel_versions="$(uname -r)"
fi

for k in $kernel_versions
do
    # If '-u', always try to upgrade.  Otherwise, only install new packages.
    if [ "$update_driver" = "t" ] || \
        ! rpm -q "${DRIVER}-${k}" >/dev/null 2>&1
    then
        install_versions="$install_versions $k"
    fi
done

"${DRIVER}-update-driver" $download_only $dry_run $verbose $install_versions

exit 0
