# DataShield - Notes pour Claude

## Description du projet

Gestionnaire automatisé de blocklist IPv4 pour le pare-feu **PF (Packet Filter)** de FreeBSD.

- **Version** : 1.8.0
- **Langage** : Shell POSIX (`sh`)
- **Dépendances** : `pfctl`, `fetch`, `ipcalc`
- **Déploiement cible** : `/usr/local/sbin/update_datashield.sh`
- **Cron** : `0 */6 * * * root /usr/local/sbin/update_datashield.sh --cron`

## Structure

```
/home/algalord/www/datashield/
├── update_datashield.sh          # Script principal
└── pf/
    ├── datashield_blocklist.txt  # ~75k IPs bloquées (~1 MB)
    └── datashield_whitelist.txt  # IPs/subnets autorisées
```

## Flux d'exécution

```
5 miroirs (GitHub, GitLab, jsDelivr, BitBucket, Codeberg) — fallback automatique
    ↓ fetch HTTPS (premier miroir disponible)
Validation (10k–200k IPs)
    ↓ application whitelist (IPs + CIDR, une seule passe grep)
Blocklist filtrée
    ↓ installation atomique + backup
/etc/pf/datashield_blocklist.txt
    ↓ rechargement table PF (pfctl -T replace)
Pare-feu actif
```

## Configuration (hardcodée dans le script)

- **PF table** : `datashield`
- **Répertoire** : `/etc/pf/`
- **Log** : `/var/log/datashield_update.log`
- **Rotation logs** : 500 lignes max → `.old`
- **Validation** : Entre 10 000 et 200 000 IPs
- **Alerte** : Réduction >50% de la liste
- **CIDR_MIN_PREFIX** : 16 (refus des subnets plus larges que /16)

## Usage

```sh
# Mode interactif — output complet (tests manuels)
/usr/local/sbin/update_datashield.sh

# Mode cron — silencieux sauf WARN/ERROR
/usr/local/sbin/update_datashield.sh --cron
```

## Points FreeBSD spécifiques

- `grep -c` retourne exit code 1 si aucune correspondance → utiliser `grep | wc -l | tr -d ' '`
- `pfctl -T replace` affiche "no changes." sur stdout → rediriger vers `/dev/null`
- `net.pf.request_maxcount` doit être augmenté à 200000 dans `/etc/sysctl.conf` pour charger ~75k IPs
- `fetch` à la place de `curl`/`wget` pour les téléchargements

## IMPORTANT : Prérequis système

Le sysctl suivant doit être augmenté pour que PF accepte ~75k IPs dans une table.

Appliquer immédiatement :
```sh
sysctl net.pf.request_maxcount=200000
```

Rendre permanent dans `/etc/sysctl.conf` :
```
net.pf.request_maxcount=200000
```

Sans ça, `pfctl -f /etc/pf.conf` échoue avec :
```
too many elements. Consider increasing net.pf.request_maxcount.
```

## IMPORTANT : Synchronisation

Ce projet ne tourne PAS sur le serveur live. Après chaque modification du script, il faut synchroniser :

```sh
sh ~/sync.sh datashield
```
