Commit Graph

1562 Commits

Author SHA1 Message Date
cd6af3edff feat(secubox-mesh): Add OpenWrt mesh daemon with topology management
Port secuboxd from Debian/Go to OpenWrt shell implementation:
- secuboxd daemon with Unix control socket at /var/run/secuboxd/topo.sock
- secuboxctl CLI compatible with Debian version interface
- Mesh libraries: topology, discovery, election, telemetry, control
- Mesh gate election with weighted scoring (uptime, peers, CPU, memory, role)
- mDNS service discovery (_secubox._udp.local) via umdns
- DID integration via mirrornet identity library
- RPCD handler with 11 ubus methods for LuCI integration
- procd init script with respawn and network triggers
- UCI config sections: mesh, node, telemetry, discovery

Fixes subprocess state access for socat handler by saving daemon state to file.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-26 06:27:45 +01:00
707142c6bb fix(crowdsec-dashboard): Fix JSON parsing bug in overview cache
grep -c returns exit code 1 when count is 0, which triggered
the `|| echo 0` fallback to also output "0", resulting in:
  "waf_threats_today":0
  0,

This broke JSON parsing and caused the dashboard to show
CrowdSec as "STOPPED" even when running.

Fix: Use `|| :` (no-op) and set defaults with `: "${var:=0}"`

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 16:16:32 +01:00
1edf7ca7c0 docs: Update HISTORY with wiki translations and meta-package
- Added wiki internationalization (French + Chinese) for all 17 pages
- Documented secubox-full meta-package with tiered bundles
- Documented CI updates for default secubox-core inclusion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 14:33:06 +01:00
ae3b2ab3b5 feat(packages): Add secubox-full meta-package and fix secubox-core
- Add p2p-mesh.sh to secubox-core install (was missing, breaking master-link)
- Create secubox-full meta-package with tiered bundles:
  - secubox-core-bundle: Essential components
  - secubox-security-bundle: WAF/IDS/threat detection
  - secubox-services-bundle: HAProxy/DNS/web services
  - secubox-luci-bundle: All LuCI apps
  - secubox-full: Everything
- Update VM and firmware workflows to include secubox-core by default
- Add secubox-p2p, secubox-master-link, secubox-identity to default installs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 13:46:13 +01:00
be27d758b0 docs: Update HISTORY with metrics OpenWrt compatibility fix
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 11:44:33 +01:00
434e501dae fix(metrics): Use date -r for OpenWrt file mtime and fix grep -c double output
- Replace stat -c %Y with date -r for BusyBox compatibility (stat not available)
- Fix get_cache_age() to properly return early when cache file missing
- Fix grep -c || echo 0 pattern that caused "invalid number '0\n0'" errors
- Add proper numeric defaults using : "${var:=0}" pattern
- Add freshness metadata (_freshness) with age, timestamp, and fresh boolean

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 11:40:04 +01:00
9f24696ddd docs: Update HISTORY with freshness indicators feature
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 11:05:24 +01:00
b99dabaca9 feat(ui): Add progressive freshness indicators to dashboards
Add visible "Updated Xs ago" timestamps and freshness indicators to
make cached stats look more alive and help users know data currency.

Backend changes:
- luci.metrics: Add _freshness metadata (age, fresh, timestamp_epoch)
  to overview, waf_stats, and connections responses
- luci.crowdsec-dashboard: Add _freshness metadata to get_overview
  response using sed injection into cached JSON

Frontend changes:
- metrics/dashboard.js: Display freshness indicator (green/yellow/red)
  in header, animate value changes with flash effect
- crowdsec-dashboard/overview.js: Display freshness indicator next to
  running badge, update on poll

Shared utilities (kiss-theme.js):
- formatAge(seconds): Format "Xs ago", "Xm ago", "Xh ago"
- getFreshnessClass(age): Return fresh/recent/stale based on age
- getFreshnessColor(class): Return #00c853/#ff9800/#f44336
- freshnessIndicator(age, id): Create indicator DOM element
- updateFreshness(age, id): Update existing indicator

Freshness thresholds:
- Fresh (green): < 15s for metrics, < 30s for CrowdSec
- Recent (yellow): < 45s for metrics, < 90s for CrowdSec
- Stale (red): > threshold

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 11:05:01 +01:00
355c050700 fix(seed): Add opkg lock wait before install retries
Wait for /var/lock/opkg.lock to be released before retrying
package installation to avoid "Resource temporarily unavailable" errors.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:56:23 +01:00
33c413c893 fix(seed): Add signature check disable and retry logic for GitHub Pages
- Disable opkg signature checking for unsigned SecuBox feeds
- Add retry logic (3 attempts) for repository validation
- Add retry logic (3 attempts) for opkg update
- Add retry logic (3 attempts) for package installation
- Increase wget timeout from 10s to 15s
- Update slipstream firstboot to also disable signature checking
- Fix CORE_PACKAGES to use packages that actually exist

This fixes the "Unknown package" errors when installing from
repo.secubox.in caused by opkg discarding unsigned package lists.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:55:12 +01:00
f9d1fee08e fix(ci): Update publish workflow to use individual ipk files
The release contains individual ipk files, not architecture-specific
tarballs. Update the workflow to:

- Download all *.ipk files from the release
- Copy packages to all architecture directories (most SecuBox packages
  are architecture-independent LuCI/shell packages)
- Simplify the repository structure creation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:33:13 +01:00
f447f62b13 fix(scripts): Fix seed script repo detection and error handling
- Send log messages to stderr in find_working_repo() to avoid
  polluting the URL output captured by configure_repo()
- Actually download and validate Packages.gz file content instead
  of just checking if server responds (spider check)
- Handle find_working_repo() failure gracefully with || true
- Clean up old feed entries properly when reconfiguring

Fixes the issue where log messages were being written to
customfeeds.conf along with the URL.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:31:06 +01:00
7d0f47f465 feat(scripts): Add SecuBox seed and slipstream scripts for auto-install
Add comprehensive scripts for bootstrapping SecuBox on fresh OpenWrt:

- secubox-seed.sh: Bootstrap script for fresh installations
  - Auto-detects architecture (x86_64, aarch64, armv7l)
  - Configures SecuBox repository with fallback mechanisms
  - Installation profiles: minimal, standard, full
  - Graceful handling when repo.secubox.in is unavailable

- secubox-slipstream.sh: Bake SecuBox config into images during build
  - Pre-configures repository feeds in rootfs
  - Installs seed script and first-boot setup
  - Adds SecuBox branding (banner, release info)
  - Works with rootfs directories or image files

Update GitHub Actions workflows:
- build-secubox-vm.yml: Add slipstream step for x86_64 VMs
- build-secubox-images.yml: Add slipstream step for GlobalScale devices

Images now include:
- Pre-configured SecuBox repository (/etc/opkg/customfeeds.conf)
- Seed script (/usr/sbin/secubox-seed)
- First-boot auto-setup script
- SecuBox banner

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:23:05 +01:00
ccfb58124c docs: Add trilingual documentation (French and Chinese translations)
Add complete French (fr) and Chinese (zh) translations for all documentation:

- Root files: README, CHANGELOG, SECURITY, BETA-RELEASE
- docs/: All 16 core documentation files
- DOCS/: All 19 deep-dive documents including embedded/ and archive/
- package/secubox/: All 123+ package READMEs
- Misc: secubox-tools/, scripts/, EXAMPLES/, config-backups/, streamlit-apps/

Total: 346 translation files created

Each file includes language switcher links for easy navigation between
English, French, and Chinese versions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:00:18 +01:00
66b504dc07 fix(ci): Ignore tar race condition in publish step
The all-architectures tar archive may change during creation due to
other files being written. This causes tar to exit with code 1 even
though the archive is created successfully.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 23:01:36 +01:00
e15248afea fix(ci): Add python3-pyelftools for u-boot toolchain build
The rockchip-armv8 toolchain build fails because u-boot requires
the Python3 elftools module. Adding python3-pyelftools to the
toolchain job dependencies.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 19:19:15 +01:00
a61b0fcda8 feat(haproxy): Add Sync WAF Routes button and fix LuCI backend routing
- Add "Sync WAF Routes" button to HAProxy vhosts page in LuCI
- Add sync_mitmproxy_routes RPC method to HAProxy RPCD backend
- Fix mitmproxyctl and secubox-route to handle LuCI backends (luci, luci_default, luci_control)
- Remove outdated port 8081 skip filter in route sync that prevented LuCI routes
- These changes allow vhosts with original_backend='luci' to be properly
  routed through the WAF

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 19:15:51 +01:00
64a12a65ad fix(droplet): Fix BusyBox tr bug in name sanitization too
The buggy tr '[:upper:]' '[:lower:]' was also used for sanitizing
site names, causing 'ziptest' to become 'ziwtest'. Use awk tolower()
for all lowercase conversions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 11:19:17 +01:00
afaa9c05ef feat(droplet): Add multi-file upload support
- Allow selecting and uploading multiple files at once
- Each file gets its own name input field
- Files are processed sequentially with progress indicator
- Errors are collected and displayed at the end

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 11:06:11 +01:00
1a1ca1794a fix(droplet): Use awk for lowercase instead of buggy BusyBox tr
BusyBox tr '[:upper:]' '[:lower:]' has a bug that converts 'p' to 'w',
causing .zip to be detected as .ziw. Use awk tolower() instead.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 11:04:05 +01:00
b76131ed1d fix(droplet): Strip CR/LF from file extension detection
Windows uploads may include carriage returns in filenames, causing
.zip to be detected as .ziw. Strip \r\n from extension string.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 10:57:22 +01:00
a905b885fc chore: Update to OpenWrt 24.10.6
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 09:07:45 +01:00
c79b3cb27b feat(repo): Add unified repo-deploy.sh and multi-arch support
- Add repo-deploy.sh script for staging and deploying packages
- Replicate _all.ipk packages to all 6 architectures automatically
- Add "Refresh Indexes" button to LuCI dashboard for local deployments
- Add RPCD refresh method to regenerate Packages indexes on-device
- Support architectures: aarch64_cortex-a72, aarch64_cortex-a53,
  aarch64_generic, x86_64, mips_24kc, mipsel_24kc

Usage:
  ./secubox-tools/repo-deploy.sh stage --clean
  ./secubox-tools/repo-deploy.sh deploy root@192.168.255.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 08:03:08 +01:00
d92b3360ea feat(repo): Add unified repo-deploy.sh and multi-arch support
- Add repo-deploy.sh script for staging and deploying packages
- Replicate _all.ipk packages to all 6 architectures automatically
- Add "Refresh Indexes" button to LuCI dashboard for local deployments
- Add RPCD refresh method to regenerate Packages indexes on-device
- Support architectures: aarch64_cortex-a72, aarch64_cortex-a53,
  aarch64_generic, x86_64, mips_24kc, mipsel_24kc

Usage:
  ./secubox-tools/repo-deploy.sh stage --clean
  ./secubox-tools/repo-deploy.sh deploy root@192.168.255.1

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-19 07:48:59 +01:00
9ddf5a4e0b fix(build): Fix 16 failed packages with missing Build/Compile and URL config
- Add missing 'define Build/Compile' to script-only packages:
  - secubox-app-config-vault
  - secubox-app-gotosocial
  - secubox-app-ipblocklist
  - secubox-app-ksmbd
  - secubox-app-qbittorrent
  - secubox-app-talk-hpb
  - secubox-app-vhost-manager
  - secubox-app-webtorrent
  - secubox-avatar-tap
  - secubox-core-users
  - secubox-dpi-dual
  - secubox-app-backup

- Fix luci-app-interceptor: Add missing BuildPackage call
- Fix luci-app-master-link: Correct RPCD handler filename (underscore → dash)
- Fix luci-app-config-vault: Add Build/Compile definition

- Create secubox-console Makefile (new package for remote management)
- Create secubox-app-backup cron job file

- Update secubox-app-repo: Change feed URLs from local IP (192.168.255.1:8888)
  to repo.secubox.in domain with HTTPS and proper src/gz format

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 18:01:51 +01:00
dd18e5c4aa fix(repo): Fix BusyBox ash compatibility in repo-sync
Wrap for loop with output redirection in subshell for
BusyBox ash compatibility when generating Packages index.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 16:43:27 +01:00
a15cdfc823 fix(ci): Sync GHA build workflow with local-build.sh methodology
- Split builds into SDK (PKGARCH:=all) and Toolchain (native binaries)
- Mirror OPENWRT_ONLY_PACKAGES list from local-build.sh
- Add all architectures: x86-64, aarch64-cortex-a72, aarch64-cortex-a53,
  aarch64-generic, rockchip-armv8, mips-24kc, mipsel-24kc
- SDK builds: LuCI apps, shell scripts, configs
- Toolchain builds: Go (crowdsec), C++ (netifyd, ndpid)
- Combine artifacts per architecture with checksums
- Create GitHub releases on tags

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:59:05 +01:00
21a8f06058 chore(secubox-app-bonus): Rebuild local feed with repo packages
- Add secubox-app-repo and luci-app-repo to local feed
- Regenerate Packages index
- Update all embedded packages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:54:11 +01:00
6d2ee8ae8f fix(repo-sync): Fix shell syntax error in for loop
Remove invalid 2>/dev/null redirection from for loop header

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:33:06 +01:00
86d6889285 fix(repo): Add usign package signing and fix ACL conflict
- Add usign dependency for package signing
- Sign Packages files after generation in repo-sync
- Generate signing keys automatically if not present
- Remove duplicate ACL file (now only in luci-app-repo)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:29:48 +01:00
088b6e749f fix(luci-app-repo): Add proper Package definition with TITLE field
- Add Package/luci-app-repo section with required fields
- Add Build/Compile empty target
- Add package description
- Fix build failure in SDK

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 10:41:36 +01:00
c152934bf1 fix(repo): Add postinst script to configure opkg feeds automatically
- Auto-create repo directories on install
- Detect device architecture and configure customfeeds.conf
- Add prerm script to cleanup on uninstall
- Points opkg to local repo at 192.168.255.1:8888

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 10:33:50 +01:00
9cd59b77ba feat(repo): Add secubox-app-repo and luci-app-repo packages
Backend package (secubox-app-repo):
- repoctl CLI for managing local package repository
- repo-sync script to download packages from GitHub releases
- uhttpd-based server on port 8888
- UCI configuration at /etc/config/repo
- RPCD handler for LuCI integration
- Auto-sync cron support (configurable interval)

Frontend package (luci-app-repo):
- Dashboard showing repository status and package counts
- Sync button to trigger package downloads
- Log viewer for sync operations
- Usage instructions for opkg configuration

Supported architectures:
- x86_64, aarch64_cortex-a72, aarch64_generic
- mips_24kc, mipsel_24kc

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 10:21:23 +01:00
276685f109 feat(repo): Add package repository at repo.secubox.in
- Fix preseed URLs from non-existent repo.secubox.org to repo.secubox.in
- Make feed URLs architecture-aware (x86_64, aarch64_cortex-a72, etc.)
- Add publish-package-repo.yml workflow for GitHub Pages deployment
- Workflow downloads release artifacts, generates opkg Packages index
- Supports all SecuBox architectures with proper opkg feed structure

Package repository structure:
- https://repo.secubox.in/packages/{arch}/ - Core SecuBox packages
- https://repo.secubox.in/luci/{arch}/ - LuCI apps
- https://repo.secubox.in/catalog/ - Repository metadata

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 09:10:01 +01:00
89e6db8631 chore(vm): Disable ARM64 Generic target (package repo issues) 2026-03-18 08:35:29 +01:00
19ee3b761d fix(vm): Use matrix target path for ARM image listing 2026-03-18 08:09:31 +01:00
eb46c7128b fix(vm): Fix ARM builds by using arch-specific packages
- Remove docker/bind-server from ARM (not available)
- Use simpler package set for ARM targets
- Fix rockchip profile name
- Keep x86-64 with full package set

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 21:17:46 +01:00
9c4d8dcdfd feat(vm): Add ARM64 architectures to C3Box VM builds
- Add aarch64-generic (QEMU/Proxmox ARM)
- Add Raspberry Pi 4/400/CM4 (bcm27xx/bcm2711)
- Add Rockchip ARM64 (NanoPi R4S/R5S/R6S)
- Download arch-specific prebuilt packages
- Add architecture-specific kernel modules
- Create local build script with same logic
- Handle different image formats per arch

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 20:44:40 +01:00
2c2d11423c feat(vm): Include full SecuBox package suite in C3Box VM
- Download prebuilt packages from release artifacts
- Include 101+ SecuBox modules matching c3box.local production
- Preseed SecuBox core config (appstore, security, diagnostics)
- Configure network: 192.168.200.1 (LAN), DHCP (WAN)
- Include master-link mesh and P2P hub components
- Add fallback install script for post-boot installation
- Increase default disk to 8GB for full suite
- Update RAM recommendation to 2GB minimum

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 20:05:40 +01:00
2482f76e52 fix(ci): Use explicit version input for C3Box VM naming
- Add 'version' input parameter (default: v1.0.0-beta)
- Use C3BOX_VERSION env var for consistent naming
- Artifacts now named: c3box-vm-{version}-{arch}.{format}
- Fix: manual triggers now use correct version in filenames

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 19:36:16 +01:00
5da21f29e4 feat(ci): Update C3Box preseed for devel/beta test config
- LAN IP changed to 192.168.200.1 (test subnet)
- WAN (br-wan) configured as DHCP client
- Updated banner, docs, and release notes with new IP
- Ready for SecuBox devel beta testing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 19:12:08 +01:00
4fa322d1fd feat(ci): Rebrand VM appliance to C3Box
- Rename workflow to "Build C3Box VM Appliance"
- Update hostname to 'c3box'
- New ASCII banner with C3Box branding
- Update artifact names: c3box-vm-{version}-{arch}
- Update all documentation and release notes
- Config files now in /etc/c3box/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 18:54:46 +01:00
d8f8d04110 fix(ci): Look for SecuBox packages in package/secubox/
The luci-app-* packages are in package/secubox/, not at the repo root.
Updated the workflow to copy packages from the correct location.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 18:02:04 +01:00
4b72126784 fix(ci): Handle gunzip trailing garbage warning in VM build
OpenWrt firmware images contain trailing data that gunzip reports
as "trailing garbage" with exit code 2. This is normal and the
extracted image is valid. The fix ignores the warning while still
checking that extraction produced output.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 17:47:36 +01:00
b2af68ac9a feat(ci): Add multi-platform firmware and VM appliance workflows
New workflows using OpenWrt Image Builder for fast builds:

build-firmware-imagebuilder.yml:
- 16+ devices: x86-64, RPi 3/4/5, NanoPi R4S/R5S/R6S, GL.iNet, Linksys, NETGEAR, Ubiquiti, GlobalScale
- Uses Image Builder (much faster than source compilation)
- Pre-installs SecuBox packages
- Preseed auto-configuration
- Configurable root filesystem size (256MB-2GB)

build-vm-appliance.yml:
- VM images in multiple formats: VMDK, VDI, QCOW2
- EFI and BIOS boot options
- Auto-resize filesystem on first boot
- Configurable disk size (1-8GB)
- Ready for VMware, VirtualBox, Proxmox

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 17:34:26 +01:00
5b3ee567c5 feat(ci): Add x86_64 VM firmware build workflow
- New build-secubox-vm.yml for ready-to-use SecuBox VM images
- Uses OpenWrt 24.10.5 (latest stable release)
- Builds VMDK, VDI, QCOW2 formats for all VM platforms
- Includes all SecuBox LuCI packages pre-installed
- Docker support enabled (dockerd, docker-compose)
- Virtio drivers and QEMU guest tools for KVM/Proxmox
- Configurable rootfs size (512MB-4GB)
- Manual dispatch + automatic on version tags

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 14:00:34 +01:00
1edb8c880c fix(ci): Handle luci.mk auto-generated PKG_NAME
- luci.mk auto-sets PKG_NAME from directory name
- Skip PKG_NAME check for packages using luci.mk
- PKG_VERSION/PKG_RELEASE are recommended for luci.mk packages
- PKG_LICENSE remains recommended for all packages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 13:00:34 +01:00
49a6090dcf fix(ci): Make PKG_LICENSE warning instead of error
- PKG_LICENSE is now recommended, not required
- Required: PKG_NAME, PKG_VERSION, PKG_RELEASE
- Warnings are reported but don't fail the build
- Also updated tracking docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:48:12 +01:00
cb59c58617 docs: Update tracking for Metrics Dashboard v2 + caching
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:43:48 +01:00
a53d2b1d63 fix(metrics): Get WAF blocked count from CrowdSec mitmproxy decisions
- WAF blocked now counts mitmproxy scenario decisions (1031 blocks)
- Removed waf_threats field (redundant with waf_blocked)
- Fixed dashboard to show 3 WAF stats: Bans, Alerts, Blocked

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:41:14 +01:00