#!/bin/bash PROGNAME=`basename $0` || exit 1 DEBUG=0 QUIET=0 TARGET= OVERWRITE=0 WORKDIR=$PWD OUTPUT=image.iso CONFIGFILE=$WORKDIR/tortmpcd.conf function debug { if [ "$DEBUG" = "1" ]; then echo "${PROGNAME}:debug:$1" 1>&2; fi } function warning { if [ "$QUIET" = "0" ]; then echo "${PROGNAME}:warning:$1" 1>&2; fi } function usage { echo "Usage: ${PROGNAME}" exit } while [ "$1" != "" ]; do case $1 in -D | --debug ) shift DEBUG=1 ;; -q | --quiet ) shift QUIET=1 ;; --overwrite ) shift OVERWRITE=1 ;; -h | --help ) usage ;; -c | --config ) shift CONFIGFILE=$1 shift ;; -o | --output ) shift OUTPUT=$1 shift ;; * ) echo "$PROGNAME: unrecognized option or argument \`$1'" echo "Try \`$PROGNAME --help' for more information." exit 1 ;; esac done function cleanup { debug "cleanup called, arg=$1" trap - EXIT HUP INT TERM ERR if [ "$TARGET" != "" ]; then rm -f -r $TARGET fi exit $1 } function fatal { echo "${PROGNAME}:${1:-"unknown error"}" 1>&2 cleanup 1 } function sig_handler_HUPINTTERM { fatal "cought HUP, INT or TERM signal, exiting" } function sig_handler_ERR { debug "an error occured in a called command" cleanup 1 } function sig_handler_EXIT { debug "exit handler called" cleanup 0 } trap sig_handler_HUPINTTERM HUP INT TERM trap sig_handler_ERR ERR trap sig_handler_EXIT EXIT function get_file { debug "looking for package $1" RES=$MIRROR/`$PKGDETAILS PKGS $MIRROR $MIRROR/dists/$DIST/main/binary-i386/Packages $1 | cut -f 5 -d ' '` if [ "x$RES" = "x$MIRROR/" ]; then RES=$MIRROR/`$PKGDETAILS PKGS $MIRROR $MIRROR/dists/$DIST/main/debian-installer/binary-i386/Packages $1 | cut -f 5 -d ' '` fi if [ "x$RES" = "x$MIRROR/" ]; then fatal "unable to find package $1 in either main or main/debian-installer" fi echo $RES } function extract_to_initramfs { NAME=$1 shift ar p `get_file $NAME` data.tar.gz | tar --exclude ./usr/share/doc --exclude ./usr/share/lintian --exclude ./usr/share/man --wildcards -xvz -C $TARGET_INITRAMFS "$@" } #read configuration . $CONFIGFILE debug "using Debian mirror at $MIRROR to get $DIST" if [ ! -d $MIRROR ]; then fatal "$MIRROR does not exist" fi if [ ! -d $MIRROR/dists ]; then fatal "directory dists/ not found in $MIRROR" fi if [ ! -d $MIRROR/dists/$DIST ]; then fatal "dist $DIST not found on $MIRROR"; fi if [ ! -d `dirname $OUTPUT` ]; then fatal "output directory \``dirname $OUTPUT`\` does not exist" fi if [ -f $OUTPUT -a "$OVERWRITE" = "0" ]; then fatal "output file \`$OUTPUT\` already exists" fi DESCRIPTION=`cat $MIRROR/dists/$DIST/Release | grep -e "^Description: " | cut -f 2- -d ' '` debug "using $DESCRIPTION" TARGET=`mktemp -d` debug "created temporary directory $TARGET" mkdir $TARGET/iso9660 TARGET_ISO9660=$TARGET/iso9660 mkdir $TARGET/initramfs TARGET_INITRAMFS=$TARGET/initramfs # install pkgdetails binary and point to it ar p $MIRROR/pool/main/b/base-installer/bootstrap-base_${BBASE_VERSION}_i386.udeb data.tar.gz | tar -xz -C $TARGET_INITRAMFS ./usr/lib/debootstrap/pkgdetails PKGDETAILS=$TARGET_INITRAMFS/usr/lib/debootstrap/pkgdetails if [ ! -x $PKGDETAILS ]; then fatal "$PKGDETAILS not executable?" fi KERNELPACKAGE=`get_file linux-image-$DEBIAN_KERNEL` ar p $KERNELPACKAGE data.tar.gz | tar -xz -C $TARGET_ISO9660 ./boot/vmlinuz-$DEBIAN_KERNEL mv $TARGET_ISO9660/boot/vmlinuz-$DEBIAN_KERNEL $TARGET_ISO9660/boot/bzImage mkdir -p $TARGET_ISO9660/isolinux cp $ISOLINUX $TARGET_ISO9660/isolinux/ cat > $TARGET_ISO9660/isolinux/isolinux.cfg << "X" PROMPT 1 SAY Booting this will destroy (not in the forensic sense...) the contents of a partition, type "destroy" to boot LABEL destroy KERNEL /boot/bzImage INITRD /boot/initrd.img X extract_to_initramfs libc6 ./lib/{libc.so.6,libc-\*.so,libm.so.6,libm-\*.so,ld-linux.so.2,ld-\*.so,libdl.so.2,libdl-\*.so,libpthread.so.0,libpthread-\*.so} extract_to_initramfs busybox extract_to_initramfs libklibc extract_to_initramfs klibc-utils ./usr/lib/klibc/bin/{sh.shared,run-init,insmod} extract_to_initramfs binutils ./usr/bin/ar ./usr/lib/libbfd-\*.so extract_to_initramfs e2fslibs extract_to_initramfs libblkid1 extract_to_initramfs libuuid1 extract_to_initramfs libpopt0 extract_to_initramfs libcomerr2 extract_to_initramfs e2fsprogs ./sbin/{mkfs.ext2,mke2fs} extract_to_initramfs debootstrap-udeb cat > $TARGET_INITRAMFS/init << "X" #!/usr/lib/klibc/bin/sh.shared export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/klibc/bin busybox --install -s mkdir /proc /sys mount -t proc none /proc mount -t sysfs none /sys mknod /dev/hda b 3 0 mknod /dev/hdb b 3 64 mknod /dev/random c 1 8 mknod /dev/urandom c 1 9 mkdir /mirror sh.shared -i X chmod a+x $TARGET_INITRAMFS/init cd $TARGET_INITRAMFS find . | cpio -o -H newc | gzip > $TARGET_ISO9660/boot/initrd.img cd $WORKDIR genisoimage -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -c isolinux/boot.cat -quiet -r -o $OUTPUT $TARGET_ISO9660