166 lines
3.1 KiB
Plaintext
166 lines
3.1 KiB
Plaintext
|
#! /bin/bash
|
||
|
|
||
|
LC_ALL=POSIX
|
||
|
|
||
|
usage() {
|
||
|
cat <<EOF
|
||
|
Usage: ${0##*/} [-i module] [-x module] [-Nv] {module|rpm} ...
|
||
|
|
||
|
-i Include the specified modules (glob expression).
|
||
|
|
||
|
-x Exclude the specified modules (glob expression).
|
||
|
|
||
|
-N Don't try to combine modalias tags that only differ in one character.
|
||
|
|
||
|
-v Verbose: report which modules define which aliases.
|
||
|
EOF
|
||
|
exit $1
|
||
|
}
|
||
|
|
||
|
ARGS=("$@")
|
||
|
|
||
|
options=`getopt -o i:x:vNh -- "$@"`
|
||
|
|
||
|
if [ $? -ne 0 ]
|
||
|
then
|
||
|
usage 2
|
||
|
fi
|
||
|
|
||
|
eval set -- "$options"
|
||
|
|
||
|
opt_combine=1
|
||
|
while :; do
|
||
|
case "$1" in
|
||
|
-i)
|
||
|
include="$include ${2%.ko}"
|
||
|
shift 2
|
||
|
;;
|
||
|
-x)
|
||
|
exclude="$exclude ${2%.ko}"
|
||
|
shift 2
|
||
|
;;
|
||
|
-v)
|
||
|
opt_verbose=1
|
||
|
shift ;;
|
||
|
-N)
|
||
|
opt_combine=
|
||
|
shift ;;
|
||
|
-h)
|
||
|
usage 0
|
||
|
;;
|
||
|
--)
|
||
|
shift
|
||
|
break
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
process_module() {
|
||
|
declare module=$1 base=${1##*/} aliases
|
||
|
|
||
|
if [ -n "$include" ]; then
|
||
|
included=
|
||
|
for x in $include; do
|
||
|
eval "case \"\${base%.ko}\" in (${x%.ko}) included=1;; esac"
|
||
|
done
|
||
|
else
|
||
|
included=1
|
||
|
fi
|
||
|
for x in $exclude; do
|
||
|
eval "case \"\${base%.ko}\" in (${x%.ko}) included=;; esac"
|
||
|
done
|
||
|
[ -n "$included" ] || return
|
||
|
|
||
|
aliases="$(/sbin/modinfo -F alias "$module" \
|
||
|
| sed -nre 's@^.+:.+$@Supplements: modalias(&)@p')"
|
||
|
if [ -n "$aliases" ]; then
|
||
|
eval "processed_module_${base//[^a-zA-Z0-9_]/_}=$base"
|
||
|
echo "$aliases" \
|
||
|
| if [ -n "$opt_verbose" ]; then
|
||
|
sed -e "s@\$@ # $base@"
|
||
|
else
|
||
|
cat
|
||
|
fi
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
print_modaliases() {
|
||
|
declare class=$1 variants=$2 pos=$3
|
||
|
if [ -n "$variants" ]; then
|
||
|
echo "${class:0:pos}[$variants]${class:pos+1}"
|
||
|
else
|
||
|
[ -z "$class" ] || echo "$class"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
combine_modaliases() {
|
||
|
declare tag class variants pos n
|
||
|
read class
|
||
|
while read tag; do
|
||
|
for ((n=0; n<${#class}; n++)); do
|
||
|
if [ "*" != "${class:n:1}" -a \
|
||
|
"${class:0:n}" = "${tag:0:n}" -a \
|
||
|
"${class:n+1}" = "${tag:n+1}" ] &&
|
||
|
( [ -z "$pos" ] || [ $n = $pos ] ); then
|
||
|
variants="${variants:-${class:n:1}}${tag:n:1}"
|
||
|
pos=$n
|
||
|
break
|
||
|
fi
|
||
|
done
|
||
|
if [ $n -eq ${#class} ]; then
|
||
|
print_modaliases "$class" "$variants" "$pos"
|
||
|
variants=
|
||
|
pos=
|
||
|
class=$tag
|
||
|
fi
|
||
|
done
|
||
|
print_modaliases "$class" "$variants" "$pos"
|
||
|
}
|
||
|
|
||
|
tmp=$(mktemp -t ${0##*/}.XXXXXX)
|
||
|
trap "rm -f $tmp" EXIT
|
||
|
|
||
|
for file in "$@"; do
|
||
|
case "$(file -b "$file")" in
|
||
|
RPM*)
|
||
|
tmpdir=$(mktemp -td ${0##*/}.XXXXXX)
|
||
|
rpm2cpio "$file" | ( cd $tmpdir && cpio -dim --quiet )
|
||
|
for module in $(find $tmpdir -type f -name '*.ko'); do
|
||
|
process_module "$module" >> $tmp
|
||
|
done
|
||
|
rm -rf $tmpdir
|
||
|
;;
|
||
|
ELF*)
|
||
|
process_module "$file" >> $tmp
|
||
|
;;
|
||
|
*)
|
||
|
if [ -e "$file" ]; then
|
||
|
echo "File type of $file not supported" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
file2=$(/sbin/modinfo -F filename "${file%.ko}")
|
||
|
if ! [ -e "$file2" ]; then
|
||
|
echo "No module $file found" >&2
|
||
|
exit 1
|
||
|
fi
|
||
|
process_module "$file2" >> $tmp
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
if [ -n "${!processed_module_*}" ]; then
|
||
|
echo "# Modules:" $(for m in ${!processed_module_*}; do echo ${!m}; done \
|
||
|
| sort -u)
|
||
|
|
||
|
sort -u $tmp \
|
||
|
| if [ -n "$opt_combine" ]; then
|
||
|
combine_modaliases
|
||
|
else
|
||
|
cat
|
||
|
fi
|
||
|
|
||
|
echo "# Generated with: ${0##*/} ${ARGS[*]}"
|
||
|
fi
|
||
|
|
||
|
# vim:softtabstop=4 shiftwidth=4
|