21 KiB
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_pathdansperipheral_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
- Nouveau champ
-
✏️ 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 à 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.yamletconfig/peripheral_types.yaml
- Polices : Remplacement du CDN par hébergement local (378 KB total)
-
🗂️ 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)
- Charge les types de localisation depuis
-
📋 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
- Nouveau champ
-
⭐ 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
- Implémentation copie presse-papiers via
-
🖥️ Dropdown assignation d'hôtes
- Sélection de l'hôte dans la section "État et localisation"
- Format :
hostname (location)ouhostname - 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
climarqué DEPRECATED (conservé pour compatibilité) - Migration 007 appliquée :
cli→cli_raw
- Champ
-
📐 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
- Un seul dossier
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
- Toutes références mises à jour :
Documentation
docs/SESSION_2025-12-31_UI_IMPROVEMENTS.md: Session complète UI/UX- Commentaires icônes dans
config/locations.yamletconfig/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 debDeviceClasspour détection Mass Storage (classe 08) - Détection automatique de
type_principaletsous_typebasé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
- Documentation complète : docs/FEATURE_INTELLIGENT_CLASSIFICATION.md
- CRITIQUE : Utilisation de
-
⚡ 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
- Classe Vendor Specific (255) →
-
📋 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_specifiquesenrichi 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_poweredpower_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
- Nouveau champ
-
🔌 Import USB amélioré avec workflow 2 étapes
- Étape 1 : Affichage de la commande
sudo lsusb -vavec 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
- Documentation : FEATURE_IMPORT_USB_CLI.md
- Étape 1 : Affichage de la commande
-
📝 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
- Stockage du contenu complet dans le champ
-
📊 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
- 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
-
💾 Sous-types de stockage détaillés
- Ajout "Clé USB", "Disque dur externe", "Lecteur de carte" dans 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 colonnesdescription,synthese,cli - Schéma
PeripheralBase- Ajout champs optionnels documentation
- Endpoint
-
Frontend
- frontend/peripherals.html - Modal USB en 2 étapes avec radio buttons
- frontend/peripherals.html - Ajout section "Documentation technique" avec champs
syntheseetcli - frontend/css/peripherals.css - Styles pour bouton copier, liste USB, help text inline
- frontend/js/peripherals.js - Logique robuste de pré-sélection avec retry logic
- Pré-sélection automatique de
type_principaletsous_typeaprès import
-
Configuration
- 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
- Base de données séparée (
-
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
- Modèles SQLAlchemy :
-
Frontend
- Page principale : frontend/peripherals.html
- Page détail : 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/etuploads/peripherals/ - Variables d'environnement pour le module
- Documentation de déploiement : DOCKER_DEPLOYMENT.md
- Volumes ajoutés pour
-
Documentation
- README_PERIPHERALS.md - Guide complet
- docs/PERIPHERALS_MODULE_SPECIFICATION.md - Spécifications
- DOCKER_DEPLOYMENT.md - Déploiement
-
Dépendances
Pillow==10.2.0- Traitement d'imagesqrcode[pil]==7.4.2- Génération QR codesPyYAML==6.0.1- Configuration YAML
Changed
- docker-compose.yml - Ajout volumes et variables pour périphériques
- .env.example - Variables du module périphériques
- README.md - Documentation du module
- 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
- 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 → 100000cpu.score_single: 10000 → 50000cpu.score_multi: 10000 → 100000memory.score: 10000 → 100000disk.score: 10000 → 50000network.score: 10000 → 100000gpu.score: 10000 → 50000global_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
- 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')
{
"name": "eth0",
"type": "ethernet",
"wake_on_lan": true
}
2. Statistiques RAM détaillées
- Fichier : script_test.sh:298-303 et script_test.sh:367-385
- 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
{
"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
- 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.
# Sur le serveur 10.0.0.50
iperf3 -s
{
"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
-
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 totalespower_cycle_count: Nombre de démarrages/arrêtsreallocated_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 cellulestotal_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
{
"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
- 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/sbinet/sbinau PATH (script_test.sh:30)- Résout le problème de détection de
dmidecode,smartctl,ethtool
- Résout le problème de détection de
Format JSON mis à jour
{
"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
- Serveur iperf3 : Assurez-vous que
iperf3 -stourne sur 10.0.0.50 avant de lancer le script - Permissions : Le script nécessite
sudopour dmidecode, smartctl, ethtool - Durée : Le script prend environ 3-4 minutes (10s iperf3 upload + 10s download + 30s disk)
Commande de test
# 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 .