# Mises à jour Frontend - Linux BenchTools

Date: 2025-12-07

## Vue d'ensemble

Le frontend a été mis à jour pour afficher les nouvelles données collectées par le script bench.sh v1.1.0, notamment :
- Statistiques RAM détaillées (utilisée, libre, partagée)
- Informations réseau complètes (Wake-on-LAN, vitesse)
- Résultats des tests iperf3 (upload, download, ping)

## Fichiers modifiés

### 1. `frontend/device_detail.html`

**Ajout** d'une nouvelle section "Informations Réseau Détaillées" après la section "Dernier Benchmark" (lignes 67-75) :

```html
<!-- Network Details -->
<div class="card">
  <div class="card-header">🌐 Informations Réseau Détaillées</div>
  <div class="card-body">
    <div id="networkDetails">
      <div class="loading">Chargement...</div>
    </div>
  </div>
</div>
```

### 2. `frontend/js/device_detail.js`

#### Modifications apportées :

**a) Appel de la nouvelle fonction dans `loadDeviceDetail()` (ligne 39)**
```javascript
renderNetworkDetails();
```

**b) Affichage RAM détaillé dans `renderHardwareSummary()` (lignes 89-105)**

Ajout du calcul et de l'affichage des statistiques RAM :
- Pourcentage d'utilisation
- RAM utilisée en GB
- RAM libre en GB
- RAM partagée en GB (si disponible, ex: mémoire vidéo partagée)

```javascript
// RAM usage info
const ramTotalGB = Math.round((snapshot.ram_total_mb || 0) / 1024);
const ramUsedMB = snapshot.ram_used_mb || 0;
const ramFreeMB = snapshot.ram_free_mb || 0;
const ramSharedMB = snapshot.ram_shared_mb || 0;

let ramValue = `${ramTotalGB} GB`;
if (ramUsedMB > 0 || ramFreeMB > 0) {
  const usagePercent = ramTotalGB > 0 ? Math.round((ramUsedMB / (snapshot.ram_total_mb || 1)) * 100) : 0;
  ramValue = `${ramTotalGB} GB (${usagePercent}% utilisé)<br><small>Utilisée: ${Math.round(ramUsedMB / 1024)}GB • Libre: ${Math.round(ramFreeMB / 1024)}GB`;
  if (ramSharedMB > 0) {
    ramValue += ` • Partagée: ${Math.round(ramSharedMB / 1024)}GB`;
  }
  ramValue += `<br>${snapshot.ram_slots_used || '?'} / ${snapshot.ram_slots_total || '?'} slots</small>`;
}
```

**c) Nouvelle fonction `renderNetworkDetails()` (lignes 163-281)**

Cette fonction affiche :
1. **Interfaces réseau** :
   - Type (ethernet/wifi) avec icône appropriée (🔌/📡)
   - Badge Wake-on-LAN (WoL ✓ ou WoL ✗)
   - Adresse IP
   - Adresse MAC
   - Vitesse en Mbps
   - Driver (si disponible)

2. **Résultats benchmark réseau (iperf3)** :
   - Upload en Mbps avec flèche ↑
   - Download en Mbps avec flèche ↓
   - Ping moyen en ms
   - Score réseau

```javascript
// Render network details
function renderNetworkDetails() {
  const container = document.getElementById('networkDetails');
  const snapshot = currentDevice.last_hardware_snapshot;
  const bench = currentDevice.last_benchmark;

  // Parse network interfaces JSON
  const interfaces = JSON.parse(snapshot.network_interfaces_json);

  // Display each interface with WoL badge
  interfaces.forEach(iface => {
    const typeIcon = iface.type === 'ethernet' ? '🔌' : '📡';
    const wolBadge = iface.wake_on_lan === true
      ? '<span class="badge badge-success">WoL ✓</span>'
      : '<span class="badge badge-muted">WoL ✗</span>';
    // ... affichage des détails
  });

  // Display iperf3 results if available
  if (bench && bench.network_results_json) {
    const netResults = JSON.parse(bench.network_results_json);
    // Affichage upload_mbps, download_mbps, ping_ms, score
  }
}
```

## Backend - Modifications associées

### 1. Modèle Benchmark (`backend/app/models/benchmark.py`)

**Ajout** du champ `network_results_json` (ligne 33) :
```python
network_results_json = Column(Text, nullable=True)  # Network benchmark details (iperf3)
```

### 2. API Benchmark (`backend/app/api/benchmark.py`)

**Ajout** de l'extraction et de la sauvegarde des résultats réseau (lignes 134-142, 158) :
```python
# Extract network results for easier frontend access
network_results = None
if results.network:
    network_results = {
        "upload_mbps": results.network.upload_mbps,
        "download_mbps": results.network.download_mbps,
        "ping_ms": results.network.ping_ms,
        "score": results.network.score
    }

benchmark = Benchmark(
    # ...
    network_results_json=json.dumps(network_results) if network_results else None
)
```

### 3. Migration SQL

**Fichier** : `backend/migrations/002_add_network_results.sql`
```sql
ALTER TABLE benchmarks ADD COLUMN network_results_json TEXT;
```

**Script d'application** : `backend/apply_migration_002.py`

### 4. Migration SQL (nouveau score CPU)

**Fichier** : `backend/migrations/003_add_cpu_scores.sql`
```sql
ALTER TABLE benchmarks ADD COLUMN cpu_score_single FLOAT;
ALTER TABLE benchmarks ADD COLUMN cpu_score_multi FLOAT;
```

**Script d'application** : `backend/apply_migration_003.py`

### 5. Migration SQL (métadonnées hardware supplémentaires)

**Fichier** : `backend/migrations/004_add_snapshot_details.sql`
```sql
ALTER TABLE hardware_snapshots ADD COLUMN hostname VARCHAR(255);
ALTER TABLE hardware_snapshots ADD COLUMN desktop_environment VARCHAR(100);
ALTER TABLE hardware_snapshots ADD COLUMN pci_devices_json TEXT;
ALTER TABLE hardware_snapshots ADD COLUMN usb_devices_json TEXT;
```

**Script d'application** : `backend/apply_migration_004.py`

### 6. Migration SQL (session Wayland/X11, batterie, uptime)

**Fichier** : `backend/migrations/005_add_os_display_and_battery.sql`
```sql
ALTER TABLE hardware_snapshots ADD COLUMN screen_resolution VARCHAR(50);
ALTER TABLE hardware_snapshots ADD COLUMN display_server VARCHAR(50);
ALTER TABLE hardware_snapshots ADD COLUMN session_type VARCHAR(50);
ALTER TABLE hardware_snapshots ADD COLUMN last_boot_time VARCHAR(50);
ALTER TABLE hardware_snapshots ADD COLUMN uptime_seconds INTEGER;
ALTER TABLE hardware_snapshots ADD COLUMN battery_percentage FLOAT;
ALTER TABLE hardware_snapshots ADD COLUMN battery_status VARCHAR(50);
ALTER TABLE hardware_snapshots ADD COLUMN battery_health VARCHAR(50);
```

**Script d'application** : `backend/apply_migration_005.py`

## Déploiement

Pour appliquer les mises à jour :

### 1. Appliquer les migrations 002, 003, 004 et 005
```bash
cd backend
python3 apply_migration_002.py
python3 apply_migration_003.py
python3 apply_migration_004.py
python3 apply_migration_005.py
```

### 2. Redémarrer le backend
```bash
docker compose restart backend
```

### 3. Frontend
Aucune action requise - les fichiers HTML/JS sont servis directement par nginx.
Il suffit de rafraîchir la page dans le navigateur (F5 ou Ctrl+R).

## Données affichées

### Section "Résumé Hardware"
- **RAM** : Affiche maintenant le pourcentage d'utilisation et le détail utilisée/libre/partagée

**Avant** :
```
💾 RAM: 16 GB
    2 / 4 slots
```

**Après** :
```
💾 RAM: 16 GB (45% utilisé)
    Utilisée: 7GB • Libre: 9GB • Partagée: 0GB
    2 / 4 slots
```

### Section "Informations Réseau Détaillées" (nouvelle)

**Interfaces** :
```
🔌 enp0s31f6 (ethernet)                    [WoL ✓]
    IP: 10.0.1.100
    MAC: a0:b1:c2:d3:e4:f5
    Vitesse: 1000 Mbps
```

**Benchmark iperf3** :
```
📈 Résultats Benchmark Réseau (iperf3)

  ↑ 945.23           ↓ 938.17          52.3            47.2
  Upload Mbps       Download Mbps     Ping ms         Score
```

## Compatibilité

- ✅ Compatible avec les anciens benchmarks (affichage gracieux si données manquantes)
- ✅ Gestion des cas où `network_results_json` est null
- ✅ Gestion des cas où `ram_used_mb`, `ram_free_mb`, `ram_shared_mb` sont null
- ✅ Affichage "N/A" ou messages appropriés si données non disponibles

## Tests à effectuer

1. **Nouveau benchmark** :
   - Exécuter `sudo bash scripts/bench.sh` depuis un client
   - Vérifier l'affichage des nouvelles données sur la page device detail

2. **Anciens benchmarks** :
   - Vérifier que les devices avec anciens benchmarks s'affichent correctement
   - Vérifier l'absence d'erreurs JavaScript dans la console

3. **Wake-on-LAN** :
   - Vérifier le badge "WoL ✓" pour les interfaces ethernet supportant WoL
   - Vérifier le badge "WoL ✗" pour les interfaces ne supportant pas WoL

4. **iperf3** :
   - Vérifier l'affichage des débits upload/download
   - Vérifier l'affichage du ping moyen
   - Vérifier le calcul du score réseau

## Notes techniques

### Parsing JSON
Le frontend parse plusieurs champs JSON :
- `network_interfaces_json` : Array des interfaces réseau
- `network_results_json` : Objet avec upload_mbps, download_mbps, ping_ms, score

### Gestion des erreurs
Tous les parsings JSON sont dans des blocs try/catch pour éviter les crashes si le JSON est invalide.

### Classes CSS utilisées
- `.badge-success` : Badge vert pour WoL activé
- `.badge-muted` : Badge gris pour WoL désactivé
- `.hardware-item` : Conteneur pour chaque interface réseau
- Couleurs CSS variables : `--color-success`, `--color-info`, `--color-warning`, `--color-primary`

## Améliorations futures possibles

1. **Graphiques** : Ajouter des graphiques pour visualiser l'historique des performances réseau
2. **SMART** : Ajouter une section pour afficher les données SMART des disques (déjà collectées par le script)
3. **Alertes** : Notifier si Wake-on-LAN n'est pas activé sur les serveurs
4. **Comparaison** : Permettre de comparer les résultats iperf3 entre plusieurs benchmarks
5. **Export** : Permettre d'exporter les données réseau en CSV/JSON

## Support

Pour toute question ou problème concernant ces mises à jour, vérifiez :
1. Les logs du backend : `docker compose logs backend`
2. La console JavaScript du navigateur (F12)
3. Les migrations ont été appliquées : `python3 backend/apply_migration_002.py`
