# Ajout des Champs Manquants - 2025-12-14 ## đŻ Objectif Ajouter les 2 champs identifiĂ©s comme **collectĂ©s mais non stockĂ©s** dans la base de donnĂ©es : 1. **`bios_vendor`** - Fabricant du BIOS (ex: "American Megatrends Inc.") 2. **`wake_on_lan`** - Support Wake-on-LAN des interfaces rĂ©seau (true/false) --- ## â Champ #1 : `bios_vendor` ### Analyse Initiale **CollectĂ©** : â Oui - ligne 491 de [scripts/bench.sh](scripts/bench.sh#L491) ```bash bios_vendor=$(sudo dmidecode -s bios-vendor 2>/dev/null || echo "Unknown") ``` **EnvoyĂ© dans JSON** : â Oui - ligne 505 ```json { "motherboard": { "bios_vendor": "Gigabyte Technology Co., Ltd." } } ``` **StockĂ© en base** : â Non - Colonne absente du schema SQLite ### Modifications AppliquĂ©es #### 1. ModĂšle SQLAlchemy **Fichier** : [backend/app/models/hardware_snapshot.py](backend/app/models/hardware_snapshot.py#L70) ```python # Ajout ligne 70 bios_vendor = Column(String(100), nullable=True) ``` #### 2. Schema Pydantic **Fichier** : [backend/app/schemas/hardware.py](backend/app/schemas/hardware.py#L103) ```python class MotherboardInfo(BaseModel): vendor: Optional[str] = None model: Optional[str] = None bios_vendor: Optional[str] = None # â AJOUTĂ bios_version: Optional[str] = None bios_date: Optional[str] = None ``` #### 3. API Mapping **Fichier** : [backend/app/api/benchmark.py](backend/app/api/benchmark.py#L121) ```python snapshot.bios_vendor = hw.motherboard.bios_vendor if hw.motherboard and hasattr(hw.motherboard, 'bios_vendor') else None ``` #### 4. Migration Base de DonnĂ©es **Commande exĂ©cutĂ©e** : ```bash docker compose exec backend python3 -c " import sqlite3 conn = sqlite3.connect('/app/data/data.db') conn.execute('ALTER TABLE hardware_snapshots ADD COLUMN bios_vendor VARCHAR(100)') conn.commit() " ``` **RĂ©sultat** : ``` â Colonne bios_vendor ajoutĂ©e avec succĂšs ``` **VĂ©rification** : ```sql PRAGMA table_info(hardware_snapshots); -- RĂ©sultat : 45. bios_vendor VARCHAR(100) NULL ``` ### Test de Validation Au prochain benchmark, la valeur sera stockĂ©e : **Attendu** : ```json { "motherboard": { "bios_vendor": "American Megatrends Inc." // ou "Gigabyte Technology Co., Ltd." } } ``` **En base** : ```sql SELECT bios_vendor FROM hardware_snapshots WHERE device_id = 1 ORDER BY captured_at DESC LIMIT 1; -- Devrait retourner: "American Megatrends Inc." ``` --- ## â ïž Champ #2 : `wake_on_lan` ### Analyse Initiale **CollectĂ©** : â Oui - ligne 667-676 de [scripts/bench.sh](scripts/bench.sh#L667-L676) ```bash local wol_supported="" if [[ "$type" = "ethernet" && -x /usr/sbin/ethtool ]]; then wol=$(echo "$e" | awk -F: '/Wake-on:/ {gsub(/^[ \t]+/,"",$2); print $2}') if [[ -n "$wol" && "$wol" != "d" ]]; then wol_supported="true" fi fi ``` **EnvoyĂ© dans JSON** : â Oui - ligne 687 ```json { "network": { "interfaces": [ { "name": "eno1", "wake_on_lan": null // ou true/false si collectĂ© } ] } } ``` **StockĂ© en base** : â ïž Partiellement - StockĂ© dans `network_interfaces_json` (TEXT) ### DĂ©cision : Pas de Colonne DĂ©diĂ©e **Raison** : Le champ `wake_on_lan` est **dĂ©jĂ stockĂ©** dans le JSON `network_interfaces_json`. **Exemple de contenu actuel** : ```json [ { "name": "eno1", "type": "ethernet", "mac": "18:c0:4d:b5:65:74", "ip": "10.0.1.109", "speed_mbps": null, "driver": null, "wake_on_lan": null // â DĂ©jĂ prĂ©sent ! } ] ``` **Action requise** : - â Aucune modification backend nĂ©cessaire - â ïž Le frontend peut dĂ©jĂ parser `network_interfaces_json` pour afficher cette info ### Mise Ă Jour Schema Pydantic (pour validation) **Fichier** : [backend/app/schemas/hardware.py](backend/app/schemas/hardware.py#L84-L92) ```python class NetworkInterface(BaseModel): """Network interface information""" name: str type: Optional[str] = None mac: Optional[str] = None ip: Optional[str] = None speed_mbps: Optional[int] = None driver: Optional[str] = None wake_on_lan: Optional[bool] = None # â AJOUTĂ pour validation Pydantic ``` --- ## đ RĂ©sumĂ© des Modifications | Champ | CollectĂ© | EnvoyĂ© JSON | StockĂ© DB | Action | |-------|----------|-------------|-----------|--------| | **bios_vendor** | â | â | â â â | **Colonne ajoutĂ©e** | | **wake_on_lan** | â | â | â ïž (JSON) | **Schema Pydantic mis Ă jour** | --- ## đ§ Fichiers ModifiĂ©s ### Backend 1. **[backend/app/models/hardware_snapshot.py](backend/app/models/hardware_snapshot.py)** - Ligne 70 : Ajout colonne `bios_vendor` 2. **[backend/app/schemas/hardware.py](backend/app/schemas/hardware.py)** - Ligne 103 : Ajout `bios_vendor` Ă `MotherboardInfo` - Ligne 92 : Ajout `wake_on_lan` Ă `NetworkInterface` 3. **[backend/app/api/benchmark.py](backend/app/api/benchmark.py)** - Ligne 121 : Mapping `bios_vendor` vers DB 4. **[backend/migrations/add_bios_vendor.sql](backend/migrations/add_bios_vendor.sql)** - Script SQL de migration (pour rĂ©fĂ©rence) ### Base de DonnĂ©es ```sql -- Colonne ajoutĂ©e ALTER TABLE hardware_snapshots ADD COLUMN bios_vendor VARCHAR(100); ``` --- ## â Validation Finale ### Test 1 : VĂ©rifier bios_vendor dans DB ```bash # Lancer un nouveau benchmark cd /home/gilles/Documents/vscode/serv_benchmark/scripts sudo bash bench.sh # VĂ©rifier en base docker compose exec backend python3 -c " import sqlite3 conn = sqlite3.connect('/app/data/data.db') cursor = conn.cursor() cursor.execute('SELECT bios_vendor, bios_version FROM hardware_snapshots ORDER BY captured_at DESC LIMIT 1') print(cursor.fetchone()) " ``` **RĂ©sultat attendu** : ``` ('American Megatrends Inc.', 'F65e') ``` ### Test 2 : VĂ©rifier wake_on_lan dans JSON ```bash # RequĂȘte API curl -s http://10.0.1.97:8007/api/devices/1 | jq '.hardware_snapshots[0].network_interfaces_json' | jq '.[0].wake_on_lan' ``` **RĂ©sultat attendu** : ```json null // ou true/false si ethtool a pu le dĂ©tecter ``` --- ## đ Notes Techniques ### Pourquoi wake_on_lan n'est pas en colonne dĂ©diĂ©e ? 1. **DonnĂ©e par interface** : Chaque interface rĂ©seau peut avoir un statut WoL diffĂ©rent 2. **DĂ©jĂ dans JSON** : StockĂ© dans `network_interfaces_json` avec les autres propriĂ©tĂ©s 3. **Peu utilisĂ© en requĂȘtes** : Pas besoin d'indexation SQL pour ce champ 4. **FlexibilitĂ©** : Permet d'ajouter d'autres propriĂ©tĂ©s rĂ©seau sans migration ### Pourquoi bios_vendor mĂ©rite une colonne ? 1. **DonnĂ©e unique par device** : Une seule valeur par snapshot 2. **FiltrabilitĂ©** : Peut ĂȘtre utile pour filtrer/grouper par fabricant BIOS 3. **CohĂ©rence** : Suit le pattern de `bios_version` et `bios_date` (dĂ©jĂ en colonnes) --- ## đ Prochaines Ătapes (Optionnel) ### Frontend : Afficher bios_vendor **Fichier** : `frontend/js/device_detail.js` **Zone** : Section "Carte mĂšre et BIOS" (ligne ~95-107) **Ajout suggĂ©rĂ©** : ```javascript const biosVendor = cleanValue(snapshot.bios_vendor); if (biosVendor !== 'N/A') { motherboardHTML += `
Fabricant BIOS : ${biosVendor}
`; } ``` ### Frontend : Afficher wake_on_lan **Fichier** : `frontend/js/device_detail.js` **Zone** : Section "RĂ©seau" (aprĂšs affichage des interfaces) **Ajout suggĂ©rĂ©** : ```javascript const interfaces = JSON.parse(snapshot.network_interfaces_json || '[]'); interfaces.forEach(iface => { // ... affichage existant ... if (iface.wake_on_lan !== null) { const wolStatus = iface.wake_on_lan ? 'â ActivĂ©' : 'â DĂ©sactivĂ©'; networkHTML += `Wake-on-LAN : ${wolStatus}
`; } }); ``` --- **Document créé le** : 2025-12-14 Ă 10h00 **Version backend** : 1.2.0 **Statut** : â Migration appliquĂ©e, backend redĂ©marrĂ© **Prochaine action** : Lancer un benchmark pour valider le stockage de `bios_vendor`