#!/bin/bash
set -e
ISO_OUT="/home/workspace/nullframe-os/nullframe-os-1.0.0.iso"
WORK="/tmp/nullframe-iso-build"
ISOPATH="/home/workspace/nullframe-os"

rm -rf "$WORK"
mkdir -p "$WORK"/{boot,system,tools,assets,rootfs}

echo "[+] Creating root filesystem..."
mkdir -p "$WORK/rootfs"/{bin,sbin,etc,proc,sys,dev,run,tmp,var,usr/{bin,sbin,lib},opt/nullframe/{wifi,ble,rf,network},boot,tmp,root}
ln -sf bin/busybox "$WORK/rootfs/bin/sh" 2>/dev/null || true

# Copy busybox
cp /bin/busybox "$WORK/rootfs/bin/" 2>/dev/null || echo "[*] Using container sh"
cp /bin/sh "$WORK/rootfs/bin/sh" 2>/dev/null || true

# Setup Alpine rootfs
echo "[+] Initializing Alpine rootfs..."
apk --root "$WORK/rootfs" --arch x86_64 initdb --no-scripts 2>/dev/null
apk --root "$WORK/rootfs" --arch x86_64 add alpine-base apk-tools bash zsh busybox 2>/dev/null

# Copy attack scripts
echo "[+] Installing attack tools..."
cp "$ISOPATH/tools/menu.sh" "$WORK/rootfs/opt/nullframe/"

# Create attack tool scripts
mkdir -p "$WORK/rootfs/opt/nullframe/"{wifi,ble,rf,network}

cat > "$WORK/rootfs/opt/nullframe/wifi/monitor.sh" << 'WIFI'
#!/bin/sh
echo "[*] WiFi Monitor Mode Enabler"
ip link show 2>/dev/null | grep -q wlan && echo "[+] wlan interface found" || echo "[!] No wlan"
WIFI

cat > "$WORK/rootfs/opt/nullframe/ble/scan.sh" << 'BLE'
#!/bin/sh
echo "[*] BLE Scanner - requires bluetooth hardware"
BLE

cat > "$WORK/rootfs/opt/nullframe/ble/glitch.sh" << 'GLITCH'
#!/bin/sh
echo "[*] Cursed BLE Glitcher"
python3 -c "print('[+] Cursed spectral ready')"
GLITCH

cat > "$WORK/rootfs/opt/nullframe/rf/sniff.sh" << 'RF'
#!/bin/sh
echo "[*] RF Sniffer - needs RTL-SDR"
RF

cat > "$WORK/rootfs/opt/nullframe/network/arpSpoof.sh" << 'NET'
#!/bin/sh
echo "[*] ARP Spoof - usage: arpSpoof <target> <gw>"
NET

chmod +x "$WORK/rootfs/opt/nullframe/wifi/monitor.sh"
chmod +x "$WORK/rootfs/opt/nullframe/ble/scan.sh"
chmod +x "$WORK/rootfs/opt/nullframe/ble/glitch.sh"
chmod +x "$WORK/rootfs/opt/nullframe/rf/sniff.sh"
chmod +x "$WORK/rootfs/opt/nullframe/network/arpSpoof.sh"

# Create disclaimer
cp "$ISOPATH/boot/disclaimer.txt" "$WORK/rootfs/boot/disclaimer.txt"
cp "$ISOPATH/boot/disclaimer.txt" "$WORK/boot/disclaimer.txt"

# Create MOTD
cat > "$WORK/rootfs/etc/motd" << 'MOTD'

 ██╗  ██╗██████╗  ██████╗ ██████╗ ███████╗
 ██║ ██╔╝██╔══██╗██╔═══██╗██╔══██╗██╔════╝
 █████╔╝ ██████╔╝██║   ██║██████╔╝███████╗
 ██╔═██╗ ██╔══██╗██║   ██║██╔══██╗╚════██║
 ██║  ██╗██████╔╝╚██████╔╝██████╔╝███████║
 ╚═╝  ╚═╝╚═════╝  ╚═════╝ ╚═════╝ ╚══════╝
   SECURITY TESTING LABORATORY EDITION

WARNING: AUTHORIZED USE ONLY - ALL LOGGED
MOTD

# Create init
cat > "$WORK/rootfs/etc/inittab" << 'INIT'
::sysinit:/bin/sh /etc/init.sh
::askfirst:-/bin/sh
::ctrlaltdel:/bin/reboot
INIT

cat > "$WORK/rootfs/etc/init.sh" << 'INITSH'
#!/bin/sh
echo ""
cat /boot/disclaimer.txt
echo ""
echo "[+] NullFrame OS booted"
echo "[*] Type 'menu' for attack tools or 'help'"
INITSH

chmod +x "$WORK/rootfs/etc/init.sh"

# Download kernel and initramfs from Alpine
echo "[+] Downloading Alpine kernel..."
KERNEL_URL="https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/vmlinuz-lts"
curl -sL "$KERNEL_URL" -o "$WORK/boot/vmlinuz" && echo "[+] Kernel ready" || echo "[!] Kernel failed"

echo "[+] Downloading Alpine initramfs..."
INITRAMFS_URL="https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/initramfs-lts"
curl -sL "$INITRAMFS_URL" -o "$WORK/boot/initramfs" && echo "[+] Initramfs ready" || echo "[!] Initramfs failed"

# Setup SYSLINUX
echo "[+] Setting up boot loader..."
mkdir -p "$WORK/boot/syslinux"

cat > "$WORK/boot/syslinux/syslinux.cfg << 'SYSLINUX'
DEFAULT menu
TIMEOUT 30
PROMPT 1

MENU TITLE NullFrame OS - Security Testing Lab
MENU COLOR border 30;44
MENU COLOR title 1;36;44

LABEL menu
MENU LABEL NullFrame OS (Live)
KERNEL /boot/vmlinuz
APPEND initrd=/boot/initramfs vga=791 quiet splash
TEXT HELP
Boot NullFrame Security Testing OS
ENDTEXT

LABEL safe  
MENU LABEL NullFrame OS (Safe Mode)
KERNEL /boot/vmlinuz
APPEND initrd=/boot/initramfs vga=791
TEXT HELP
Boot without attack tools loaded
ENDTEXT
SYSLINUX

# Copy isolinux from system
if [ -f /usr/share/syslinux/isolinux.bin ]; then
    cp /usr/share/syslinux/isolinux.bin "$WORK/boot/syslinux/"
elif [ -f /usr/lib/syslinux/bios/isolinux.bin ]; then
    cp /usr/lib/syslinux/bios/isolinux.bin "$WORK/boot/syslinux/"
else
    echo "[!] isolinux.bin not found, using syslinux64"
fi

# Create boot catalog
cat > "$WORK/boot/syslinux/boot.cat << 'BOOTCAT'
NullFrame OS Boot Catalog
BOOTCAT

# Build ISO
echo "[+] Building ISO..."
xorriso -as mkisofs \
    -R \
    -b boot/syslinux/isolinux.bin \
    -c boot/syslinux/boot.cat \
    -no-emul-boot \
    -boot-load-size 4 \
    -boot-info-table \
    -isohybrid-mbr /usr/share/syslinux/mbr/mbr.bin \
    -o "$ISO_OUT" \
    "$WORK/" 2>&1

if [ -f "$ISO_OUT" ]; then
    echo ""
    echo "[+] ISO CREATED: $ISO_OUT"
    ls -lh "$ISO_OUT"
else
    echo "[!] Build failed"
fi
