Cybersecurity-Projects/PROJECTS/advanced/haskell-reverse-proxy/justfile

302 lines
7.1 KiB
Makefile

# =============================================================================
# AngelaMos | 2026
# Justfile - Aenebris (Haskell Reverse Proxy)
# =============================================================================
set export
set shell := ["bash", "-uc"]
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
project := file_name(justfile_directory())
version := `git describe --tags --always 2>/dev/null || echo "dev"`
default_config := "examples/config.yaml"
log_file := "aenebris.log"
backend_log := "backend.log"
# =============================================================================
# Default
# =============================================================================
default:
@just --list --unsorted
# =============================================================================
# Build
# =============================================================================
[group('build')]
build:
stack build
[group('build')]
build-fast:
stack build --fast
[group('build')]
build-watch:
stack build --fast --file-watch
[group('build')]
build-pedantic:
stack build --pedantic
[group('build')]
deps:
stack build --only-dependencies
[group('build')]
install:
stack install
[group('build')]
ghci *ARGS:
stack ghci {{ARGS}}
# =============================================================================
# Run (Proxy Lifecycle)
# =============================================================================
[group('run')]
run config=default_config:
stack run -- {{config}}
[group('run')]
run-bg config=default_config:
@echo "Starting Aenebris with {{config}}..."
@nohup stack run -- {{config}} > {{log_file}} 2>&1 &
@sleep 2
@echo "PID: $(pgrep -f '[a]enebris examples' | head -1)"
@echo "Use 'just logs' to follow output, 'just stop' to halt"
[group('run')]
https:
stack run -- examples/config-https.yaml
[group('run')]
sni:
stack run -- examples/config-sni.yaml
[group('run')]
lb:
stack run -- examples/config-loadbalancing.yaml
[group('run')]
advanced:
stack run -- examples/config-advanced.yaml
[group('run')]
ws-sse:
stack run -- examples/websockets/config_ws_sse.yaml
[group('run')]
stop:
@pkill -f '[a]enebris examples' && echo "Proxy stopped" || echo "Proxy not running"
[group('run')]
restart config=default_config:
@just stop
@sleep 1
@just run-bg {{config}}
[group('run')]
logs:
tail -f {{log_file}}
[group('run')]
status:
@pgrep -af '[a]enebris examples' || echo "Proxy not running"
# =============================================================================
# Backends (Python Test Servers)
# =============================================================================
[group('backend')]
backend:
python3 examples/test_backend.py
[group('backend')]
backend-bg:
@nohup python3 examples/test_backend.py > {{backend_log}} 2>&1 &
@sleep 1
@echo "Backend on :8000 (PID: $(pgrep -f '[t]est_backend.py' | head -1))"
[group('backend')]
backends:
@bash examples/start_backends.sh
[group('backend')]
ws-server:
python3 examples/websockets/ws_echo_server.py
[group('backend')]
sse-server:
python3 examples/websockets/sse_server.py
[group('backend')]
kill-backends:
-@pkill -f '[t]est_backend\.py'
-@pkill -f '[t]est_backend_multi\.py'
-@pkill -f '[w]s_echo_server\.py'
-@pkill -f '[s]se_server\.py'
@echo "Test backends stopped"
[group('backend')]
kill-all:
@just stop
@just kill-backends
# =============================================================================
# Tests (HSpec + Integration)
# =============================================================================
[group('test')]
test *ARGS:
stack test {{ARGS}}
[group('test')]
test-fast:
stack test --fast
[group('test')]
test-watch:
stack test --fast --file-watch
[group('test')]
test-match PATTERN:
stack test --test-arguments='--match="{{PATTERN}}"'
[group('test')]
test-cov:
stack test --coverage
[group('test')]
test-list:
stack test --test-arguments='--dry-run'
[group('test')]
test-config:
@just test-match "Config"
[group('test')]
test-lb:
@just test-match "LoadBalancer"
[group('test')]
test-backend-unit:
@just test-match "Backend"
[group('test')]
test-security:
@just test-match "Security headers"
[group('test')]
test-redirect:
@just test-match "HTTPS redirect"
[group('test')]
test-ratelimit:
@just test-match "RateLimit"
[group('test')]
test-ddos:
stack test --test-arguments='--match="EarlyData" --match="IPJail" --match="MemoryShed" --match="ConnLimit"'
[group('test')]
test-ja4h:
@just test-match "JA4H fingerprint"
[group('test')]
test-waf:
@just test-match "WAF"
[group('test')]
test-honeypot:
@just test-match "Honeypot"
[group('test')]
test-geo:
@just test-match "Geo/ASN"
[group('test')]
test-ml:
stack test --test-arguments='--match="ML.Features" --match="ML.Model"'
[group('test')]
ws-test host='localhost' port='8081':
python3 examples/websockets/test_client.py {{host}} {{port}}
# =============================================================================
# TLS / Certificates
# =============================================================================
[group('tls')]
gen-certs:
bash examples/generate-test-certs.sh
[group('tls')]
clean-certs:
-rm -rf examples/certs
@echo "Test certs removed (regenerate with 'just gen-certs')"
[group('tls')]
tls-headers:
curl -kI https://localhost:8443/
[group('tls')]
tls13:
openssl s_client -connect localhost:8443 -tls1_3 < /dev/null 2>&1 | grep -E "Protocol|Cipher"
[group('tls')]
sni-curl domain='api.localhost':
curl -k -H "Host: {{domain}}" -v https://localhost:8443/
# =============================================================================
# CI / Quality
# =============================================================================
[group('ci')]
ci: build test
[group('ci')]
check: build
# =============================================================================
# Setup
# =============================================================================
[group('setup')]
setup:
@echo "First-time setup: building deps + generating test certs..."
stack build --only-dependencies
bash examples/generate-test-certs.sh
@echo "Setup complete - try 'just backends' then 'just run'"
# =============================================================================
# Utilities
# =============================================================================
[group('util')]
info:
@echo "Project: {{project}}"
@echo "Version: {{version}}"
@echo "OS: {{os()}} ({{arch()}})"
@stack --version 2>/dev/null || true
@ghc --version 2>/dev/null || true
[group('util')]
clean:
stack clean
-rm -f {{log_file}} {{backend_log}} nohup.out
-rm -f /tmp/backend-8000.log /tmp/backend-8001.log /tmp/backend-8002.log
@echo "Build artifacts and logs cleaned"
[group('util')]
[confirm("Remove .stack-work, dist-newstyle, certs, and all logs?")]
nuke:
-stack purge
-rm -rf .stack-work dist-newstyle
-rm -rf examples/certs
-rm -f {{log_file}} {{backend_log}} nohup.out
-rm -f /tmp/backend-*.log
@echo "Nuke complete"