#!/bin/bash -e ### # STAGE 2: Create initrd, splash screens, md5sums, and the iso itself ### # Get arch ARCH="$(uname -m)" if [ -z "$DISTARCH" ]; then if [ "${ARCH}" = "ppc" ]; then DISTARCH="ppc" else DISTARCH="x86" fi fi ### variables [ -z "$GPGUSER" ] && GPGUSER="Ryan Finnie " [ -z "$BASEDIR"] && BASEDIR=/mnt/hda1/knx [ -z "$MASTER" ] && MASTER=${BASEDIR}/master [ -z "$SOURCE" ] && SOURCE=${BASEDIR}/source/FINNIX if [ -z "$ISO" ]; then if [ "${DISTARCH}" = "ppc" ]; then ISO=${BASEDIR}/finnix-ppc.iso else ISO=${BASEDIR}/finnix.iso fi fi if [ -z "$BOOTDIR" ]; then if [ "${DISTARCH}" = "ppc" ]; then BOOTDIR=${MASTER}/boot else BOOTDIR=${MASTER}/isolinux fi fi [ -z "$INITRD" ] && INITRD=${BASEDIR}/initrd [ -z "$STUFF" ] && STUFF=${BASEDIR}/stuff if [ -f "${SOURCE}/etc/finnix-version" ]; then [ -z "$FINNIXVER" ] && FINNIXVER="$(cat ${SOURCE}/etc/finnix-version)" [ -z "$FINNIXVERFMT" ] && FINNIXVERFMT="$(printf '%-20s' "${FINNIXVER}")" else echo "Cannot find /etc/finnix-version in ${SOURCE}." exit 1 fi ### sanity check for i in "${BASEDIR}" "${MASTER}" "${SOURCE}"; do if ! [ -d "$i" ]; then echo "Directory $i does not exist." exit 1 fi done # Functions findmods() { KVER="$1"; shift BASE="$1"; shift [ -z "${BASE}" ] && BASE="/" for MODFILE in "$@"; do if [ ! "${MODFILE:0:1}" = "/" ]; then MODFILE="`cd /${BASE}; find ./lib/modules/${KVER} -name ${MODFILE}.ko | sed 's/^\.//g'`" fi for i in `grep "^${MODFILE}:" ${BASE}/lib/modules/${KVER}/modules.dep | head -n 1 | awk '{print $0." "}' | sed 's/^.*: //g'`; do for RECMOD in $(findmods "${KVER}" "${BASE}" $i); do case "$TORETURN" in *"$RECMOD"*) ;; *) TORETURN="${TORETURN} ${RECMOD}" ;; esac done done TORETURN="${TORETURN} ${MODFILE}" done for i in $TORETURN; do echo $i; done } # End functions if [ -f "${STUFF}/devtag" ]; then DEVTAG=$(cat ${STUFF}/devtag) let DEVTAG++ echo ${DEVTAG} >${STUFF}/devtag FINNIXDATE="$(date) (Build ${DEVTAG})" else FINNIXDATE="$(date)" fi FVTITLE="${FINNIXVER}" [ -n "$DEVTAG" ] && FVTITLE="${FVTITLE} (Build ${DEVTAG})" ### make sure required binaries are present BAD_BINARIES="" which mkisofs 2>&1 >/dev/null || BAD_BINARIES="yes" if [ -n "${BAD_BINARIES}" ]; then echo "One or more required binaries are missing." exit 1 fi ### generate modules if [ -d "${INITRD}" ]; then # USB/Firewire IMODS="ehci-hcd ohci-hcd uhci-hcd ohci1394 usb-storage usbhid sbp2" # Common SCSI IMODS="${IMODS} a100u2w aic7xxx BusLogic dc395x sym53c8xx tmscsim" # x86-only SCSI if [ "${DISTARCH}" != "ppc" ]; then IMODS="${IMODS} gdth mptspi" fi # Common USB/Firewire/SCSI IMODS="${IMODS} sr_mod sd_mod" # IDE IMODS="${IMODS} ide-disk ide-cd ide-cd_mod ide-generic" # SATA/etc IMODS="${IMODS} libata" # Block devices IMODS="${IMODS} floppy loop" # Filesystems IMODS="${IMODS} ext2 isofs vfat nls_cp437 nls_iso8859-1 unionfs aufs squashfs" for i in ${SOURCE}/lib/modules/*; do MODKERNEL="$(basename $i)" for MODFILE in $(findmods "$MODKERNEL" "$SOURCE" $IMODS); do MODFILEDIR="$(dirname $MODFILE)" [ -d "${INITRD}/$MODFILEDIR" ] || mkdir -p "${INITRD}/${MODFILEDIR}" cp -a "${SOURCE}/${MODFILE}" "${INITRD}/${MODFILEDIR}/" done # All IDE drivers #mkdir -p ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ide/pci/ #cp -a ${SOURCE}/lib/modules/${MODKERNEL}/kernel/drivers/ide/pci/*.ko ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ide/pci/ mkdir -p ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ide/ cp -a ${SOURCE}/lib/modules/${MODKERNEL}/kernel/drivers/ide/*.ko ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ide/ # All ATA drivers if [ "${DISTARCH}" != "ppc" ]; then mkdir -p ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ata/ cp -a ${SOURCE}/lib/modules/${MODKERNEL}/kernel/drivers/ata/*.ko ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ata/ rm -f ${INITRD}/lib/modules/${MODKERNEL}/kernel/drivers/ata/pata_pcmcia.ko fi depmod -b ${INITRD} ${MODKERNEL} done ### cpio for ramdisk rm -f ${BOOTDIR}/minirt ${BOOTDIR}/minirt.gz (cd ${INITRD} ; find . | cpio --verbose -o -H newc | gzip -9 >${BOOTDIR}/minirt) chmod 644 ${BOOTDIR}/minirt fi ### generate splash screens if [ -f ${STUFF}/readme.txt.content ]; then cat ${STUFF}/readme.txt.content | sed "s/FINNIX-VERSION-NUMBR/${FINNIXVERFMT}/g" | sed "s/FINNIX-COMPILE-DATE/${FINNIXDATE}/g" | sed "s/FYER/$(date +%Y)/g" | perl -pe 's/\n/\r\n/g' > ${MASTER}/readme.txt fi if [ "${DISTARCH}" = "ppc" ]; then if [ -f ${STUFF}/boot.msg.content ]; then cat ${STUFF}/boot.msg.content | sed "s/FINNIX-VERSION-NUMBR/${FINNIXVERFMT}/g" | sed "s/FINNIX-COMPILE-DATE/${FINNIXDATE}/g" | sed "s/FYER/$(date +%Y)/g" > ${BOOTDIR}/boot.msg fi else if [ -f ${STUFF}/finnix.header ]; then for i in 1 2; do cat ${STUFF}/finnix.header ${STUFF}/f$i.content ${STUFF}/finnix.footer | sed "s/FINNIX-VERSION-NUMBR/${FINNIXVERFMT}/g" | sed "s/FINNIX-COMPILE-DATE/${FINNIXDATE}/g" | sed "s/FYER/$(date +%Y)/g" > ${BOOTDIR}/f$i done fi if [ -f ${STUFF}/isolinux.cfg.content ]; then cat ${STUFF}/isolinux.cfg.content | sed "s/FINNIX-VERSION-TITLE/${FVTITLE}/g" > ${BOOTDIR}/isolinux.cfg fi fi ### calculate md5sums cd ${MASTER} find -type f -not -name md5sums -not -name boot.cat -not -name isolinux.bin \ -exec md5sum '{}' \; > FINNIX/md5sums ### the iso itself rm -f ${ISO} if [ "${DISTARCH}" = "ppc" ]; then time mkisofs -hide-rr-moved -hfs -part -map ${STUFF}/maps -no-desktop \ -hfs-volid "Finnix_${FINNIXVER}" -hfs-bless ${BOOTDIR} \ -pad -l -r -J -v -V "Finnix ${FINNIXVER}" -o ${ISO} ${MASTER} else time mkisofs -pad -l -r -J -v -V "Finnix ${FINNIXVER}" -no-emul-boot -boot-load-size 4 \ -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat \ -hide-rr-moved -o ${ISO} ${MASTER} fi [ -x /usr/bin/implantisomd5 ] && /usr/bin/implantisomd5 ${ISO} if [ -n ${DEVTAG} -a $(ls ${ISO}-LATEST_IS_* 2>/dev/null | wc -l) -gt 0 ]; then rm -f ${ISO}-LATEST_IS_* touch ${ISO}-LATEST_IS_${DEVTAG} fi if [ -n "$GPGUSER" ]; then rm -f ${ISO}.gpg gpg --sign --local-user "$GPGUSER" -ba -o ${ISO}.gpg ${ISO} fi echo "" echo "Version: ${FINNIXVER}" echo "Build: ${FINNIXDATE}"