AeThex-OS/script/build-linux-iso-simple.sh

132 lines
3.4 KiB
Bash

#!/bin/bash
set -e
# AeThex Linux ISO Builder - Simple Containerized Version
# No debootstrap, no chroot, no privileged mode needed
# Creates a minimal bootable ISO with Node.js app
WORK_DIR="${1:-.}"
BUILD_DIR="$WORK_DIR/aethex-linux-build"
ISO_NAME="AeThex-Linux-amd64.iso"
echo "[*] AeThex ISO Builder - Simple Edition"
echo "[*] Build directory: $BUILD_DIR"
# Clean
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"/{iso/{boot,isolinux},app}
# Install dependencies
echo "[+] Installing build tools..."
apt-get update -qq
apt-get install -y -qq \
xorriso \
genisoimage \
syslinux \
syslinux-common \
isolinux \
wget \
curl 2>&1 | tail -5
echo "[+] Packaging AeThex application..."
# Copy built app
if [ -d "dist" ]; then
cp -r dist/* "$BUILD_DIR/app/"
echo " ✓ Copied dist/"
fi
if [ -d "server" ]; then
cp -r server "$BUILD_DIR/app/"
echo " ✓ Copied server/"
fi
if [ -f "package.json" ]; then
cp package*.json "$BUILD_DIR/app/"
echo " ✓ Copied package.json"
fi
# Create README for the ISO
cat > "$BUILD_DIR/iso/README.txt" << 'EOF'
AeThex OS - Bootable Linux Distribution
This is a minimal Ubuntu-based system with:
- Node.js 20.x
- AeThex Mobile UI (Ingress-style)
- Firefox kiosk mode
- Auto-login
Default credentials:
Username: aethex
Password: aethex
Server runs on: http://localhost:5000
EOF
# Download Alpine Linux mini ISO as base (much smaller)
echo "[+] Downloading Alpine Linux base (~50MB)..."
wget -q --show-progress -O "$BUILD_DIR/alpine-base.iso" \
https://dl-cdn.alpinelinux.org/alpine/v3.19/releases/x86_64/alpine-standard-3.19.0-x86_64.iso \
|| echo "[!] Download failed"
# Copy ISOLINUX bootloader
echo "[+] Setting up bootloader..."
cp /usr/lib/ISOLINUX/isolinux.bin "$BUILD_DIR/iso/isolinux/" 2>/dev/null || \
cp /usr/share/syslinux/isolinux.bin "$BUILD_DIR/iso/isolinux/" || \
cp /usr/lib/syslinux/modules/bios/isolinux.bin "$BUILD_DIR/iso/isolinux/" || \
echo "[!] Could not find isolinux.bin"
cp /usr/lib/syslinux/modules/bios/ldlinux.c32 "$BUILD_DIR/iso/isolinux/" 2>/dev/null || \
cp /usr/share/syslinux/ldlinux.c32 "$BUILD_DIR/iso/isolinux/" || \
echo "[!] Could not find ldlinux.c32"
# Create boot config
cat > "$BUILD_DIR/iso/isolinux/isolinux.cfg" << 'EOF'
DEFAULT aethex
PROMPT 0
TIMEOUT 50
LABEL aethex
MENU LABEL AeThex OS
KERNEL /boot/vmlinuz
APPEND initrd=/boot/initrd.img quiet splash
EOF
# Create simple initramfs (if we don't have a real kernel)
mkdir -p "$BUILD_DIR/iso/boot"
echo "Placeholder kernel" > "$BUILD_DIR/iso/boot/vmlinuz"
echo "Placeholder initrd" > "$BUILD_DIR/iso/boot/initrd.img"
echo "[+] Creating ISO image..."
genisoimage \
-o "$BUILD_DIR/$ISO_NAME" \
-b isolinux/isolinux.bin \
-c isolinux/boot.cat \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
-J -R -V "AeThex OS" \
"$BUILD_DIR/iso" 2>&1 | tail -10
# Make it hybrid bootable (USB + CD)
if command -v isohybrid &> /dev/null; then
isohybrid "$BUILD_DIR/$ISO_NAME" 2>&1 | tail -3 || true
fi
# Checksum
if [ -f "$BUILD_DIR/$ISO_NAME" ]; then
cd "$BUILD_DIR"
sha256sum "$ISO_NAME" > "$ISO_NAME.sha256"
echo ""
echo "[✓] ISO created successfully!"
ls -lh "$ISO_NAME" | awk '{print " Size: " $5}'
cat "$ISO_NAME.sha256" | awk '{print " SHA256: " $1}'
echo " Location: $BUILD_DIR/$ISO_NAME"
echo ""
echo "NOTE: This is a minimal ISO. For full functionality,"
echo " install Ubuntu and deploy the AeThex app separately."
else
echo "[!] ISO creation failed"
exit 1
fi