mirror of
https://github.com/AeThex-Corporation/AeThex-OS.git
synced 2026-04-17 22:07:20 +00:00
fix(linux-iso): Fix ISO build script syntax errors and mobile app integration
- Fix corrupted kernel/initrd extraction section - Fix unmount commands (proc/sys/dev) - Fix isolinux and GRUB configuration syntax - Fix mksquashfs error handling - Add mobile app build and integration - Create systemd service for mobile server - Update Firefox kiosk to launch mobile UI - Add Capacitor Android build copying - Improve GitLab CI error handling (fail on missing tools) - Update completion messages with mobile features This resolves ISO build failures and properly packages the Ingress-style mobile UI into the bootable Linux distribution.
This commit is contained in:
parent
29385e9844
commit
7715fba8b5
3 changed files with 148 additions and 39 deletions
|
|
@ -17,22 +17,24 @@ build_iso:
|
||||||
script:
|
script:
|
||||||
# Update system
|
# Update system
|
||||||
- apt-get update -qq
|
- apt-get update -qq
|
||||||
- apt-get install -y -qq build-essential curl wget git nodejs npm debootstrap squashfs-tools xorriso grub-common grub-pc-bin grub-efi-amd64-bin mtools dosfstools isolinux syslinux-common || true
|
- apt-get install -y -qq build-essential curl wget git nodejs npm debootstrap squashfs-tools xorriso grub-common grub-pc-bin grub-efi-amd64-bin mtools dosfstools isolinux syslinux-common
|
||||||
|
|
||||||
# Verify critical tools are installed
|
# Verify critical tools are installed
|
||||||
- which mksquashfs && echo "✅ mksquashfs found" || echo "⚠️ mksquashfs missing"
|
- which mksquashfs && echo "✅ mksquashfs found" || (echo "❌ mksquashfs missing" && exit 1)
|
||||||
- which grub-mkrescue && echo "✅ grub-mkrescue found" || echo "⚠️ grub-mkrescue missing"
|
- which grub-mkrescue && echo "✅ grub-mkrescue found" || (echo "❌ grub-mkrescue missing" && exit 1)
|
||||||
|
- which debootstrap && echo "✅ debootstrap found" || (echo "❌ debootstrap missing" && exit 1)
|
||||||
|
|
||||||
# Install Node dependencies
|
# Install Node dependencies
|
||||||
- npm install
|
- npm install
|
||||||
|
|
||||||
# Build client
|
# Build client
|
||||||
- npm run build || true
|
- npm run build
|
||||||
|
|
||||||
# Build ISO
|
# Build ISO (fail if it errors)
|
||||||
- mkdir -p aethex-linux-build
|
- mkdir -p aethex-linux-build
|
||||||
- bash script/build-linux-iso.sh || true
|
- bash script/build-linux-iso.sh
|
||||||
|
|
||||||
# Verify ISO exists
|
# Verify ISO exists (fail the build if not)
|
||||||
- |
|
- |
|
||||||
ISO_PATH=$(ls aethex-linux-build/AeThex-Linux-*.iso 2>/dev/null | head -n 1)
|
ISO_PATH=$(ls aethex-linux-build/AeThex-Linux-*.iso 2>/dev/null | head -n 1)
|
||||||
if [ -n "$ISO_PATH" ]; then
|
if [ -n "$ISO_PATH" ]; then
|
||||||
|
|
@ -43,7 +45,9 @@ build_iso:
|
||||||
cp "$ISO_PATH" artifacts/local/
|
cp "$ISO_PATH" artifacts/local/
|
||||||
cp aethex-linux-build/SHA256 artifacts/local/$(basename "$ISO_PATH").sha256
|
cp aethex-linux-build/SHA256 artifacts/local/$(basename "$ISO_PATH").sha256
|
||||||
else
|
else
|
||||||
echo "⚠️ ISO not found, continuing anyway"
|
echo "❌ ISO not found! Build failed."
|
||||||
|
ls -la aethex-linux-build/ || echo "Build directory doesn't exist"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
release_iso:
|
release_iso:
|
||||||
|
|
|
||||||
38
configs/systemd/aethex-mobile-server.service
Normal file
38
configs/systemd/aethex-mobile-server.service
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
[Unit]
|
||||||
|
Description=AeThex Mobile Server
|
||||||
|
Documentation=https://github.com/AeThex-Corporation/AeThex-OS
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=aethex
|
||||||
|
Group=aethex
|
||||||
|
WorkingDirectory=/opt/aethex-desktop
|
||||||
|
Environment="NODE_ENV=production"
|
||||||
|
Environment="PORT=5000"
|
||||||
|
|
||||||
|
# Start the Node.js server
|
||||||
|
ExecStart=/usr/bin/npm start
|
||||||
|
|
||||||
|
# Restart policy
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
StartLimitInterval=200
|
||||||
|
StartLimitBurst=5
|
||||||
|
|
||||||
|
# Security
|
||||||
|
NoNewPrivileges=true
|
||||||
|
PrivateTmp=true
|
||||||
|
ProtectSystem=strict
|
||||||
|
ProtectHome=read-only
|
||||||
|
ReadWritePaths=/opt/aethex-desktop
|
||||||
|
ReadWritePaths=/home/aethex/.local/share/aethex
|
||||||
|
|
||||||
|
# Logging
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
SyslogIdentifier=aethex-mobile
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
|
@ -94,22 +94,70 @@ LIGHTDM
|
||||||
|
|
||||||
echo "[+] Setting up AeThex Desktop application..."
|
echo "[+] Setting up AeThex Desktop application..."
|
||||||
|
|
||||||
|
# Build mobile app if possible
|
||||||
|
if [ -f "package.json" ]; then
|
||||||
|
echo " Building AeThex mobile app..."
|
||||||
|
npm run build 2>&1 | tail -5 || echo " Build skipped"
|
||||||
|
fi
|
||||||
|
|
||||||
# Copy app files (if available, otherwise note for manual addition)
|
# Copy app files (if available, otherwise note for manual addition)
|
||||||
if [ -d "client" ] && [ -d "server" ]; then
|
if [ -d "client" ] && [ -d "server" ]; then
|
||||||
echo " Copying AeThex Desktop files..."
|
echo " Copying AeThex Desktop files..."
|
||||||
mkdir -p "$ROOTFS_DIR/opt/aethex-desktop"
|
mkdir -p "$ROOTFS_DIR/opt/aethex-desktop"
|
||||||
|
|
||||||
|
# Copy source files
|
||||||
cp -r client "$ROOTFS_DIR/opt/aethex-desktop/"
|
cp -r client "$ROOTFS_DIR/opt/aethex-desktop/"
|
||||||
cp -r server "$ROOTFS_DIR/opt/aethex-desktop/"
|
cp -r server "$ROOTFS_DIR/opt/aethex-desktop/"
|
||||||
cp -r shared "$ROOTFS_DIR/opt/aethex-desktop/" 2>/dev/null || true
|
cp -r shared "$ROOTFS_DIR/opt/aethex-desktop/" 2>/dev/null || true
|
||||||
cp package*.json "$ROOTFS_DIR/opt/aethex-desktop/" 2>/dev/null || true
|
cp package*.json "$ROOTFS_DIR/opt/aethex-desktop/" 2>/dev/null || true
|
||||||
|
cp tsconfig.json "$ROOTFS_DIR/opt/aethex-desktop/" 2>/dev/null || true
|
||||||
|
cp vite.config.ts "$ROOTFS_DIR/opt/aethex-desktop/" 2>/dev/null || true
|
||||||
|
|
||||||
|
# Copy built assets if they exist
|
||||||
|
if [ -d "dist" ]; then
|
||||||
|
cp -r dist "$ROOTFS_DIR/opt/aethex-desktop/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Copy Capacitor Android build if it exists (for native features)
|
||||||
|
if [ -d "android" ]; then
|
||||||
|
mkdir -p "$ROOTFS_DIR/opt/aethex-desktop/android"
|
||||||
|
cp -r android/app "$ROOTFS_DIR/opt/aethex-desktop/android/" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
# Install dependencies in chroot
|
# Install dependencies in chroot
|
||||||
chroot "$ROOTFS_DIR" bash -c 'cd /opt/aethex-desktop && npm install --production' 2>&1 | tail -10 || echo " npm install skipped"
|
echo " Installing Node.js dependencies..."
|
||||||
|
chroot "$ROOTFS_DIR" bash -c 'cd /opt/aethex-desktop && npm install --production --legacy-peer-deps' 2>&1 | tail -10 || echo " npm install skipped"
|
||||||
|
|
||||||
|
# Set ownership
|
||||||
|
chroot "$ROOTFS_DIR" chown -R aethex:aethex /opt/aethex-desktop
|
||||||
else
|
else
|
||||||
echo " (client/server not found; skipping app copy)"
|
echo " (client/server not found; skipping app copy)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create systemd service for AeThex server
|
# Create systemd service for AeThex mobile server
|
||||||
|
cat > "$ROOTFS_DIR/etc/systemd/system/aethex-mobile-server.service" << 'SERVICEEOF'
|
||||||
|
[Unit]
|
||||||
|
Description=AeThex Mobile Server
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=aethex
|
||||||
|
WorkingDirectory=/opt/aethex-desktop
|
||||||
|
Environment="NODE_ENV=production"
|
||||||
|
Environment="PORT=5000"
|
||||||
|
ExecStart=/usr/bin/npm start
|
||||||
|
Restart=always
|
||||||
|
RestartSec=10
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
SERVICEEOF
|
||||||
|
|
||||||
|
# Create backward-compatible legacy service name
|
||||||
cat > "$ROOTFS_DIR/etc/systemd/system/aethex-desktop.service" << 'SERVICEEOF'
|
cat > "$ROOTFS_DIR/etc/systemd/system/aethex-desktop.service" << 'SERVICEEOF'
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=AeThex Desktop Server
|
Description=AeThex Desktop Server
|
||||||
|
|
@ -127,24 +175,30 @@ RestartSec=5
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
SERVICEEOF
|
SERVICEEOF
|
||||||
|
|
||||||
# Enable AeThex service
|
# Enable both services
|
||||||
chroot "$ROOTFS_DIR" systemctl enable aethex-desktop.service 2>/dev/null || echo " systemd service added"
|
chroot "$ROOTFS_DIR" systemctl enable aethex-mobile-server.service 2>/dev/null || echo " Mobile server service added"
|
||||||
|
chroot "$ROOTFS_DIR" systemctl enable aethex-desktop.service 2>/dev/null || echo " Desktop service added"
|
||||||
|
|
||||||
# Create auto-start script for Firefox kiosk
|
# Create auto-start script for Firefox kiosk pointing to mobile server
|
||||||
mkdir -p "$ROOTFS_DIR/home/aethex/.config/autostart"
|
mkdir -p "$ROOTFS_DIR/home/aethex/.config/autostart"
|
||||||
cat > "$ROOTFS_DIR/home/aethex/.config/autostart/aethex-kiosk.desktop" << 'KIOSK'
|
cat > "$ROOTFS_DIR/home/aethex/.config/autostart/aethex-kiosk.desktop" << 'KIOSK'
|
||||||
[Desktop Entry]
|
[Desktop Entry]
|
||||||
Type=Application
|
Type=Application
|
||||||
Name=AeThex Kiosk
|
Name=AeThex Mobile UI
|
||||||
Exec=firefox --kiosk http://localhost:5000
|
Exec=sh -c "sleep 5 && firefox --kiosk http://localhost:5000"
|
||||||
Hidden=false
|
Hidden=false
|
||||||
NoDisplay=false
|
NoDisplay=false
|
||||||
X-GNOME-Autostart-enabled=true
|
X-GNOME-Autostart-enabled=true
|
||||||
|
Comment=Launch AeThex mobile interface in fullscreen
|
||||||
KIOSK
|
KIOSK
|
||||||
|
|
||||||
chroot "$ROOTFS_DIR" chown -R aethex:aethex /home/aethex
|
chroot "$ROOTFS_DIR" chown -R aethex:aethex /home/aethex
|
||||||
|
|
||||||
echo "[✓] AeThex Desktop integrated with Xfce auto-login and Firefox kiosk"
|
echo "[✓] AeThex Mobile UI integrated:"
|
||||||
|
echo " - Server runs on port 5000"
|
||||||
|
echo " - Firefox launches in kiosk mode"
|
||||||
|
echo " - Xfce desktop with auto-login"
|
||||||
|
echo " - Ingress-style mobile interface"
|
||||||
|
|
||||||
echo "[+] Extracting kernel and initrd..."
|
echo "[+] Extracting kernel and initrd..."
|
||||||
KERNEL="$(ls -1 $ROOTFS_DIR/boot/vmlinuz-* 2>/dev/null | head -n 1)"
|
KERNEL="$(ls -1 $ROOTFS_DIR/boot/vmlinuz-* 2>/dev/null | head -n 1)"
|
||||||
|
|
@ -153,6 +207,8 @@ INITRD="$(ls -1 $ROOTFS_DIR/boot/initrd.img-* 2>/dev/null | head -n 1)"
|
||||||
if [ -z "$KERNEL" ] || [ -z "$INITRD" ]; then
|
if [ -z "$KERNEL" ] || [ -z "$INITRD" ]; then
|
||||||
echo "[!] Kernel or initrd not found."
|
echo "[!] Kernel or initrd not found."
|
||||||
ls -la "$ROOTFS_DIR/boot/" || true
|
ls -la "$ROOTFS_DIR/boot/" || true
|
||||||
|
mkdir -p "$BUILD_DIR"
|
||||||
|
echo "No kernel found in rootfs" > "$BUILD_DIR/README.txt"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -160,33 +216,26 @@ cp "$KERNEL" "$ISO_DIR/casper/vmlinuz"
|
||||||
cp "$INITRD" "$ISO_DIR/casper/initrd.img"
|
cp "$INITRD" "$ISO_DIR/casper/initrd.img"
|
||||||
echo "[✓] Kernel: $(basename "$KERNEL")"
|
echo "[✓] Kernel: $(basename "$KERNEL")"
|
||||||
echo "[✓] Initrd: $(basename "$INITRD")"
|
echo "[✓] Initrd: $(basename "$INITRD")"
|
||||||
echo "No kernel found in rootfs" > "$BUILD_DIR/README.txt"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp "$KERNEL" "$ISO_DIR/casper/vmlinuz"
|
|
||||||
cp "$INITRD" "$ISO_DIR/casper/initrd.i
|
|
||||||
|
|
||||||
# Unmount before squashfs
|
# Unmount before squashfs
|
||||||
echo "[+] Unmounting chroot filesystems..."
|
echo "[+] Unmounting chroot filesystems..."
|
||||||
umount -lf "$ROOTFS_DIR/procfilesystem..."
|
umount -lf "$ROOTFS_DIR/proc" 2>/dev/null || true
|
||||||
|
umount -lf "$ROOTFS_DIR/sys" 2>/dev/null || true
|
||||||
|
umount -lf "$ROOTFS_DIR/dev" 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "[+] Creating SquashFS filesystem..."
|
||||||
echo " (compressing ~2-3GB desktop, takes 10-15 minutes...)"
|
echo " (compressing ~2-3GB desktop, takes 10-15 minutes...)"
|
||||||
mksquashfs "$ROOTFS_DIR" "$ISO_DIR/casper/filesystem.squashfs" -b 1048576 -comp xz -Xdict-size 100% 2>&1 | tail -3mksquashfs "$ROOTFS_DIR" "$ISO_DIR/casper/filesystem.squashfs" -b 1048576 -comp xz 2>&1 | tail -3
|
if command -v mksquashfs &> /dev/null; then
|
||||||
|
mksquashfs "$ROOTFS_DIR" "$ISO_DIR/casper/filesystem.squashfs" -b 1048576 -comp xz -Xdict-size 100% 2>&1 | tail -3
|
||||||
else
|
else
|
||||||
echo "[!] mksquashfs not found; cannot create ISO."
|
echo "[!] mksquashfs not found; cannot create ISO."
|
||||||
mkdir -p "$BUILD_DIR"
|
mkdir -p "$BUILD_DIR"
|
||||||
echo "mksquashfs not available" > "$BUILD_DIR/README.txt"
|
echo "mksquashfs not available" > "$BUILD_DIR/README.txt"
|
||||||
exit 0
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "[+] Setting up BIOS boot (isolinux)..."
|
echo "[+] Setting up BIOS boot (isolinux)..."
|
||||||
cat > "$BUILD_DIR/isolinux.cfg" << 'EOF'
|
cat > "$ISO_DIR/isolinux/isolinux.cfg" << 'EOF'
|
||||||
PROMPT 0
|
|
||||||
TIMEOUT 50
|
|
||||||
DEFAULT linux
|
|
||||||
|
|
||||||
LABEL linux
|
|
||||||
KERNELISO_DIR/isolinux/isolinux.cfg" << 'EOF'
|
|
||||||
PROMPT 0
|
PROMPT 0
|
||||||
TIMEOUT 50
|
TIMEOUT 50
|
||||||
DEFAULT linux
|
DEFAULT linux
|
||||||
|
|
@ -196,6 +245,7 @@ LABEL linux
|
||||||
KERNEL /casper/vmlinuz
|
KERNEL /casper/vmlinuz
|
||||||
APPEND initrd=/casper/initrd.img boot=casper quiet splash
|
APPEND initrd=/casper/initrd.img boot=casper quiet splash
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cp /usr/lib/syslinux/isolinux.bin "$ISO_DIR/isolinux/" 2>/dev/null || \
|
cp /usr/lib/syslinux/isolinux.bin "$ISO_DIR/isolinux/" 2>/dev/null || \
|
||||||
cp /usr/share/syslinux/isolinux.bin "$ISO_DIR/isolinux/" 2>/dev/null || echo "[!] isolinux.bin missing"
|
cp /usr/share/syslinux/isolinux.bin "$ISO_DIR/isolinux/" 2>/dev/null || echo "[!] isolinux.bin missing"
|
||||||
cp /usr/lib/syslinux/ldlinux.c32 "$ISO_DIR/isolinux/" 2>/dev/null || \
|
cp /usr/lib/syslinux/ldlinux.c32 "$ISO_DIR/isolinux/" 2>/dev/null || \
|
||||||
|
|
@ -205,7 +255,14 @@ echo "[+] Setting up UEFI boot (GRUB)..."
|
||||||
cat > "$ISO_DIR/boot/grub/grub.cfg" << 'EOF'
|
cat > "$ISO_DIR/boot/grub/grub.cfg" << 'EOF'
|
||||||
set timeout=10
|
set timeout=10
|
||||||
set default=0
|
set default=0
|
||||||
with grub-mkrescue..."
|
|
||||||
|
menuentry "AeThex OS" {
|
||||||
|
linux /casper/vmlinuz boot=casper quiet splash
|
||||||
|
initrd /casper/initrd.img
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "[+] Creating hybrid ISO with grub-mkrescue..."
|
||||||
grub-mkrescue -o "$BUILD_DIR/$ISO_NAME" "$ISO_DIR" --verbose 2>&1 | tail -20
|
grub-mkrescue -o "$BUILD_DIR/$ISO_NAME" "$ISO_DIR" --verbose 2>&1 | tail -20
|
||||||
|
|
||||||
echo "[+] Computing SHA256 checksum..."
|
echo "[+] Computing SHA256 checksum..."
|
||||||
|
|
@ -226,15 +283,25 @@ rm -rf "$ROOTFS_DIR"
|
||||||
|
|
||||||
echo "[✓] Build complete!"
|
echo "[✓] Build complete!"
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== AeThex OS Full Desktop Edition ==="
|
echo "=== AeThex OS - Mobile UI Edition ==="
|
||||||
echo "Features:"
|
echo "Features:"
|
||||||
|
echo " - Ubuntu 24.04 LTS base"
|
||||||
echo " - Xfce desktop environment"
|
echo " - Xfce desktop environment"
|
||||||
echo " - Firefox browser (auto-launches in kiosk mode)"
|
echo " - Firefox browser (auto-launches mobile UI in kiosk mode)"
|
||||||
echo " - Node.js 20.x + npm"
|
echo " - Node.js 20.x + npm"
|
||||||
echo " - AeThex Desktop app at /opt/aethex-desktop"
|
echo " - AeThex Mobile App (Ingress-style) at /opt/aethex-desktop"
|
||||||
echo " - Auto-login as user 'aethex'"
|
echo " - Server: http://localhost:5000"
|
||||||
|
echo " - Auto-login as user 'aethex' (password: aethex)"
|
||||||
echo " - NetworkManager for WiFi/Ethernet"
|
echo " - NetworkManager for WiFi/Ethernet"
|
||||||
echo " - Audio support (PulseAudio)"
|
echo " - PipeWire audio support"
|
||||||
|
echo " - 18 Capacitor plugins integrated"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Flash to USB: sudo ./script/flash-usb.sh -i $BUILD_DIR/$ISO_NAME
|
echo "Mobile UI Features:"
|
||||||
|
echo " - Ingress-style hexagonal design"
|
||||||
|
echo " - Green/Cyan color scheme"
|
||||||
|
echo " - CSS-only animations (low CPU)"
|
||||||
|
echo " - Native-like performance"
|
||||||
|
echo " - Calculator, Notes, File Manager, Terminal, Games, etc."
|
||||||
|
echo ""
|
||||||
|
echo "Flash to USB: sudo ./script/flash-usb.sh -i $BUILD_DIR/$ISO_NAME"
|
||||||
echo "[✓] Done!"
|
echo "[✓] Done!"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue