Update comment regarding checksum generation
[grml-live.git] / grml-live
index 95f0b3e..bdefd28 100755 (executable)
--- a/grml-live
+++ b/grml-live
@@ -12,6 +12,9 @@
 export LANG=C
 export LC_ALL=C
 
 export LANG=C
 export LC_ALL=C
 
+# avoid leaking into chroots
+unset TMPDIR
+
 # define function getfilesize before "set -e"
 if stat --help >/dev/null 2>&1; then
   getfilesize='stat -c %s'  # GNU stat
 # define function getfilesize before "set -e"
 if stat --help >/dev/null 2>&1; then
   getfilesize='stat -c %s'  # GNU stat
@@ -61,12 +64,15 @@ Usage: $PN [options, see as follows]
    -q                      skip mksquashfs
    -Q                      skip netboot package build
    -r <release_name>       release name
    -q                      skip mksquashfs
    -Q                      skip netboot package build
    -r <release_name>       release name
-   -s <suite>              Debian suite; values: etch, lenny, squeeze, sid
+   -s <suite>              Debian suite/release, like: stable, testing, unstable
+   -S <script_directory>   place of scripts (defaults to /usr/share/grml-live/scripts)
    -t <template_directory> place of the templates
    -u                      update existing chroot instead of rebuilding it from scratch
    -U <username>           arrange output to be owned by specified username
    -v <version_number>     specify version number of the release
    -V                      increase verbosity in the build process
    -t <template_directory> place of the templates
    -u                      update existing chroot instead of rebuilding it from scratch
    -U <username>           arrange output to be owned by specified username
    -v <version_number>     specify version number of the release
    -V                      increase verbosity in the build process
+   -w <date>               wayback machine, build system using Debian archives
+                           from specified date
    -z                      use ZLIB instead of LZMA/XZ compression
 
 Usage examples:
    -z                      use ZLIB instead of LZMA/XZ compression
 
 Usage examples:
@@ -74,7 +80,7 @@ Usage examples:
     $PN
     $PN -c GRMLBASE,GRML_FULL,AMD64 -o /dev/shm/grml
     $PN -c GRMLBASE,GRML_FULL,AMD64 -i grml_0.0-1.iso -v 0.0-1
     $PN
     $PN -c GRMLBASE,GRML_FULL,AMD64 -o /dev/shm/grml
     $PN -c GRMLBASE,GRML_FULL,AMD64 -i grml_0.0-1.iso -v 0.0-1
-    $PN -c GRMLBASE,GRML_FULL,AMD64 -s sid -V -r 'grml-live rocks'
+    $PN -c GRMLBASE,GRML_FULL,AMD64 -s stable -V -r 'grml-ftw'
 
 More details: man grml-live + /usr/share/doc/grml-live/grml-live.html
               http://grml.org/grml-live/
 
 More details: man grml-live + /usr/share/doc/grml-live/grml-live.html
               http://grml.org/grml-live/
@@ -143,8 +149,14 @@ else
 fi
 
 # source main configuration file:
 fi
 
 # source main configuration file:
-LIVE_CONF=/etc/grml/grml-live.conf
-. $LIVE_CONF
+[ -z "$LIVE_CONF" ] && LIVE_CONF='/etc/grml/grml-live.conf'
+if ! [ -r "$LIVE_CONF" ] ; then
+  ewarn "Configuration file $LIVE_CONF can not be read, ignoring"
+else
+  einfo "Sourcing configuration file $LIVE_CONF"
+  . $LIVE_CONF
+  eend $?
+fi
 # }}}
 
 # umount all directories {{{
 # }}}
 
 # umount all directories {{{
@@ -157,6 +169,10 @@ umount_all() {
    umount $CHROOT_OUTPUT/dev/pts 2>/dev/null || /bin/true
    umount $CHROOT_OUTPUT/dev 2>/dev/null || /bin/true
 
    umount $CHROOT_OUTPUT/dev/pts 2>/dev/null || /bin/true
    umount $CHROOT_OUTPUT/dev 2>/dev/null || /bin/true
 
+   if [ -n "$EXTRACT_ISO_NAME" ] ; then
+     umount "$EXTRACT_ISO_NAME" 2>/dev/null || /bin/true
+   fi
+
    # certain FAI versions sadly leave a ramdisk behind, so better safe than sorry
    if [ -x /usr/lib/fai/mkramdisk ] ; then
      /usr/lib/fai/mkramdisk -u "$(readlink -f ${CHROOT_OUTPUT}/var/lib/dpkg)" >/dev/null 2>&1 || /bin/true
    # certain FAI versions sadly leave a ramdisk behind, so better safe than sorry
    if [ -x /usr/lib/fai/mkramdisk ] ; then
      /usr/lib/fai/mkramdisk -u "$(readlink -f ${CHROOT_OUTPUT}/var/lib/dpkg)" >/dev/null 2>&1 || /bin/true
@@ -183,6 +199,11 @@ bailout() {
     [ -n "${CHROOT_OUTPUT}" -a -d "${CHROOT_OUTPUT}" ] && rm -r "${CHROOT_OUTPUT}"
     eend 0
   fi
     [ -n "${CHROOT_OUTPUT}" -a -d "${CHROOT_OUTPUT}" ] && rm -r "${CHROOT_OUTPUT}"
     eend 0
   fi
+
+  # get rid of automatically generated conffiles
+  rm -f ${GRML_FAI_CONFIG}/nfsroot.conf
+  rm -f ${GRML_FAI_CONFIG}/make-fai-nfsroot.conf
+
   if [ -n "$CHOWN_USER" ]; then
     log "Setting ownership"
     einfo "Setting ownership"
   if [ -n "$CHOWN_USER" ]; then
     log "Setting ownership"
     einfo "Setting ownership"
@@ -258,12 +279,12 @@ extend_string_end() {
 # This is because:
 #   * We assume that the chroot always has a "good" version of
 #     the file. Also it makes sources handling easier.
 # This is because:
 #   * We assume that the chroot always has a "good" version of
 #     the file. Also it makes sources handling easier.
-#   * On unstable, we Recommend the Debian packages containing
+#   * On unstable, we recommend the Debian packages containing
 #     these files. The user can override them by putting his
 #     "better" version into the chroot.
 #     these files. The user can override them by putting his
 #     "better" version into the chroot.
-#   * On stable, the Debian packages are probably not available,
-#     or outdated, so we look in TEMPLATE_DIRECTORY/compat first, where
-#     our grml-live-compat package installs current file versions.
+#   * With older releases the Debian packages are probably
+#     not available, so we look in TEMPLATE_DIRECTORY/compat,
+#     where a (custom) package might install current file versions.
 copy_addon_file() {
   DEST="${BUILD_OUTPUT}/boot/$3"
   if [ ! -d "${DEST}/" ]; then
 copy_addon_file() {
   DEST="${BUILD_OUTPUT}/boot/$3"
   if [ ! -d "${DEST}/" ]; then
@@ -275,7 +296,7 @@ copy_addon_file() {
     return $?
   fi
   if [ -e "${TEMPLATE_DIRECTORY}/compat/$3/$1" ]; then
     return $?
   fi
   if [ -e "${TEMPLATE_DIRECTORY}/compat/$3/$1" ]; then
-    log   "Copying $1 from grml-live-compat"
+    log   "Copying $1 from ${TEMPLATE_DIRECTORY}/compat"
     cp "${TEMPLATE_DIRECTORY}/compat/$3/$1" "${DEST}/"
     return $?
   fi
     cp "${TEMPLATE_DIRECTORY}/compat/$3/$1" "${DEST}/"
     return $?
   fi
@@ -292,7 +313,7 @@ copy_addon_file() {
 # }}}
 
 # command line parsing {{{
 # }}}
 
 # command line parsing {{{
-while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFhnNqQuVz" opt; do
+while getopts "a:C:c:d:D:e:g:i:I:o:r:s:S:t:U:v:w:AbBFhnNqQuVz" opt; do
   case "$opt" in
     a) ARCH="$OPTARG" ;;
     A) CLEAN_ARTIFACTS=1 ;;
   case "$opt" in
     a) ARCH="$OPTARG" ;;
     A) CLEAN_ARTIFACTS=1 ;;
@@ -314,17 +335,24 @@ while getopts "a:C:c:d:D:e:g:i:I:o:r:s:t:U:v:AbBFhnNqQuVz" opt; do
     Q) SKIP_NETBOOT=1 ;;
     r) RELEASENAME="$OPTARG" ;;
     s) SUITE="$OPTARG" ;;
     Q) SKIP_NETBOOT=1 ;;
     r) RELEASENAME="$OPTARG" ;;
     s) SUITE="$OPTARG" ;;
+    S) SCRIPTS_DIRECTORY="$OPTARG";;
     t) TEMPLATE_DIRECTORY="$OPTARG";;
     v) VERSION="$OPTARG" ;;
     F) FORCE=1 ;;
     u) UPDATE=1 ;;
     U) CHOWN_USER="$OPTARG" ;;
     V) VERBOSE="-v" ;;
     t) TEMPLATE_DIRECTORY="$OPTARG";;
     v) VERSION="$OPTARG" ;;
     F) FORCE=1 ;;
     u) UPDATE=1 ;;
     U) CHOWN_USER="$OPTARG" ;;
     V) VERBOSE="-v" ;;
+    w) export WAYBACK_DATE="$OPTARG" ;;
     z) SQUASHFS_ZLIB=1 ;;
     z) SQUASHFS_ZLIB=1 ;;
-    ?) echo "invalid option -$OPTARG" >&2; bailout 1 ;;
+    ?) echo "invalid option -$OPTARG" >&2; usage; bailout 1 ;;
   esac
 done
 shift $(($OPTIND - 1))  # set ARGV to the first not parsed commandline parameter
   esac
 done
 shift $(($OPTIND - 1))  # set ARGV to the first not parsed commandline parameter
+
+if [ -n "$1" ] ; then
+  echo "Error: unknown argument '$1' in options. Exiting to avoid possible data loss." >&2
+  bailout 1
+fi
 # }}}
 
 # read local (non-packaged) configuration {{{
 # }}}
 
 # read local (non-packaged) configuration {{{
@@ -365,16 +393,16 @@ fi
 [ -n "$GRML_NAME" ]               || GRML_NAME='grml'
 [ -n "$HOSTNAME" ]                || HOSTNAME='grml'
 [ -n "$HYBRID_METHOD" ]           || HYBRID_METHOD='isohybrid'
 [ -n "$GRML_NAME" ]               || GRML_NAME='grml'
 [ -n "$HOSTNAME" ]                || HOSTNAME='grml'
 [ -n "$HYBRID_METHOD" ]           || HYBRID_METHOD='isohybrid'
-[ -n "$NFSROOT_CONF" ]            || NFSROOT_CONF="${GRML_FAI_CONFIG}/make-fai-nfsroot.conf"
 [ -n "$RELEASENAME" ]             || RELEASENAME='grml-live rocks'
 [ -n "$SQUASHFS_EXCLUDES_FILE" ]  || SQUASHFS_EXCLUDES_FILE="${GRML_FAI_CONFIG}/config/grml/squashfs-excludes"
 [ -n "$SUITE" ]                   || SUITE='testing'
 [ -n "$TEMPLATE_DIRECTORY" ]      || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
 [ -n "$RELEASENAME" ]             || RELEASENAME='grml-live rocks'
 [ -n "$SQUASHFS_EXCLUDES_FILE" ]  || SQUASHFS_EXCLUDES_FILE="${GRML_FAI_CONFIG}/config/grml/squashfs-excludes"
 [ -n "$SUITE" ]                   || SUITE='testing'
 [ -n "$TEMPLATE_DIRECTORY" ]      || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
+[ -n "$SCRIPTS_DIRECTORY" ]       || SCRIPTS_DIRECTORY='/usr/share/grml-live/scripts'
 [ -n "$USERNAME" ]                || USERNAME='grml'
 [ -n "$VERSION" ]                 || VERSION='0.0.1'
 
 # output specific stuff, depends on $OUTPUT (iff not set):
 [ -n "$USERNAME" ]                || USERNAME='grml'
 [ -n "$VERSION" ]                 || VERSION='0.0.1'
 
 # output specific stuff, depends on $OUTPUT (iff not set):
-[ -n "$OUTPUT" ]           || OUTPUT='/grml/grml-live'
+[ -n "$OUTPUT" ]           || OUTPUT="$PWD/grml/"
 [ -n "$BUILD_OUTPUT" ]     || BUILD_OUTPUT="$OUTPUT/grml_cd"
 [ -n "$CHROOT_OUTPUT" ]    || CHROOT_OUTPUT="$OUTPUT/grml_chroot"
 [ -n "$ISO_OUTPUT" ]       || ISO_OUTPUT="$OUTPUT/grml_isos"
 [ -n "$BUILD_OUTPUT" ]     || BUILD_OUTPUT="$OUTPUT/grml_cd"
 [ -n "$CHROOT_OUTPUT" ]    || CHROOT_OUTPUT="$OUTPUT/grml_chroot"
 [ -n "$ISO_OUTPUT" ]       || ISO_OUTPUT="$OUTPUT/grml_isos"
@@ -455,7 +483,9 @@ if [ -z "$FORCE" ] ; then
    echo -n "Is this ok for you? [y/N] "
    read a
    if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
    echo -n "Is this ok for you? [y/N] "
    read a
    if ! [ "$a" = 'y' -o "$a" = 'Y' ] ; then
-      bailout 1 "Exiting as requested."
+      CLEAN_ARTIFACTS=0
+      echo "Exiting as requested."
+      exit 0
    fi
    echo
 fi
    fi
    echo
 fi
@@ -545,7 +575,20 @@ if [ -n "$EXTRACT_ISO_NAME" ]; then
     eend 1
     bailout 1
   fi
     eend 1
     bailout 1
   fi
-  unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*/*.squashfs ; rc=$?
+
+  if ls "${mountpoint}"/live/*/*.squashfs 2>/dev/null | grep -q . ; then # ISOs >=2011.12
+    log "Using ${mountpoint}/live/*/*.squashfs for unsquashfs"
+    unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*/*.squashfs ; rc=$?
+  elif ls "${mountpoint}"/live/*.squashfs 2>/dev/null | grep -q . ; then # ISOs before 2011.12
+    log "Using ${mountpoint}/live/*.squashfs for unsquashfs"
+    unsquashfs -d "${CHROOT_OUTPUT}" "${mountpoint}"/live/*.squashfs ; rc=$?
+  else
+    log "Error: Could not find any *.squashfs files on the ISO"
+    eerror "Error: Could not find any *.squashfs files on the ISO"
+    eend 1
+    bailout 1
+  fi
+
   umount "$mountpoint"
   rmdir "$mountpoint"
   if [ "$rc" != 0 ]; then
   umount "$mountpoint"
   rmdir "$mountpoint"
   if [ "$rc" != 0 ]; then
@@ -560,9 +603,6 @@ extract_iso
 # }}}
 
 # on-the-fly configuration {{{
 # }}}
 
 # on-the-fly configuration {{{
-if [ -n "$FAI_DEBOOTSTRAP" ] ; then
-  sed "s#^FAI_DEBOOTSTRAP=.*#FAI_DEBOOTSTRAP=\"$FAI_DEBOOTSTRAP\"#" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF"
-fi
 
 # does this suck? YES!
 # /usr/share/debootstrap/scripts/unstable does not exist, instead use 'sid':
 
 # does this suck? YES!
 # /usr/share/debootstrap/scripts/unstable does not exist, instead use 'sid':
@@ -572,15 +612,9 @@ case $SUITE in
 esac
 export SUITE # make sure it's available in FAI scripts
 
 esac
 export SUITE # make sure it's available in FAI scripts
 
-for file in "$LIVE_CONF" "$LOCAL_CONFIG" "$NFSROOT_CONF" ; do
-    if [ -n "$file" ] ; then
-       sed "s|^FAI_DEBOOTSTRAP=\"[a-z]* |FAI_DEBOOTSTRAP=\"$SUITE |" "$file" | sponge "$file"
-    fi
-done
-
 # validate whether the specified architecture class matches the
 # architecture (option), otherwise installation of kernel will fail
 # validate whether the specified architecture class matches the
 # architecture (option), otherwise installation of kernel will fail
-if echo $CLASSES | grep -qi i386 ; then
+if echo $CLASSES | grep -qw I386 ; then
    if ! [[ "$ARCH" == "i386" ]] ; then
       log    "Error: You specified the I386 class but are trying to build something else (AMD64?)."
       eerror "Error: You specified the I386 class but are trying to build something else (AMD64?)."
    if ! [[ "$ARCH" == "i386" ]] ; then
       log    "Error: You specified the I386 class but are trying to build something else (AMD64?)."
       eerror "Error: You specified the I386 class but are trying to build something else (AMD64?)."
@@ -598,11 +632,35 @@ elif echo $CLASSES | grep -qi amd64 ; then
    fi
 fi
 
    fi
 fi
 
-if grep -q -- 'FAI_DEBOOTSTRAP_OPTS.*--arch' "$NFSROOT_CONF" ; then
-   sed "s/--arch [a-z0-9]* /--arch $ARCH /" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF"
-else
-   sed "s|^FAI_DEBOOTSTRAP_OPTS=\"\(.*\)|FAI_DEBOOTSTRAP_OPTS=\"--arch $ARCH \1|" "$NFSROOT_CONF" | sponge "$NFSROOT_CONF"
+# generate nfsroot configuration for FAI on the fly
+if [ -z "$FAI_DEBOOTSTRAP" ] ; then
+  if [ -n "$WAYBACK_DATE" ] ; then
+    FAI_DEBOOTSTRAP="$SUITE http://snapshot.debian.org/archive/debian/$WAYBACK_DATE/"
+  else
+    FAI_DEBOOTSTRAP="$SUITE http://ftp.debian.org/debian"
+  fi
 fi
 fi
+
+if [ -z "$FAI_DEBOOTSTRAP_OPTS" ] ; then
+  FAI_DEBOOTSTRAP_OPTS="--exclude=info,tasksel,tasksel-data --include=aptitude --arch $ARCH"
+fi
+
+# create backup of old (not yet automatically generated) config file
+if [ -f "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" ] ; then
+  if ! grep -q 'This is an automatically generated file by grml-live' "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" ; then
+    ewarn "Found old ${GRML_FAI_CONFIG}/make-fai-nfsroot.conf - moving to ${GRML_FAI_CONFIG}/make-fai-nfsroot.conf.outdated"
+    mv "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf" "${GRML_FAI_CONFIG}/make-fai-nfsroot.conf.outdated"
+    eend $?
+  fi
+fi
+
+echo "# This is an automatically generated file by grml-live.
+# Do NOT edit this file, your changes will be lost.
+FAI_DEBOOTSTRAP=\"$FAI_DEBOOTSTRAP\"
+FAI_DEBOOTSTRAP_OPTS=\"$FAI_DEBOOTSTRAP_OPTS\"
+# EOF " > "${GRML_FAI_CONFIG}/nfsroot.conf"
+# support FAI <=3.4.8, versions >=4.0 use nfsroot.conf
+( cd ${GRML_FAI_CONFIG} && ln -sf nfsroot.conf make-fai-nfsroot.conf )
 # }}}
 
 # CHROOT_OUTPUT - execute FAI {{{
 # }}}
 
 # CHROOT_OUTPUT - execute FAI {{{
@@ -612,12 +670,6 @@ if [ -n "$BUILD_DIRTY" ]; then
 else
    [ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot"
 
 else
    [ -n "$CHROOT_OUTPUT" ] || CHROOT_OUTPUT="$OUTPUT/grml_chroot"
 
-   # provide inform fai about the ISO we build
-   [ -d "$CHROOT_OUTPUT/etc/" ] || mkdir -p "$CHROOT_OUTPUT/etc/"
-   echo '# This file has been generated by grml-live.' > "$CHROOT_OUTPUT/etc/grml_live_version"
-   [ -n "$GRML_LIVE_VERSION" ] && echo "GRML_LIVE_VERSION=$GRML_LIVE_VERSION" >> "$CHROOT_OUTPUT/etc/grml_live_version"
-   [ -n "$SUITE" ] && echo "SUITE=$SUITE" >> "$CHROOT_OUTPUT/etc/grml_live_version"
-
    if [ -n "$UPDATE" -o -n "$BUILD_ONLY" ] ; then
       FAI_ACTION=softupdate
    else
    if [ -n "$UPDATE" -o -n "$BUILD_ONLY" ] ; then
       FAI_ACTION=softupdate
    else
@@ -647,31 +699,36 @@ else
       mkdir -p "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/"
       mount --bind "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/"
 
       mkdir -p "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/"
       mount --bind "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/"
 
-      # tell dpkg to use "unsafe io" during the build
-      [ -d "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d" ] || mkdir -p "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d"
-      echo force-unsafe-io > "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d/unsafe-io"
-
       log "Executed FAI command line:"
       log "Executed FAI command line:"
-      log "BUILD_ONLY=$BUILD_ONLY BOOTSTRAP_ONLY=$BOOTSTRAP_ONLY GRML_LIVE_CONFIG=$CONFIGDUMP fai $VERBOSE -C $GRML_FAI_CONFIG -s file:///$GRML_FAI_CONFIG/config -c$CLASSES -u $HOSTNAME $FAI_ACTION $CHROOT_OUTPUT $FAI_ARGS"
+      log "BUILD_ONLY=$BUILD_ONLY BOOTSTRAP_ONLY=$BOOTSTRAP_ONLY GRML_LIVE_CONFIG=$CONFIGDUMP WAYBACK_DATE=$WAYBACK_DATE fai $VERBOSE -C $GRML_FAI_CONFIG -s file:///$GRML_FAI_CONFIG/config -c$CLASSES -u $HOSTNAME $FAI_ACTION $CHROOT_OUTPUT $FAI_ARGS"
       BUILD_ONLY="$BUILD_ONLY" BOOTSTRAP_ONLY="$BOOTSTRAP_ONLY" GRML_LIVE_CONFIG="$CONFIGDUMP" fai $VERBOSE \
                   -C "$GRML_FAI_CONFIG" -s "file:///$GRML_FAI_CONFIG/config" -c"$CLASSES" \
                   -u "$HOSTNAME" "$FAI_ACTION" "$CHROOT_OUTPUT" $FAI_ARGS | tee -a $LOGFILE
       RC="$PIPESTATUS" # notice: bash-only
 
       BUILD_ONLY="$BUILD_ONLY" BOOTSTRAP_ONLY="$BOOTSTRAP_ONLY" GRML_LIVE_CONFIG="$CONFIGDUMP" fai $VERBOSE \
                   -C "$GRML_FAI_CONFIG" -s "file:///$GRML_FAI_CONFIG/config" -c"$CLASSES" \
                   -u "$HOSTNAME" "$FAI_ACTION" "$CHROOT_OUTPUT" $FAI_ARGS | tee -a $LOGFILE
       RC="$PIPESTATUS" # notice: bash-only
 
-      rm -f "$CHROOT_OUTPUT/etc/dpkg/dpkg.cfg.d/unsafe-io"
-
-      FORCE_ISO_REBUILD=true
-
       if [ "$RC" != 0 ] ; then
          log    "Error: critical error while executing fai [exit code ${RC}]. Exiting."
          eerror "Error: critical error while executing fai [exit code ${RC}]. Exiting." ; eend 1
          bailout 1
       fi
 
       if [ "$RC" != 0 ] ; then
          log    "Error: critical error while executing fai [exit code ${RC}]. Exiting."
          eerror "Error: critical error while executing fai [exit code ${RC}]. Exiting." ; eend 1
          bailout 1
       fi
 
+      # provide inform fai about the ISO we build, needs to be provided
+      # *after* FAI stage, otherwise FAI skips the debootstrap stage if
+      # there is not BASEFILE (as it checks for presence of /etc) :(
+      echo '# This file has been generated by grml-live.' > "$CHROOT_OUTPUT/etc/grml_live_version"
+      [ -n "$GRML_LIVE_VERSION" ] && echo "GRML_LIVE_VERSION=$GRML_LIVE_VERSION" >> "$CHROOT_OUTPUT/etc/grml_live_version"
+      [ -n "$SUITE" ] && echo "SUITE=$SUITE" >> "$CHROOT_OUTPUT/etc/grml_live_version"
+
+      FORCE_ISO_REBUILD=true
+
       # move fai logs into grml_logs directory
       mkdir -p "$LOG_OUTPUT"/fai/
       cp -r "$CHROOT_OUTPUT"/var/log/fai/"$HOSTNAME"/last/* "$LOG_OUTPUT"/fai/
       rm -rf "$CHROOT_OUTPUT"/var/log/fai
       # move fai logs into grml_logs directory
       mkdir -p "$LOG_OUTPUT"/fai/
       cp -r "$CHROOT_OUTPUT"/var/log/fai/"$HOSTNAME"/last/* "$LOG_OUTPUT"/fai/
       rm -rf "$CHROOT_OUTPUT"/var/log/fai
+
+      # store copy of autogenerated configuration file
+      cp ${GRML_FAI_CONFIG}/nfsroot.conf "$LOG_OUTPUT"/fai/
+
       # copy fai package list
       cp "$CHROOT_OUTPUT"/var/log/install_packages.list "$LOG_OUTPUT"/fai/
       # fixup owners
       # copy fai package list
       cp "$CHROOT_OUTPUT"/var/log/install_packages.list "$LOG_OUTPUT"/fai/
       # fixup owners
@@ -696,6 +753,11 @@ else
          grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=6
       fi
 
          grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=6
       fi
 
+      if [ -r "$CHECKLOG/fai.log" ] ; then
+        grep 'updatebase.*FAILED with exit code' "$CHECKLOG/fai.log" >> "$LOGFILE" && ERROR=7
+        grep 'instsoft.*FAILED with exit code'   "$CHECKLOG/fai.log" >> "$LOGFILE" && ERROR=8
+      fi
+
       if [ -n "$ERROR" ] ; then
          log    "Error: there was a critical error [${ERROR}] during execution of stage 'fai dirinstall' [$(date)]"
          eerror "Error: there was a critical error during execution of stage 'fai dirinstall'"
       if [ -n "$ERROR" ] ; then
          log    "Error: there was a critical error [${ERROR}] during execution of stage 'fai dirinstall' [$(date)]"
          eerror "Error: there was a critical error during execution of stage 'fai dirinstall'"
@@ -754,7 +816,7 @@ else
 <testsuite name="grml-live-missing-packages" tests="${package_count}" time="1" failures="${package_errors}" errors="${package_errors}" skipped="0" assertions="0">
 EOF
 
 <testsuite name="grml-live-missing-packages" tests="${package_count}" time="1" failures="${package_errors}" errors="${package_errors}" skipped="0" assertions="0">
 EOF
 
-  for package in $(awk '{print $1}' "${CHECKLOG}/package_errors.log") ; do
+  for package in $(awk '{print $1}' "${CHECKLOG}/package_errors.log" | sed 's;/;\\/;') ; do
     failure_reason="$(awk "/$package/ {print \$2}" "${CHECKLOG}/package_errors.log")"
     cat >> "${REPORT_MISSING_PACKAGES}" << EOF
   <testcase name="test_missing_packages_${package}" time="0" assertions="0">
     failure_reason="$(awk "/$package/ {print \$2}" "${CHECKLOG}/package_errors.log")"
     cat >> "${REPORT_MISSING_PACKAGES}" << EOF
   <testcase name="test_missing_packages_${package}" time="0" assertions="0">
@@ -846,15 +908,26 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
        fi
 
        # copy _required_ isolinux files
        fi
 
        # copy _required_ isolinux files
-       for file in ifcpu64.c32 isolinux.bin vesamenu.c32; do
-         copy_addon_file "${file}" /usr/lib/syslinux isolinux
-       done
+       if [ -d "${CHROOT_OUTPUT}/usr/lib/ISOLINUX" ] ; then
+         copy_addon_file isolinux.bin /usr/lib/ISOLINUX isolinux
+         for file in ${CHROOT_OUTPUT}/usr/lib/syslinux/modules/bios/*.c32 ; do
+           copy_addon_file "$(basename "$file")"  /usr/lib/syslinux/modules/bios/ isolinux
+         done
+       else # syslinux versions <= 3:4.05+dfsg-6+deb8u1
+         copy_addon_file isolinux.bin /usr/lib/syslinux isolinux
+         copy_addon_file ifcpu64.c32  /usr/lib/syslinux isolinux
+         copy_addon_file vesamenu.c32 /usr/lib/syslinux isolinux
+       fi
 
        # *always* copy files to output directory so the variables
        # get adjusted according to the build.
        cp ${TEMPLATE_DIRECTORY}/boot/isolinux/*  "$BUILD_OUTPUT"/boot/isolinux/
 
 
        # *always* copy files to output directory so the variables
        # get adjusted according to the build.
        cp ${TEMPLATE_DIRECTORY}/boot/isolinux/*  "$BUILD_OUTPUT"/boot/isolinux/
 
+       mkdir -p "${BUILD_OUTPUT}/boot/grub"
+       cp -a ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/
+
        if [ -n "$NO_ADDONS" ] ; then
        if [ -n "$NO_ADDONS" ] ; then
+          rm -f "$BUILD_OUTPUT"/boot/grub/addons.cfg
           log   "Skipping installation of boot addons as requested via \$NO_ADDONS."
           einfo "Skipping installation of boot addons as requested via \$NO_ADDONS."; eend 0
        else
           log   "Skipping installation of boot addons as requested via \$NO_ADDONS."
           einfo "Skipping installation of boot addons as requested via \$NO_ADDONS."; eend 0
        else
@@ -862,14 +935,24 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
             log   "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)"
             ewarn "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)" ; eend 0
           else
             log   "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)"
             ewarn "Boot addons not found, skipping therefore. (Consider installing package grml-live-addons)" ; eend 0
           else
-            # copy addons from system packages or grml-live-compat
+            # copy addons from system packages or grml-live-addons
             copy_addon_file ipxe.lkrn /usr/lib/ipxe addons
             copy_addon_file pci.ids /usr/share/misc addons
             copy_addon_file memtest86+.bin /boot addons
             copy_addon_file ipxe.lkrn /usr/lib/ipxe addons
             copy_addon_file pci.ids /usr/share/misc addons
             copy_addon_file memtest86+.bin /boot addons
-            for file in memdisk chain.c32 hdt.c32 menu.c32; do
-              copy_addon_file "${file}" /usr/lib/syslinux addons
+
+            # since syslinux(-common) v3:6.03~pre1+dfsg-4 the files are in a
+            # different directory :(
+            if [ -d "${CHROOT_OUTPUT}/usr/lib/syslinux/modules/bios/" ] ; then
+              syslinux_modules_dir=/usr/lib/syslinux/modules/bios/
+            else
+              syslinux_modules_dir=/usr/lib/syslinux
+            fi
+            for file in chain.c32 hdt.c32 mboot.c32 menu.c32; do
+              copy_addon_file "${file}" "${syslinux_modules_dir}" addons
             done
 
             done
 
+            copy_addon_file memdisk /usr/lib/syslinux addons
+
             # make memtest filename FAT16/8.3 compatible
             mv "${BUILD_OUTPUT}/boot/addons/memtest86+.bin" \
               "${BUILD_OUTPUT}/boot/addons/memtest"
             # make memtest filename FAT16/8.3 compatible
             mv "${BUILD_OUTPUT}/boot/addons/memtest86+.bin" \
               "${BUILD_OUTPUT}/boot/addons/memtest"
@@ -894,11 +977,6 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
           fi # no "$TEMPLATE_DIRECTORY"/boot/addons
        fi # NO_ADDONS
 
           fi # no "$TEMPLATE_DIRECTORY"/boot/addons
        fi # NO_ADDONS
 
-       if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then
-         mkdir -p "${BUILD_OUTPUT}/boot/grub"
-       fi
-       cp -a ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/
-
        # generate loopback.cfg config file without depending on grub's regexp module
        # which isn't available in Debian/squeeze
        echo "## grub2 loopback configuration" > "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
        # generate loopback.cfg config file without depending on grub's regexp module
        # which isn't available in Debian/squeeze
        echo "## grub2 loopback configuration" > "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
@@ -907,17 +985,24 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
          [ -r "$config" ] || continue
          echo "source ${config##$BUILD_OUTPUT}" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
        done
          [ -r "$config" ] || continue
          echo "source ${config##$BUILD_OUTPUT}" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
        done
-       echo "source /boot/grub/addons.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
+       if [ -z "$NO_ADDONS" ] ; then
+         echo "source /boot/grub/addons.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
+       fi
        echo "source /boot/grub/footer.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
 
        # copy grub files from target
        echo "source /boot/grub/footer.cfg" >> "${BUILD_OUTPUT}"/boot/grub/loopback.cfg
 
        # copy grub files from target
-       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/
-       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/
-       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/
+       mkdir -p "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.mod "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.o "${BUILD_OUTPUT}"/boot/grub/i386-pc/
+       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/*-pc/*.lst "${BUILD_OUTPUT}"/boot/grub/i386-pc/
        cp -a "${CHROOT_OUTPUT}"/usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/
        cp -a "${CHROOT_OUTPUT}"/boot/grub/core.img "${BUILD_OUTPUT}"/boot/grub/
        cp -a "${CHROOT_OUTPUT}"/boot/grub/grub.img "${BUILD_OUTPUT}"/boot/grub/
 
        cp -a "${CHROOT_OUTPUT}"/usr/share/grub/ascii.pf2 "${BUILD_OUTPUT}"/boot/grub/
        cp -a "${CHROOT_OUTPUT}"/boot/grub/core.img "${BUILD_OUTPUT}"/boot/grub/
        cp -a "${CHROOT_OUTPUT}"/boot/grub/grub.img "${BUILD_OUTPUT}"/boot/grub/
 
+       # copy modules for UEFI grub
+       mkdir -p "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
+       cp -a "${CHROOT_OUTPUT}"/usr/lib/grub/x86_64-efi/*.{mod,lst} "${BUILD_OUTPUT}"/boot/grub/x86_64-efi/
+
        if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then
           log    "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting."
           eerror "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." ; eend 1
        if ! [ -d "${TEMPLATE_DIRECTORY}"/GRML ] ; then
           log    "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting."
           eerror "Error: ${TEMPLATE_DIRECTORY}/GRML does not exist. Exiting." ; eend 1
@@ -1014,7 +1099,7 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
           done
 
           echo "include options.cfg"     >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
           done
 
           echo "include options.cfg"     >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
-          if [ ! -n "$NO_ADDONS" ] ; then
+          if [ -z "$NO_ADDONS" ] ; then
             echo "include addons.cfg"    >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
           fi
           echo "include isoprompt.cfg"   >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
             echo "include addons.cfg"    >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
           fi
           echo "include isoprompt.cfg"   >> "${BUILD_OUTPUT}/boot/isolinux/grmlmain.cfg"
@@ -1032,7 +1117,9 @@ if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
          else
             log "including ${DISTRI_NAME}.cfg in ${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
             echo "include ${DISTRI_NAME}.cfg" > "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
          else
             log "including ${DISTRI_NAME}.cfg in ${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
             echo "include ${DISTRI_NAME}.cfg" > "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
-            [ -n "$NO_ADDONS" ] || echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
+            if [ -z "$NO_ADDONS" ] ; then
+              echo "include addons.cfg" >> "${BUILD_OUTPUT}/boot/isolinux/distri.cfg"
+            fi
           fi
        fi
 
           fi
        fi
 
@@ -1180,7 +1267,7 @@ fi
 # create md5sum file:
 if [ -z "$BOOTSTRAP_ONLY" ] ; then
   ( cd $BUILD_OUTPUT/GRML/"${GRML_NAME}" &&
 # create md5sum file:
 if [ -z "$BOOTSTRAP_ONLY" ] ; then
   ( cd $BUILD_OUTPUT/GRML/"${GRML_NAME}" &&
-  find .. -type f -not -name md5sums -not -name isolinux.bin -exec md5sum {} \; > md5sums )
+  find ../.. -type f -not -name md5sums -not -name isolinux.bin -exec md5sum {} \; > md5sums )
 fi
 # }}}
 
 fi
 # }}}
 
@@ -1260,7 +1347,7 @@ else
          # make a 2048-byte bootsector for El Torito
          dd if=/dev/zero of=boot/grub/toriboot.bin bs=512 count=4 2>/dev/null
          # those are in 2048-byte sectors, so 1 16 matches 4 63 below
          # make a 2048-byte bootsector for El Torito
          dd if=/dev/zero of=boot/grub/toriboot.bin bs=512 count=4 2>/dev/null
          # those are in 2048-byte sectors, so 1 16 matches 4 63 below
-         echo 1 16 | mksh /usr/share/grml-live/scripts/bootgrub.mksh -B 11 | \
+         echo 1 16 | mksh "${SCRIPTS_DIRECTORY}/bootgrub.mksh" -B 11 | \
             dd of=boot/grub/toriboot.bin conv=notrunc 2>/dev/null
       fi
       log "$MKISOFS -V '${GRML_NAME} ${VERSION}' -publisher 'grml-live | grml.org' -l -r -J $BOOT_ARGS -o ${ISO_OUTPUT}/${ISO_NAME} ."
             dd of=boot/grub/toriboot.bin conv=notrunc 2>/dev/null
       fi
       log "$MKISOFS -V '${GRML_NAME} ${VERSION}' -publisher 'grml-live | grml.org' -l -r -J $BOOT_ARGS -o ${ISO_OUTPUT}/${ISO_NAME} ."
@@ -1302,19 +1389,19 @@ else
             log   "Creating hybrid ISO file with manifold/grub2 method"
             einfo "Creating hybrid ISO file with manifold/grub2 method"
             # 512 bytes: MBR, partition table, load GRUB 2
             log   "Creating hybrid ISO file with manifold/grub2 method"
             einfo "Creating hybrid ISO file with manifold/grub2 method"
             # 512 bytes: MBR, partition table, load GRUB 2
-            echo 4 63 | mksh /usr/share/grml-live/scripts/bootgrub.mksh -A -M 4:0x96 -g $cyls:16:32
+            echo 4 63 | mksh "${SCRIPTS_DIRECTORY}/bootgrub.mksh" -A -M 4:0x96 -g $cyls:16:32
           else
             log   "Creating hybrid ISO file with manifold method"
             einfo "Creating hybrid ISO file with manifold method"
             # read only one but 2048-byte sized (scale: << 2) sector
             echo $bootoff $bootoff | \
           else
             log   "Creating hybrid ISO file with manifold method"
             einfo "Creating hybrid ISO file with manifold method"
             # read only one but 2048-byte sized (scale: << 2) sector
             echo $bootoff $bootoff | \
-              mksh /usr/share/grml-live/scripts/bootilnx.mksh -A -M 4:0x96 -g $cyls:16:32 -S 2
+              mksh ${SCRIPTS_DIRECTORY}/bootilnx.mksh -A -M 4:0x96 -g $cyls:16:32 -S 2
           fi | dd of="${ISO_OUTPUT}/${ISO_NAME}" conv=notrunc 2>/dev/null
           eend $?
         fi
       elif [ "$HYBRID_METHOD" = "isohybrid" ] ; then
         if ! which isohybrid >/dev/null 2>&1 ; then
           fi | dd of="${ISO_OUTPUT}/${ISO_NAME}" conv=notrunc 2>/dev/null
           eend $?
         fi
       elif [ "$HYBRID_METHOD" = "isohybrid" ] ; then
         if ! which isohybrid >/dev/null 2>&1 ; then
-          bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common"
+          bailout 12 "isohybrid binary not found - please install syslinux/syslinux-common/syslinux-utils"
         else
           log   "Creating hybrid ISO file with isohybrid method"
           einfo "Creating hybrid ISO file with isohybrid method"
         else
           log   "Creating hybrid ISO file with isohybrid method"
           einfo "Creating hybrid ISO file with isohybrid method"
@@ -1326,9 +1413,14 @@ else
           #   (hidden NTFS, IIRC), as the partition type is sometimes needed
           #   to get the BIOS even look at the partition created by isohybrid
           if isohybrid --help | grep -q -- --uefi ; then
           #   (hidden NTFS, IIRC), as the partition type is sometimes needed
           #   to get the BIOS even look at the partition created by isohybrid
           if isohybrid --help | grep -q -- --uefi ; then
-            log   "Detected uefi support for isohybrid, enabling"
-            einfo "Detected uefi support for isohybrid, enabling"
-            ISOHYBRID_OPTIONS=--uefi
+            if echo $CLASSES | grep -qw I386 ; then
+              log   "Detected uefi support for isohybrid but 32bit systems do not support it, ignoring."
+              einfo "Detected uefi support for isohybrid but 32bit systems do not support it, ignoring."
+            else
+              log   "Detected uefi support for isohybrid, enabling"
+              einfo "Detected uefi support for isohybrid, enabling"
+              ISOHYBRID_OPTIONS=--uefi
+            fi
           fi
 
           log "isohybrid $ISOHYBRID_OPTIONS ${ISO_OUTPUT}/${ISO_NAME}"
           fi
 
           log "isohybrid $ISOHYBRID_OPTIONS ${ISO_OUTPUT}/${ISO_NAME}"
@@ -1339,7 +1431,7 @@ else
         bailout 12 "Unknown HYBRID_METHOD [${HYBRID_METHOD}]. Supported values: disable, isohybrid, grub2, manifold"
       fi
 
         bailout 12 "Unknown HYBRID_METHOD [${HYBRID_METHOD}]. Supported values: disable, isohybrid, grub2, manifold"
       fi
 
-      # generate md5sum and sha1sum of ISO if we are using class 'RELEASE':
+      # generate ISO checksums if we are using class 'RELEASE':
       case $CLASSES in *RELEASE*)
          [ "$RC" = 0 ] && \
          (
       case $CLASSES in *RELEASE*)
          [ "$RC" = 0 ] && \
          (
@@ -1348,6 +1440,10 @@ else
              touch -r ${ISO_NAME} ${ISO_NAME}.md5
              sha1sum ${ISO_NAME} > ${ISO_NAME}.sha1 && \
              touch -r ${ISO_NAME} ${ISO_NAME}.sha1
              touch -r ${ISO_NAME} ${ISO_NAME}.md5
              sha1sum ${ISO_NAME} > ${ISO_NAME}.sha1 && \
              touch -r ${ISO_NAME} ${ISO_NAME}.sha1
+             sha256sum ${ISO_NAME} > ${ISO_NAME}.sha256 && \
+             touch -r ${ISO_NAME} ${ISO_NAME}.sha256
+             sha512sum ${ISO_NAME} > ${ISO_NAME}.sha512 && \
+             touch -r ${ISO_NAME} ${ISO_NAME}.sha512
            fi
          )
          ;;
            fi
          )
          ;;
@@ -1383,10 +1479,18 @@ create_netbootpackage() {
 
   mkdir -p "$NETBOOT"
 
 
   mkdir -p "$NETBOOT"
 
-  if ! [ -r "${CHROOT}/usr/lib/syslinux/pxelinux.0" ] ; then
-    ewarn "File /usr/lib/syslinux/pxelinux.0 not found in build chroot." ; eend 0
+  # since syslinux v3:6.03~pre1+dfsg-4 the pxelinux.0 has been split into a
+  # separate pxelinux package
+  if [ -d "${CHROOT_OUTPUT}/usr/lib/PXELINUX/" ] ; then
+    local pxelinux_dir=/usr/lib/PXELINUX
+  else
+    local pxelinux_dir=/usr/lib/syslinux
+  fi
+
+  if ! [ -r "${CHROOT_OUTPUT}/${pxelinux_dir}/pxelinux.0" ] ; then
+    ewarn "File ${pxelinux_dir}/pxelinux.0 not found in build chroot." ; eend 0
     eindent
     eindent
-    einfo "Install syslinux[-common] package in chroot to get a netboot package."
+    einfo "Install syslinux[-common]/pxelinux package in chroot to get a netboot package."
     eoutdent
     return 0
   fi
     eoutdent
     return 0
   fi
@@ -1398,7 +1502,11 @@ create_netbootpackage() {
 
   cp "${CHROOT_OUTPUT}"/boot/vmlinuz-*    "$WORKING_DIR"/vmlinuz
   cp "${CHROOT_OUTPUT}"/boot/initrd.img-* "$WORKING_DIR"/initrd.img
 
   cp "${CHROOT_OUTPUT}"/boot/vmlinuz-*    "$WORKING_DIR"/vmlinuz
   cp "${CHROOT_OUTPUT}"/boot/initrd.img-* "$WORKING_DIR"/initrd.img
-  cp "${CHROOT_OUTPUT}"/usr/lib/syslinux/pxelinux.0 "${WORKING_DIR}/pxelinux.0"
+  cp "${CHROOT_OUTPUT}/${pxelinux_dir}/pxelinux.0" "${WORKING_DIR}/pxelinux.0"
+
+  if [ -r "${CHROOT_OUTPUT}"/usr/lib/syslinux/modules/bios/ldlinux.c32 ] ; then
+    cp "${CHROOT_OUTPUT}"/usr/lib/syslinux/modules/bios/ldlinux.c32 "${WORKING_DIR}"/
+  fi
 
   mkdir -p "${WORKING_DIR}/pxelinux.cfg"
   if [ -r "${BUILD_OUTPUT}/boot/isolinux/netboot.cfg" ] ; then
 
   mkdir -p "${WORKING_DIR}/pxelinux.cfg"
   if [ -r "${BUILD_OUTPUT}/boot/isolinux/netboot.cfg" ] ; then
@@ -1416,6 +1524,8 @@ create_netbootpackage() {
     (
       cd $(dirname "${OUTPUT_FILE}")
       sha1sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha1"
     (
       cd $(dirname "${OUTPUT_FILE}")
       sha1sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha1"
+      sha256sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha256"
+      sha512sum $(basename "${OUTPUT_FILE}") > "${OUTPUT_FILE}.sha512"
     )
     einfo "Generated netboot package ${OUTPUT_FILE}" ; eend 0
     rm -rf "${OUTPUTDIR}"
     )
     einfo "Generated netboot package ${OUTPUT_FILE}" ; eend 0
     rm -rf "${OUTPUTDIR}"