-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:
fi
# source main configuration file:
-LIVE_CONF=/etc/grml/grml-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
# 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.
-# * 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
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
# }}}
# command line parsing {{{
-while getopts "a:C:c:d:D:e:g:i:I:o:r:s: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 ;;
u) UPDATE=1 ;;
U) CHOWN_USER="$OPTARG" ;;
V) VERBOSE="-v" ;;
+ w) export WAYBACK_DATE="$OPTARG" ;;
z) SQUASHFS_ZLIB=1 ;;
?) echo "invalid option -$OPTARG" >&2; usage; bailout 1 ;;
esac
[ -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"
# generate nfsroot configuration for FAI on the fly
if [ -z "$FAI_DEBOOTSTRAP" ] ; then
- FAI_DEBOOTSTRAP="$SUITE http://http.debian.net/debian"
+ 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
if [ -z "$FAI_DEBOOTSTRAP_OPTS" ] ; then
- FAI_DEBOOTSTRAP_OPTS="--exclude=info,tasksel,tasksel-data --arch $ARCH"
+ FAI_DEBOOTSTRAP_OPTS="--exclude=info,tasksel,tasksel-data --include=aptitude --arch $ARCH"
fi
# create backup of old (not yet automatically generated) config file
mount --bind "${OUTPUT}/grml_sources/" "${CHROOT_OUTPUT}/grml-live/sources/"
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
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'"
<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">
# copy _required_ isolinux files
if [ -d "${CHROOT_OUTPUT}/usr/lib/ISOLINUX" ] ; then
copy_addon_file isolinux.bin /usr/lib/ISOLINUX isolinux
- copy_addon_file ifcpu64.c32 /usr/lib/syslinux/modules/bios/ isolinux
- copy_addon_file ldlinux.c32 /usr/lib/syslinux/modules/bios/ isolinux
- copy_addon_file libcom32.c32 /usr/lib/syslinux/modules/bios/ isolinux
- copy_addon_file libutil.c32 /usr/lib/syslinux/modules/bios/ isolinux
- copy_addon_file vesamenu.c32 /usr/lib/syslinux/modules/bios/ 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
# 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
+ 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 "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
else
syslinux_modules_dir=/usr/lib/syslinux
fi
- for file in memdisk chain.c32 hdt.c32 mboot.c32 menu.c32; do
+ for file in chain.c32 hdt.c32 mboot.c32 menu.c32; do
copy_addon_file "${file}" "${syslinux_modules_dir}" addons
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"
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
[ -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
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"
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
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"
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 ] && \
(
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
)
;;
cp "${CHROOT_OUTPUT}"/boot/initrd.img-* "$WORKING_DIR"/initrd.img
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
cp "${BUILD_OUTPUT}/boot/isolinux/netboot.cfg" "${WORKING_DIR}/pxelinux.cfg/default"
(
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}"