#!/bin/bash
#
# Download the latest driver for a given kernel.
#
# This script uses up2date to access the Unbreakable Linux Network (ULN).
# 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] [<kernel_version>]"

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

exec 3>/dev/null

help=
verbose=
version=
usage=
dry_run=
download_only=
kernel_version=
while case "$#" in 0) break ;; esac
do
    case "$1" in
    -n|--dry-run)
        dry_run=--dry-run
        ;;
    -d|--download-only)
        download_only=t
        ;;
    -v|--verbose)
        verbose=-v
        exec 3>&2
        ;;
    -V|--version)
        version=t
        ;;
    -h|--help)
        help=t
        ;;
    -*)
        usage=t
        ;;
    *)
        if [ -z "$kernel_version" ]
        then
            kernel_version="$1"
        else
            usage=t
        fi
        ;;
    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

case "$VENDOR" in
rhel5|rhel4|rhel3)
    ;;
"")
    die "Driver update unsupported for unknown vendor"
    ;;
*)
    die "Driver updated unsupported for this vendor"
    ;;
esac


#
# Now let's actually do something
#


#
# Our driver packages are always named
# "${DRIVER}-<kernel_version>", where <kernel_version> is the output
# of `uname -r`.  So, let's get our driver package name to use later.
#
if [ -z "$kernel_version" ]
then
    kernel_version="$(uname -r)"
fi
if [ ! -d "/lib/modules/${kernel_version}" ] || ! rpm -qf "/lib/modules/${kernel_version}" 1>/dev/null 2>&1
then
    die "Kernel ${kernel_version} is not installed"
fi

kernel_arch="$(rpm -qf "/lib/modules/${kernel_version}" --qf "%{ARCH}" 2>&3)"
if [ $? != 0 -o -z "$kernel_arch" ]
then
    die "Unable to determine kernel package architecture"
fi

echo -e "Kernel:\t\t$kernel_version $kernel_arch"

DRIVER_NAME="${DRIVER}-${kernel_version}"
echo -e "Driver name:\t$DRIVER_NAME"

up2date_cmd="up2date -i"
if [ "$download_only" = "t" ]
then
    up2date_cmd="up2date -d"
fi

$up2date_cmd $dry_run "$DRIVER_NAME"

exit 0
