#!/bin/bash
ARCH="i686 i586"
TOPDIR="/imedia/initrd-build"
INITRDTREE="$TOPDIR/initrdtree"
KERNEL_SRC_DIR="/usr/src/linux"
VERBOSE=1
WITH_BOOTSPLASH=1
BOOTSPLASHDIR="bootsplash"

# Kernel version from the KERNEL_SRC_DIR
function detect_kernel_version()
{
    current_dir=`pwd`
    
    if [ ! -e "$KERNEL_SRC_DIR/Makefile" ]
    then
	error "Cannot find kernel sources\n"
    fi
    
    cd $KERNEL_SRC_DIR
    KERNEL_VERSION=`make kernelversion`
    
    cd $current_dir
}
function create_image()
{
    SIZE=`du -s -k  $INITRDTREE | awk '{print $1}'`
    # Add some padding 
    let TSIZE=$SIZE+512
    echo " > Building initrd image ($TSIZE KB)"
    rm -f $TOPDIR/imedia-initrd-$TARGET
    dd if=/dev/zero of=$TOPDIR/initrd.tmp bs=1k count=$TSIZE >> /dev/null 2>&1
    losetup /dev/loop2 $TOPDIR/initrd.tmp
    mkfs  -t ext2 -F -m 0 -b 1024 /dev/loop2 >> /dev/null 2>&1
    tune2fs -c0 -i0 /dev/loop2 >> /dev/null 2>&1
    mount /dev/loop2 /mnt/loop2 
    rm -rf /mnt/loop2/lost+found 
    cp -dpR $INITRDTREE/* /mnt/loop2/
    umount /mnt/loop2
    losetup -d /dev/loop2 
    echo "  > Compressing initrd image "
    rm -f $TOPDIR/imedia-initrd-$TARGET.img
    # and gzip our ramdisk image and put it in the right place.
    gzip -9 -c $TOPDIR/initrd.tmp > $TOPDIR/imedia-initrd-$TARGET.img
    if [  $WITH_BOOTSPLASH ]; then
        echo "  > Adding bootsplash image for 640x480"
        $BOOTSPLASHDIR/splash -s -f $BOOTSPLASHDIR/bootsplash-640x480.cfg >> $TOPDIR/imedia-initrd-$TARGET.img
	echo "  > Adding bootsplash image for 1024x768"
	$BOOTSPLASHDIR/splash -s -f $BOOTSPLASHDIR/bootsplash-1024x768.cfg >> $TOPDIR/imedia-initrd-$TARGET.img
    fi
    
    rm -f $TOPDIR/initrd.tmp
}

# Could be the same image for all $TARGETS but left like this for future image->$TARGET customisations
function create_image_splash_only()
{

    echo " > Creating bootsplash only initrd image"
    
    rm -f $TOPDIR/imedia-initrd-splash-only-$TARGET.img
    
    $BOOTSPLASHDIR/splash -s -f $BOOTSPLASHDIR/bootsplash-640x480.cfg >> $TOPDIR/imedia-initrd-splash-only-$TARGET.img
    $BOOTSPLASHDIR/splash -s -f $BOOTSPLASHDIR/bootsplash-1024x768.cfg >> $TOPDIR/imedia-initrd-splash-only-$TARGET.img

}

function sync_initrdtree()
{
        echo " > Sync'ing kernel modules"
    
	rm -rf $INITRDTREE/lib/modules/*
	
	# Make the real kernel version dir
        mkdir -p $INITRDTREE/lib/modules/$KERNEL_DIR

	# Sata Modules
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/scsi/BusLogic.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/scsi/qlogicfas408.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
	
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/scsi/sd_mod.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/scsi/sg.ko		 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/scsi/sr_mod.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/scsi/ide-scsi.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/ahci.ko	 	$INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/ata_piix.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/libata.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_mv.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_nv.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_sil.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_sil24.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_sis.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_uli.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_via.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_vsc.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
	
    #	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_promise.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
    #	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_qstor.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
    #	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_svw.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/
    #	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/ata/sata_sx4.ko	 $INITRDTREE/lib/modules/$KERNEL_DIR/


	
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/usb/core/usbcore.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
        cp  /lib/modules/$KERNEL_DIR/kernel/drivers/usb/host/ohci-hcd.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/usb/host/uhci-hcd.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/usb/host/ehci-hcd.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
	
	# libusual has problems with usb flash devices during boot
	#cp  /lib/modules/$KERNEL_DIR/kernel/drivers/usb/storage/libusual.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
	cp  /lib/modules/$KERNEL_DIR/kernel/drivers/usb/storage/usb-storage.ko $INITRDTREE/lib/modules/$KERNEL_DIR/
	
	# Make the /modules symlink
	echo " > Creating /modules symlink"
	rm -fr $INITRDTREE/modules
	ln -sf /lib/modules/$KERNEL_DIR/ $INITRDTREE/modules
	
	echo " > Running depmod"
	depmod -b $INITRDTREE $KERNEL_DIR
	
}

detect_kernel_version

for TARGET in $ARCH; do 
    KERNEL_DIR="$KERNEL_VERSION-$TARGET"
    echo "* Building initrd for $KERNEL_DIR kernel"
    sync_initrdtree
    create_image
    create_image_splash_only
done
