previous commit requires lots of changes in other modules so introduce a quick hack...
[bootcd.git] / kvariant.sh
1 #!/bin/bash
2
3 COMMAND=$(basename $0)
4
5 function usage() {
6   echo "$COMMAND variant kernel-rpm"
7   echo "    Allows to create a variant of the bootcd image with a different kernel"
8   echo "    variant will be created under /usr/share/bootcd/<variant>"
9   echo "    with the same structure as the default /usr/share/bootcd/build"
10   echo "    the kernel rpm will also be stored in the variant dir for future reference"
11   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"
12   exit 1
13 }
14
15 function bail () {
16     rm -rf $tmpdir $files
17     exit -1
18 }
19
20 ## locate rpm and store it in variant
21 function getrpm () {
22     kernelrpm_url=$1; shift
23     kernelrpm_local=$1; shift
24     nocolon=$(echo $kernelrpm_url | sed -e s,:,,)
25     if [ "$kernelrpm_url" == "$nocolon" ] ; then
26         echo "Copying $kernelrpm_url in $variant_path"
27         cat $kernelrpm_url > $kernelrpm_local
28     else
29         echo "Fetching $kernelrpm_url in $variant_path"
30         curl -o $kernelrpm_local $kernelrpm_url
31     fi 
32 }
33
34 ## sanity check
35 function checkrpm () {
36     filename=$1
37     if [ -f "$filename" ] ; then
38         if [ $(rpm -qip $filename | wc -l) -eq 1 ] ; then
39             echo "$filename not a valid rpm file"
40             usage
41         fi
42     fi
43 }
44
45 ######################################## let's go
46 set -e
47
48 [[ -z "$@" ]] && usage
49 variant=$1; shift
50 [[ -z "$@" ]] && usage
51 kernelrpm_url=$1; shift
52 [[ -n "$@" ]] && usage
53
54 basedir=$(cd -P $(dirname $0); pwd)
55 standard_path="$basedir/build"
56 if [ ! -d $standard_path ] ; then
57     echo "Cound not find standard image $standard_path - exiting"
58     exit 1
59 fi
60
61 variant_path="$basedir/$variant"
62 if [ -e $variant_path ] ; then
63     echo "Found $variant_path - please remove first - exiting"
64     exit 1
65 fi
66
67 here=$(pwd)
68 mkdir $variant_path
69 echo "Creating $variant_path from $standard_path"
70 tar -C $standard_path -cf - . | tar -C $variant_path -xf - 
71
72 kernelrpm=$variant_path/$(basename $kernelrpm_url)
73 getrpm $kernelrpm_url $kernelrpm
74 checkrpm $kernelrpm
75
76 if echo ${kernelrpm} | grep -q kernel-2.6.32 ; then
77     extrarpm_url=`echo $kernelrpm_url | sed -e "s:kernel-2.6.32:kernel-firmware-2.6.32:g"`
78     extrarpm=$variant_path/$(basename $extrarpm_url)
79     getrpm $extrarpm_url $extrarpm
80     checkrpm $extrarpm
81 fi
82
83 isofsdir=$variant_path/isofs
84
85 tmpdir=
86 files=
87
88 tmpdir=$(mktemp -d /var/tmp/bootcd.XXXXXX)
89 trap "bail" ERR INT
90 echo "Updating bootcd image with $kernelrpm"
91 mkdir $tmpdir/bootcd
92 pushd $tmpdir/bootcd
93 echo "Unwrapping bootcd.img in $(pwd)"
94 gzip -d -c $isofsdir/bootcd.img | cpio -diu
95 echo "Cleaning up older kernel"
96 rm -rf boot/*
97 rm -rf lib/modules
98 echo "Replacing with new kernel"
99 rpm2cpio  $kernelrpm | cpio -diu
100 if [ -n $"extrarpm_url" ] ; then
101     echo "Unpacking $extrarpm"
102     rpm2cpio  $extrarpm | cpio -diu
103 fi
104 echo "Running depmod"
105 version=$(cd ./boot && ls vmlinuz* | sed 's,vmlinuz-,,')
106 depmod -b . $version
107 echo "Exposing kernel"
108 cp boot/vmlinuz* ${tmpdir}/kernel
109 echo "Wrapping new bootcd.img"
110 find . | cpio --quiet -c -o | gzip -9 > ${tmpdir}/bootcd.img
111 popd
112
113 #
114 echo -n "Preserving in $isofsdir .."
115 mv ${isofsdir}/kernel ${tmpdir}/kernel.orig
116 echo -n " kernel"
117 mv ${isofsdir}/bootcd.img ${tmpdir}/bootcd.img.orig
118 echo -n " bootcd.img"
119 echo ""
120
121 #
122 echo -n "Populating $isofsdir .."
123 mv ${tmpdir}/kernel ${isofsdir}/kernel
124 echo -n " kernel"
125 mv ${tmpdir}/bootcd.img ${isofsdir}/bootcd.img
126 echo -n " bootcd.img"
127 echo ""
128
129 rm -rf $tmpdir $kernelrpm $extrarpm
130
131 echo "new variant $variant ready"
132 trap - ERR
133 exit 0