Files
serv_benchmark/docs/SESSION_2025-12-18.md
Gilles Soulier c67befc549 addon
2026-01-05 16:08:01 +01:00

7.0 KiB
Executable File

Session de Développement - 2025-12-18

Contexte

Reprise du développement du projet Linux BenchTools après la session du 2025-12-14 qui avait corrigé 8 bugs majeurs.

L'utilisateur a signalé que la commande bash curl n'apparaissait pas dans le dashboard frontend.

Problèmes Identifiés

1. Commande curl manquante dans le dashboard

Symptôme : La section "Quick Bench Script" affichait "Chargement..." au lieu de la vraie commande.

Cause : Le token API était hardcodé à YOUR_TOKEN dans le code JavaScript au lieu d'être récupéré dynamiquement depuis le backend.

2. Script bench.sh bloqué en mode non-interactif

Symptôme : Lors de l'exécution via curl | bash, le script s'arrêtait après l'affichage du payload JSON et n'envoyait rien au serveur.

Cause :

  • DEBUG_PAYLOAD=1 par défaut
  • read -p qui attendait un input sans vérifier si stdin était un terminal interactif

Solutions Implémentées

Fix #1 : Endpoint API pour configuration frontend

Backend - Nouvel endpoint /api/config

Fichier : backend/app/main.py

@app.get(f"{settings.API_PREFIX}/config")
async def get_config():
    """Get frontend configuration (API token, server URLs, etc.)"""
    return {
        "api_token": settings.API_TOKEN,
        "iperf_server": "10.0.0.50"
    }

URL : http://10.0.0.50:8007/api/config

Réponse :

{
  "api_token": "29855796dacf5cfe75ff9b02d6adf3dd0f9c52db5b53e7abfb4c0df7ece1be0a",
  "iperf_server": "10.0.0.50"
}

Frontend - Chargement dynamique du token

Fichier : frontend/js/dashboard.js

Ajout de variables globales et fonction de chargement :

let apiToken = null;
let iperfServer = null;

async function loadBackendConfig() {
  const response = await fetch(`${window.BenchConfig.backendApiUrl}/config`);
  if (response.ok) {
    const config = await response.json();
    apiToken = config.api_token;
    iperfServer = config.iperf_server || '10.0.0.50';
    updateBenchCommandDisplay();
  }
}

Modification de la génération de commande :

function buildBenchCommand() {
  const token = apiToken || 'LOADING...';
  const backendUrl = backendBase.replace(/\/api$/, '');

  return `curl -fsSL ${frontendBase}${scriptPath} | sudo bash -s -- --server ${backendUrl} --token "${token}" --iperf-server ${iperf}`;
}

Initialisation au chargement de la page :

document.addEventListener('DOMContentLoaded', async () => {
  await loadBackendConfig(); // Charge le token en premier
  loadDashboard();
  // ...
});

Fichier : frontend/js/settings.js - Modifications similaires

Docker - Volume de développement

Fichier : docker-compose.yml

Ajout du volume pour faciliter les modifications sans rebuild :

backend:
  volumes:
    - ./backend/data:/app/data
    - ./uploads:/app/uploads
    - ./backend/app:/app/app  # ← Nouveau

Fix #2 : Mode non-interactif pour bench.sh

Fichier : scripts/bench.sh

Changement 1 : DEBUG_PAYLOAD désactivé par défaut (ligne 37)

# Avant
DEBUG_PAYLOAD="${DEBUG_PAYLOAD:-1}"  # Par défaut: 1 (activé)

# Après
DEBUG_PAYLOAD="${DEBUG_PAYLOAD:-0}"  # Par défaut: 0 (désactivé)

Changement 2 : Détection du mode interactif (lignes 1493-1499)

# Demander confirmation seulement si on a un terminal interactif
if [[ -t 0 ]]; then
    read -p "Appuyez sur Entrée pour continuer l'envoi ou Ctrl+C pour annuler..."
else
    log_warn "Mode non-interactif détecté - envoi automatique dans 2 secondes..."
    sleep 2
fi

Commande Finale Générée

La commande affichée dans le dashboard est maintenant :

curl -fsSL http://10.0.0.50:8087/scripts/bench.sh | sudo bash -s -- \
  --server http://10.0.0.50:8007 \
  --token "29855796dacf5cfe75ff9b02d6adf3dd0f9c52db5b53e7abfb4c0df7ece1be0a" \
  --iperf-server 10.0.0.50

Fichiers Modifiés

Fichier Lignes Changement
backend/app/main.py 97-104 Ajout endpoint /api/config
frontend/js/dashboard.js 9-25, 229-235, 305-320 Chargement dynamique token
frontend/js/settings.js 6-29, 149-167 Chargement dynamique token
docker-compose.yml 12 Volume backend app
scripts/bench.sh 37, 1493-1499 DEBUG_PAYLOAD=0 + détection TTY

Documentation Créée

  • COMMAND_CURL_FIX.md - Fix de la commande curl manquante
  • FIX_DEBUG_PAYLOAD.md - Fix du blocage en mode non-interactif
  • SESSION_2025-12-18.md - Ce document (résumé de session)

Tests de Validation

Test 1 : API Config

curl http://10.0.0.50:8007/api/config
# ✅ Retourne le token et iperf_server

Test 2 : Dashboard Frontend

  1. Ouvrir http://10.0.0.50:8087
  2. Section " Quick Bench Script"
  3. La commande complète s'affiche avec le vrai token
  4. Le bouton "Copier" fonctionne

Test 3 : Page Settings

  1. Ouvrir http://10.0.0.50:8087/settings.html
  2. Section "📋 Commande Générée"
  3. La commande s'affiche avec le vrai token
  4. Le token est visible dans la section "🔑 Informations API"

Test 4 : Exécution du script via curl

curl -fsSL http://10.0.0.50:8087/scripts/bench.sh | sudo bash -s -- \
  --server http://10.0.0.50:8007 \
  --token "29855796dacf5cfe75ff9b02d6adf3dd0f9c52db5b53e7abfb4c0df7ece1be0a" \
  --iperf-server 10.0.0.50

Le script s'exécute de bout en bout sans blocage Le payload est envoyé au serveur Le benchmark apparaît dans le dashboard

Statut Final

Composant Statut Remarques
Backend API Fonctionnel Endpoint /api/config opérationnel
Frontend Dashboard Fonctionnel Commande curl complète affichée
Frontend Settings Fonctionnel Token et commande affichés
Script bench.sh Fonctionnel Mode non-interactif OK
Docker Compose Fonctionnel Volumes de dev ajoutés

Prochaines Étapes Recommandées

Phase 2 - Améliorations UX (Roadmap)

  1. Tri avancé sur les colonnes du dashboard
  2. Filtres par tags/type de machine
  3. Icônes pour types de machines et OS
  4. Pagination améliorée

Phase 3 - Graphiques d'historique

  1. Intégration Chart.js
  2. Graphiques d'évolution des scores
  3. Comparaison de benchmarks

Phase 4 - Détection de régressions

  1. Calcul de baseline par device
  2. Alertes sur régression de performance
  3. Webhooks pour notifications

Résumé Technique

Problème Initial : Impossible d'utiliser la commande curl du dashboard car le token n'était pas affiché.

Solution :

  • Backend : Nouvel endpoint REST pour exposer la config
  • Frontend : Chargement asynchrone du token au démarrage
  • Script : Détection du mode non-interactif pour éviter les blocages

Impact :

  • Workflow complet fonctionnel de bout en bout
  • Aucune modification manuelle requise
  • Expérience utilisateur améliorée

Session du : 2025-12-18 Durée : ~2 heures Bugs corrigés : 2 Fichiers modifiés : 5 Documentation : 3 fichiers Lignes de code : ~150 Statut : SUCCÈS COMPLET