| #! /bin/sh -e |
| |
| # Naive shell script to translate modules.conf + defaults to modprobe.conf |
| # Normal caveats apply, as with any machine translation. |
| usage() { |
| cat <<-EOF |
| Usage: $0 [--assume-kernel=n.n.n] [--stdin] [modprobe.conf] |
| Converts your current modules setup to modprobe.conf. |
| Don't trust it too much. |
| Version 0.1 |
| EOF |
| exit ${1:-1} |
| } |
| |
| KV=$(uname -r) |
| STDIN= |
| while [ -n "$1" ] ; do |
| case $1 in |
| --assume-kernel) KV=$2; shift;; |
| --assume-kernel=*) KV=${1#*=};; |
| --stdin) STDIN=1;; |
| -h|--help) usage 0;; |
| *) break;; |
| esac |
| shift |
| done |
| |
| # Set up output if specified. |
| if [ $# -eq 1 ] ; then |
| exec > $1 |
| else |
| usage 1 |
| fi |
| |
| MODPROBECONF=`mktemp /tmp/modprobe.XXXXXX || tempfile || echo /tmp/modprobe.$$` |
| trap "rm -f $MODPROBECONF" 0 |
| |
| modprobe_abort() |
| { |
| echo Failed to to run modprobe. Giving up. 1>&2 |
| exit 1 |
| } |
| |
| if [ x"$TESTING_MODPROBE_CONF" != x ]; then |
| cp $TESTING_MODPROBE_CONF $MODPROBECONF |
| elif [ "$STDIN" = "1" ]; then |
| cat > $MODPROBECONF |
| elif [ -x /sbin/modprobe.old ]; then |
| # In sbin. |
| /sbin/modprobe.old -c > $MODPROBECONF || modprobe_abort |
| elif modprobe.old -c >/dev/null 2>&1; then |
| # Somewhere in path. |
| modprobe.old -c > $MODPROBECONF || modprobe_abort |
| elif /sbin/modprobe -V 2>/dev/null | grep -q 'modprobe version'; then |
| # Running /sbin/modprobe gives old version. |
| /sbin/modprobe -c > $MODPROBECONF || modprobe_abort |
| elif modprobe -V 2>/dev/null | grep -q 'modprobe version'; then |
| # Running modprobe gives old version. |
| modprobe -c > $MODPROBECONF || modprobe_abort |
| else |
| echo Cannot find old version of modprobe. Giving up. 2>&1 |
| exit 1 |
| fi |
| |
| # Resolve (possibly recursive) alias: args filename alias |
| resolve_alias() |
| { |
| RA_RESOLVE=`grep "^alias[ ][ ]*$2[ ]" -- $1 | awk '{ print $3 }'` |
| if [ x"$RA_RESOLVE" = x ]; then |
| echo $2 |
| return |
| fi |
| # Recurse. |
| (resolve_alias $1 "$RA_RESOLVE") |
| } |
| |
| # Parse alias: args filename modulename aliasto. |
| parse_alias() |
| { |
| PA_ALIAS=`resolve_alias $1 $3` |
| NAME=`echo $2|sed -e 's/\(block\|char\)-major-\([0-9]\+\)$/\1-major-\2-*/'` |
| |
| echo "alias $NAME $PA_ALIAS" |
| } |
| |
| # Parse options: args modulename aliasto. |
| parse_options() |
| { |
| # Second arg can be null if grab_noninstall options returns empty. |
| [ x"$2" = x ] || echo "options $1 $2" |
| } |
| |
| # Separate out the modprobe options from the module options |
| grab_install_options() |
| { |
| GRAB_OPTS="" |
| GRAB_NEXT=0 |
| for grab_i; do |
| case "$grab_i" in |
| -o) GRAB_OPTS="$GRAB_OPTS -o"; GRAB_NEXT=1;; |
| -*) echo Warning: Ignoring unknown alias option "$grab_i" >&2;; |
| *) |
| [ $GRAB_NEXT = 0 ] || GRAB_OPTS="$GRAB_OPTS $grab_i" |
| GRAB_NEXT=0 |
| ;; |
| esac |
| done |
| echo "$GRAB_OPTS" |
| } |
| |
| grab_noninstall_options() |
| { |
| GRAB_OPTS="" |
| GRAB_NEXT=0 |
| for grab_i; do |
| case "$grab_i" in |
| -o) GRAB_NEXT=1;; |
| -*) ;; |
| *) |
| [ $GRAB_NEXT = 1 ] || GRAB_OPTS="$GRAB_OPTS $grab_i" |
| GRAB_NEXT=0 |
| ;; |
| esac |
| done |
| echo "$GRAB_OPTS" |
| } |
| |
| # Produce a multiple install/remove commands. Args: list, command, separator. |
| multi() |
| { |
| mp_res="" |
| for mp_arg in $1; do |
| if [ x"$mp_res" = x ]; then mp_res="/sbin/$2 $mp_arg"; |
| else mp_res="$mp_res${3}/sbin/$2 $mp_arg"; |
| fi |
| done |
| echo "$mp_res" |
| } |
| |
| # Install and remove commands frequently refer to insmod and rmmod. |
| # Use "modprobe --ignore-install " and "modprobe -r --ignore-remove" since |
| # our versions of rmmod and insmod are deliberately stupid. |
| convert_command() |
| { |
| echo "$@" | sed -e 's,insmod,/sbin/modprobe --ignore-install,' -e 's,rmmod,/sbin/modprobe -r --ignore-remove,' |
| } |
| |
| while read ADD NAME MODULE REST; do |
| # Ignore a spurious add, otherwise move them down. |
| if [ x"$ADD" = x"add" ]; then :; else |
| REST="`echo $MODULE $REST | sed 's/ *$//'`" |
| MODULE="$NAME" |
| NAME="$ADD"; |
| fi |
| #echo "NAME=$NAME MODULE=$MODULE REST=$REST" >&2 |
| |
| # MODNAME is the converted name for use in variables. |
| MODNAME=`echo $MODULE | tr -c A-Za-z_0-9 _` |
| case "$NAME" in |
| '#'*) : ;; # Comment |
| '') : ;; # Blank line |
| |
| keep) # Do nothing. |
| ;; |
| |
| alias) |
| if [ x"$REST" = xoff ] || [ x"$REST" = xnull ]; then |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval install_$MODNAME=\"/bin/true\" |
| else |
| parse_alias $MODPROBECONF "$MODULE" $REST |
| fi |
| ;; |
| |
| options) |
| # Options used to be able to contain extra args to insmod |
| # (eg. -o foo). Not any more. |
| case " $REST" in |
| *' '-[-a-z]*) |
| parse_options $MODULE `grab_noninstall_options $REST` |
| INSTALL_OPTIONS=`grab_install_options $REST` |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval install_$MODNAME=\"/sbin/modprobe $INSTALL_OPTIONS --ignore-install `resolve_alias $MODPROBECONF $MODULE`\" |
| ;; |
| *) |
| parse_options $MODULE "$REST" |
| ;; |
| esac |
| ;; |
| |
| above) |
| # Pull in these modules after me. |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval post_install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\; /bin/true\" |
| REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE" |
| eval pre_remove_$MODNAME=\"`multi "$REST" 'modprobe -r' '; '`\" |
| ;; |
| below) |
| # Pull in these modules before me. |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval pre_install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\" |
| REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE" |
| eval post_remove_$MODNAME=\"`multi "$REST" 'modprobe -r' '; '`\; /bin/true\" |
| ;; |
| probe) |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval install_$MODNAME=\"`multi "$REST" 'modprobe' ' || '`\" |
| ;; |
| probeall) |
| # Not quite correct. If they all fail, we should fail. |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval install_$MODNAME=\"`multi "$REST" 'modprobe' '; '`\; /bin/true\" |
| ;; |
| post-install) |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval post_install_$MODNAME=\"`convert_command "$REST"`\" |
| ;; |
| pre-install) |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval pre_install_$MODNAME=\"`convert_command "$REST"`\" |
| ;; |
| install) |
| INSTALL_COMMANDS="$INSTALL_COMMANDS $MODULE" |
| eval install_$MODNAME=\"`convert_command "$REST"`\" |
| ;; |
| post-remove) |
| REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE" |
| eval post_remove_$MODNAME=\"`convert_command "$REST"`\" |
| ;; |
| pre-remove) |
| REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE" |
| eval pre_remove_$MODNAME=\"`convert_command "$REST"`\" |
| ;; |
| remove) |
| REMOVE_COMMANDS="$REMOVE_COMMANDS $MODULE" |
| eval remove_$MODNAME=\"`convert_command "$REST"`\" |
| ;; |
| include) |
| # Recurse. |
| ($0 $MODULE) |
| ;; |
| # Ignore default lines which are not required any more. |
| "path[boot]=/lib/modules/boot"|"path[toplevel]=/lib/modules/$KV"|"path[toplevel]=/lib/modules/2.4"|"path[kernel]=/lib/modules/kernel"|"path[fs]=/lib/modules/fs"|"path[net]=/lib/modules/net"|"path[scsi]=/lib/modules/scsi"|"path[block]=/lib/modules/block"|"path[cdrom]=/lib/modules/cdrom"|"path[ipv4]=/lib/modules/ipv4"|"path[ipv6]=/lib/modules/ipv6"|"path[sound]=/lib/modules/sound"|"path[fc4]=/lib/modules/fc4"|"path[video]=/lib/modules/video"|"path[misc]=/lib/modules/misc"|"path[pcmcia]=/lib/modules/pcmcia"|"path[atm]=/lib/modules/atm"|"path[usb]=/lib/modules/usb"|"path[ide]=/lib/modules/ide"|"path[ieee1394]=/lib/modules/ieee1394"|"path[mtd]=/lib/modules/mtd"|"generic_stringfile=/lib/modules/$KV/modules.generic_string"|"pcimapfile=/lib/modules/$KV/modules.pcimap"|"isapnpmapfile=/lib/modules/$KV/modules.isapnpmap"|"usbmapfile=/lib/modules/$KV/modules.usbmap"|"parportmapfile=/lib/modules/$KV/modules.parportmap"|"ieee1394mapfile=/lib/modules/$KV/modules.ieee1394map"|"pnpbiosmapfile=/lib/modules/$KV/modules.pnpbiosmap"|"depfile=/lib/modules/$KV/modules.dep"|"persistdir=/var/lib/modules/persist") |
| ;; |
| |
| # Ignore prune lines unless they end in .o or .ko, which would |
| # have an effect. |
| prune) |
| case "$MODULE" in |
| *.ko|*.o) |
| echo "Warning: not translating $NAME $MODULE $REST" >&2 |
| ;; |
| esac |
| ;; |
| *) |
| echo "Warning: not translating $NAME $MODULE $REST" >&2 |
| ;; |
| esac |
| done < $MODPROBECONF |
| |
| for mod in `echo $INSTALL_COMMANDS | tr ' ' '\n' | sort -u`; do |
| # MODNAME is the converted name for use in variables. |
| MODNAME=`echo $mod | tr -c A-Za-z_0-9 _` |
| eval PREINSTALL=\"\$pre_install_$MODNAME\" |
| eval POSTINSTALL=\"\$post_install_$MODNAME\" |
| eval INSTALL=\"\$\{install_$MODNAME:-/sbin/modprobe --first-time --ignore-install $mod}\" |
| if [ -n "$PREINSTALL" ]; then PREINSTALL="{ $PREINSTALL; } ; "; fi |
| if [ -n "$POSTINSTALL" ]; then POSTINSTALL="&& { $POSTINSTALL; }"; fi |
| echo install $mod $PREINSTALL $INSTALL $POSTINSTALL |
| done |
| |
| for mod in `echo $REMOVE_COMMANDS | tr ' ' '\n' | sort -u`; do |
| # MODNAME is the converted name for use in variables. |
| MODNAME=`echo $mod | tr -c A-Za-z_0-9 _` |
| eval PREREMOVE=\"\$pre_remove_$MODNAME\" |
| eval POSTREMOVE=\"\$post_remove_$MODNAME\" |
| eval REMOVE=\"\$\{remove_$MODNAME:-/sbin/modprobe -r --first-time --ignore-remove $mod}\" |
| if [ -n "$PREREMOVE" ]; then PREREMOVE="{ $PREREMOVE; } ; "; fi |
| if [ -n "$POSTREMOVE" ]; then POSTREMOVE="&& { $POSTREMOVE; }"; fi |
| echo remove $mod $PREREMOVE $REMOVE $POSTREMOVE |
| done |