#!/usr/bin/env bash set -euo pipefail SOURCE_ISO="${1:-}" REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" BASE_DIR="$(cd "$REPO_DIR/.." && pwd)" BUILD_DIR="$BASE_DIR/build" WORK_DIR="$BUILD_DIR/work" OUTPUT_DIR="$BUILD_DIR/output" MOUNT_DIR="/mnt/fedora-iso" usage() { echo "Usage: $0 /path/to/source.iso" } check_input() { if [[ -z "$SOURCE_ISO" ]]; then usage exit 1 fi if [[ ! -f "$SOURCE_ISO" ]]; then echo "Error: ISO not found: $SOURCE_ISO" exit 1 fi } check_dependencies() { for cmd in rsync xorriso; do if ! command -v "$cmd" >/dev/null 2>&1; then echo "Error: missing dependency: $cmd" exit 1 fi done } prepare_dirs() { mkdir -p "$BUILD_DIR" "$OUTPUT_DIR" rm -rf "$WORK_DIR" mkdir -p "$WORK_DIR" } mount_iso() { sudo mkdir -p "$MOUNT_DIR" sudo mount -o loop "$SOURCE_ISO" "$MOUNT_DIR" } unmount_iso() { sudo umount "$MOUNT_DIR" || true } extract_iso() { echo "Extracting ISO..." mount_iso trap unmount_iso EXIT sudo rsync -a "$MOUNT_DIR"/ "$WORK_DIR"/ sudo chown -R "$(id -u):$(id -g)" "$WORK_DIR" unmount_iso trap - EXIT } patch_grub() { echo "Installing Tuxflotte GRUB configuration..." cp "$REPO_DIR/grub/EFI-BOOT-grub.cfg" \ "$WORK_DIR/EFI/BOOT/grub.cfg" cp "$REPO_DIR/grub/boot-grub2-grub.cfg" \ "$WORK_DIR/boot/grub2/grub.cfg" } verify_workdir() { echo "Verifying workdir..." grep -q "Tuxflotte" "$WORK_DIR/EFI/BOOT/grub.cfg" grep -q "Tuxflotte" "$WORK_DIR/boot/grub2/grub.cfg" echo "GRUB verification passed." } create_iso() { echo "Creating Tuxflotte ISO..." local output_iso="$OUTPUT_DIR/tuxflotte-provisioning-0.1.iso" rm -f "$output_iso" xorriso \ -indev "$SOURCE_ISO" \ -outdev "$output_iso" \ -compliance no_emul_toc \ -map "$REPO_DIR/grub/EFI-BOOT-grub.cfg" /EFI/BOOT/grub.cfg \ -map "$REPO_DIR/grub/boot-grub2-grub.cfg" /boot/grub2/grub.cfg \ -boot_image any replay echo "ISO created: $output_iso" } main() { check_input check_dependencies prepare_dirs extract_iso patch_grub verify_workdir create_iso echo echo "Build preparation complete." echo "Work dir: $WORK_DIR" echo echo "ISO creation will be added in the next step." } main "$@"