#!/bin/sh

DST=${2:-fla1}

echo DST: ${DST}

if [ -f /etc/modules.conf ] ; then
	MODFILE=/etc/modules.conf
else
	MODFILE=/etc/conf.modules
fi

#
# Create a DOC image
#
OS=`cat /proc/sys/kernel/osrelease`
MNT="/mnt/${DST}"
export GC="./getchar"

yesno(){
	echo -en "${@} (Y/n)"
	yesno_reply=`${GC}` 
	echo -en "$yesno_reply\n"
	case "$yesno_reply" in
	[Yy]|[Yy]es|[Oo]ui|[Ss]i|[jJ]a) return 0 ;;
	*) return 1 ;;
	esac
}

errexit() {
	echo
	echo $@
	echo
	exit 1
}


err(){
errexit "caught signal"
}

trap "err" 2 3

WAIT() {
echo -en "Press any key to continue: "
./getchar
echo
}

MSG() {
echo -en "$* ... "
}
DONE() {
echo " ... done"
}

# check for required argument
if [ -z "$1" ]; then
	errexit "No file argument given, usage: mkdocimg list.files"
fi

# check that we can find the file list
if [ ! -s "$1" ]; then
	errexit "Couldn't find $1"
fi
FILELIST="$1"

MSG "Creating mount point ${MNT}"
mkdir -p ${MNT} || errexit "mkdir ${MNT} failed"
DONE

echo
yesno "Creating a new filesystem on /dev/msys/${DST}, do you want to abort?" && 
	errexit "Operation aborted"
echo
yesno "Are you sure, this will destroy all data on /dev/msys/${DST}?" || 
	errexit "Operation aborted"

MSG "Creating ext2 filesystem on /dev/msys/${DST}"
mke2fs /dev/msys/${DST} || errexit "mke2fs failed"	
DONE

MSG "Mounting /dev/msys/${DST} on ${MNT}"
mount /dev/msys/${DST} ${MNT} || errexit "mke2fs failed"	
DONE

echo -e "\nCopying files listed in $FILELIST"
MSG "This may take a few minutes"
cat ${FILELIST} |\
    if [ -f /etc/modules.conf ] ; then sed s/conf.modules/modules.conf/g;
    else cat; fi |\
       ( cd /; cpio -pdmu --quiet --sparse ${MNT} )
DONE

MSG "Fixing syslogd invokation"
   echo "exec syslogd" >> ${MNT}/etc/rc.d/rc.local
DONE

MSG "Creating /home"
mkdir -p ${MNT}/home || errexit "mkdir ${MNT}/home"
DONE

MSG "Copying /sbin/doc-lilo"
cp /sbin/doc-lilo ${MNT}/sbin || errexit "cp /sbin/doc-lilo failed"
DONE

MSG "Stripping libraries"
for l in lib usr/lib; do
   (
   cd ${MNT}/${l}
   file * | sed -n '/ELF/s/\(.*\):.*/\1/p' | xargs -r strip -g
   )
done
DONE

MSG "Stripping binaries"
for b in bin sbin usr/bin usr/sbin; do
   (
   cd ${MNT}/${b}
   file * | sed -n '/ELF/s/\(.*\):.*/\1/p' | xargs -r strip -s
   )
done
DONE

MSG "Copying /boot"
( 
cd /boot
find doc.b chain.b *${OS}* | 
	sed '/vmlinux/d' | 
	cpio -pdmu --quiet --sparse ${MNT}/boot || 
		errexit "cpio ${MNT}/boot failed"
)
DONE

MSG "Copying /etc/{group,passwd}"
cp /etc/{group,passwd} ${MNT}/etc || errexit "cp /etc/{group,passwd} failed"
DONE

MSG "Copying /etc/sysconfig"
(
cd /etc/
find sysconfig | cpio -pdmu --quiet --sparse ${MNT}/etc || 
	errexit "cpio ${MNT}/etc/ failed"
)
DONE

MSG "Copying /etc/fstab"
awk < /etc/fstab > /tmp/fstab -- '
function pfstab(device,mount,fstype,opt,dump,fsck) {
printf "%-24s %-24s %-10s %-20s %s %s\n", device, mount, fstype, opt, dump, fsck;
}
BEGIN {pfstab("/dev/msys/XXXX","/","ext2","defaults","1","1");}
{
if ($2 == "/") {
	mnt=$1;
	gsub(/\/dev/,"/mnt",mnt);
	pfstab("#"$1,mnt,$3,$4,$5,$6);
}
else if (/^\/dev/) {
	pfstab("#"$1,$2,$3,$4,$5,$6);
}
else {
	pfstab($1,$2,$3,$4,$5,$6);
}
}
' || errexit "awk < fstab failed"

sed "s/XXXX/${DST}/" < /tmp/fstab > ${MNT}/etc/fstab 
rm /tmp/fstab
DONE

MSG "Setting up lilo.conf"
sed -e s/initrd.img/initrd-${OS}.img/g \
    -e s/vmlinuz/vmlinuz-${OS}/g \
    -e s/System.map/System.map-${OS}/g \
        < lilo.template \
        > ${MNT}/etc/lilo.conf 
DONE



MSG "Copying all modules; remove ones you don't want by hand afterward"
rm -rf ${MNT}/lib/modules/*
(cd /lib/modules; tar cf - ${OS}) |\
    (cd ${MNT}/lib/modules; tar xpf -)
DONE

MSG "Running doc-lilo"
doc-lilo -v -r ${MNT} || errexit "doc-lilo failed"
DONE

MSG "Unmounting ${MNT}"
umount ${MNT}
DONE

