515 lines
21 KiB
Markdown
Executable File
515 lines
21 KiB
Markdown
Executable File
# Changelog
|
||
|
||
## 2025-12-31 - Améliorations UI/UX, Font Awesome Local & Correction Docker Images
|
||
|
||
### Added
|
||
- **🖼️ Génération automatique de miniatures**
|
||
- Nouveau champ `thumbnail_path` dans `peripheral_photos`
|
||
- Génération automatique lors de l'upload (48px large, ratio conservé @ 75% qualité)
|
||
- Structure : `original/`, image redimensionnée, `thumbnail/`
|
||
- API retourne `thumbnail_path` + `stored_path`
|
||
- Gain performance : ~94% poids en moins + conservation ratio d'aspect
|
||
- Migration 009 appliquée
|
||
- Documentation : `docs/SESSION_2025-12-31_THUMBNAILS.md`, `docs/THUMBNAILS_ASPECT_RATIO.md`
|
||
|
||
- **✏️ Fonction "Modifier" complète dans page détail**
|
||
- Modale d'édition avec tous les champs du périphérique (22 champs)
|
||
- Système d'étoiles cliquables pour la note
|
||
- Pré-remplissage automatique des données actuelles
|
||
- Sauvegarde via API PUT + rechargement automatique
|
||
- Modale large (1400px max) pour affichage optimal
|
||
- Documentation : `docs/FEATURE_EDIT_PERIPHERAL.md`
|
||
|
||
- **📸 Icône cliquable pour photo principale**
|
||
- Icône ⭕/✅ en bas à gauche de chaque photo dans la galerie
|
||
- Un clic pour définir/changer la photo principale (vignette)
|
||
- États visuels : normal (gris), hover (bleu), active (cyan)
|
||
- API POST `/peripherals/{id}/photos/{photo_id}/set-primary`
|
||
- Une seule photo principale garantie par périphérique
|
||
- Documentation : `docs/FEATURE_PRIMARY_PHOTO_TOGGLE.md`
|
||
|
||
### Improved
|
||
- **ℹ️ Aide contextuelle pour "Photo principale"**
|
||
- Texte explicatif avec icône <i class="fas fa-info-circle"></i> à côté du checkbox
|
||
- Badge "★ Principale" avec étoile dans la galerie photos
|
||
- Clarification : une seule photo principale par périphérique
|
||
|
||
### Fixed
|
||
- **🐳 Docker : Images périphériques accessibles**
|
||
- Problème : Images uploadées retournaient 404 (read-only filesystem)
|
||
- Solution : Montage simplifié `./uploads:/uploads:ro`
|
||
- Ajout configuration nginx personnalisée (`frontend/nginx.conf`)
|
||
- Conversion chemins API : `/app/uploads/...` → `/uploads/...`
|
||
- Cache navigateur 1 jour + en-têtes sécurité
|
||
- Documentation : `docs/SESSION_2025-12-31_DOCKER_IMAGES_FIX.md`
|
||
|
||
## 2025-12-31 - Améliorations UI/UX & Font Awesome Local
|
||
|
||
### Added
|
||
- **🎨 Font Awesome 6.4.0 en local (polices + SVG)**
|
||
- **Polices** : Remplacement du CDN par hébergement local (378 KB total)
|
||
- Fichiers : all.min.css + 3 fichiers woff2 (solid, regular, brands)
|
||
- Dossier : `frontend/fonts/fontawesome/`
|
||
- **Icônes SVG** : 2020 icônes téléchargées (8.1 MB)
|
||
- Solid : 1347 icônes | Regular : 164 icônes | Brands : 509 icônes
|
||
- Dossier : `frontend/icons/svg/fa/`
|
||
- Utilisation : `<img src="...">` ou SVG inline
|
||
- Avantages : hors ligne, RGPD-friendly, meilleure performance, qualité vectorielle
|
||
- Documentation ajoutée dans `config/locations.yaml` et `config/peripheral_types.yaml`
|
||
|
||
- **🗂️ Endpoint API `/config/location-types`**
|
||
- Charge les types de localisation depuis `config/locations.yaml`
|
||
- Permet construction d'interface hiérarchique de localisation
|
||
- Retourne icônes, couleurs, règles de hiérarchie (`peut_contenir`)
|
||
|
||
- **📋 Champ Spécifications techniques**
|
||
- Nouveau champ `specifications` (format Markdown)
|
||
- Destiné au contenu brut importé depuis fichiers .md
|
||
- Séparation claire : CLI → Spécifications → Notes
|
||
- Migration 008 appliquée
|
||
|
||
- **⭐ Système d'étoiles cliquables pour la note**
|
||
- Remplacement du champ numérique par 5 étoiles interactives
|
||
- Effet hover pour prévisualisation
|
||
- CSS : étoiles actives en doré (#f1c40f) avec ombre
|
||
- Fonction `setRating()` pour pré-remplissage lors de l'édition
|
||
|
||
- **📋 Tooltip "Copié !" sur bouton copier**
|
||
- Implémentation copie presse-papiers via `navigator.clipboard`
|
||
- Tooltip avec animation fade in/out (2 secondes)
|
||
- Design cohérent avec thème Monokai
|
||
|
||
- **🖥️ Dropdown assignation d'hôtes**
|
||
- Sélection de l'hôte dans la section "État et localisation"
|
||
- Format : `hostname (location)` ou `hostname`
|
||
- Option par défaut : "En stock (non assigné)"
|
||
- Endpoint API : `/api/peripherals/config/devices`
|
||
|
||
### Changed
|
||
- **📝 Séparation CLI : YAML + Markdown**
|
||
- Champ `cli_yaml` : données structurées au format YAML
|
||
- Champ `cli_raw` : sortie CLI brute (sudo lsusb -v, lshw, etc.)
|
||
- Ancien champ `cli` marqué DEPRECATED (conservé pour compatibilité)
|
||
- Migration 007 appliquée : `cli` → `cli_raw`
|
||
|
||
- **📐 Optimisation espace formulaire (-25-30% scroll)**
|
||
- Modal padding : 2rem → 1.25rem (-37%)
|
||
- Form grid gap : 2rem → 0.9rem (-55%)
|
||
- Section padding : 1.5rem → 0.9rem (-40%)
|
||
- Form group margin : 1.25rem → 0.8rem (-36%)
|
||
- Input padding : 0.75rem → 0.5rem 0.65rem (-33%)
|
||
- Textarea line-height : 1.4 → 1.3
|
||
- Textarea min-height : 80px → 70px (-12.5%)
|
||
|
||
- **🖼️ Configuration compression photo par niveaux**
|
||
- Format entrée : jpg, png, webp
|
||
- Format sortie : PNG
|
||
- Structure : `original/` (fichiers originaux) + `thumbnail/` (miniatures)
|
||
- 4 niveaux : high (92%, 2560×1920), medium (85%, 1920×1080), low (75%, 1280×720), minimal (65%, 800×600)
|
||
- Fichier : `config/image_compression.yaml`
|
||
|
||
- **🔧 Consolidation config/**
|
||
- Un seul dossier `config/` à la racine du projet
|
||
- Suppression de `backend/config/`
|
||
- Chemins mis à jour dans `image_config_loader.py`
|
||
|
||
### Fixed
|
||
- **🔧 Correction commande USB**
|
||
- Toutes références mises à jour : `lsusb -v` → `sudo lsusb -v`
|
||
- Fichiers : peripherals.html, README.md, README_PERIPHERALS.md, CHANGELOG.md
|
||
- Raison : accès aux descripteurs complets nécessite privilèges root
|
||
|
||
### Documentation
|
||
- `docs/SESSION_2025-12-31_UI_IMPROVEMENTS.md` : Session complète UI/UX
|
||
- Commentaires icônes dans `config/locations.yaml` et `config/peripheral_types.yaml`
|
||
|
||
---
|
||
|
||
## 2025-12-31 - Conformité Spécifications USB & Classification Intelligente
|
||
|
||
### Added
|
||
- **🧠 Classification intelligente des périphériques CONFORME AUX SPÉCIFICATIONS USB**
|
||
- **CRITIQUE** : Utilisation de `bInterfaceClass` (normative) au lieu de `bDeviceClass` pour détection Mass Storage (classe 08)
|
||
- Détection automatique de `type_principal` et `sous_type` basée sur l'analyse du contenu
|
||
- Support de multiples stratégies : USB **interface** class (prioritaire), device class (fallback), vendor/product IDs, analyse de mots-clés
|
||
- Patterns pour WiFi, Bluetooth, Storage, Hub, Clavier, Souris, Webcam, Ethernet
|
||
- Système de scoring pour sélectionner le type le plus probable
|
||
- Fonctionne avec import USB (sudo lsusb -v) ET import markdown (.md)
|
||
- Nouveau classificateur : [backend/app/utils/device_classifier.py](backend/app/utils/device_classifier.py)
|
||
- Documentation complète : [docs/FEATURE_INTELLIGENT_CLASSIFICATION.md](docs/FEATURE_INTELLIGENT_CLASSIFICATION.md)
|
||
|
||
- **⚡ Détection normative du type USB basée sur la vitesse négociée** (pas bcdUSB)
|
||
- Low Speed (1.5 Mbps) → USB 1.1
|
||
- Full Speed (12 Mbps) → USB 1.1
|
||
- High Speed (480 Mbps) → USB 2.0
|
||
- SuperSpeed (5 Gbps) → USB 3.0
|
||
- SuperSpeed+ (10 Gbps) → USB 3.1
|
||
- SuperSpeed Gen 2x2 (20 Gbps) → USB 3.2
|
||
|
||
- **🔌 Analyse de puissance USB normative**
|
||
- Extraction MaxPower (en mA) et bmAttributes
|
||
- Détection Bus Powered vs Self Powered
|
||
- Calcul suffisance alimentation basé sur capacité normative du port :
|
||
- USB 2.0 : 500 mA @ 5V = 2,5 W
|
||
- USB 3.x : 900 mA @ 5V = 4,5 W
|
||
|
||
- **🛠️ Détection firmware requis**
|
||
- Classe Vendor Specific (255) → `requires_firmware: true`
|
||
- Indication que le périphérique nécessite un pilote + microcode spécifique
|
||
|
||
- **📋 Mappings de champs conformes aux spécifications USB**
|
||
- `marque` = `idVendor` (vendor_id, ex: 0x0781)
|
||
- `modele` = `iProduct` (product string, ex: "SanDisk 3.2Gen1")
|
||
- `fabricant` = `iManufacturer` (manufacturer string, ex: "SanDisk Corp.")
|
||
- `caracteristiques_specifiques` enrichi avec :
|
||
- `vendor_id` / `product_id` (idVendor / idProduct)
|
||
- `fabricant` (iManufacturer)
|
||
- `usb_version_declared` (bcdUSB - déclaré, non définitif)
|
||
- `usb_type` (type réel basé sur vitesse négociée)
|
||
- `negotiated_speed` (vitesse négociée, ex: "High Speed")
|
||
- `interface_classes` (CRITIQUE : liste des bInterfaceClass)
|
||
- `requires_firmware` (true si classe 255)
|
||
- `max_power_ma` (MaxPower en mA)
|
||
- `is_bus_powered` / `is_self_powered`
|
||
- `power_sufficient` (comparaison MaxPower vs capacité port)
|
||
|
||
- **📋 Champs de documentation enrichis**
|
||
- Nouveau champ `synthese` (TEXT) - Stockage complet du markdown importé
|
||
- Nouveau champ `cli` (TEXT) - Sortie CLI formatée en markdown avec coloration syntaxique
|
||
- Nouveau champ `description` (TEXT) - Description courte du périphérique
|
||
- Migration automatique de la base de données
|
||
|
||
- **🔌 Import USB amélioré avec workflow 2 étapes**
|
||
- **Étape 1** : Affichage de la commande `sudo lsusb -v` avec bouton "Copier"
|
||
- Zone de texte pour coller la sortie complète
|
||
- **Étape 2** : Liste des périphériques détectés avec **radio buttons** (sélection unique)
|
||
- Bouton "Finaliser" activé uniquement après sélection
|
||
- Filtrage CLI pour ne garder que le périphérique sélectionné
|
||
- Formatage markdown automatique du CLI stocké
|
||
- Pré-remplissage intelligent du formulaire avec détection automatique du type
|
||
- Nouveau parser : [backend/app/utils/lsusb_parser.py](backend/app/utils/lsusb_parser.py)
|
||
- Documentation : [FEATURE_IMPORT_USB_CLI.md](FEATURE_IMPORT_USB_CLI.md)
|
||
|
||
- **📝 Import markdown amélioré**
|
||
- Stockage du contenu complet dans le champ `synthese`
|
||
- Classification intelligente basée sur l'analyse du markdown
|
||
- Détection automatique du type depuis le contenu textuel
|
||
|
||
- **📊 Import USB avec informations structurées** (NOUVEAU)
|
||
- Nouveau bouton "Importer USB (Info)" pour informations formatées
|
||
- Support du format texte structuré (Bus, Vendor ID, Product ID, etc.)
|
||
- Parser intelligent : [backend/app/utils/usb_info_parser.py](backend/app/utils/usb_info_parser.py)
|
||
- Stockage CLI en **format YAML structuré** (+ sortie brute)
|
||
- Endpoint `/api/peripherals/import/usb-structured`
|
||
- Détection automatique type/sous-type
|
||
- Organisation YAML : identification, usb, classe, alimentation, interfaces, endpoints
|
||
- Documentation : [docs/FEATURE_USB_STRUCTURED_IMPORT.md](docs/FEATURE_USB_STRUCTURED_IMPORT.md)
|
||
|
||
- **💾 Sous-types de stockage détaillés**
|
||
- Ajout "Clé USB", "Disque dur externe", "Lecteur de carte" dans [config/peripheral_types.yaml](config/peripheral_types.yaml)
|
||
- Distinction automatique entre flash drive, HDD/SSD, et card reader
|
||
- Méthode `refine_storage_subtype()` dans le classificateur
|
||
- Patterns pour marques : SanDisk Cruzer, WD Passport, Seagate Expansion, etc.
|
||
|
||
- **🏠 Nouveaux types IoT et biométrie**
|
||
- Ajout type "ZigBee" pour dongles domotique (ConBee, CC2531, CC2652, Thread)
|
||
- Ajout type "Lecteur biométrique" pour lecteurs d'empreintes digitales
|
||
- Détection automatique avec patterns : dresden elektronik, conbee, fingerprint, fingprint (typo)
|
||
- Support des principaux fabricants : Validity, Synaptics, Goodix, Elan
|
||
- Caractéristiques spécifiques : protocole ZigBee, firmware, type de capteur, résolution DPI
|
||
|
||
### Changed
|
||
- **Backend**
|
||
- Endpoint `/api/peripherals/import/usb-cli/extract` - Ajout classification intelligente
|
||
- Endpoint `/api/peripherals/import/markdown` - Ajout classification + stockage synthèse
|
||
- Modèle `Peripheral` - Ajout colonnes `description`, `synthese`, `cli`
|
||
- Schéma `PeripheralBase` - Ajout champs optionnels documentation
|
||
|
||
- **Frontend**
|
||
- [frontend/peripherals.html](frontend/peripherals.html) - Modal USB en 2 étapes avec radio buttons
|
||
- [frontend/peripherals.html](frontend/peripherals.html) - Ajout section "Documentation technique" avec champs `synthese` et `cli`
|
||
- [frontend/css/peripherals.css](frontend/css/peripherals.css) - Styles pour bouton copier, liste USB, help text inline
|
||
- [frontend/js/peripherals.js](frontend/js/peripherals.js) - Logique robuste de pré-sélection avec retry logic
|
||
- Pré-sélection automatique de `type_principal` et `sous_type` après import
|
||
|
||
- **Configuration**
|
||
- [config/peripheral_types.yaml](config/peripheral_types.yaml) - Ajout type "Adaptateur WiFi" (USB)
|
||
- Chargement dynamique des types depuis YAML via API
|
||
|
||
### Fixed
|
||
- Problème de sélection des sous-types après import (timeout non fiable remplacé par retry logic)
|
||
- WiFi manquant dans les sous-types USB (maintenant chargé depuis YAML)
|
||
- Types hardcodés dans le frontend (maintenant dynamiques depuis l'API)
|
||
|
||
## 2025-12-30 - Module Périphériques (v1.0)
|
||
|
||
### Added
|
||
- **🔌 Module complet de gestion d'inventaire de périphériques**
|
||
- Base de données séparée (`peripherals.db`) avec 7 tables
|
||
- 30+ types de périphériques configurables via YAML
|
||
- Support : USB, Bluetooth, Réseau, Stockage, Video, Audio, Câbles, Consoles, Microcontrôleurs, Quincaillerie
|
||
- CRUD complet avec API REST (20+ endpoints)
|
||
- Système de prêts avec rappels automatiques
|
||
- Localisations hiérarchiques avec génération de QR codes
|
||
- Import automatique depuis `sudo lsusb -v`
|
||
- Import depuis fichiers .md de spécifications
|
||
- Upload de photos avec compression WebP automatique
|
||
- Upload de documents (PDF, factures, manuels)
|
||
- Gestion de liens externes (fabricant, support, drivers)
|
||
- Historique complet de tous les mouvements
|
||
- Cross-database queries (périphériques ↔ devices)
|
||
- Statistiques en temps réel
|
||
|
||
- **Backend**
|
||
- Modèles SQLAlchemy : `Peripheral`, `PeripheralPhoto`, `PeripheralDocument`, `PeripheralLink`, `PeripheralLoan`, `Location`, `PeripheralLocationHistory`
|
||
- Schémas Pydantic : 400+ lignes de validation
|
||
- Services : `PeripheralService`, `LocationService`
|
||
- Utilitaires : `usb_parser.py`, `md_parser.py`, `image_processor.py`, `qr_generator.py`, `yaml_loader.py`
|
||
- API endpoints : `/api/peripherals/*`, `/api/locations/*`, `/api/peripherals/import/markdown`
|
||
- Configuration YAML : `peripheral_types.yaml`, `locations.yaml`, `image_processing.yaml`, `notifications.yaml`
|
||
|
||
- **Frontend**
|
||
- Page principale : [frontend/peripherals.html](frontend/peripherals.html)
|
||
- Page détail : [frontend/peripheral-detail.html](frontend/peripheral-detail.html)
|
||
- Thème Monokai dark complet
|
||
- Liste paginée avec recherche et filtres multiples
|
||
- Tri sur toutes les colonnes
|
||
- Modal d'ajout, d'import USB et d'import fichiers .md
|
||
- Gestion complète des photos, documents, liens
|
||
|
||
- **Docker**
|
||
- Volumes ajoutés pour `config/` et `uploads/peripherals/`
|
||
- Variables d'environnement pour le module
|
||
- Documentation de déploiement : [DOCKER_DEPLOYMENT.md](DOCKER_DEPLOYMENT.md)
|
||
|
||
- **Documentation**
|
||
- [README_PERIPHERALS.md](README_PERIPHERALS.md) - Guide complet
|
||
- [docs/PERIPHERALS_MODULE_SPECIFICATION.md](docs/PERIPHERALS_MODULE_SPECIFICATION.md) - Spécifications
|
||
- [DOCKER_DEPLOYMENT.md](DOCKER_DEPLOYMENT.md) - Déploiement
|
||
|
||
- **Dépendances**
|
||
- `Pillow==10.2.0` - Traitement d'images
|
||
- `qrcode[pil]==7.4.2` - Génération QR codes
|
||
- `PyYAML==6.0.1` - Configuration YAML
|
||
|
||
### Changed
|
||
- [docker-compose.yml](docker-compose.yml) - Ajout volumes et variables pour périphériques
|
||
- [.env.example](.env.example) - Variables du module périphériques
|
||
- [README.md](README.md) - Documentation du module
|
||
- [frontend/js/utils.js](frontend/js/utils.js) - Fonctions `apiRequest`, `formatDateTime`, `formatBytes`, `showSuccess`, `showInfo`
|
||
|
||
### Files Added (25+)
|
||
- Backend: 12 fichiers (models, schemas, services, utils, routes)
|
||
- Frontend: 5 fichiers (HTML, JS, CSS)
|
||
- Config: 4 fichiers YAML
|
||
- Documentation: 3 fichiers markdown
|
||
|
||
## 2025-12-20 - Backend Schema Fix
|
||
|
||
### Fixed
|
||
- **Backend Schema Validation**: Increased upper bound constraints on score fields to accommodate high-performance hardware
|
||
- File: [backend/app/schemas/benchmark.py](backend/app/schemas/benchmark.py)
|
||
- Issue: CPU multi-core scores (25000+) and other raw benchmark values were being rejected with HTTP 422 errors
|
||
- Solution: Increased constraints to realistic maximum values:
|
||
- `cpu.score`: 10000 → 100000
|
||
- `cpu.score_single`: 10000 → 50000
|
||
- `cpu.score_multi`: 10000 → 100000
|
||
- `memory.score`: 10000 → 100000
|
||
- `disk.score`: 10000 → 50000
|
||
- `network.score`: 10000 → 100000
|
||
- `gpu.score`: 10000 → 50000
|
||
- `global_score`: 10000 → 100000
|
||
|
||
# Changelog - script_test.sh
|
||
|
||
## Version 1.0.1 - Améliorations demandées
|
||
|
||
### Nouvelles fonctionnalités
|
||
|
||
#### 1. Wake-on-LAN pour cartes Ethernet
|
||
- **Fichier** : [script_test.sh:546-555](script_test.sh#L546-L555)
|
||
- Détection automatique du support Wake-on-LAN via `ethtool`
|
||
- Ajout du champ `wake_on_lan` (true/false/null) dans les informations réseau
|
||
- Vérifie si la carte supporte le "magic packet" (flag 'g')
|
||
|
||
```json
|
||
{
|
||
"name": "eth0",
|
||
"type": "ethernet",
|
||
"wake_on_lan": true
|
||
}
|
||
```
|
||
|
||
#### 2. Statistiques RAM détaillées
|
||
- **Fichier** : [script_test.sh:298-303](script_test.sh#L298-L303) et [script_test.sh:367-385](script_test.sh#L367-L385)
|
||
- Ajout de la RAM utilisée (`used_mb`)
|
||
- Ajout de la RAM libre (`free_mb`)
|
||
- Ajout de la RAM partagée (`shared_mb`) - inclut tmpfs, vidéo partagée, etc.
|
||
- Distinction entre RAM physique totale et RAM disponible dans l'OS
|
||
|
||
```json
|
||
{
|
||
"total_mb": 16384,
|
||
"used_mb": 8192,
|
||
"free_mb": 7500,
|
||
"shared_mb": 692
|
||
}
|
||
```
|
||
|
||
#### 3. Test réseau iperf3 vers 10.0.0.50
|
||
- **Fichier** : [script_test.sh:675-726](script_test.sh#L675-L726)
|
||
- Test de connectivité préalable avec `ping`
|
||
- Test upload (client → serveur) pendant 10 secondes
|
||
- Test download (serveur → client avec `-R`) pendant 10 secondes
|
||
- Mesure du ping moyen (5 paquets)
|
||
- Calcul du score réseau basé sur la moyenne upload/download
|
||
|
||
**Prérequis** : Le serveur 10.0.0.50 doit avoir `iperf3 -s` en cours d'exécution.
|
||
|
||
```bash
|
||
# Sur le serveur 10.0.0.50
|
||
iperf3 -s
|
||
```
|
||
|
||
```json
|
||
{
|
||
"upload_mbps": 940.50,
|
||
"download_mbps": 950.20,
|
||
"ping_ms": 0.5,
|
||
"score": 94.54
|
||
}
|
||
```
|
||
|
||
#### 4. Données SMART de vieillissement des disques
|
||
- **Fichier** : [script_test.sh:492-602](script_test.sh#L492-L602)
|
||
- Extraction complète des données SMART pour chaque disque via `smartctl`
|
||
- **Indicateurs de santé globale** :
|
||
- `health_status` : PASSED/FAILED (test auto-diagnostic SMART)
|
||
- `temperature_celsius` : Température actuelle du disque
|
||
|
||
- **Indicateurs de vieillissement** :
|
||
- `power_on_hours` : Heures de fonctionnement totales
|
||
- `power_cycle_count` : Nombre de démarrages/arrêts
|
||
- `reallocated_sectors` : Secteurs défectueux réalloués (⚠️ signe de défaillance)
|
||
- `pending_sectors` : Secteurs en attente de réallocation (⚠️ attention)
|
||
- `udma_crc_errors` : Erreurs de transmission (câble/interface)
|
||
|
||
- **Pour SSD uniquement** :
|
||
- `wear_leveling_count` : Compteur d'usure des cellules
|
||
- `total_lbas_written` : Volume total de données écrites
|
||
|
||
**Interprétation** :
|
||
- ✅ `health_status: "PASSED"` + `reallocated_sectors: 0` = Disque sain
|
||
- ⚠️ `reallocated_sectors > 0` = Début de défaillance, surveiller
|
||
- 🔴 `pending_sectors > 0` = Défaillance imminente, sauvegarder immédiatement
|
||
- 🔴 `health_status: "FAILED"` = Disque défaillant, remplacer
|
||
|
||
```json
|
||
{
|
||
"device": "sda",
|
||
"model": "Samsung SSD 970 EVO Plus 500GB",
|
||
"type": "ssd",
|
||
"smart": {
|
||
"health_status": "PASSED",
|
||
"power_on_hours": 12543,
|
||
"power_cycle_count": 1876,
|
||
"temperature_celsius": 42,
|
||
"reallocated_sectors": 0,
|
||
"pending_sectors": 0,
|
||
"udma_crc_errors": 0,
|
||
"wear_leveling_count": 97,
|
||
"total_lbas_written": 45678901234
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 5. Correction du calcul global_score
|
||
- **Fichier** : [script_test.sh:732-760](script_test.sh#L732-L760)
|
||
- Le score global n'inclut **que** CPU, RAM et Disk (pas réseau, pas GPU)
|
||
- Nouvelle pondération :
|
||
- **CPU** : 40%
|
||
- **RAM** : 30%
|
||
- **Disk** : 30%
|
||
- Normalisation automatique si certains benchmarks sont manquants
|
||
- Score sur 100
|
||
|
||
### Corrections
|
||
|
||
- **PATH Fix** : Ajout de `/usr/sbin` et `/sbin` au PATH ([script_test.sh:30](script_test.sh#L30))
|
||
- Résout le problème de détection de `dmidecode`, `smartctl`, `ethtool`
|
||
|
||
### Format JSON mis à jour
|
||
|
||
```json
|
||
{
|
||
"hardware": {
|
||
"ram": {
|
||
"total_mb": 16384,
|
||
"used_mb": 8192,
|
||
"free_mb": 7500,
|
||
"shared_mb": 692,
|
||
"slots_total": 4,
|
||
"slots_used": 2,
|
||
"ecc": false,
|
||
"layout": [...]
|
||
},
|
||
"network": [
|
||
{
|
||
"name": "eth0",
|
||
"type": "ethernet",
|
||
"mac": "00:11:22:33:44:55",
|
||
"ip_address": "10.0.1.100",
|
||
"speed_mbps": 1000,
|
||
"wake_on_lan": true
|
||
}
|
||
]
|
||
},
|
||
"benchmarks": {
|
||
"cpu": {
|
||
"events_per_sec": 5234.89,
|
||
"duration_s": 10.0,
|
||
"score": 52.35
|
||
},
|
||
"memory": {
|
||
"throughput_mib_s": 15234.5,
|
||
"score": 76.17
|
||
},
|
||
"disk": {
|
||
"read_mb_s": 450.0,
|
||
"write_mb_s": 420.0,
|
||
"iops_read": 112000,
|
||
"iops_write": 105000,
|
||
"latency_ms": 0.08,
|
||
"score": 43.50
|
||
},
|
||
"network": {
|
||
"upload_mbps": 940.5,
|
||
"download_mbps": 950.2,
|
||
"ping_ms": 0.5,
|
||
"score": 94.54
|
||
},
|
||
"gpu": null,
|
||
"global_score": 57.00
|
||
}
|
||
}
|
||
```
|
||
|
||
### Notes d'utilisation
|
||
|
||
1. **Serveur iperf3** : Assurez-vous que `iperf3 -s` tourne sur 10.0.0.50 avant de lancer le script
|
||
2. **Permissions** : Le script nécessite `sudo` pour dmidecode, smartctl, ethtool
|
||
3. **Durée** : Le script prend environ 3-4 minutes (10s iperf3 upload + 10s download + 30s disk)
|
||
|
||
### Commande de test
|
||
|
||
```bash
|
||
# Lancer le serveur iperf3 sur 10.0.0.50
|
||
ssh user@10.0.0.50 'iperf3 -s -D'
|
||
|
||
# Lancer le script de test
|
||
sudo bash script_test.sh
|
||
|
||
# Voir le résultat
|
||
cat result.json | jq .
|
||
```
|