#!/bin/sh

if [ "x$1" == "x" ]; then
   KVERSION=`uname -r`
else
   KVERSION=$1
   if [ ! -d "/lib/modules/$KVERSION" ]; then
      echo "Kernel Module directory '/lib/modules/$KVERSION' doesn't exist"
      exit 1
   fi
fi

. /etc/warewulf/wwinitrd.config

if [ ! -d "/tftpboot" ]; then
   mkdir -p /tftpboot
fi

mknods() {
   if [ -z $1 ]; then
      echo "need path to build dev entries!"
      return 1
   fi
   mkdir $1/dev/               2>/dev/null
   mkdir $1/dev/pts/           2>/dev/null
   for dev in $DEVS; do
      cp -ap /dev/$dev $1/dev/$dev
   done
}

size=0
totalsize=0

for i in $KERNEL_MODULES; do
   MODULE=`find /lib/modules/$KVERSION/ | egrep "/$i.(k)?o(.gz)?"`
   KMODULE_LIST="$KMODULE_LIST $MODULE"
done

for i in $KMODULE_LIST; do
   size=`du -sk $i 2>/dev/null | cut -f 1 `
   totalsize=`expr $size + $totalsize`
done

#totalsize=`expr $totalsize + 4096`
totalsize=15360

dd if=/dev/zero of=/var/tmp/wwinitrd-$KVERSION.img bs=1024 count=$totalsize    >/dev/null 2>&1
echo y | /sbin/mke2fs /var/tmp/wwinitrd-$KVERSION.img            >/dev/null 2>&1
mkdir /var/tmp/wwinitrd                        >/dev/null 2>&1
mount /var/tmp/wwinitrd-$KVERSION.img /var/tmp/wwinitrd -o loop
cp -rap /var/warewulf/wwinitrd/* /var/tmp/wwinitrd/
for i in $KMODULE_LIST; do
   if [ -f "$i" ]; then
      dirname=`echo $i | sed -e "s@/lib/modules/$KVERSION/@@g"`
      dirname=`dirname $dirname`
      mkdir -p /var/tmp/wwinitrd/lib/modules/$KVERSION/$dirname
      cp -rap $i /var/tmp/wwinitrd/lib/modules/$KVERSION/$dirname/
   elif [ -d "$i" ]; then
      dirname=`echo $i | sed -e "s@/lib/modules/$KVERSION/@@g"`
      mkdir -p /var/tmp/wwinitrd/lib/modules/$KVERSION/$dirname
      cp -rap $i /var/tmp/wwinitrd/lib/modules/$KVERSION/$dirname/
   fi
done

sed -e "s/\.gz//g" /lib/modules/$KVERSION/modules.dep > /var/tmp/wwinitrd/lib/modules/$KVERSION/modules.dep
cp /lib/modules/$KVERSION/modules.pcimap /var/tmp/wwinitrd/lib/modules/$KVERSION/

find /var/tmp/wwinitrd/lib/modules/$KVERSION/ -name *.gz -exec gunzip {} \;

> /var/tmp/wwinitrd/etc/load_modules
for module in $LOAD_MODULES; do
   echo $module >> /var/tmp/wwinitrd/etc/load_modules
done

#mknods /var/tmp/wwinitrd
mkdir /var/tmp/wwinitrd/dev/               2>/dev/null
mkdir /var/tmp/wwinitrd/dev/pts/           2>/dev/null
#mknod /var/tmp/wwinitrd/dev/pts/0   c 5 136 2>/dev/null
#mknod /var/tmp/wwinitrd/dev/pts/1   c 5 136 2>/dev/null
#mknod /var/tmp/wwinitrd/dev/pts/2   c 5 136 2>/dev/null
#mknod /var/tmp/wwinitrd/dev/pts/3   c 5 136 2>/dev/null
for dev in $DEVS; do
   cp -ap /dev/$dev /var/tmp/wwinitrd/dev/$dev 2>/dev/null
done

if [ -f "/sbin/insmod.static" ]; then
   rm /var/tmp/wwinitrd/sbin/insmod
   cp -ap /sbin/insmod.static /var/tmp/wwinitrd/sbin/insmod
   strip /var/tmp/wwinitrd/sbin/insmod
fi

#usize=`du -sk /var/tmp/wwinitrd/ | awk '{print $1'}`
umount /var/tmp/wwinitrd                     >/dev/null 2>&1
gzip -9f /var/tmp/wwinitrd-$KVERSION.img
mv /var/tmp/wwinitrd-$KVERSION.img.gz /tftpboot/wwinitrd-$KVERSION.img

tsize=`du -sk /tftpboot/wwinitrd-$KVERSION.img | awk '{print $1}'`

rm -rf /var/tmp/wwinitrd

if [ -f "/boot/vmlinuz-$KVERSION" ]; then
   # We prefer the compressed kernel but will use the ohter kernel if needed
   cp /boot/vmlinuz-$KVERSION /tftpboot/kernel-$KVERSION
elif [ -f "/boot/vmlinux-$KVERSION" ]; then
   cp /boot/vmlinux-$KVERSION /tftpboot/kernel-$KVERSION
else
   echo "WARNING: I couldn't find the kernel in /boot! You must put it at"
   echo "/tftpboot/kernel-$KVERSION by hand."
fi

ln -f /tftpboot/kernel-$KVERSION /tftpboot/kernel
ln -f /tftpboot/wwinitrd-$KVERSION.img /tftpboot/wwinitrd.img

ksize=`du -sk /tftpboot/kernel-$KVERSION | awk '{print $1}'`

echo "ramdisk=${totalsize}KB, transfer=${tsize}KB, kernel=${ksize}KB, version=$KVERSION"
