+ mkdir -p "$CHROOT_OUTPUT" || bailout 5 "Problem with creating $CHROOT_OUTPUT for FAI"
+
+ if [ -n "${MIRROR_DIRECTORY}" ] ; then
+ mkdir -p "${CHROOT_OUTPUT}/${MIRROR_DIRECTORY}"
+ mount --bind "${MIRROR_DIRECTORY}" "${CHROOT_OUTPUT}/${MIRROR_DIRECTORY}"
+ fi
+
+ # 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 "BUILD_ONLY=$BUILD_ONLY BOOTSTRAP_ONLY=$BOOTSTRAP_ONLY 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" 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
+ else
+ einfo "Setting /etc/grml_version to $GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]"
+ log "Setting /etc/grml_version to $GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]"
+ echo "$GRML_NAME $VERSION Release Codename $RELEASENAME [$DATE]" > $CHROOT_OUTPUT/etc/grml_version
+ chmod 644 $CHROOT_OUTPUT/etc/grml_version
+ einfo "Rebuilding initramfs"
+ # make sure new /etc/grml_version reaches initramfs, iterate over all
+ # present kernel versions (note: we can't really handle more than one
+ # kernel version anyway right now)
+ # chroot $CHROOT_OUTPUT update-initramfs -u -t => might break when using kernel-package :(
+ for initrd in "$(basename $CHROOT_OUTPUT/boot/vmlinuz-*)" ; do
+ if ! chroot $CHROOT_OUTPUT update-initramfs -k "${initrd##vmlinuz-}" -c ; then
+ einfo "Creating fresh initrd did not work, trying update instead:"
+ log "Creating fresh initrd did not work, trying update instead:"
+ chroot $CHROOT_OUTPUT update-initramfs -k "${initrd##vmlinuz-}" -u
+ fi
+ done
+ eend $?
+ fi
+
+ # Remove all FAI logs from chroot if class RELEASE is used:
+ if [ -f "$CHROOT_OUTPUT"/etc/grml_fai_release ] ; then
+ rm -rf "$CHROOT_OUTPUT"/var/log/fai/*
+ rm -f "$CHROOT_OUTPUT"/var/log/install_packages.list
+ fi
+
+ umount_all
+
+ # notice: 'fai dirinstall' does not seem to exit appropriate, so:
+ ERROR=''
+ CHECKLOG=/var/log/fai/$HOSTNAME/last
+ if [ -r "$CHECKLOG/software.log" ] ; then
+ # 1 errors during executing of commands
+ grep 'dpkg: error processing' $CHECKLOG/software.log >> $LOGFILE && ERROR=1
+ grep 'E: Method http has died unexpectedly!' $CHECKLOG/software.log >> $LOGFILE && ERROR=2
+ grep 'ERROR: chroot' $CHECKLOG/software.log >> $LOGFILE && ERROR=3
+ grep 'E: Failed to fetch' $CHECKLOG/software.log >> $LOGFILE && ERROR=4
+ grep 'Unable to write mmap - msync (28 No space left on device)' $CHECKLOG/software.log >> $LOGFILE && ERROR=5
+ fi
+
+ if [ -r "$CHECKLOG/shell.log" ] ; then
+ grep 'FAILED with exit code' $CHECKLOG/shell.log >> $LOGFILE && ERROR=6
+ 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'"
+ eerror "Note: check out ${CHECKLOG}/ for details. [exit ${ERROR}]"
+ eend 1
+ bailout 1
+ else
+ log "Finished execution of stage 'fai dirinstall' [$(date)]"
+ einfo "Finished execution of stage 'fai dirinstall'"
+ fi
+
+ einfo "Find FAI build logs at $(readlink -f /var/log/fai/$HOSTNAME/last)"
+ log "Find FAI build logs at $(readlink -f /var/log/fai/$HOSTNAME/last)"
+ eend 0
+ fi
+fi # BUILD_DIRTY?
+# }}}
+
+# package validator {{{
+CHECKLOG=/var/log/fai/$HOSTNAME/last
+# package validator
+if [ -r "$CHECKLOG/package_errors.log" ] && grep -q '[a-z]' "$CHECKLOG/package_errors.log" ; then
+
+ if [ -n "$EXIT_ON_MISSING_PACKAGES" -a -z "$BUILD_DIRTY" ] ; then
+ eerror "The following packages were requested for installation but could not be processed:"
+ cat $CHECKLOG/package_errors.log
+ eerror "... exiting as requested via \$EXIT_ON_MISSING_PACKAGES."
+ eend 1
+ bailout 13
+ else
+ ewarn "The following packages were requested for installation but could not be processed:"
+ cat $CHECKLOG/package_errors.log
+ eend 0
+ fi
+fi
+# }}}
+
+# BUILD_OUTPUT - execute arch specific stuff and squashfs {{{
+[ -n "$BUILD_OUTPUT" ] || BUILD_OUTPUT="$OUTPUT/grml_cd"
+mkdir -p "$BUILD_OUTPUT" || bailout 6 "Problem with creating $BUILD_OUTPUT for stage ARCH"
+
+# prepare ISO
+if [ "$ARCH" = i386 ] || [ "$ARCH" = amd64 ] ; then
+ if [ -n "$BOOTSTRAP_ONLY" ] ; then
+ log "Skipping stage 'boot' as building with bootstrap only."
+ ewarn "Skipping stage 'boot' as building with bootstrap only." ; eend 0
+ else
+ if [ -d "$BUILD_OUTPUT"/boot/isolinux -a -z "$UPDATE" -a -z "$BUILD_ONLY" ] ; then
+ log "Skipping stage 'boot' as $BUILD_OUTPUT/boot/isolinux exists already."
+ ewarn "Skipping stage 'boot' as $BUILD_OUTPUT/boot/isolinux exists already." ; eend 0
+ else
+ # booting stuff:
+ [ -d "$BUILD_OUTPUT"/boot/isolinux ] || mkdir -p "$BUILD_OUTPUT"/boot/isolinux
+ [ -d "$BUILD_OUTPUT"/boot/"${SHORT_NAME}" ] || mkdir -p "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"
+
+ # if we don't have an initrd we a) can't boot and b) there was an error
+ # during build, so check for the file:
+ INITRD="$(ls $CHROOT_OUTPUT/boot/initrd* 2>/dev/null| grep -v '.bak$' | sort -r | head -1)"
+ if [ -n "$INITRD" ] ; then
+ cp $INITRD "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/initrd.gz
+ find $CHROOT_OUTPUT/boot/ -name initrd\*.bak -exec rm {} \;
+ else
+ log "Error: No initrd found inside $CHROOT_OUTPUT/boot/ - Exiting"
+ eerror "Error: No initrd found inside $CHROOT_OUTPUT/boot/ - Exiting" ; eend 1
+ bailout 10
+ fi
+
+ KERNEL_IMAGE="$(ls $CHROOT_OUTPUT/boot/vmlinuz* 2>/dev/null | sort -r | head -1)"
+ if [ -n "$KERNEL_IMAGE" ] ; then
+ cp "$KERNEL_IMAGE" "$BUILD_OUTPUT"/boot/"${SHORT_NAME}"/linux26
+ else
+ log "Error: No kernel found inside $CHROOT_OUTPUT/boot/ - Exiting"
+ eerror "Error: No kernel found inside $CHROOT_OUTPUT/boot/ - Exiting" ; eend 1
+ bailout 11
+ fi
+
+ [ -n "$TEMPLATE_DIRECTORY" ] || TEMPLATE_DIRECTORY='/usr/share/grml-live/templates'
+ if ! [ -d "${TEMPLATE_DIRECTORY}"/boot ] ; then
+ log "Error: ${TEMPLATE_DIRECTORY}/boot does not exist. Exiting."
+ eerror "Error: ${TEMPLATE_DIRECTORY}/boot does not exist. Exiting." ; eend 1
+ bailout 8
+ fi
+
+ # copy _required_ isolinux files
+ for file in ifcpu64.c32 isolinux.bin vesamenu.c32; do
+ copy_addon_file "${file}" /usr/lib/syslinux isolinux
+ done
+
+ # *always* copy files to output directory so the variables
+ # get adjusted according to the build.
+ cp ${TEMPLATE_DIRECTORY}/boot/isolinux/* "$BUILD_OUTPUT"/boot/isolinux/
+
+ if [ -n "$NO_ADDONS" ] ; then
+ 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
+ if ! [ -d "$TEMPLATE_DIRECTORY"/boot/addons ] ; 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
+ # copy addons from system packages or grml-live-compat
+ 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
+ done
+
+ # make memtest filename FAT16/8.3 compatible
+ mv "${BUILD_OUTPUT}/boot/addons/memtest86+.bin" \
+ "${BUILD_OUTPUT}/boot/addons/memtest"
+
+ # copy only files so we can handle bsd4grml on its own
+ for file in ${TEMPLATE_DIRECTORY}/boot/addons/* ; do
+ test -f $file && cp $file "$BUILD_OUTPUT"/boot/addons/
+ done
+
+ if [ -n "$NO_ADDONS_BSD4GRML" ] ; then
+ log "Skipping installation of bsd4grml as requested via \$NO_ADDONS_BSD4GRML."
+ einfo "Skipping installation of bsd4grml as requested via \$NO_ADDONS_BSD4GRML."; eend 0
+ else
+ if [ -d "$TEMPLATE_DIRECTORY"/boot/addons/bsd4grml ] ; then
+ cp -a ${TEMPLATE_DIRECTORY}/boot/addons/bsd4grml "$BUILD_OUTPUT"/boot/addons/
+ else
+ log "Missing addon file: bsd4grml"
+ ewarn "Missing addon file: bsd4grml" ; eend 0
+ fi
+ fi
+
+ fi # no "$TEMPLATE_DIRECTORY"/boot/addons
+ fi # NO_ADDONS
+
+ if ! [ -d "${BUILD_OUTPUT}/boot/grub" ] ; then
+ mkdir -p "${BUILD_OUTPUT}/boot/grub"
+ fi
+ cp ${TEMPLATE_DIRECTORY}/boot/grub/* "$BUILD_OUTPUT"/boot/grub/
+
+ if [ -e ${TEMPLATE_DIRECTORY}/compat/grub/linux.mod ]; then
+ cp "${TEMPLATE_DIRECTORY}"/compat/grub/* "${BUILD_OUTPUT}"/boot/grub/
+ else
+ if ! which "grub-mkimage" >/dev/null 2>&1 ; then
+ log "grub-mkimage not found, skipping Grub step therefore." ; eend 0
+ ewarn "grub-mkimage not found, skipping Grub step therefore."
+ ewarn "Please install grub-pc-bin or grub-common >= 1.98+20100804-14." ; eend 0
+ elif ! grub-mkimage --help | grep -q -- --format ; then
+ log "grub-mkimage does not support --format=i386-pc, skipping Grub step therefore." ; eend 0
+ ewarn "grub-mkimage does not support --format=i386-pc, skipping Grub step therefore."
+ ewarn "Please install grub-common >= 1.98+20100804-14 or grub-pc-bin." ; eend 0