Hack up argument processing in dracut and mkinitrd-dracut.sh to use read_arg to flexibly process arguments. --- dracut | 50 ++++++++---- mkinitrd-dracut.sh | 240 ++++++++++++++++++++++------------------------------ 2 files changed, 137 insertions(+), 153 deletions(-) diff --git a/dracut b/dracut index 1242f42..1a30cc7 100755 --- a/dracut +++ b/dracut @@ -89,23 +89,41 @@ Creates initial ramdisk images for preloading modules " } +# Little helper function for reading args from the commandline. +# it automatically handles -a b and -a=b variants, and returns 1 if +# we need to shift $3. +read_arg() { + # $1 = arg name + # $2 = arg value + # $3 = arg parameter + local rematch='^[^=]*=(.*)$' + if [[ $2 =~ $rematch ]]; then + read "$1" <<< "${BASH_REMATCH[1]}" + else + read "$1" <<< "$3" + # There is no way to shift our callers args, so + # return 1 to indicate they should do it instead. + return 1 + fi +} + while (($# > 0)); do - case $1 in + case ${1%%=*} in -f|--force) force=yes;; - -m|--modules) dracutmodules_l="$dracutmodules_l $2"; shift;; - -o|--omit) omit_dracutmodules_l="$omit_dracutmodules_l $2"; shift;; - -a|--add) add_dracutmodules_l="$add_dracutmodules_l $2"; shift;; - -d|--drivers) drivers_l="$drivers_l $2"; shift;; - --add-drivers) add_drivers_l="$add_drivers_l $2"; shift;; - --filesystems) filesystems_l="$filesystems_l $2"; shift;; - -k|--kmoddir) drivers_dir_l="$2"; shift;; - --fwdir) fw_dir_l="$fw_dir_l:$2"; shift;; + -m|--modules) read_arg dracutmodules_l "$@" ||shift;; + -o|--omit) read_arg omit_dracutmodules_l "$@" || shift;; + -a|--add) read_arg add_dracutmodules_l "$@" || shift;; + -d|--drivers) read_arg drivers_l "$@" || shift;; + --add-drivers) read_arg add_drivers_l "$@" || shift;; + --filesystems) read_arg filesystems_l "$@" || shift;; + -k|--kmoddir) read_arg drivers_dir_l "$@" || shift;; + --fwdir) read_arg fw_dir_l "$@" || shift;; --kernel-only) kernel_only="yes"; no_kernel="no";; --no-kernel) kernel_only="no"; no_kernel="yes";; - --ignore-kernel-modules) kernel_only="no"; no_kernel="yes" - ignore_kmodules="yes" - omit_dracutmodules_l+=\ kernel-modules - ;; + --ignore-kernel-modules) kernel_only="no"; no_kernel="yes" + ignore_kmodules="yes" + omit_dracutmodules_l+=\ kernel-modules + ;; --strip) do_strip_l="yes";; --nostrip) do_strip_l="no";; --mdadmconf) mdadmconf_l="yes";; @@ -115,13 +133,13 @@ while (($# > 0)); do -h|--help) usage; exit 1 ;; --debug) debug="yes";; -v|--verbose) beverbose="yes";; - -c|--conf) conffile="$2"; shift;; - --confdir) confdir="$2"; shift;; + -c|--conf) read_arg conffile "$@" || shift;; + --confdir) read_arg confdir "$@" || shift;; -l|--local) allowlocal="yes" ;; -H|--hostonly) hostonly_l="yes" ;; --fstab) use_fstab_l="yes" ;; -i|--include) include_src="$2"; include_target="$3"; shift 2;; - -I|--install) install_items="$2"; shift;; + -I|--install) read_arg install_items "$@" || shift;; --gzip) [[ $compress != cat ]] && compress="gzip -9";; --bzip2) [[$compress != cat ]] && compress="bzip2 -9";; --xz) [[ $compress != cat ]] && compress="xz -9";; diff --git a/mkinitrd-dracut.sh b/mkinitrd-dracut.sh dissimilarity index 61% index 3943dad..f25ccb9 100644 --- a/mkinitrd-dracut.sh +++ b/mkinitrd-dracut.sh @@ -1,137 +1,103 @@ -#!/bin/bash --norc -kver=$(uname -r) - -error() { echo "$@" >&2; } - -usage () { - [[ $1 = '-n' ]] && cmd=echo || cmd=error - - $cmd "usage: ${0%/*} [--version] [--help] [-v] [-f] [--preload <module>]" - $cmd " [--image-version] [--with=<module>]" - $cmd " <initrd-image> <kernel-version>" - $cmd "" - $cmd " (ex: ${0%/*} /boot/initramfs-$kver.img $kver)" - - [[ $1 = '-n' ]] && exit 0 - exit 1 -} - - -while [ $# -gt 0 ]; do - case $1 in - --with-usb*) - if [ "$1" != "${1##--with-usb=}" ]; then - usbmodule=${1##--with-usb=} - else - usbmodule="usb-storage" - fi - basicmodules="$basicmodules $usbmodule" - unset usbmodule - ;; - --with-avail*) - if [ "$1" != "${1##--with-avail=}" ]; then - modname=${1##--with-avail=} - else - modname=$2 - shift - fi - - basicmodules="$basicmodules $modname" - ;; - --with*) - if [ "$1" != "${1##--with=}" ]; then - modname=${1##--with=} - else - modname=$2 - shift - fi - - basicmodules="$basicmodules $modname" - ;; - --version) - echo "mkinitrd: dracut compatibility wrapper" - exit 0 - ;; - -v|--verbose) - dracut_args="${dracut_args} -v" - ;; - -f) - dracut_args="${dracut_args} -f" - ;; - --preload*) - if [ "$1" != "${1##--preload=}" ]; then - modname=${1##--preload=} - else - modname=$2 - shift - fi - basicmodules="$basicmodules $modname" - ;; - --image-version) - img_vers=yes - ;; - --rootfs*) - if [ "$1" != "${1##--rootfs=}" ]; then - rootfs="${1##--rootfs=}" - else - rootfs="$2" - shift - fi - dracut_args="${dracut_args} --filesystems $rootfs" - ;; - --builtin*) ;; - --without*) ;; - --without-usb) ;; - --fstab*) ;; - --nocompress) dracut_args="$dracut_args --no-compress";; - --ifneeded) ;; - --omit-scsi-modules) ;; - --omit-ide-modules) ;; - --omit-raid-modules) ;; - --omit-lvm-modules) ;; - --omit-dmraid) ;; - --allow-missing) ;; - --net-dev*) ;; - --noresume) ;; - --rootdev*) ;; - --thawdev*) ;; - --rootopts*) ;; - --root*) ;; - --loopdev*) ;; - --loopfs*) ;; - --loopopts*) ;; - --looppath*) ;; - --dsdt*) ;; - --bootchart) ;; - --help) - usage -n - ;; - *) - if [ -z "$target" ]; then - target=$1 - elif [ -z "$kernel" ]; then - kernel=$1 - else - usage - fi - ;; - esac - - shift -done - -if [ -z "$target" -o -z "$kernel" ]; then - usage -fi - -if [ -n "$img_vers" ]; then - target="$target-$kernel" -fi - -if [ -n "$basicmodules" ]; then - dracut -H $dracut_args --add-drivers "$basicmodules" "$target" "$kernel" -else - dracut -H $dracut_args "$target" "$kernel" -fi - -# vim:ts=8:sw=4:sts=4:et +#!/bin/bash --norc +kver=$(uname -r) + +error() { echo "$@" >&2; } + +usage () { + [[ $1 = '-n' ]] && cmd=echo || cmd=error + + $cmd "usage: ${0%/*} [--version] [--help] [-v] [-f] [--preload <module>]" + $cmd " [--image-version] [--with=<module>]" + $cmd " <initrd-image> <kernel-version>" + $cmd "" + $cmd " (ex: ${0%/*} /boot/initramfs-$kver.img $kver)" + + [[ $1 = '-n' ]] && exit 0 + exit 1 +} + +# Little helper function for reading args from the commandline. +# it automatically handles -a b and -a=b variants, and returns 1 if +# we need to shift $3. +read_arg() { + # $1 = arg name + # $2 = arg value + # $3 = arg parameter + local rematch='^[^=]*=(.*)$' + if [[ $2 =~ $rematch ]]; then + read "$1" <<< "${BASH_REMATCH[1]}" + elif [[ $3 != -* ]]; then + # Only read next arg if it not an arg itself. + read "$1" <<< "$3" + # There is no way to shift our callers args, so + # return 1 to indicate they should do it instead. + return 1 + fi +} + +while (($# > 0)); do + case ${1%%=*} in + --with-usb) read_arg usbmodule "$@" || shift + basicmodules="$basicmodules ${usbmodule:-usb-storage}" + unset usbmodule;; + --with-avail) read_arg modname "$@" || shift + basicmodules="$basicmodules $modname";; + --with) read_arg modname "$@" || shift + basicmodules="$basicmodules $modname";; + --version) + echo "mkinitrd: dracut compatibility wrapper" + exit 0;; + -v|--verbose) dracut_args="${dracut_args} -v";; + -f) dracut_args="${dracut_args} -f";; + --preload) read_args modname "$@" || shift + basicmodules="$basicmodules $modname";; + --image-version) img_vers=yes;; + --rootfs) read_args rootfs "$@" || shift + dracut_args="${dracut_args} --filesystems $rootfs";; + --nocompress) dracut_args="$dracut_args --no-compress";; + --help) usage -n;; + --builtin) ;; + --without*) ;; + --without-usb) ;; + --fstab*) ;; + --ifneeded) ;; + --omit-scsi-modules) ;; + --omit-ide-modules) ;; + --omit-raid-modules) ;; + --omit-lvm-modules) ;; + --omit-dmraid) ;; + --allow-missing) ;; + --net-dev*) ;; + --noresume) ;; + --rootdev*) ;; + --thawdev*) ;; + --rootopts*) ;; + --root*) ;; + --loopdev*) ;; + --loopfs*) ;; + --loopopts*) ;; + --looppath*) ;; + --dsdt*) ;; + --bootchart) ;; + *) if [[ ! $target ]]; then + target=$1 + elif [[ ! $kernel ]]; then + kernel=$1 + else + usage + fi;; + esac + shift +done + +[[ $target && $kernel ]] || usage +[[ $img_vers ]] && target="$target-$kernel" +fi + +if [[ $basicmodules ]]; then + dracut -H $dracut_args --add-drivers "$basicmodules" "$target" "$kernel" +else + dracut -H $dracut_args "$target" "$kernel" +fi + +# vim:ts=8:sw=4:sts=4:et -- 1.7.2.1 -- To unsubscribe from this list: send the line "unsubscribe initramfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html