+# http://www.debian.org/releases/stable/i386/index.html.en
+
+# variables {{{
+PN="$(basename $0)"
+VERSION="$(dpkg --list $PN 2>/dev/null| awk '/^i/ {print $3}')"
+VERSION="${VERSION:-unknown}"
+MNTPOINT="/mnt/debootstrap.$$"
+
+# defaults
+CHROOT_SCRIPTS='yes'
+CONFFILES='/etc/debootstrap'
+DEBCONF='yes'
+DEBIAN_FRONTEND='noninteractive'
+DEBOOTSTRAP='debootstrap'
+DEFAULT_LOCALES='en_US.UTF-8'
+EXTRAPACKAGES='yes'
+FALLBACK_MIRROR='http://http.debian.net/debian'
+FORCE=''
+HOSTNAME='grml'
+INITRD='yes'
+INSTALL_NOTES='/etc/debootstrap/install_notes'
+LOCALES='yes'
+MIRROR="$FALLBACK_MIRROR"
+MKFS='mkfs.ext3'
+PACKAGES='yes'
+PRE_SCRIPTS='yes'
+RECONFIGURE='console-data'
+RELEASE='wheezy'
+RM_APTCACHE='yes'
+SCRIPTS='yes'
+SECURE='yes'
+TIMEZONE='Europe/Vienna'
+TUNE2FS='tune2fs -c0 -i0'
+UPGRADE_SYSTEM='yes'
+VMSIZE="2G"
+
+# inside the chroot system locales might not be available, so use minimum:
+export LANG=C
+export LC_ALL=C
+
+# make sure interactive mode is only executed when
+# using an empty configuration file or option --interactive
+INTERACTIVE=''
+# }}}
+
+# help text {{{
+usage() {
+ echo "$PN - wrapper around debootstrap for installing Debian
+
+Usage: $PN [options]
+
+Bootstrap options:
+
+ -m, --mirror <URL> Mirror which should be used for apt-get/aptitude.
+ -i, --iso <mnt> Mountpoint where a Debian ISO is mounted to, for use
+ instead of fetching packages from a mirror.
+ -r, --release <name> Release of new Debian system (default: wheezy).
+ -t, --target <target> Target partition (/dev/...) or directory where the
+ system should be installed to.
+ -p, --mntpoint <mnt> Mountpoint used for mounting the target system,
+ has no effect if -t is given and represents a directory.
+ --debopt <params> Extra parameters passed to the debootstrap command.
+ --interactive Use interactive mode (frontend).
+ --nodebootstrap Skip debootstrap, only do configuration to the target.
+ --grub <device> Target for grub installation. Usage example: /dev/sda
+ --arch <arch> Set target architecture, use for installing i386 on amd64.
+ --filesystem <fs> Filesystem that should be used when target is a partition
+ or Virtual Machine (see --vmfile).
+ --force Do not prompt for user acknowledgement.
+
+Options for Virtual Machine deployment:
+
+ --vmfile Set up a Virtual Machine instead of installing to
+ a partition or directory, to be combined with --target,
+ like: --vmfile --target /mnt/sda1/qemu.img
+ --vmsize <size> Use specified size for size of VM file (default: 2G).
+ Syntax as supported by qemu-img, like: --vmsize 3G
+
+Configuration options:
+
+ -c, --config <file> Use specified configuration file, defaults to
+ /etc/debootstrap/config
+ -d, --confdir <path> Place of config files for debootstrap, defaults
+ to /etc/debootstrap
+ --packages <file> Install packages defined in specified list file
+ instead of using /etc/debootstrap/packages.
+ --nopackages Skip installation of packages defined in
+ /etc/debootstrap/packages
+ --debconf <file> Pre-seed packages using specified pre-seed db file.
+ --grmlrepos Enable Grml's Debian repository (deb.grml.org).
+ --backportrepos Enable Debian's backports repository (backports.debian.org).
+ --keep_src_list Do not overwrite user provided apt sources.list.
+ --hostname <name> Hostname of Debian system.
+ --nopassword Do not prompt for the root password.
+ --password <pwd> Use specified password as password for user root.
+ --bootappend <line> Add specified appendline to kernel whilst booting.
+ --chroot-scripts <d> Execute chroot scripts from specified directory.
+ --pre-scripts <dir> Execute scripts from specified directory (before chroot-scripts).
+ --scripts <dir> Execute scripts from specified directory (after chroot-scripts).
+
+Other options:
+
+ -v, --verbose Increase verbosity.
+ -h, --help Print this usage information and exit.
+ -V, --version Show summary of options and exit.
+
+Usage examples can be found in the grml-debootstrap manpage.
+Send bugreports to the grml-team: bugs (at) grml.org || http://grml.org/bugs/
+"
+}
+
+if [ "$1" = '-h' ] || [ "$1" = '-help' ] || [ "$1" = "--help" ] ; then
+ usage
+ echo 'Please notice that this script requires root permissions!'
+ exit 0
+fi
+# }}}
+
+# early helper functions {{{
+GOOD='\e[32;01m'
+WARN='\e[33;01m'
+BAD='\e[31;01m'
+NORMAL='\e[0m'
+HILITE='\e[36;01m'
+BRACKET='\e[34;01m'
+
+einfo() {
+ einfon "$1\n"
+ return 0
+}
+
+einfon() {
+ [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
+ printf " ${GOOD}*${NORMAL} $*"
+ LAST_E_CMD=einfon
+ return 0
+}
+
+eerror() {
+ [ "${RC_ENDCOL}" != "yes" ] && [ "${LAST_E_CMD}" = "ebegin" ] && echo
+ printf " ${BAD}*${NORMAL} $*\n" >&2
+ LAST_E_CMD=eerror
+ return 0
+}
+
+eend() {
+ local retval="${1:-0}"
+ shift
+ if [ $retval -gt 0 ]; then
+ printf " ${BAD}-> Failed (rc=${retval})${NORMAL}\n"
+ fi
+ return $retval
+}
+
+check4root(){
+ if [ "$(id -u 2>/dev/null)" != 0 ] ; then
+ echo 1>&2 "Error: please run this script with uid 0 (root)." ; return 1
+ fi
+}
+
+check4progs(){
+ local RC=''
+ for arg in $* ; do
+ which $arg >/dev/null 2>&1 || RC="$arg"
+ done
+ if [ -n "$RC" ] ; then
+ echo "$RC not installed"
+ return 1
+ fi
+}
+# }}}
+
+# helper functions {{{
+cleanup() {
+ if [ -n "$CHROOT_VARIABLES" ] ; then
+ einfo "Removing ${CHROOT_VARIABLES}" ; rm "$CHROOT_VARIABLES" ; eend $?
+ fi
+
+ if [ -n "$STAGES" ] ; then
+ einfo "Removing ${STAGES}" ; rmdir "$STAGES" ; eend $?
+ fi
+
+ # Remove temporary mountpoint again
+ if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
+ rmdir "$MNTPOINT" 2>/dev/null
+ fi
+
+ # make sure $TARGET is not mounted when exiting grml-debootstrap
+ if [ -n "$MNTPOINT" ] ; then
+ if grep -q "$MNTPOINT" /proc/mounts ; then
+ # make sure nothing is left inside chroot so we can unmount it
+ [ -x "$MNTPOINT"/etc/init.d/ssh ] && "$MNTPOINT"/etc/init.d/ssh stop
+ [ -x "$MNTPOINT"/etc/init.d/mdadm ] && "$MNTPOINT"/etc/init.d/mdadm stop
+
+ [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount -a >/dev/null 2>&1
+
+ # ugly, but make sure we really don't leave anything (/proc /proc and
+ # /dev /dev are intended, trying to work around timing issues, see #657023)
+ for ARG in /sys /proc /proc /dev /dev ; do
+ [ -x "$MNTPOINT"/bin/umount ] && chroot "$MNTPOINT" umount $ARG >/dev/null 2>&1
+ umount "$MNTPOINT"/$ARG >/dev/null 2>&1
+ done
+
+ if [ -n "$ISODIR" ] ; then
+ [ -d "$MNTPOINT/$ISODIR" ] && umount "$MNTPOINT/$ISODIR" >/dev/null 2>&1
+ fi
+
+ if [ -n "$DIRECTORY" ] ; then
+ einfo "Not unmounting $MNTPOINT as you requested me to install into a directory of your own choice." ; eend 0
+ else
+ einfo "Unmounting $MNTPOINT"
+ umount "$MNTPOINT"
+ eend $?
+ fi
+
+ if [ -n "$STAGES" ] ; then
+ echo -n "Removing stages directory ${STAGES}: "
+ rm -rf "$STAGES" && echo done
+ fi
+
+ # remove directory only if we used the default with process id inside the name
+ if echo "$MNTPOINT" | grep -q '/mnt/debootstrap\.' ; then
+ einfo "Removing directory ${MNTPOINT}"
+ rmdir "$MNTPOINT"
+ eend $?
+ fi
+ fi
+ fi
+
+ if [ -n "${ORIG_TARGET}" ] ; then
+ einfo "Removing loopback mount of file ${ORIG_TARGET}."
+ kpartx -d "${ORIG_TARGET}" ; eend $?
+ fi
+}
+
+# we want to exit smoothly and clean:
+bailout(){
+
+ cleanup
+
+ [ -n "$1" ] && EXIT="$1" || EXIT="1"
+ [ -n "$2" ] && einfo "Notice: remove $STAGES/$2 to reexecute the stage"
+
+ exit "$EXIT"
+}
+trap bailout HUP INT QUIT TERM
+
+# we want to execute all the functions only once, simple check for it:
+stage() {
+ if [ -n "$2" ] ; then
+ echo "$2" > "${STAGES}/${1}"
+ return 0
+ elif grep -q done "${STAGES}/${1}" 2>/dev/null ; then
+ ewarn "Notice: stage $1 has been executed already, skipping execution therefore." ; eend 0
+ ewarn " To reexecute it clean up the according directory inside $STAGES" ; eend 0
+ return 1
+ fi
+}
+# }}}
+
+# make sure we have what we need {{{
+check4progs debootstrap || bailout 1
+# }}}
+
+# source main configuration file {{{