#!/bin/bash

MODPROBE=/sbin/modprobe
CONFIG=/etc/modules_lookup.conf

#DEBUG=1
#exec >& /var/tmp/module_lookup.log
#MODPROBE="echo /sbin/modprobe"

#if [ -x /usr/bin/logger ]; then
#    LOGGER=/usr/bin/logger
#elif [ -x /bin/logger ]; then
#    LOGGER=/bin/logger
#else
#    unset LOGGER
#fi
#
# for diagnostics
#
if [ -t 1 -o -z "$LOGGER" ]; then
    mesg () {
	echo "$@"
    }
else
    mesg () {
	$LOGGER -t $(basename $0)"[$$]" "$@"
	echo "$@"
    }
fi

lprintf() {
    local str
    str=`printf "$@"`
    mesg "$str"
}

decho () {
    test "$DEBUG" = "" -o "$DEBUG" = no && return
    mesg "$@"
}

dprintf () {
    test "$DEBUG" = "" -o "$DEBUG" = no && return
    lprintf "$@"
}

function warn() {
    lprintf "$@"
}

function die() {
    lprintf "$@"
    exit 1
}

declare -x REQ_EVENT REQ_NAME EVENT ACTION NAME MODULE NAME_MATCHED

REQ_EVENT=$1
REQ_NAME=$2

decho "$0 \"$REQ_EVENT\" \"$REQ_NAME\""

[ -s "$CONFIG" ] || exit 0

IFS=,
while read line; do
    set -- ${line%%#*} ''
    unset EVENT ACTION NAME MODULE NAME_MATCHED
    test $# -eq 1 && continue
    while test $# -gt 1; do
	eval "$1"
	shift
    done
    dprintf 'EVENT="%s", ACTION="%s", NAME="%s", MODULE="%s"\n' "$EVENT" "$ACTION" "$NAME" "$MODULE"
    if [ -z "$NAME" ]; then
	warn "Rule '$line' with empty NAME is ignored\n"
	continue
    fi
    [ -n "$EVENT" -a -n "$REQ_EVENT" -a "x$EVENT" != "x$REQ_EVENT" ] && continue
    # Ugly workaround against yet another bash deficiency
    eval "case \"\$REQ_NAME\" in
     $NAME)
	NAME_MATCHED=1
        ;;
    esac"
    [ -z "$NAME_MATCHED" ] && continue
    if [ -n "$MODULE" ]; then
	decho "$MODPROBE $MODULE"
	eval "$MODPROBE \"$MODULE\""
    fi
    if [ -n "$ACTION" ]; then
	decho "Evaluation \"$ACTION\""
	eval "$ACTION" # Not sure if this is correct
    fi
done < $CONFIG
