#!/bin/bash

# Version: 20110515
# Copyright Jan Exß
# Contributions by Jochen Meyer-Hilberg
#
# Use and modify at your own risk

DIST_NUMBER=`cat /etc/debian_version`
case ${DIST_NUMBER} in
	#4.0*)
	#DIST="etch"
	#;;
	#5.0*)
	#DIST="lenny"
	#;;
	6.0*)
	DIST="squeeze"
	;;
	*)
	echo "Error:Debian release $DIST_NUMBER is not supported. Giving up."
	exit 6
	;;
esac
ARCH=`dpkg-architecture 2>/dev/null | grep DEB_HOST_ARCH= | cut -f 2 -d '='`

# --------------
# Config section
# --------------

IMAGENAME="debian-${DIST}-`date +%Y%m%d`"
	# IMAGENAME="debian-${DIST}-`date +%Y%m%d`"
	# IMAGENAME="my-little-debian"

CDNAME="Debian GNU/Linux 4.0 \"${DIST}\" - Unofficial ${ARCH} (`date +%Y%m%d`)"
	# CDNAME="Debian GNU/Linux 4.0 \"${DIST}\" - Unofficial ${ARCH} (`date +%Y%m%d`)"
	# CDNAME="Debian GNU/Linux 4.0 Personal Edition"

CDVOLUME="Debian GNU/Linux 4.0 (`date +%Y%m%d`)"
	# CDVOLUME="Debian GNU/Linux 4.0 (`date +%Y%m%d`)"
	# CDVOLUME="Debian GNU/Linux 4.0 Personal Edition"

CDROM_MOUNTPOINT="/media/cdrom0"
	# CDROM_MOUNTPOINT="/media/cdrom0"
	# CDROM_MOUNTPOINT="/mnt"

SELECTION="localhost"
	# SELECTION="localhost"
	# SELECTION="/home/jexss/public_html/debian/${DIST}/extra/jexss/dpkg-selections"

USE_OVERRIDE_FILES="yes"
	# USE_OVERRIDE_FILES="yes"
	# USE_OVERRIDE_FILES="no"

INSTALLER="yes"
	# INSTALLER="yes"
	# INSTALLER="no"

INSTALLER_VERSION="current"
	# INSTALLER_VERSION="current"
	# INSTALLER_VERSION="rc2"

INSTALLER_MEDIUM="network"
	# INSTALLER_MEDIUM="network"
	# INSTALLER_MEDIUM="cdrom"

DEBIAN_MIRROR="http://ftp.de.debian.org/debian"
	# DEBIAN_MIRROR="http://ftp.de.debian.org/debian"
	# DEBIAN_MIRROR="http://localhost/~jexss/debian/${DIST}/"

EXTRA_PACKAGES="."
	# EXTRA_PACKAGES="."
	# EXTRA_PACKAGES="/home/jexss/extra_debs/"

ADD_LIST=""
	# ADD_LIST=""
	# ADD_LIST="pcmcia-cs,telnet-ssl"

MAKE_CD_IMAGE="yes"
	# MAKE_CD_IMAGE="yes"
	# MAKE_CD_IMAGE="no"

VERIFY_SIZE="no"
	# VERIFY_SIZE="no"
	# VERIFY_SIZE="yes"

# ---------------------
# End of config section
# ---------------------

LC_ALL="C"
LC_MESSAGES="POSIX"
BASENAME=`basename $0`
WHEREAMI=`pwd`

Usage ()
{
    echo "Usage: ${BASENAME} [Options]

Options:
  -i Image name                  [debian-${DIST}-`date +%Y%m%d`]
  -c CD-Rom mount point          [/media/cdrom0]
  -s Selection                   [localhost]
  -v Installer version           [current]
  -m Install dir medium          [network]
  -d Debian mirror               [http://ftp.de.debian.org/debian]
  -e Path to extra packages      [.]
  -a List of additional packages (Comma separated)

  -O Don't use override files
  -I Don't include install dir
  -M Don't create CD image
  -V Verify CD image size before making the image

Selection may be a text file generated by \"dpkg --get-selections\"."
    exit 1
}

while getopts 'i:c:s:OIv:m:d:e:a:MVh' options 2>/dev/null
do
	case "${options}" in
		i)
		IMAGENAME=`echo ${OPTARG}`
		;;
		c)
		CDROM_MOUNTPOINT=`echo ${OPTARG}`
		;;
		s)
		SELECTION=`echo ${OPTARG}`
		;;
		O)
		USE_OVERRIDE_FILES="no"
		;;
		I)
		INSTALLER="no"
		;;
		v)
		INSTALLER_VERSION=`echo ${OPTARG}`
		;;
		m)
		INSTALLER_MEDIUM=`echo ${OPTARG}`
		;;
		d)
		DEBIAN_MIRROR=`echo ${OPTARG}`
		;;
		e)
		EXTRA_PACKAGES=`echo ${OPTARG}`
		;;
		a)
		ADD_LIST=`echo ${OPTARG}`
		;;
		M)
		MAKE_CD_IMAGE="no"
		;;
		V)
		VERIFY_SIZE="yes"
		;;
		h)
		Usage
		;;
		*)
		Usage
		;;
	esac
done

CHECK_EXTRA=`echo ${EXTRA_PACKAGES} | cut -b 1`

case ${CHECK_EXTRA} in
	'/')
	EXTRA_PACKAGES="${EXTRA_PACKAGES}"
	;;
	*)
	EXTRA_PACKAGES="${WHEREAMI}/${EXTRA_PACKAGES}"
	;;
esac

case $ARCH in
	"amd64")
		ARCH_INST="amd"
	;;
	"i386")
		ARCH_INST="386"
	;;
esac

echo " "
echo "-------------------------------------------------"
echo " Preparation"
echo "-------------------------------------------------"
echo " "

echo -n " Checking installed programs                                         "

PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:${PATH}
PROGRAMS="debootstrap apt-ftparchive apt-get basename cat chmod clear cp cut dpkg dpkg-scanpackages expr file grep gunzip gzip head ln ls mkdir genisoimage mount mv rm rmdir sed sleep sort tail tr umount uniq wc wget xargs syslinux"
NOTFOUNDLIST=""

for PROGRAM in `echo "${PROGRAMS}"`
do
	NOTFOUND=`type -ap ${PROGRAM}`
	case ${NOTFOUND} in
		"")
		NOTFOUNDLIST="${NOTFOUNDLIST} ${PROGRAM}"
		;;
		*)
		;;
	esac
done

case ${NOTFOUNDLIST} in
	"")
	echo "Done."
	;;
	*)
	echo ""
	echo ""
	echo ' ERROR. The following program(s) could not be found in the $PATH:'
	echo ""
	echo "${NOTFOUNDLIST}" | cut -f 2- -d ' ' | tr ' ' '\n' | sed s/^/' ==> '/
	echo ""
	echo ' Please make sure the corresponding package is installed on your system!'
	echo ""
	exit 0
	;;
esac

echo -n " Making directory structure                                          "

rm -rf ${IMAGENAME}/
mkdir -p ${IMAGENAME}/
cd ${IMAGENAME}/

mkdir -p dists/${DIST}/main/binary-${ARCH}
mkdir -p dists/${DIST}/contrib/binary-${ARCH}
mkdir -p dists/${DIST}/non-free/binary-${ARCH}
mkdir -p .disk

rm -f debian
ln -sf . debian

rm -f dists/stable
ln -sf ${DIST} dists/stable

mkdir -p pool/main
mkdir -p pool-installer/main
mkdir -p tmp
mkdir -p indices

echo "Done."
echo ""

echo ${CDNAME} > .disk/info
touch .disk/base_installable
echo "main" > .disk/base_components
echo "netcfg"              >  .disk/udeb_include
echo "ethdetect"           >> .disk/udeb_include
echo "wireless-tools-udeb" >> .disk/udeb_include

case ${SELECTION} in
	"localhost")
	dpkg --get-selections > tmp/dpkg-get-selections.tmp
	;;
	*)
	cd ..
	cat ${SELECTION} > ${IMAGENAME}/tmp/dpkg-get-selections.tmp
	cd ${IMAGENAME}
	;;
esac

case ${INSTALLER} in
	yes)
	echo "-------------------------------------------------"
	echo " Debian Installer"
	echo "-------------------------------------------------"
	echo " "
	echo -n " Creating installation directory                                     "
	mkdir -p dists/${DIST}/main/debian-installer/binary-${ARCH}
	mkdir -p dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/
	mkdir -p install.${ARCH_INST}/
	mkdir -p install/
	mkdir -p isolinux/
	echo "Done."

	case ${INSTALLER_MEDIUM} in
		"network")
			echo -n " Downloading installation files                                      "
			wget -c -q -P install/ ${DEBIAN_MIRROR}/dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/initrd.gz
			wget -c -q -P install/ ${DEBIAN_MIRROR}/dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/vmlinuz
			
			#cp -p /usr/lib/syslinux/isolinux.bin isolinux/
			cp -a /usr/lib/syslinux/* isolinux/
			wget -c -q -P dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/ ${DEBIAN_MIRROR}/dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/debian-cd_info.tar.gz
			tar xfz dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/debian-cd_info.tar.gz -C isolinux/
			perl -pi -e 's|/%install%/|/install/|g' isolinux/*cfg
			ln -s ../../../../../../../install/initrd.gz dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/initrd.gz
			ln -s ../../../../../../../install/vmlinuz dists/${DIST}/main/installer-${ARCH}/${INSTALLER_VERSION}/images/cdrom/vmlinuz
	
			wget -c -q -P tmp/ ${DEBIAN_MIRROR}/dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages.gz
			mv tmp/Packages.gz tmp/Packages_orig_installer.gz
			gunzip tmp/Packages_orig_installer.gz
			
			wget -c -q -P tmp/ ${DEBIAN_MIRROR}/dists/${DIST}/main/binary-${ARCH}/Packages.gz
			mv tmp/Packages.gz tmp/Packages_orig.gz
			gunzip tmp/Packages_orig.gz
			
			wget -c -q -P tmp/ ${DEBIAN_MIRROR}/dists/${DIST}/Release
			mv tmp/Release tmp/Release_orig
			
			wget -c -q -P tmp/ ${DEBIAN_MIRROR}/dists/${DIST}/main/binary-${ARCH}/Release
			mv tmp/Release tmp/Release_binary_orig
			echo "Done."
			
			NoPKG=`cat tmp/Packages_orig_installer | grep 'Filename: ' | wc -l | xargs expr`
			NoPKG=`printf %4i ${NoPKG}`

			CURRENT_PKG=1
			for udeb in `cat tmp/Packages_orig_installer | grep 'Filename: ' | cut -b 11-`
			do
				CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
				echo -e -n "\r Fetching installer packages                        ${CURRENT_PKG} / ${NoPKG}      "
				wget -c -q -P pool-installer/main/ ${DEBIAN_MIRROR}/${udeb}
				CURRENT_PKG=$[${CURRENT_PKG} + 1]
			done
			rm tmp/Packages_orig_installer
			echo "Done."
	
			echo -e -n " Generating Packages file (installer)                                "
			apt-ftparchive packages pool-installer > dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages 2>/dev/null
			gzip -c dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages > dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages.gz
			echo "Done."
		;;

		"cdrom")
			echo " "
			echo " Media change."
			echo " Please insert the CD containing the Debian Installer"
			echo -n " and press <ENTER> "
			read dummy
			echo " "
			mount ${CDROM_MOUNTPOINT} > /dev/null 2>&1
			
			echo -n " Copying installation files from CD-Rom                              "

			cp -p ${CDROM_MOUNTPOINT}/install.${ARCH_INST}/initrd.gz install.${ARCH_INST}/
			cp -p ${CDROM_MOUNTPOINT}/install.${ARCH_INST}/vmlinuz   install.${ARCH_INST}/
			cp -pr ${CDROM_MOUNTPOINT}/isolinux/* isolinux/
			cp -p ${CDROM_MOUNTPOINT}/dists/${DIST}/main/binary-${ARCH}/Packages.gz tmp/Packages_orig.gz
			chmod -R u+w .
			gunzip tmp/Packages_orig.gz

			cp -p ${CDROM_MOUNTPOINT}/dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages.gz tmp/Packages_orig_installer.gz
			chmod -R u+w .
			gunzip tmp/Packages_orig_installer.gz

			echo "Done."
			NoPKG=`cat tmp/Packages_orig_installer | grep 'Filename: ' | wc -l | xargs expr`
			NoPKG=`printf %4i ${NoPKG}`
	
			CURRENT_PKG=1
			for udeb in `cat tmp/Packages_orig_installer | grep 'Filename: ' | cut -b 11-`
			do
				CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
				echo -e -n "\r Copying installer packages                         ${CURRENT_PKG} / ${NoPKG}      "
				cp -p ${CDROM_MOUNTPOINT}/${udeb} pool-installer/main
				chmod -R u+w pool-installer/
				CURRENT_PKG=$[${CURRENT_PKG} + 1]
			done
			rm tmp/Packages_orig_installer

			cp ${CDROM_MOUNTPOINT}/dists/${DIST}/Release tmp/Release_orig
			cp ${CDROM_MOUNTPOINT}/dists/${DIST}/main/binary-${ARCH}/Release tmp/Release_binary_orig
		
			echo "Done."
			echo -e -n " Generating Packages file (installer)                                "
			apt-ftparchive packages pool-installer > dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages 2>/dev/null
			gzip -c dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages > dists/${DIST}/main/debian-installer/binary-${ARCH}/Packages.gz
			echo "Done."
	
			umount ${CDROM_MOUNTPOINT} > /dev/null 2>&1
		;;
	esac

	chmod -R u+w .

	echo -n " Collecting packages required by debootstrap                         "
	cp tmp/Release_orig dists/${DIST}/Release
	cp tmp/Release_binary_orig dists/${DIST}/main/binary-${ARCH}/Release
	cp tmp/Packages_orig dists/${DIST}/main/binary-${ARCH}/Packages
	for base_package in `/usr/sbin/debootstrap --print-debs ${DIST} tmp/installer-fake file://${WHEREAMI}/${IMAGENAME} 2>/dev/null`
	do
		echo ${base_package} >> tmp/dpkg-get-selections.tmp
	done
	DEBOOTSTRAP_UDEB=`find . -name 'debootstrap*udeb' | head -1`
	ar x ${DEBOOTSTRAP_UDEB} data.tar.gz
	tar xfz data.tar.gz
	for base_package in `DEBOOTSTRAP_DIR=./usr/lib/debootstrap /usr/sbin/debootstrap --print-debs ${DIST} tmp/installer-fake file://${WHEREAMI}/${IMAGENAME} 2>/dev/null`
	do
		echo ${base_package} >> tmp/dpkg-get-selections.tmp
	done
	rm -rf ./usr/ data.tar.gz
	echo "grub" >> tmp/dpkg-get-selections.tmp
	
	rm dists/${DIST}/Release
	rm dists/${DIST}/main/binary-${ARCH}/Release
	rm dists/${DIST}/main/binary-${ARCH}/Packages

	echo "Done."
	echo " "
	;;
	*)
	echo " Skipping download of installation files   "
	echo " "
	;;
esac

echo "-------------------------------------------------"
echo " List of Debian Packages"
echo "-------------------------------------------------"
echo " "

cat tmp/dpkg-get-selections.tmp | cut -f 1 | sort -u > tmp/dpkg-get-selections

case ${ADD_LIST} in
	'')
	false
	;;
	*)
	echo " At your request the following packages will be added to the list: "
	echo ",${ADD_LIST}" | sed s/,/'\n ==> '/g
	echo ""
	
	for addpkg in `echo "${ADD_LIST}" | tr ',' ' '`
	do
	echo ${addpkg} >> tmp/dpkg-get-selections.add
	done
	;;
esac

echo -n " Searching for unavailable packages                                  "
cat tmp/dpkg-get-selections | cut -f 1 | tr \\n ' ' | xargs dpkg --print-avail > /dev/null 2>tmp/packages.list.stderr
cat tmp/packages.list.stderr | grep "is not available" | cut -f 2 -d '`' | cut -f 1 -d "'" | sort > tmp/packages.list.unavailable
cat tmp/dpkg-get-selections | cut -f 1 | tr \\n ' ' | xargs apt-cache show > /dev/null 2>tmp/packages.list.error
cat tmp/packages.list.error | cut -f 6 -d ' ' >> tmp/packages.list.unavailable
sort -u tmp/packages.list.unavailable > tmp/packages.unavailable

NoUNAVAIL=`wc -l tmp/packages.unavailable | cut -f 1 -d ' ' | xargs expr`

case ${NoUNAVAIL} in
	"0")
	UNAVAIL="no"
	echo "None."
	;;
	*)
	UNAVAIL="yes"
	echo " "
	echo " "
	echo " WARNING!"
	echo " The following packages are not available for apt-get anymore:"
	echo ""
	cat tmp/packages.unavailable | sed s/^/' ==> '/
	echo ""
	echo " These packages will be removed from the list!"
	echo ""
	echo " Press <ENTER> to continue."
	echo ""
	read dummy
	for i in `cat tmp/packages.unavailable`
	do
		cat tmp/dpkg-get-selections | sort -u | sed "/^${i}\$/d" > tmp/dpkg-get-selections.new
		mv tmp/dpkg-get-selections.new tmp/dpkg-get-selections
	done
	;;
esac

	echo -n " Generating list of Debian packages                 "
	rm -f tmp/packages.list.full
	COUNTER_ALL=`cat tmp/dpkg-get-selections | cut -f 1 | wc -l | xargs expr`
	COUNTER_ALL=`printf %4i ${COUNTER_ALL}`
	COUNTER=1
	for i in `cat tmp/dpkg-get-selections | cut -f 1`
	do
		COUNTER=`printf %4i ${COUNTER}`
		echo -e -n "\r Generating list of Debian packages                 ${COUNTER} / ${COUNTER_ALL}      "
		apt-get --print-uris -y --force-yes --reinstall --allow-unauthenticated -d install $i | grep "^'" | grep "/${i}_" >> tmp/packages.list.full
		COUNTER=$[$COUNTER+1]
	done
	case ${ADD_LIST} in
		'')
		false
		;;
		*)
		for added_package in `cat tmp/dpkg-get-selections.add`
		do
		apt-get --print-uris -y --force-yes --reinstall --allow-unauthenticated -d install ${added_package} | grep "/${added_package}_"  >> tmp/packages.list.full
		done
		;;
	esac
	echo "Done."

sort -u tmp/packages.list.full > tmp/packages.full
cat tmp/packages.full | cut -f 2 -d "'" > tmp/packages.all
cat tmp/packages.full | cut -f 3 -d "'" | cut -f 3 -d " " > tmp/sizeofpackages

echo -n " Sorting list of Debian packages by origin "
sleep 1
echo -n "(file "
cat tmp/packages.all | grep "file:/"  | cut -f 2 -d "'" | cut -b 6- | sort > tmp/packages.list.file
sleep 1

echo -n "cdrom "
cat tmp/packages.all | grep "cdrom:" | cut -f 2 -d "'" | sort > tmp/packages.list.cdrom
sleep 1

echo -n "http "
cat tmp/packages.all | grep "http://" | cut -f 2 -d "'" | sort > tmp/packages.list.http
sleep 1

echo -n "ftp)     "
cat tmp/packages.all | grep "ftp://"  | cut -f 2 -d "'" | sort > tmp/packages.list.ftp
sleep 1
echo "Done."

echo -n " Searching for local packages                                        "

LIST_OF_EXTRA_PACKAGES=`ls ${EXTRA_PACKAGES}/*.deb 2>/dev/null`

case ${LIST_OF_EXTRA_PACKAGES} in
	"")
	echo "None."
	;;
	*)
	echo " "
	echo " "
	echo " The following local packages have been found:"
	echo " "
	for EXTRA_PACKAGE in `echo ${LIST_OF_EXTRA_PACKAGES}`
	do
		ar x ${EXTRA_PACKAGE} control.tar.gz
		tar xfz control.tar.gz ./control
		EXTRA_PACKAGE_NAME=`cat control | grep "Package:" | cut -f 2 -d ':' | cut -f 2 -d ' '`
		EXTRA_PACKAGE_SECTION=`cat control | grep "Section:" | cut -f 2 -d ':' | cut -f 2 -d ' '`
		case ${EXTRA_PACKAGE_NAME} in
			"")
			echo " "
			echo " ERROR! Package ${EXTRA_PACKAGE_NAME} has no Package Name!"
			echo " Removing ${EXTRA_PACKAGE_NAME} from list."
			;;
			*)
			case ${EXTRA_PACKAGE_SECTION} in
				"")
				echo " "
				echo " ERROR! Package ${EXTRA_PACKAGE_NAME} has no Section!"
				echo " Removing ${EXTRA_PACKAGE_NAME} from list."
				;;
				*)
				echo " ==> ${EXTRA_PACKAGE_NAME}"
				;;
			esac
		esac
		rm -f control control.tar.gz
	done
	echo " "
	echo "                                                                     Done."
	;;
esac

echo -n " Calculating total size of all packages                           "
SIZE_OF_ALL_PACKAGES=0
for packagesize in `cat tmp/sizeofpackages`
do
	SIZE_OF_ALL_PACKAGES=$[${SIZE_OF_ALL_PACKAGES}+${packagesize}]
done
SIZE_OF_ALL_PACKAGES=$[${SIZE_OF_ALL_PACKAGES}/1024]
SIZE_OF_ALL_PACKAGES=$[${SIZE_OF_ALL_PACKAGES}/1024]
SIZE_OF_ALL_PACKAGES=`printf %4i ${SIZE_OF_ALL_PACKAGES}`

case ${INSTALLER} in
	yes)
	SIZE_OF_UDEBS=`du -sm pool/main/ | cut -f 1 | xargs expr`
	SIZE_OF_ALL_PACKAGES=$[${SIZE_OF_ALL_PACKAGES}+${SIZE_OF_UDEBS}]
	SIZE_OF_ALL_PACKAGES=`printf %4i ${SIZE_OF_ALL_PACKAGES}`
	;;
	*)
	false
	;;
esac

echo "${SIZE_OF_ALL_PACKAGES} MB."
echo " "

echo "-------------------------------------------------"
echo " Collecting Debian Packages"
echo "-------------------------------------------------"
echo " "

NoPKG=`wc -l tmp/packages.list.file | cut -f 1 -d ' '`
NoPKG=`printf %4i ${NoPKG}`
case ${NoPKG} in
	"   0")
	echo -e " Fetching Debian packages (file)                              -      Done."
	;;
	
	*)
	CURRENT_PKG=1
	for package in `cat tmp/packages.list.file`
		do
		CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
		echo -e -n "\r Fetching local packages (file)                     ${CURRENT_PKG} / ${NoPKG}      "
		cp -p ${package} pool/
		CURRENT_PKG=$[${CURRENT_PKG} + 1]
	done
	echo "Done."
	;;
esac

cat tmp/packages.list.cdrom | cut -f 2 -d '[' | cut -f 1 -d ']' | sort | uniq > tmp/packages.list.cdrom-names

CDROM_INDEX_START=1
CDROM_INDEX_MAX=`cat tmp/packages.list.cdrom-names | wc -l | cut -f 1 -d ' '`

CDROM_INDEX=${CDROM_INDEX_START}

while [ ${CDROM_INDEX} -le ${CDROM_INDEX_MAX} ]
do
	CDNAME_CURRENT="`cat tmp/packages.list.cdrom-names | head -${CDROM_INDEX} | tail -1`"
	cat tmp/packages.list.cdrom | grep "${CDNAME_CURRENT}" > tmp/packages.list.cdrom_${CDROM_INDEX}
	CDROM_INDEX=$[${CDROM_INDEX} + 1]
done

NoPKG=`wc -l tmp/packages.list.cdrom | cut -f 1 -d ' '`
NoPKG=`printf %4i ${NoPKG}`
case ${NoPKG} in
	"   0")
	echo -e " Fetching Debian packages (cdrom)                             -      Done."
	;;
	
	*)
	for cdrom in `ls tmp/packages.list.cdrom_*`
	do
	NoPKG=`wc -l ${cdrom} | cut -f 1 -d ' '`
	NoPKG=`printf %4i ${NoPKG}`
		CDNAME=`head -1 ${cdrom} | cut -f 2 -d '[' | cut -f 1 -d ']' `
		echo " "
		echo " Media change."
		echo " Please insert the CD labeled"
		echo " ${CDNAME}"
		echo -n " and press <ENTER> "
		read dummy
		echo " "
		mount ${CDROM_MOUNTPOINT} > /dev/null 2>&1
		CURRENT_PKG=1
		for package in `cat ${cdrom} | cut -f 2 -d ']'`
		do
			CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
			echo -e -n "\r Fetching Debian packages (cdrom)                   ${CURRENT_PKG} / ${NoPKG}      "
			cp -p ${CDROM_MOUNTPOINT}/${package} pool/
			CURRENT_PKG=$[${CURRENT_PKG} + 1]
		done
		sleep 2
		umount ${CDROM_MOUNTPOINT} > /dev/null 2>&1
		echo "Done."
	done
	;;
esac

NoPKG=`wc -l tmp/packages.list.http | cut -f 1 -d ' '`
NoPKG=`printf %4i ${NoPKG}`
case ${NoPKG} in
	"   0")
	echo -e " Fetching Debian packages (http)                              -      Done."
	;;
	*)
	CURRENT_PKG=1
	for package in `cat tmp/packages.list.http`
	do
		CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
		echo -e -n "\r Fetching Debian packages (http)                    ${CURRENT_PKG} / ${NoPKG}      "
		wget -c -q -P pool/ ${package}
		CURRENT_PKG=$[${CURRENT_PKG} + 1]
	done
	echo "Done."
	;;
esac

NoPKG=`wc -l tmp/packages.list.ftp | cut -f 1 -d ' '`
NoPKG=`printf %4i ${NoPKG}`
case ${NoPKG} in
	"   0")
	echo -e " Fetching Debian packages (ftp)                               -      Done."
	;;
	*)
	CURRENT_PKG=1
	for package in `cat tmp/packages.list.ftp`
		do
		CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
		echo -e -n "\r Fetching Debian packages (ftp)                     ${CURRENT_PKG} / ${NoPKG}      "
		wget -c -q -P pool/ ${package}
		CURRENT_PKG=$[${CURRENT_PKG} + 1]
	done
	echo "Done."
	;;
esac

cd pool

SIZE_OF_ALL_PACKAGES=`du -sm | cut -f 1`
SIZE_OF_ALL_PACKAGES=`printf %4i ${SIZE_OF_ALL_PACKAGES}`

echo " Total size of all packages:                                      ${SIZE_OF_ALL_PACKAGES} MB."
echo " "

echo "-------------------------------------------------"
echo " Completing Debian Mirror"
echo "-------------------------------------------------"
echo " "

NoPKG=`ls *.deb | wc -l | cut -f 1 -d ' '`
NoPKG=`printf %4i ${NoPKG}`
CURRENT_PKG=1
for filename in `ls *.deb`
do
	CURRENT_PKG=`printf %4i ${CURRENT_PKG}`
	package=`ls ${filename} | cut -f 1 -d '_'`
	echo -e -n "\r Sorting packages by section                        ${CURRENT_PKG} / ${NoPKG}      "
	PKG_SECTION=`apt-cache show ${package} | grep 'Section:' | cut -f 2 -d ' ' | head -1`
	case ${PKG_SECTION} in
		'non-free/'*)
		PKG_SECTION="non-free"
		;;
		'contrib/'*)
		PKG_SECTION="contrib"
		;;
		*)
		PKG_SECTION="main"
		;;
	esac
	PKG_FILENAME=`apt-cache show ${package} | grep 'Filename:' | cut -f 2 -d ' ' | head -1 | xargs basename`
	mkdir -p ${PKG_SECTION}
	mv ${filename} ${PKG_SECTION}/${PKG_FILENAME}
	CURRENT_PKG=$[${CURRENT_PKG} + 1]
done
echo "Done."

cd ..

case ${LIST_OF_EXTRA_PACKAGES} in
	"")
	false
	;;
	*)
	echo -n " Sorting local packages by section                                   "
	for EXTRA_PACKAGE in `echo ${LIST_OF_EXTRA_PACKAGES}`
	do
		ar x ${EXTRA_PACKAGE} control.tar.gz
		tar xfz control.tar.gz ./control
		EXTRA_PACKAGE_NAME=`cat control | grep "Package:" | cut -f 2 -d ':' | cut -f 2 -d ' '`
		EXTRA_PACKAGE_SECTION=`cat control | grep "Section:" | cut -f 2 -d ':' | cut -f 2 -d ' '`
		case ${EXTRA_PACKAGE_NAME} in
			"")
			;;
			*)
			case ${EXTRA_PACKAGE_SECTION} in
				'non-free/'*)
				EXTRA_PACKAGE_SECTION="non-free"
				;;
				'contrib/'*)
				EXTRA_PACKAGE_SECTION="contrib"
				;;
				*)
				EXTRA_PACKAGE_SECTION="main"
				;;
			esac
			mkdir -p pool/${EXTRA_PACKAGE_SECTION}/
			cp -p ${EXTRA_PACKAGE} pool/${EXTRA_PACKAGE_SECTION}/
			;;
		esac
		rm -f control control.tar.gz
	done
	echo "Done."
	;;
esac

case ${USE_OVERRIDE_FILES} in
	yes)

	OVERRIDE_FILE="indices/override.${DIST}"

	echo -n " Downloading override files                                          "
	
	rm -f indices/override.${DIST}
	
	wget -q -P indices ${DEBIAN_MIRROR}/indices/override.${DIST}.main.gz
	wget -q -P indices ${DEBIAN_MIRROR}/indices/override.${DIST}.contrib.gz
	wget -q -P indices ${DEBIAN_MIRROR}/indices/override.${DIST}.non-free.gz
	
	gunzip indices/override.${DIST}.main.gz
	gunzip indices/override.${DIST}.contrib.gz
	gunzip indices/override.${DIST}.non-free.gz

	cat indices/override.${DIST}.main >> indices/override.${DIST}
	cat indices/override.${DIST}.contrib >> indices/override.${DIST}
	cat indices/override.${DIST}.non-free >> indices/override.${DIST}

	gzip indices/override.${DIST}.main
	gzip indices/override.${DIST}.contrib
	gzip indices/override.${DIST}.non-free

	echo "Done."

	;;
	
	*)
	OVERRIDE_FILE="/dev/null"
	echo " Using /dev/null as the override file   "
	;;
esac

echo -e -n " Generating Packages file (main)                                     "
dpkg-scanpackages pool/main ${OVERRIDE_FILE} > dists/${DIST}/main/binary-${ARCH}/Packages          2>/dev/null
gzip -c dists/${DIST}/main/binary-${ARCH}/Packages > dists/${DIST}/main/binary-${ARCH}/Packages.gz
echo "Done."

echo -e -n " Generating Packages file (contrib)                                  "
dpkg-scanpackages pool/contrib ${OVERRIDE_FILE} > dists/${DIST}/contrib/binary-${ARCH}/Packages            2>/dev/null
gzip -c dists/${DIST}/contrib/binary-${ARCH}/Packages > dists/${DIST}/contrib/binary-${ARCH}/Packages.gz
echo "Done."

echo -e -n " Generating Packages file (non-free)                                 "
dpkg-scanpackages pool/non-free ${OVERRIDE_FILE} > dists/${DIST}/non-free/binary-${ARCH}/Packages  2>/dev/null
gzip -c dists/${DIST}/non-free/binary-${ARCH}/Packages > dists/${DIST}/non-free/binary-${ARCH}/Packages.gz
echo "Done."

chmod -R u+w .

case ${INSTALLER} in
	yes)
	echo -n " Creating Release file                                               "

	cp tmp/Release_binary_orig dists/${DIST}/main/binary-${ARCH}/Release
	cat tmp/Release_orig | grep -v "SHA1" | grep -v "SHA256" | grep ":" >> dists/${DIST}/Release

	cd dists/${DIST}

	MD5_PACKAGES_1=`md5sum main/binary-${ARCH}/Packages | cut -f 1 -d ' '`
	MD5_PACKAGES_2=`md5sum main/binary-${ARCH}/Packages.gz | cut -f 1 -d ' '`
	MD5_PACKAGES_3=`md5sum contrib/binary-${ARCH}/Packages | cut -f 1 -d ' '`
	MD5_PACKAGES_4=`md5sum contrib/binary-${ARCH}/Packages.gz | cut -f 1 -d ' '`
	MD5_PACKAGES_5=`md5sum non-free/binary-${ARCH}/Packages | cut -f 1 -d ' '`
	MD5_PACKAGES_6=`md5sum non-free/binary-${ARCH}/Packages.gz | cut -f 1 -d ' '`
	MD5_PACKAGES_7=`md5sum main/debian-installer/binary-${ARCH}/Packages | cut -f 1 -d ' '`
	MD5_PACKAGES_8=`md5sum main/debian-installer/binary-${ARCH}/Packages.gz | cut -f 1 -d ' '`

	LL_PACKAGES_1=`ls -l main/binary-${ARCH}/Packages | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_2=`ls -l main/binary-${ARCH}/Packages.gz | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_3=`ls -l contrib/binary-${ARCH}/Packages | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_4=`ls -l contrib/binary-${ARCH}/Packages.gz | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_5=`ls -l non-free/binary-${ARCH}/Packages | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_6=`ls -l non-free/binary-${ARCH}/Packages.gz | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_7=`ls -l main/debian-installer/binary-${ARCH}/Packages | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`
	LL_PACKAGES_8=`ls -l main/debian-installer/binary-${ARCH}/Packages.gz | tr ' ' '\n' | grep -v '^$' | head -5 | tail -1`

	echo " ${MD5_PACKAGES_1}  ${LL_PACKAGES_1} main/binary-${ARCH}/Packages" >> Release
	echo " ${MD5_PACKAGES_2}  ${LL_PACKAGES_2} main/binary-${ARCH}/Packages.gz" >> Release
	echo " ${MD5_PACKAGES_3}  ${LL_PACKAGES_3} contrib/binary-${ARCH}/Packages" >> Release
	echo " ${MD5_PACKAGES_4}  ${LL_PACKAGES_4} contrib/binary-${ARCH}/Packages.gz" >> Release
	echo " ${MD5_PACKAGES_5}  ${LL_PACKAGES_5} non-free/binary-${ARCH}/Packages" >> Release
	echo " ${MD5_PACKAGES_6}  ${LL_PACKAGES_6} non-free/binary-${ARCH}/Packages.gz" >> Release
	echo " ${MD5_PACKAGES_7}  ${LL_PACKAGES_7} main/debian-installer/binary-${ARCH}/Packages" >> Release
	echo " ${MD5_PACKAGES_8}  ${LL_PACKAGES_8} main/debian-installer/binary-${ARCH}/Packages.gz" >> Release
	echo "Done."

	cd ../..
	;;
	*)
	false
	;;
esac

chmod -R u+w .

rm -rf tmp/

case ${MAKE_CD_IMAGE} in
	yes)

	echo " "
	echo "-------------------------------------------------"
	echo " Creating CD Image"
	echo "-------------------------------------------------"
	echo " "

	CDSIZE=`du -sm  | cut -f 1 `

	echo " Size of CD image: ${CDSIZE} MB"
	echo " "

	case ${VERIFY_SIZE} in
		yes)
		echo " Press <R>     to recalculate the CD image size."
		echo " Press <ENTER> to begin creation of the CD image.   "
		echo " "
	
		READY="0"
	
		until [ ${READY} -eq "1" ]
		do
			read -n 1 -s ANSWER
	
			case ${ANSWER} in
				"r")
				CDSIZE=`du -sm   | cut -f 1 `
				echo " Size of CD image: ${CDSIZE} MB"
				READY="0"
				;;
				*)
				READY="1"
				;;
			esac
		done
		;;
		*)
		false
		;;
	esac

	case ${INSTALLER} in
		yes)
		echo " "
		echo " Making bootable CD image \"${IMAGENAME}.iso\"."
		genisoimage -V "${CDVOLUME}" -o ../${IMAGENAME}.iso -quiet -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat -r .
		;;
		*)
		echo " "
		echo " Making non-bootable CD image \"${IMAGENAME}.iso\"."
		genisoimage -V "${CDVOLUME}" -o ../${IMAGENAME}.iso -quiet -r .
		;;
	esac
	;;
	
	*)
	echo " "
	echo " No CD Image will be created."
	echo " "
	
	;;
esac

echo " "
echo "-------------------------------------------------"
echo " Finish"
echo "-------------------------------------------------"
echo " "

