# Hotfix - Backend Validation & Smartctl

Date : 13 décembre 2025
Version : Backend 1.2.2 + Script 1.2.4

## 🐛 Problèmes Résolus

### Problème #1 : Erreur HTTP 422 - Validation Backend

**Symptômes** :
```
✗ Erreur lors de l'envoi (HTTP 422)
Réponse serveur :
{"detail":[
  {"type":"less_than_equal","loc":["body","results","cpu","score"],"msg":"Input should be less than or equal to 100","input":264.45},
  {"type":"less_than_equal","loc":["body","results","disk","score"],"msg":"Input should be less than or equal to 100","input":104.23},
  {"type":"less_than_equal","loc":["body","results","global_score"],"msg":"Input should be less than or equal to 100","input":139.3}
]}
```

**Cause** :
Le backend Docker n'avait pas été **rebuilt complètement** après la modification des validations Pydantic. Le cache Docker gardait l'ancienne version du fichier `benchmark.py` avec la limite de 100.

**Solution** :
```bash
# Forcer un rebuild complet sans cache
docker compose down backend
docker compose build --no-cache backend
docker compose up -d backend
```

**Vérification** :
```bash
# Vérifier la validation dans le conteneur
docker exec linux_benchtools_backend grep "score.*Field" /app/app/schemas/benchmark.py
# Doit afficher: le=10000 (pas le=100)
```

**Résultat** : ✅ Backend accepte maintenant les scores jusqu'à 10000

---

### Problème #2 : Smartmontools (smartctl) Non Installé

**Symptômes** :
- Le script ne collecte pas les informations SMART des disques
- Pas de température disque
- Pas de statut de santé SMART

**Cause** :
Le paquet `smartmontools` n'était pas dans la liste des dépendances à installer automatiquement.

**Solution** :
Ajout de `smartctl` dans la liste des outils systèmes requis :

**Fichier** : `scripts/bench.sh`

```bash
# Avant
for tool in curl jq lscpu free lsblk ip bc; do
    command -v "$tool" &>/dev/null || missing+=("$tool")
done

# Après
for tool in curl jq lscpu free lsblk ip bc smartctl; do
    command -v "$tool" &>/dev/null || missing+=("$tool")
done
```

Et ajout du mapping de package :

```bash
declare -A pkg_map=(
    [curl]="curl"
    [jq]="jq"
    [lscpu]="util-linux"
    [free]="procps"
    [lsblk]="util-linux"
    [ip]="iproute2"
    [bc]="bc"
    [smartctl]="smartmontools"    # ← Ajouté
    [sysbench]="sysbench"
    [fio]="fio"
    [iperf3]="iperf3"
)
```

**Résultat** : ✅ Le script installe automatiquement `smartmontools` s'il est manquant

---

## 📝 Fichiers Modifiés

| Fichier | Lignes | Type | Description |
|---------|--------|------|-------------|
| `backend/app/schemas/benchmark.py` | 14, 20, 30, 40, 46, 56 | Fix | Validation `le=100` → `le=10000` |
| `scripts/bench.sh` | 111 | Fix | Ajout `smartctl` aux dépendances |
| `scripts/bench.sh` | 149 | Fix | Mapping `smartctl → smartmontools` |

---

## 🧪 Tests

### Test 1 : Vérifier Validation Backend

```bash
# Dans le conteneur backend
docker exec linux_benchtools_backend grep "le=10000" /app/app/schemas/benchmark.py

# Devrait afficher plusieurs lignes avec le=10000
```

### Test 2 : Vérifier Installation Smartctl

```bash
# Exécuter le script
sudo bash scripts/bench.sh

# Si smartctl manque, le script devrait afficher:
# ⚠ Outils systèmes manquants: smartctl
# ► apt-get install...
# ✓ Installation des dépendances OK
```

### Test 3 : Benchmark Complet

```bash
sudo bash scripts/bench.sh

# Devrait réussir avec:
# ✓ CPU: 264.45 events/sec (score: 264.45)  ← Accepté (< 10000)
# ✓ Disque: ... (score: 104.23)              ← Accepté (< 10000)
# ✓ Score global: 139.3                      ← Accepté (< 10000)
# ✅ Benchmark envoyé avec succès
```

---

## 🔍 Leçons Apprises

### Cache Docker
Le cache Docker peut être très persistant. Même avec `docker compose build`, les couches mises en cache peuvent ne pas être reconstruites si Docker pense que rien n'a changé.

**Solution** : Toujours utiliser `--no-cache` pour forcer une reconstruction complète après avoir modifié du code Python dans le backend.

### Vérification Post-Build
Toujours vérifier que les modifications sont bien présentes dans le conteneur après un build :

```bash
docker exec <container> cat /path/to/modified/file | grep "pattern"
```

---

## 📊 Impact

### Backend (1.0.1 → 1.2.2)
- ✅ Accepte les scores jusqu'à 10000
- ✅ Pas de migration DB nécessaire
- ✅ Rétrocompatible (scores < 100 toujours valides)

### Script (1.2.3 → 1.2.4)
- ✅ Installation automatique de smartmontools
- ✅ Collecte des informations SMART disques
- ✅ Températures et statut de santé disques disponibles

---

## 🚀 Déploiement

### Pour Appliquer ces Fixes

```bash
cd /home/gilles/Documents/vscode/serv_benchmark

# 1. Rebuild backend sans cache
docker compose down backend
docker compose build --no-cache backend
docker compose up -d backend

# 2. Vérifier la validation
docker exec linux_benchtools_backend grep "le=10000" /app/app/schemas/benchmark.py

# 3. Tester le script
sudo bash scripts/bench.sh

# Devrait maintenant :
# - Installer smartmontools si manquant
# - Collecter les infos SMART des disques
# - Envoyer le benchmark sans erreur 422
```

---

## ✅ Checklist de Validation

- [x] Backend rebuild sans cache
- [x] Validation `le=10000` confirmée dans conteneur
- [x] Smartctl ajouté aux dépendances
- [x] Mapping smartmontools ajouté
- [x] Backend redémarré
- [ ] Test benchmark complet réussi
- [ ] Infos SMART disques collectées
- [ ] Pas d'erreur HTTP 422

---

**Status** : ✅ Fixes appliqués et déployés
**Prochaine action** : Tester le benchmark complet avec debug réseau

---

## 🔗 Fichiers Liés

- [HOTFIX_SCORE_VALIDATION.md](HOTFIX_SCORE_VALIDATION.md) - Augmentation limite initiale
- [HOTFIX_BENCH_IMPROVEMENTS.md](HOTFIX_BENCH_IMPROVEMENTS.md) - Fixes mémoire et ping
- [DEBUG_NETWORK_BENCH.md](DEBUG_NETWORK_BENCH.md) - Debug réseau en cours
- [bench.sh](scripts/bench.sh) - Script de benchmark client
- [benchmark.py](backend/app/schemas/benchmark.py) - Schémas de validation
