267 lines
9.7 KiB
Bash
267 lines
9.7 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# ───────────────────────────────────────────────────────────────
|
||
|
|
# AUTARCH Windows Package Builder
|
||
|
|
#
|
||
|
|
# Creates a standalone Windows-ready ZIP with:
|
||
|
|
# - All Python source + web assets
|
||
|
|
# - Batch launcher (autarch.bat)
|
||
|
|
# - PowerShell installer (install.ps1)
|
||
|
|
# - requirements.txt for pip install
|
||
|
|
# - Placeholder for Windows tools
|
||
|
|
#
|
||
|
|
# Usage: bash scripts/build-windows.sh [version]
|
||
|
|
# Output: dist/autarch_{version}_windows.zip
|
||
|
|
#
|
||
|
|
# NOTE: This builds a SOURCE distribution, not a frozen .exe.
|
||
|
|
# The install.ps1 script handles Python venv + dependency install.
|
||
|
|
# For a frozen .exe, run PyInstaller ON a Windows machine.
|
||
|
|
# ───────────────────────────────────────────────────────────────
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
APP_NAME="autarch"
|
||
|
|
SRC_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||
|
|
|
||
|
|
# ── Determine version ────────────────────────────────────────
|
||
|
|
if [[ ${1:-} ]]; then
|
||
|
|
VERSION="$1"
|
||
|
|
else
|
||
|
|
VERSION="$(grep -m1 '^VERSION' "$SRC_DIR/autarch.py" | sed 's/.*"\(.*\)".*/\1/')"
|
||
|
|
if [[ -z "$VERSION" ]]; then
|
||
|
|
echo "ERROR: Could not extract VERSION from autarch.py" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "Building ${APP_NAME} ${VERSION} for Windows"
|
||
|
|
|
||
|
|
# ── Paths ─────────────────────────────────────────────────────
|
||
|
|
DIST_DIR="$SRC_DIR/dist"
|
||
|
|
BUILD_DIR="$DIST_DIR/.win-build"
|
||
|
|
STAGE="$BUILD_DIR/${APP_NAME}_${VERSION}_windows"
|
||
|
|
|
||
|
|
# Clean
|
||
|
|
rm -rf "$STAGE"
|
||
|
|
mkdir -p "$STAGE"
|
||
|
|
|
||
|
|
# ── Copy application files ────────────────────────────────────
|
||
|
|
echo "Copying application files..."
|
||
|
|
|
||
|
|
# Core
|
||
|
|
cp "$SRC_DIR/autarch.py" "$STAGE/"
|
||
|
|
cp "$SRC_DIR/requirements.txt" "$STAGE/"
|
||
|
|
|
||
|
|
# Config
|
||
|
|
cp "$SRC_DIR/autarch_settings.conf" "$STAGE/autarch_settings.conf"
|
||
|
|
cp "$SRC_DIR/autarch_settings.conf" "$STAGE/autarch_settings.conf.default"
|
||
|
|
|
||
|
|
# User files
|
||
|
|
cp "$SRC_DIR/custom_sites.inf" "$STAGE/"
|
||
|
|
cp "$SRC_DIR/custom_adultsites.json" "$STAGE/"
|
||
|
|
|
||
|
|
# Documentation
|
||
|
|
[[ -f "$SRC_DIR/GUIDE.md" ]] && cp "$SRC_DIR/GUIDE.md" "$STAGE/"
|
||
|
|
[[ -f "$SRC_DIR/user_manual.md" ]] && cp "$SRC_DIR/user_manual.md" "$STAGE/"
|
||
|
|
|
||
|
|
# Directory trees
|
||
|
|
for dir in core modules web; do
|
||
|
|
cp -a "$SRC_DIR/$dir" "$STAGE/"
|
||
|
|
done
|
||
|
|
|
||
|
|
# Data (sites db etc.)
|
||
|
|
cp -a "$SRC_DIR/data" "$STAGE/"
|
||
|
|
|
||
|
|
# Config templates
|
||
|
|
if [[ -d "$SRC_DIR/.config" ]]; then
|
||
|
|
cp -a "$SRC_DIR/.config" "$STAGE/"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Windows tools directory (placeholder — user downloads nmap/tshark etc.)
|
||
|
|
mkdir -p "$STAGE/tools/windows-x86_64"
|
||
|
|
|
||
|
|
# Companion APK
|
||
|
|
APK="$SRC_DIR/autarch_companion/app/build/outputs/apk/debug/app-debug.apk"
|
||
|
|
if [[ -f "$APK" ]]; then
|
||
|
|
mkdir -p "$STAGE/companion"
|
||
|
|
cp "$APK" "$STAGE/companion/archon.apk"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# ── Strip excluded files ──────────────────────────────────────
|
||
|
|
echo "Stripping excluded files..."
|
||
|
|
find "$STAGE" -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
||
|
|
find "$STAGE" -name "*.pyc" -delete 2>/dev/null || true
|
||
|
|
find "$STAGE" -name "*.bk" -delete 2>/dev/null || true
|
||
|
|
rm -rf "$STAGE/.claude" "$STAGE/node_modules" "$STAGE/src"
|
||
|
|
rm -f "$STAGE"/*_profiles.json
|
||
|
|
rm -f "$STAGE/system.inf" "$STAGE/backupexec_dump.mtf"
|
||
|
|
rm -f "$STAGE/DEVLOG.md" "$STAGE/devjournal.md" "$STAGE/autarch_dev.md"
|
||
|
|
rm -f "$STAGE/android_plan.md" "$STAGE/master_plan.md"
|
||
|
|
rm -f "$STAGE/package.json" "$STAGE/package-lock.json" "$STAGE/.gitignore"
|
||
|
|
for datadir in results dossiers data/captures data/exports data/hardware data/pentest_sessions data/uploads; do
|
||
|
|
rm -rf "$STAGE/$datadir"
|
||
|
|
done
|
||
|
|
|
||
|
|
# ── Create Windows launcher (autarch.bat) ─────────────────────
|
||
|
|
cat > "$STAGE/autarch.bat" <<'BAT'
|
||
|
|
@echo off
|
||
|
|
REM AUTARCH Launcher for Windows
|
||
|
|
REM Uses Python virtual environment if available, falls back to system Python
|
||
|
|
|
||
|
|
setlocal
|
||
|
|
|
||
|
|
set "APP_DIR=%~dp0"
|
||
|
|
|
||
|
|
if exist "%APP_DIR%venv\Scripts\python.exe" (
|
||
|
|
"%APP_DIR%venv\Scripts\python.exe" "%APP_DIR%autarch.py" %*
|
||
|
|
) else (
|
||
|
|
python "%APP_DIR%autarch.py" %*
|
||
|
|
)
|
||
|
|
|
||
|
|
endlocal
|
||
|
|
BAT
|
||
|
|
|
||
|
|
# ── Create web dashboard launcher ─────────────────────────────
|
||
|
|
cat > "$STAGE/start-web.bat" <<'BAT'
|
||
|
|
@echo off
|
||
|
|
REM Start AUTARCH Web Dashboard
|
||
|
|
setlocal
|
||
|
|
|
||
|
|
set "APP_DIR=%~dp0"
|
||
|
|
|
||
|
|
echo Starting AUTARCH Web Dashboard...
|
||
|
|
echo Open your browser to: http://localhost:8181
|
||
|
|
echo Press Ctrl+C to stop.
|
||
|
|
echo.
|
||
|
|
|
||
|
|
if exist "%APP_DIR%venv\Scripts\python.exe" (
|
||
|
|
"%APP_DIR%venv\Scripts\python.exe" "%APP_DIR%autarch.py" --web %*
|
||
|
|
) else (
|
||
|
|
python "%APP_DIR%autarch.py" --web %*
|
||
|
|
)
|
||
|
|
|
||
|
|
endlocal
|
||
|
|
BAT
|
||
|
|
|
||
|
|
# ── Create installer script (PowerShell) ──────────────────────
|
||
|
|
cat > "$STAGE/install.ps1" <<'PS1'
|
||
|
|
# AUTARCH Windows Installer
|
||
|
|
# Run: powershell -ExecutionPolicy Bypass -File install.ps1
|
||
|
|
|
||
|
|
Write-Host ""
|
||
|
|
Write-Host "================================" -ForegroundColor Green
|
||
|
|
Write-Host " AUTARCH Installer for Windows" -ForegroundColor Green
|
||
|
|
Write-Host "================================" -ForegroundColor Green
|
||
|
|
Write-Host ""
|
||
|
|
|
||
|
|
$AppDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||
|
|
|
||
|
|
# Check Python
|
||
|
|
$python = Get-Command python -ErrorAction SilentlyContinue
|
||
|
|
if (-not $python) {
|
||
|
|
Write-Host "ERROR: Python not found. Install Python 3.10+ from python.org" -ForegroundColor Red
|
||
|
|
Write-Host "Make sure to check 'Add Python to PATH' during installation." -ForegroundColor Yellow
|
||
|
|
exit 1
|
||
|
|
}
|
||
|
|
|
||
|
|
$pyVer = python --version 2>&1
|
||
|
|
Write-Host "Found: $pyVer" -ForegroundColor Cyan
|
||
|
|
|
||
|
|
# Create virtual environment
|
||
|
|
$venvDir = Join-Path $AppDir "venv"
|
||
|
|
if (-not (Test-Path $venvDir)) {
|
||
|
|
Write-Host "Creating Python virtual environment..." -ForegroundColor Yellow
|
||
|
|
python -m venv $venvDir
|
||
|
|
}
|
||
|
|
|
||
|
|
# Install dependencies
|
||
|
|
$pip = Join-Path $venvDir "Scripts\pip.exe"
|
||
|
|
Write-Host "Installing dependencies..." -ForegroundColor Yellow
|
||
|
|
& $pip install --quiet --upgrade pip
|
||
|
|
& $pip install --quiet -r (Join-Path $AppDir "requirements.txt")
|
||
|
|
|
||
|
|
# Create data directories
|
||
|
|
$dataDirs = @("results", "dossiers", "data\captures", "data\exports",
|
||
|
|
"data\hardware", "data\pentest_sessions", "data\uploads")
|
||
|
|
foreach ($d in $dataDirs) {
|
||
|
|
$path = Join-Path $AppDir $d
|
||
|
|
if (-not (Test-Path $path)) {
|
||
|
|
New-Item -ItemType Directory -Path $path -Force | Out-Null
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Create desktop shortcut
|
||
|
|
$desktop = [Environment]::GetFolderPath("Desktop")
|
||
|
|
$shortcutPath = Join-Path $desktop "AUTARCH.lnk"
|
||
|
|
$shell = New-Object -ComObject WScript.Shell
|
||
|
|
$shortcut = $shell.CreateShortcut($shortcutPath)
|
||
|
|
$shortcut.TargetPath = Join-Path $AppDir "autarch.bat"
|
||
|
|
$shortcut.WorkingDirectory = $AppDir
|
||
|
|
$shortcut.Description = "AUTARCH Security Platform"
|
||
|
|
$shortcut.Save()
|
||
|
|
|
||
|
|
Write-Host ""
|
||
|
|
Write-Host "================================" -ForegroundColor Green
|
||
|
|
Write-Host " Installation complete!" -ForegroundColor Green
|
||
|
|
Write-Host "================================" -ForegroundColor Green
|
||
|
|
Write-Host ""
|
||
|
|
Write-Host "Run AUTARCH:" -ForegroundColor Cyan
|
||
|
|
Write-Host " CLI: autarch.bat" -ForegroundColor White
|
||
|
|
Write-Host " Web: start-web.bat" -ForegroundColor White
|
||
|
|
Write-Host " Manual: python autarch.py --manual" -ForegroundColor White
|
||
|
|
Write-Host ""
|
||
|
|
Write-Host "Desktop shortcut created." -ForegroundColor Yellow
|
||
|
|
Write-Host ""
|
||
|
|
PS1
|
||
|
|
|
||
|
|
# ── Create README for Windows ─────────────────────────────────
|
||
|
|
cat > "$STAGE/README-WINDOWS.txt" <<'README'
|
||
|
|
AUTARCH for Windows
|
||
|
|
===================
|
||
|
|
|
||
|
|
Quick Start:
|
||
|
|
1. Run install.ps1 (right-click > Run with PowerShell)
|
||
|
|
This creates a Python environment and installs dependencies.
|
||
|
|
|
||
|
|
2. Double-click autarch.bat to start the CLI menu.
|
||
|
|
Or double-click start-web.bat for the browser dashboard.
|
||
|
|
|
||
|
|
Requirements:
|
||
|
|
- Python 3.10 or newer (python.org - check "Add to PATH")
|
||
|
|
- Windows 10 or newer
|
||
|
|
|
||
|
|
Optional Tools (place in tools\windows-x86_64\):
|
||
|
|
- nmap.exe (nmap.org)
|
||
|
|
- tshark.exe (wireshark.org)
|
||
|
|
- wg.exe (wireguard.com)
|
||
|
|
|
||
|
|
Manual:
|
||
|
|
python autarch.py --manual (in terminal)
|
||
|
|
Open user_manual.md (any text editor/Markdown viewer)
|
||
|
|
http://localhost:8181/manual (when web dashboard is running)
|
||
|
|
|
||
|
|
Companion App:
|
||
|
|
The Archon Android companion app APK is in the companion\ folder.
|
||
|
|
Install it on your phone via ADB or file transfer.
|
||
|
|
README
|
||
|
|
|
||
|
|
# ── Create the ZIP ────────────────────────────────────────────
|
||
|
|
echo "Creating ZIP archive..."
|
||
|
|
mkdir -p "$DIST_DIR"
|
||
|
|
|
||
|
|
ZIP_NAME="${APP_NAME}_${VERSION}_windows.zip"
|
||
|
|
ZIP_OUT="$DIST_DIR/$ZIP_NAME"
|
||
|
|
|
||
|
|
(cd "$BUILD_DIR" && zip -r -q "$ZIP_OUT" "$(basename "$STAGE")")
|
||
|
|
|
||
|
|
# ── Clean up ──────────────────────────────────────────────────
|
||
|
|
rm -rf "$BUILD_DIR"
|
||
|
|
|
||
|
|
# ── Summary ───────────────────────────────────────────────────
|
||
|
|
ZIP_SIZE=$(du -h "$ZIP_OUT" | cut -f1)
|
||
|
|
echo ""
|
||
|
|
echo "════════════════════════════════════════════════════"
|
||
|
|
echo " Package: $ZIP_OUT"
|
||
|
|
echo " Size: $ZIP_SIZE"
|
||
|
|
echo "════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
echo "Transfer this ZIP to a Windows machine and run install.ps1"
|