- refactored marc's kupdate.sh into a new script kvariant.sh
Thierry Parmentelat [Fri, 3 Apr 2009 16:45:22 +0000 (16:45 +0000)]
- this allows to create a 'variant' stored in /usr/share/bootcd/<variant>
from the standard /usr/share/bootcd/build tree but with a different kernel
- GetBootMedium has a new option to use a given variant

build.sh
kupdate.sh
kvariant.sh [new file with mode: 0755]

index 60e7295..cfce5e2 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -10,6 +10,8 @@
 # $Id$
 #
 
+COMMAND=$(basename $0)
+DIRNAME=$(dirname $0)
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
 # defaults
@@ -77,22 +79,28 @@ function pop_cleanup() {
 function init_and_check () {
 
     # Change to our source directory
-    local srcdir=$(cd $(dirname $0) && pwd -P)
+    local srcdir=$(cd $DIRNAME && pwd -P)
     pushd $srcdir
 
     # Root of the isofs
-    ISOREF=$PWD/build
+    ISOREF=$PWD/${VARIANT}
 
     # The reference image is expected to have been built by prep.sh (see .spec)
     # we disable the initial logic that called prep.sh if that was not the case
     # this is because prep.sh needs to know pldistro 
     if [ ! -f $ISOREF/isofs/bootcd.img -o ! -f $ISOREF/version.txt ] ; then
-       echo "You have to run prep.sh prior to calling $0 - exiting"
+       echo "Could not find isofs and version.txt in $ISOREF"
+       if [ "$VARIANT" == "build" ] ; then
+           echo "You have to run prep.sh prior to calling $COMMAND"
+       else
+           echo "You need to create your variant image, see kvariant.sh"
+       fi
+       echo "Exiting .."
        exit 1
     fi
 
     # build/version.txt written by prep.sh
-    BOOTCD_VERSION=$(cat build/version.txt)
+    BOOTCD_VERSION=$(cat ${VARIANT}/version.txt)
 
     if [ -f /etc/planetlab/plc_config ] ; then
         # Source PLC configuration
@@ -116,7 +124,7 @@ function init_and_check () {
 # it seems that this feature has not been used nor tested in a long time, use with care
 
 usage() {
-    echo "Usage: build.sh [OPTION]..."
+    echo "Usage: $COMMAND [OPTION]..."
     echo "    -f plnode.txt    Node to customize CD for (default: none)"
     echo "    -t 'types'       Build the specified images (default: $DEFAULT_TYPES)"
     echo "                     NOTE: mentioning 'serial' as part of the type is not supported anymore"
@@ -130,6 +138,7 @@ usage() {
     echo "                     can be a full path"
     echo "    -o output-name   The full name of the generated file"
     echo "    -C custom-dir    Custom directory"
+    echo "    -V variant       Use a variant - see kvariant.sh"
     echo "    -n               Dry run - mostly for debug/test purposes"
     echo "    -k               Add additional parameters to the kargs.txt file"
     echo "    -h               This message"
@@ -143,7 +152,7 @@ function parse_command_line () {
     # init
     TYPES=""
     # Get options
-    while getopts "f:t:as:SO:o:C:k:nh" opt ; do
+    while getopts "f:t:as:SO:o:C:V:k:nh" opt ; do
        case $opt in
            f) NODE_CONFIGURATION_FILE=$OPTARG ;;
            t) TYPES="$TYPES $OPTARG" ;;
@@ -153,6 +162,7 @@ function parse_command_line () {
            O) OUTPUT_BASE="$OPTARG" ;;
            o) OUTPUT_NAME="$OPTARG" ;;
            C) CUSTOM_DIR="$OPTARG" ;;
+           V) VARIANT="$OPTARG" ;;
            k) KARGS_STR="$KARGS_STR $OPTARG" ;;
            n) DRY_RUN=true ;;
            h|*) usage ;;
@@ -161,6 +171,7 @@ function parse_command_line () {
 
     # use defaults if not set
     [ -z "$TYPES" ] && TYPES="$DEFAULT_TYPES"
+    [ -z "$VARIANT" ] && VARIANT="build"
     [ "$CONSOLE_INFO" == "default" ] && CONSOLE_INFO=$SERIAL_CONSOLE
 
     # check TYPES 
@@ -297,7 +308,7 @@ EOF
     fi
 
     # build/passwd copied out by prep.sh
-    sed -e "s@^root:[^:]*:\(.*\)@root:$ROOT_PASSWORD:\1@" build/passwd >$OVERLAY/etc/passwd
+    sed -e "s@^root:[^:]*:\(.*\)@root:$ROOT_PASSWORD:\1@" ${VARIANT}/passwd >$OVERLAY/etc/passwd
 
     # Install node configuration file (e.g., if node has no floppy disk or USB slot)
     if [ -f "$NODE_CONFIGURATION_FILE" ] ; then
@@ -532,7 +543,7 @@ EOF
     # generate pl_rsysinit
     cat > etc/rc.d/init.d/pl_rsysinit <<EOF
 #!/bin/sh
-# generated by build.sh
+# generated by $COMMAND
 echo -n "pl_rsysinit: preparing /etc and /var for pl_sysinit..."
 mount -t tmpfs -orw,size=${msize}M,mode=1777 tmpfs /tmp
 mkdir -p /tmp/root
@@ -683,10 +694,10 @@ function build_types () {
 #################### 
 function main () {
 
-    init_and_check
-
     parse_command_line "$@"
 
+    init_and_check
+
     echo "* Building images for $FULL_VERSION_STRING"
     # Do not tolerate errors
     set -e
index 5ca4b12..3c09c4d 100755 (executable)
@@ -1,5 +1,8 @@
 #!/bin/bash
 
+# this was the initial rough implementation of what became kvariant.sh
+# should maybe be deprecated..
+
 kernelrpm=$1
 isofsdir=$2
 
diff --git a/kvariant.sh b/kvariant.sh
new file mode 100755 (executable)
index 0000000..f369d28
--- /dev/null
@@ -0,0 +1,121 @@
+#!/bin/bash
+
+COMMAND=$(basename $0)
+
+function usage() {
+  echo "$COMMAND variant kernel-rpm"
+  echo "    Allows to create a variant of the bootcd image with a different kernel"
+  echo "    variant will be created under /usr/share/bootcd/<variant>"
+  echo "    with the same structure as the default /usr/share/bootcd/build"
+  echo "    the kernel rpm will also be stored in the variant dir for future reference"
+  echo "e.g. $COMMAND centos5 http://mirror.onelab.eu/centos/5.2/updates/i386/RPMS/kernel-2.6.18-92.1.1.el5.i686.rpm"
+  exit 1
+}
+
+function bail () {
+    rm -rf $tmpdir $files
+    exit -1
+}
+
+## locate rpm and store it in variant
+function getrpm () {
+    kernelrpm_url=$1; shift
+    kernelrpm_local=$1; shift
+    nocolon=$(echo $kernelrpm_url | sed -e s,:,,)
+    if [ "$kernelrpm_url" == "$nocolon" ] ; then
+       echo "Copying $kernelrpm_url in $variant_path"
+       cat $kernelrpm_url > $kernelrpm_local
+    else
+       echo "Fetching $kernelrpm_url in $variant_path"
+       curl -o $kernelrpm_local $kernelrpm_url
+    fi 
+}
+
+## sanity check
+function checkrpm () {
+    filename=$1
+    if [ -f "$filename" ] ; then
+       if [ $(rpm -qip $filename | wc -l) -eq 1 ] ; then
+           echo "$filename not a valid rpm file"
+           usage
+       fi
+    fi
+}
+
+######################################## let's go
+set -e
+
+[[ -z "$@" ]] && usage
+variant=$1; shift
+[[ -z "$@" ]] && usage
+kernelrpm_url=$1; shift
+[[ -n "$@" ]] && usage
+
+standard_path="/usr/share/bootcd/build"
+if [ ! -d $standard_path ] ; then
+    echo "Cound not find standard image $standard_path - exiting"
+    exit 1
+fi
+
+variant_path=/usr/share/bootcd/$variant
+if [ -e $variant_path ] ; then
+    echo "Found $variant_path - please remove first - exiting"
+    exit 1
+fi
+
+here=$(pwd)
+mkdir $variant_path
+echo "Creating $variant_path from $standard_path"
+tar -C $standard_path -cf - . | tar -C $variant_path -xf - 
+
+kernelrpm=$variant_path/$(basename $kernelrpm_url)
+getrpm $kernelrpm_url $kernelrpm
+checkrpm $kernelrpm
+
+isofsdir=$variant_path/isofs
+
+tmpdir=
+files=
+
+tmpdir=$(mktemp -d /var/tmp/bootcd.XXXXXX)
+trap "bail" ERR INT
+echo "Updating bootcd image with $kernelrpm"
+mkdir $tmpdir/bootcd
+pushd $tmpdir/bootcd
+echo "Unwrapping bootcd.img in $(pwd)"
+gzip -d -c $isofsdir/bootcd.img | cpio -diu
+echo "Cleaning up older kernel"
+rm -rf boot/*
+rm -rf lib/modules
+echo "Replacing with new kernel"
+rpm2cpio  $kernelrpm | cpio -diu
+echo "Running depmod"
+version=$(cd ./boot && ls vmlinuz* | sed 's,vmlinuz-,,')
+depmod -b . $version
+echo "Exposing kernel"
+cp boot/vmlinuz* ${tmpdir}/kernel
+echo "Wrapping new bootcd.img"
+find . | cpio --quiet -c -o | gzip -9 > ${tmpdir}/bootcd.img
+popd
+
+#
+echo -n "Preserving in $isofsdir .."
+mv ${isofsdir}/kernel ${tmpdir}/kernel.orig
+echo -n " kernel"
+mv ${isofsdir}/bootcd.img ${tmpdir}/bootcd.img.orig
+echo -n " bootcd.img"
+echo ""
+
+#
+echo -n "Populating $isofsdir .."
+mv ${tmpdir}/kernel ${isofsdir}/kernel
+echo -n " kernel"
+mv ${tmpdir}/bootcd.img ${isofsdir}/bootcd.img
+echo -n " bootcd.img"
+echo ""
+
+rm -rf $tmpdir
+
+echo "new variant $variant ready"
+trap - ERR
+exit 0