Alan Pevec
2008-Dec-02 10:57 UTC
[Ovirt-devel] [PATCH node-image] edit-livecd: optionally append kernel boot params
--- edit-livecd | 37 +++++++++++++++++++++++++++++-------- 1 files changed, 29 insertions(+), 8 deletions(-) diff --git a/edit-livecd b/edit-livecd index 0200034..8025fb6 100755 --- a/edit-livecd +++ b/edit-livecd @@ -25,12 +25,17 @@ warn() { printf '%s: %s\n' "$ME" "$*" >&2; } try_h() { printf "Try \`$ME -h' for more information.\n" >&2; } die() { warn "$@"; try_h; exit 1; } +NODEIMG_DEFAULT=/usr/share/ovirt-node-image/ovirt-node-image.iso +CD=$NODEIMG_DEFAULT + usage() { case $# in 1) warn "$1"; try_h; exit 1;; esac cat <<EOF -Usage: $ME livecd.iso program - livecd.iso - LiveCD ISO to edit - program - Arbitrary program/script that is run inside of the livecd root +Usage: $ME -i LiveCD.iso [-b bootparams] [-p program] + -h: display this help and exit + -i: livecd.iso - LiveCD ISO to edit (default: $NODEIMG_DEFAULT) + -b: bootparams - optional parameters appended to the kernel command line + -p: program - Arbitrary program/script that is run inside of the livecd root filesystem. This script is not run in a chroot environment so it can access the host filesystem. The program should be executable If program is omitted the script will pause and allow the user in @@ -48,16 +53,26 @@ EOF # exit after any error: set -e -test $# -lt 1 && { usage; exit 1; } +err=0 help=0 +while getopts :b:i:p:h c; do + case $c in + i) CD=$OPTARG;; + b) PARAMS=$OPTARG;; + p) PROG=$OPTARG;; + h) help=1;; + '?') err=1; warn "invalid option: \`-$OPTARG'";; + :) err=1; warn "missing argument to \`-$OPTARG' option";; + *) err=1; warn "internal error: \`-$OPTARG' not handled";; + esac +done +test $err = 1 && { try_h; exit 1; } +test $help = 1 && { usage; exit 0; } # first, check to see we are root if [ $( id -u ) -ne 0 ]; then die "Must run as root" fi -CD=$1 -PROG=$2 - which mkisofs mksquashfs sed > /dev/null 2>&1 WDIR=`mktemp -d $PWD/livecd.XXXXXXXXXX` @@ -81,7 +96,8 @@ function mnt() { addExit "rm -Rf $WDIR" -LABEL=$(isoinfo -d -i $CD | awk -F ": " '/Volume id:/ {print $2}') +eval $(/lib/udev/vol_id $CD) +LABEL=$ID_FS_LABEL # mount the CD image mnt "-t auto $CD -o loop,ro" cd @@ -122,6 +138,11 @@ mksquashfs $WDIR/sq-w/ $WDIR/cd-w/LiveOS/squashfs.img -noappend echo ">>> Recomputing MD5 sums" ( cd $WDIR/cd-w && find . -type f -not -name md5sum.txt -not -path '*/isolinux/*' -print0 | xargs -0 -- md5sum > md5sum.txt ) +if [ -n "$PARAMS" ]; then + echo ">>> Appending boot parameters" + sed -i 's/^ append .*$/& '$PARAMS/ "$WDIR/cd-w/isolinux/isolinux.cfg" +fi + echo ">>> Creating ISO image $ISO" mkisofs \ -V "$LABEL" \ -- 1.5.6.5
Jim Meyering
2008-Dec-02 11:13 UTC
[Ovirt-devel] [PATCH node-image] edit-livecd: optionally append kernel boot params
Alan Pevec <apevec at redhat.com> wrote:> --- > edit-livecd | 37 +++++++++++++++++++++++++++++-------- > 1 files changed, 29 insertions(+), 8 deletions(-)Good timing, since I was just considering changing usage to require something like an --output=FILE option to specify the output file name, rather than using $(basename $ISO .iso)-custom.iso, which puts the result in the current directory.> diff --git a/edit-livecd b/edit-livecd > index 0200034..8025fb6 100755 > --- a/edit-livecd > +++ b/edit-livecd > @@ -25,12 +25,17 @@ warn() { printf '%s: %s\n' "$ME" "$*" >&2; } > try_h() { printf "Try \`$ME -h' for more information.\n" >&2; } > die() { warn "$@"; try_h; exit 1; } > > +NODEIMG_DEFAULT=/usr/share/ovirt-node-image/ovirt-node-image.iso > +CD=$NODEIMG_DEFAULT > + > usage() { > case $# in 1) warn "$1"; try_h; exit 1;; esac > cat <<EOF > -Usage: $ME livecd.iso program > - livecd.iso - LiveCD ISO to edit > - program - Arbitrary program/script that is run inside of the livecd root > +Usage: $ME -i LiveCD.iso [-b bootparams] [-p program] > + -h: display this help and exit > + -i: livecd.iso - LiveCD ISO to edit (default: $NODEIMG_DEFAULT) > + -b: bootparams - optional parameters appended to the kernel command line > + -p: program - Arbitrary program/script that is run inside of the livecd rootPlease remove the ":" after each option, and leave at least two spaces between option-arg and description (in case we ever use help2man): -h display this help and exit -i livecd.iso LiveCD ISO to edit (default: $NODEIMG_DEFAULT) -b bootparams optional parameters appended to the kernel command line -p program Arbitrary program/script that is run inside of the livecd ...> @@ -48,16 +53,26 @@ EOF > # exit after any error: > set -e > > -test $# -lt 1 && { usage; exit 1; } > +err=0 help=0 > +while getopts :b:i:p:h c; do > + case $c in > + i) CD=$OPTARG;; > + b) PARAMS=$OPTARG;; > + p) PROG=$OPTARG;; > + h) help=1;; > + '?') err=1; warn "invalid option: \`-$OPTARG'";; > + :) err=1; warn "missing argument to \`-$OPTARG' option";; > + *) err=1; warn "internal error: \`-$OPTARG' not handled";; > + esac > +done > +test $err = 1 && { try_h; exit 1; } > +test $help = 1 && { usage; exit 0; } > > # first, check to see we are root > if [ $( id -u ) -ne 0 ]; then > die "Must run as root" > fi > > -CD=$1 > -PROG=$2 > - > which mkisofs mksquashfs sed > /dev/null 2>&1 > > WDIR=`mktemp -d $PWD/livecd.XXXXXXXXXX` > @@ -81,7 +96,8 @@ function mnt() { > > addExit "rm -Rf $WDIR" > > -LABEL=$(isoinfo -d -i $CD | awk -F ": " '/Volume id:/ {print $2}') > +eval $(/lib/udev/vol_id $CD)You'll want extra quotes, to be safe: eval "$(/lib/udev/vol_id $CD)"> +LABEL=$ID_FS_LABEL > > # mount the CD image > mnt "-t auto $CD -o loop,ro" cd > @@ -122,6 +138,11 @@ mksquashfs $WDIR/sq-w/ $WDIR/cd-w/LiveOS/squashfs.img -noappend > echo ">>> Recomputing MD5 sums" > ( cd $WDIR/cd-w && find . -type f -not -name md5sum.txt -not -path '*/isolinux/*' -print0 | xargs -0 -- md5sum > md5sum.txt ) > > +if [ -n "$PARAMS" ]; then > + echo ">>> Appending boot parameters" > + sed -i 's/^ append .*$/& '$PARAMS/ "$WDIR/cd-w/isolinux/isolinux.cfg"and you need quotes around $PARAMS: sed -i 's/^ append .*$/& '"$PARAMS"/ "$WDIR/cd-w/isolinux/isolinux.cfg" And you'll also want to make the script fail -- or maybe try to find a usable sed delimiter if $PARAMS contains a slash.> +fi > + > echo ">>> Creating ISO image $ISO" > mkisofs \ > -V "$LABEL" \