#!/bin/bash
# $Id: make_isolinux,v 1.15 2009-01-31 00:05:47 tim Exp $

if [ $# -ne 1 ]; then
    echo "You must supply the kernel image"
    exit 1
fi

SRC_DIR=tmp-build1
INITRD_DIR=tmp-build2
KERNEL=$1
#atl2-modules for eeepc
REQUIRED_PKGS="linux-image-${KERNEL} aufs-modules-${KERNEL} atl2-modules-${KERNEL} syslinux dash"

trim_lead_slash()
{
    slash=/
    echo ${1/#$slash/}
}

copyfile()
{
    mkdir -p ${INITRD_DIR}/$( dirname ${1} )
    cp -p ${SRC_DIR}/${1} ${INITRD_DIR}/${1}
}

rm -fr ${SRC_DIR} ${INITRD_DIR}
rm -fr isolinux

#Initialize the directory for installing a kernel

mkdir ${SRC_DIR}
cd ${SRC_DIR}
restore -r -f ../install.dmp
cd ..

cp -dpR aptmirror/debian ${SRC_DIR}/debian
echo "deb file:/debian stable main" >${SRC_DIR}/etc/apt/sources.list
echo "deb file:/debian stable/updates main" >>${SRC_DIR}/etc/apt/sources.list

#Install a kernel and syslinux
#setup kernel-img.conf
cat >${SRC_DIR}/etc/kernel-img.conf <<EOF
#link_in_boot = Yes
do_symlinks = Yes
do_initrd = Yes
EOF

#Set up fstab
cat >${SRC_DIR}/etc/fstab <<EOF
# /etc/fstab: static file system information.
#
# <file system>	<mount point>	<type>	<options>		<dump>	<pass>
ramdisk		/		tempfs	defaults		0	0
none		/proc		proc	defaults		0	0
EOF

#Needed for dash install
mknod ${SRC_DIR}/dev/null c 1 3

chroot ${SRC_DIR} /bin/bash <<CHROOT
export LANG=C

mount -t proc none /proc
apt-get update
apt-get --allow-unauthenticated -y install ${REQUIRED_PKGS}
umount /proc

CHROOT

#Copy the bits we need from ${SRC_DIR} to isolinux
mkdir isolinux
cp ${SRC_DIR}/vmlinuz isolinux/
cp ${SRC_DIR}/usr/lib/syslinux/isolinux.bin isolinux/
cp scripts/isolinux.cfg isolinux/
cp scripts/boot.msg isolinux/

#Now build an initrd
mkdir ${INITRD_DIR}
#copy in init and stage2
cp scripts/init ${INITRD_DIR}
cp scripts/stage2 ${INITRD_DIR}
#Some empty directories we need
mkdir ${INITRD_DIR}/etc
#an empty modules.conf
touch ${INITRD_DIR}/etc/modules.conf
#And an mtab
ln -s /proc/mounts ${INITRD_DIR}/etc/mtab

kernelver=$( LANG=C ls -l ${SRC_DIR}/vmlinuz | awk '{print $11}' | sed "s/^.*vmlinuz-//" )

MODULES="
    lib/modules/${kernelver}/extra/aufs/aufs.ko
    lib/modules/${kernelver}/kernel/fs/ext2/ext2.ko
    lib/modules/${kernelver}/kernel/fs/ext3/ext3.ko
    lib/modules/${kernelver}/kernel/fs/isofs/isofs.ko
    lib/modules/${kernelver}/kernel/fs/nls/nls_base.ko
    lib/modules/${kernelver}/kernel/lib/zlib_inflate/zlib_inflate.ko
    lib/modules/${kernelver}/kernel/drivers/ata/ata_piix.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-cd_mod.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-core.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-disk.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-floppy.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-generic.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-pnp.ko
    lib/modules/${kernelver}/kernel/drivers/ide/ide-tape.ko
    lib/modules/${kernelver}/kernel/drivers/ide/legacy/ide-cs.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/aec62xx.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/alim15x3.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/amd74xx.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/atiixp.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/cmd640.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/cmd64x.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/cs5520.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/cs5530.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/cs5535.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/cy82c693.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/delkin_cb.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/hpt34x.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/hpt366.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/ide-pci-generic.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/it8213.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/it821x.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/jmicron.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/ns87415.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/opti621.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/pdc202xx_new.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/pdc202xx_old.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/piix.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/rz1000.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/sc1200.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/serverworks.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/siimage.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/sis5513.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/slc90e66.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/tc86c001.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/triflex.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/trm290.ko
    lib/modules/${kernelver}/kernel/drivers/ide/pci/via82cxxx.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/ehci-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/isp116x-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/ohci-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/r8a66597-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/sl811-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/sl811_cs.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/u132-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/host/uhci-hcd.ko
    lib/modules/${kernelver}/kernel/drivers/usb/storage/usb-storage.ko
    lib/modules/${kernelver}/kernel/drivers/scsi/sd_mod.ko
    lib/modules/${kernelver}/kernel/drivers/scsi/sr_mod.ko
    lib/modules/${kernelver}/kernel/drivers/cdrom/cdrom.ko
    "
#Get all the binaries we need
#They are all referenced in init via SetCmd lines
#Except sh which is a symbolic link to dash
(
    IFS="="
    grep "^setCmd.*=" ${INITRD_DIR}/init |
	while read -r a b; do
	    copyfile `trim_lead_slash $b`
	done
    ln -s /bin/dash ${INITRD_DIR}/bin/sh
)


#Now copy all the libraries that these binaries depend on
EXECS="${INITRD_DIR}/*bin/*"

for i in $(
  for j in ${EXECS}; do
    chroot ${SRC_DIR} /bin/bash <<CHROOT
      ldd ${j#*/}
CHROOT
  done | grep -v linux-gate | grep -v ld-linux.so.2 | awk '{print $3}' | sort -u
); do
  copyfile `trim_lead_slash $i`
done

copyfile `trim_lead_slash /lib/ld-linux.so.2`


#Turn modules.dep into a makefile
# And copy all the modules we want in this ${INITRD_DIR} together with their dependencies
sed -e "s/\/lib\/modules\//.&/g" ${SRC_DIR}/lib/modules/${kernelver}/modules.dep \
    -e "s/$/\n\t@mkdir -p \$\$( dirname ${INITRD_DIR}\/\$@ ); cp -p ${SRC_DIR}\/\$@ ${INITRD_DIR}\/\$@/" >/tmp/modules.$$.mk
make -f /tmp/modules.$$.mk $MODULES
rm -f /tmp/modules.$$.mk

#Finally calculate a modules.dep
depmod -a -F ${SRC_DIR}/boot/System.map-${kernelver} -C ${INITRD_DIR}/etc/modules.conf -b ${INITRD_DIR} ${kernelver}

#Create /etc/udev
cp -dpR ${SRC_DIR}/etc/udev/ ${INITRD_DIR}/etc/udev

#set up our ld.so stuff
cp /sbin/ldconfig ${INITRD_DIR}/sbin
chroot ${INITRD_DIR} /sbin/ldconfig
rm ${INITRD_DIR}/sbin/ldconfig
cp serial ${INITRD_DIR}/serial
(cd "${INITRD_DIR}" && find . | cpio --quiet --dereference -o -H newc | gzip -9 >"../isolinux/initrd") || exit 1
rm -fr ${INITRD_DIR}
rm -fr ${SRC_DIR}

exit 0
