Files
ja4-platform/Makefile
Jacquin Antoine f88b739992 feat(e2e): add distributed E2E test framework with parametric traffic generation
Add run-e2e-test.sh with CLI parameters (--hits, --http-ratio, --dns, --tls,
--src-ips, --keep-analysis, --up) for configurable traffic generation. Traffic
runs from VM endpoints with multiple source IPs (alias IPs on eth0) to produce
distinct sessions for the ML pipeline. Fix curl TLS flags (--tlsv1.2 instead
of --tls-v1-2), skip redundant local verification in distributed mode, and
fix dashboard is_available() cache that never retried after ClickHouse recovery.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 00:09:32 +02:00

322 lines
13 KiB
Makefile
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# =============================================================================
# ja4-platform — Monorepo Makefile
# Service de capture : ja4ebpf (eBPF CO-RE)
# =============================================================================
VERSION ?= $(shell git describe --tags --always 2>/dev/null || echo dev)
.PHONY: help \
build-all test-all rpm-all dist \
build-ja4ebpf test-ja4ebpf rpm-ja4ebpf \
build-bot-detector test-bot-detector \
build-dashboard test-dashboard \
test-all-stacks test-nginx test-nginx-varnish test-hitch-varnish test-apache \
test-matrix \
test-vm-nginx test-vm-all vm-up vm-down vm-ssh \
e2e-up e2e-down test-e2e test-e2e-quick \
reload-prod-logs init-stack import-prod-data init-and-import \
purge-db
.DEFAULT_GOAL := help
help: ## Affiche cette aide
@echo ""
@echo " ja4-platform — Makefile"
@echo " ─────────────────────────────────────────────────────"
@echo ""
@echo " Build"
@echo " make build-all Construit toutes les images Docker"
@echo " make build-ja4ebpf Image ja4ebpf (agent eBPF CO-RE)"
@echo " make build-bot-detector Image bot-detector (détection ML)"
@echo " make build-dashboard Image dashboard (SOC UI)"
@echo ""
@echo " Tests unitaires"
@echo " make test-all Lance tous les tests unitaires"
@echo " make test-ja4ebpf Tests Go ja4ebpf"
@echo " make test-bot-detector Tests Python bot-detector"
@echo " make test-dashboard Tests Python dashboard"
@echo ""
@echo " Tests VM (eBPF sur kernel réel — nécessite 'make vm-up' d'abord)"
@echo " make vm-up Créer la VM Rocky Linux 9 (vagrant up)"
@echo " make vm-up-all Créer les 3 VMs (centos8/rocky9/rocky10)"
@echo " make vm-down Détruire la VM (vagrant destroy)"
@echo " make vm-ssh Connexion SSH à la VM"
@echo " make vm-reprovision Re-provisionner les 3 VMs"
@echo " make test-vm-nginx Test nginx dans la VM Rocky 9"
@echo " make test-vm-apache Test apache dans la VM Rocky 9"
@echo " make test-vm-hitch-varnish Test hitch+varnish dans la VM Rocky 9"
@echo " make test-vm-all Tous les tests (3 stacks) dans la VM Rocky 9"
@echo " make test-vm-centos8 Tous les tests dans la VM CentOS 8"
@echo " make test-vm-rocky10 Tous les tests dans la VM Rocky 10"
@echo " make test-vm-matrix Matrice complète : 3 stacks × 3 distros"
@echo ""
@echo " Tests d'intégration (par stack, Docker — L3/L4/TLS uniquement)"
@echo " make test-all-stacks Toutes les stacks sur Rocky Linux 9"
@echo " make test-apache Stack Apache + ja4ebpf"
@echo " make test-nginx Stack nginx + ja4ebpf"
@echo " make test-nginx-varnish Stack nginx + Varnish + ja4ebpf"
@echo " make test-hitch-varnish Stack hitch + Varnish + ja4ebpf"
@echo ""
@echo " Matrice multi-distro"
@echo " make test-matrix Toutes stacks × el8/el9/el10"
@echo " make test-matrix MATRIX_STACKS=nginx,apache MATRIX_DISTROS=el9,el10"
@echo ""
@echo " Tests E2E distribués (full stack : capture + ML + dashboard)"
@echo " make e2e-up Créer les 4 VMs (endpoints + analysis)"
@echo " make e2e-down Détruire les VMs E2E"
@echo " make test-e2e Test E2E complet"
@echo " make test-e2e-quick Test E2E rapide (trafic réduit)"
@echo ""
@echo " RPM"
@echo " make rpm-all Construit tous les RPMs ja4ebpf (el8/el9/el10)"
@echo " make rpm-ja4ebpf RPMs ja4ebpf (el8, el9, el10)"
@echo " make dist Alias de rpm-all"
@echo ""
@echo " Base de données"
@echo " make init-stack Initialise ClickHouse (schéma complet)"
@echo " make import-prod-data Importe les données prod (date shift)"
@echo " make init-and-import init-stack + import-prod-data"
@echo " make reload-prod-logs Exporte prod → importe en dev"
@echo " make purge-db Supprime et recrée les bases ja4_*"
@echo ""
# ── Cibles agrégées ──────────────────────────────────────────────────────────
build-all: build-ja4ebpf build-bot-detector build-dashboard
@echo "All services built."
test-all: test-ja4ebpf test-bot-detector test-dashboard
@echo "All unit tests completed."
rpm-all: rpm-ja4ebpf
@echo "All RPMs built."
dist: rpm-all
@echo "RPMs disponibles dans services/ja4ebpf/dist/"
# ── ja4ebpf (agent eBPF CO-RE) ───────────────────────────────────────────────
build-ja4ebpf:
docker build \
-f services/ja4ebpf/Dockerfile \
--build-arg BUILD_VERSION=$(VERSION) \
-t ja4-platform/ja4ebpf:latest \
.
test-ja4ebpf:
docker build \
-f services/ja4ebpf/Dockerfile.tests \
-t ja4-platform/ja4ebpf-tests:latest \
.
docker run --rm ja4-platform/ja4ebpf-tests:latest
rpm-ja4ebpf:
# Build multi-distro : el8 (AlmaLinux 8) + el9 (Rocky 9) + el10 (AlmaLinux 10)
# Sortie : services/ja4ebpf/dist/el{8,9,10}/ja4ebpf-*.rpm
docker build \
-f services/ja4ebpf/Dockerfile.package \
--target output \
--output type=local,dest=services/ja4ebpf/dist \
--build-arg BUILD_VERSION=$(VERSION) \
.
@echo ""
@echo "RPMs produits :"
@find services/ja4ebpf/dist -name '*.rpm' | sort | sed 's/^/ /'
# ── bot-detector ─────────────────────────────────────────────────────────────
build-bot-detector:
docker build \
-f services/bot-detector/bot_detector/Dockerfile \
-t ja4-platform/bot-detector:latest \
.
test-bot-detector:
docker build \
-f services/bot-detector/bot_detector/Dockerfile.tests \
-t ja4-platform/bot-detector-tests:latest \
.
docker run --rm ja4-platform/bot-detector-tests:latest
# ── dashboard ────────────────────────────────────────────────────────────────
build-dashboard:
docker build \
-f services/dashboard/Dockerfile \
-t ja4-platform/dashboard:latest \
.
test-dashboard:
docker build \
-f services/dashboard/Dockerfile.tests \
-t ja4-platform/dashboard-tests:latest \
.
docker run --rm ja4-platform/dashboard-tests:latest
# ── Tests d'intégration par stack ────────────────────────────────────────────
test-all-stacks: ## Toutes les stacks sur la distro par défaut (Rocky Linux 9)
cd tests/integration && bash run-all-stacks.sh
test-apache:
cd tests/integration && bash apache/run-tests.sh
test-nginx:
cd tests/integration && bash nginx/run-tests.sh
test-nginx-varnish:
cd tests/integration && bash nginx-varnish/run-tests.sh
test-hitch-varnish:
cd tests/integration && bash hitch-varnish/run-tests.sh
# ── Tests VM (kernel réel, eBPF complet) ─────────────────────────────────────
# Répertoire Vagrantfile
VM_DIR := tests/vm
VMS := centos8 rocky9 rocky10
STACKS := nginx apache hitch-varnish
vm-up: ## Créer la VM Rocky Linux 9 pour les tests eBPF
cd $(VM_DIR) && vagrant up rocky9
vm-up-all: ## Créer les 3 VMs (centos8, rocky9, rocky10)
cd $(VM_DIR) && vagrant up centos8 rocky9 rocky10
vm-down: ## Détruire la VM
cd $(VM_DIR) && vagrant destroy -f
vm-down-all: ## Détruire toutes les VMs
cd $(VM_DIR) && vagrant destroy -f
vm-ssh: ## Connexion SSH à la VM Rocky 9
cd $(VM_DIR) && vagrant ssh rocky9
vm-rebuild-ja4ebpf: ## Recompiler ja4ebpf dans la VM Rocky 9 (après modifications)
cd $(VM_DIR) && vagrant rsync rocky9 && vagrant ssh rocky9 -- \
'export PATH=/usr/local/go/bin:$$PATH && \
cd /ja4-platform/services/ja4ebpf && \
GOWORK=off go generate ./internal/loader/ && \
GOWORK=off CGO_ENABLED=0 go build -o /tmp/ja4ebpf ./cmd/ja4ebpf/ && \
sudo mv /tmp/ja4ebpf /usr/local/bin/ja4ebpf && \
echo "ja4ebpf rebuilt OK"'
# ── Tests VM : cibles par stack ──────────────────────────────────────────────
test-vm-nginx: ## Test nginx dans la VM Rocky 9 (trafic host → VM)
bash tests/vm/run-test-from-host.sh rocky9 nginx
test-vm-apache: ## Test apache dans la VM Rocky 9
bash tests/vm/run-test-from-host.sh rocky9 apache
test-vm-hitch-varnish: ## Test hitch+varnish dans la VM Rocky 9
bash tests/vm/run-test-from-host.sh rocky9 hitch-varnish
test-vm-all: ## Tous les tests (3 stacks) dans la VM Rocky 9
@for stack in $(STACKS); do \
bash tests/vm/run-test-from-host.sh rocky9 $$stack || true; \
done
# ── Tests VM : cibles par distro ─────────────────────────────────────────────
test-vm-centos8: ## Test nginx dans la VM CentOS 8
bash tests/vm/run-test-from-host.sh centos8 nginx
test-vm-rocky10: ## Test nginx dans la VM Rocky 10
bash tests/vm/run-test-from-host.sh rocky10 nginx
# ── Matrice complète : toutes stacks × toutes distros ────────────────────────
test-vm-matrix: ## Toutes stacks × toutes VMs (nginx/apache/hitch-varnish sur centos8/rocky9/rocky10)
@echo "╔══════════════════════════════════════════════╗"
@echo "║ Matrice VM : 3 stacks × 3 distros ║"
@echo "╚══════════════════════════════════════════════╝"
@TOTAL_FAIL=0; \
for vm in $(VMS); do \
for stack in $(STACKS); do \
bash tests/vm/run-test-from-host.sh $$vm $$stack || TOTAL_FAIL=$$((TOTAL_FAIL + 1)); \
done; \
done; \
echo ""; \
if [ "$$TOTAL_FAIL" -eq 0 ]; then \
echo "=== Matrice complète : SUCCÈS ==="; \
else \
echo "=== Matrice : $$TOTAL_FAIL combinaisons échouées ==="; \
exit 1; \
fi
done; \
echo ""; \
if [ "$$TOTAL_FAIL" -eq 0 ]; then \
echo "=== Matrice complète : SUCCÈS ==="; \
else \
echo "=== Matrice : $$TOTAL_FAIL combinaisons échouées ==="; \
exit 1; \
fi
test-vm-all-distros: ## Tests unitaires Go sur les 3 VMs (centos8 + rocky9 + rocky10)
@echo "=== Tests unitaires multi-distro ==="
@for vm in $(VMS); do \
echo ""; \
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
echo " VM: $$vm"; \
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"; \
cd $(CURDIR)/$(VM_DIR) && vagrant rsync $$vm && vagrant ssh $$vm -- \
'export PATH=/usr/local/go/bin:$$PATH && \
cd /ja4-platform/services/ja4ebpf && \
GOWORK=off go generate ./internal/loader/ 2>&1 | tail -2 && \
GOWORK=off CGO_ENABLED=0 go test ./... 2>&1 | tail -20'; \
echo ""; \
done
@echo "=== Tous les tests multi-distro terminés ==="
vm-reprovision: ## Re-provisionner les 3 VMs (installer nouveaux paquets)
@for vm in $(VMS); do \
echo "Re-provision $$vm..."; \
cd $(CURDIR)/$(VM_DIR) && vagrant rsync $$vm && vagrant provision $$vm; \
done
# ── Matrice multi-distro ─────────────────────────────────────────────────────
test-matrix: ## Toutes stacks × el8 + el9 + el10
cd tests/integration && bash run-distro-matrix.sh \
$${MATRIX_STACKS:+--stacks=$${MATRIX_STACKS}} \
$${MATRIX_DISTROS:+--distros=$${MATRIX_DISTROS}}
# ── Tests E2E distribués (full stack) ──────────────────────────────────────
E2E_VMS := centos8 rocky9 rocky10 analysis
e2e-up: ## Créer les 4 VMs pour le test E2E distribué
cd $(VM_DIR) && vagrant up $(E2E_VMS)
e2e-down: ## Détruire les VMs E2E
cd $(VM_DIR) && vagrant destroy -f $(E2E_VMS)
e2e-rsync: ## Synchroniser les fichiers vers toutes les VMs E2E
@for vm in $(E2E_VMS); do \
cd $(CURDIR)/$(VM_DIR) && vagrant rsync $$vm; \
done
test-e2e: ## Test E2E complet (capture + ML + dashboard)
bash tests/vm/run-e2e-test.sh
test-e2e-quick: ## Test E2E rapide (trafic réduit, 1 cycle bot-detector)
TRAFFIC_COUNT=100 bash tests/vm/run-e2e-test.sh
# ── Base de données ───────────────────────────────────────────────────────────
reload-prod-logs:
./scripts/reload-prod-logs.sh
init-stack:
./scripts/init-stack.sh
import-prod-data:
./scripts/import-prod-data.sh
init-and-import:
./scripts/init-stack.sh --import-prod
purge-db:
./scripts/init-stack.sh --reset