open-range / src /open_range /builder /npc /http_traffic.sh
Aaron Brown
Add episode CLI, synthetic data pipeline, NPC generalization, service manifest
f016eb7
#!/usr/bin/env bash
# Level 0 NPC: HTTP traffic generator (curl loop)
#
# Generates benign web traffic to simulate normal user browsing.
# Discovers available pages dynamically from the web server's document
# root so it adapts to any LLM-generated environment.
#
# Environment variables:
# WEB_HOST - hostname of the web server (default: web)
# RATE_LAMBDA - requests per minute (default: 30)
set -euo pipefail
WEB_HOST="${WEB_HOST:-web}"
RATE_LAMBDA="${RATE_LAMBDA:-30}"
INTERVAL=$(awk "BEGIN {printf \"%.1f\", 60.0 / $RATE_LAMBDA}")
# Discover available pages from the web root
discover_pages() {
local pages=("/")
# Try common doc roots
for root in /var/www/html /var/www/portal /var/www; do
if [ -d "$root" ]; then
while IFS= read -r f; do
# Strip doc root to get URL path
local url_path="${f#$root}"
[ -n "$url_path" ] && pages+=("$url_path")
done < <(find "$root" -maxdepth 2 -name '*.php' -o -name '*.html' 2>/dev/null | head -20)
break
fi
done
# Fallback: probe common endpoints
if [ ${#pages[@]} -le 1 ]; then
for p in /index.php /index.html /login.php /dashboard.php; do
if curl -s -o /dev/null -w '%{http_code}' "http://${WEB_HOST}${p}" 2>/dev/null | grep -q '^[23]'; then
pages+=("$p")
fi
done
fi
printf '%s\n' "${pages[@]}"
}
# Build page list once at startup
mapfile -t PAGES < <(discover_pages)
[ ${#PAGES[@]} -eq 0 ] && PAGES=("/")
echo "[NPC-HTTP] Starting HTTP traffic to ${WEB_HOST} at ${RATE_LAMBDA} req/min (${#PAGES[@]} pages)"
while true; do
IDX=$(( RANDOM % ${#PAGES[@]} ))
PAGE="${PAGES[$IDX]}"
curl -s -o /dev/null -w '' \
-A "NPC-Traffic/1.0 (benign)" \
"http://${WEB_HOST}${PAGE}" 2>/dev/null || true
sleep "${INTERVAL}"
done