# Feature: Import USB avec informations structurées ## Vue d'ensemble Import de périphériques USB à partir d'informations structurées (format texte avec champs identifiés). Contrairement à l'import `lsusb -v` qui nécessite la sortie brute de la commande, cet import accepte des informations formatées provenant d'outils GUI ou de sorties pré-traitées. ## Format d'entrée supporté ### Format texte structuré (français) ``` Bus : 003 Device : 040 Vendor ID : 0x2b89 Product ID : 0x8761 Vendor string : Realtek Product string : Bluetooth Radio Numéro de série : 00E04C239987 Vitesse négociée : Full Speed (12 Mbps) Version USB déclarée : USB 1.10 (bcdUSB 1.10) Classe périphérique : 224 → Wireless Sous-classe périphérique : 1 → Radio Frequency Protocole périphérique : 1 → Bluetooth Puissance maximale déclarée : 500 mA Mode d'alimentation : Self Powered Interface 0 Classe interface : 224 → Wireless ... ``` ## Avantages par rapport à lsusb -v | Aspect | lsusb -v | Info structurée | |--------|----------|-----------------| | **Format** | Sortie brute complète | Informations sélectionnées | | **Source** | Commande CLI uniquement | CLI, GUI, outils tiers | | **Taille** | Très volumineuse | Plus compacte | | **Lisibilité** | Difficile (sortie brute) | Facile (formaté) | | **Stockage CLI** | Markdown brut | **YAML structuré** | ## Workflow utilisateur 1. **Obtenir les informations USB** depuis : - Un outil GUI (gestionnaire de périphériques) - Une sortie formatée d'un script - Un export d'un autre système 2. **Cliquer sur "Importer USB (Info)"** 3. **Coller les informations** dans la zone de texte 4. **Cliquer "Importer"** 5. **Le système :** - ✅ Parse les informations - ✅ Extrait les champs généraux (nom, marque, numero_serie) - ✅ **Détecte automatiquement type_principal et sous_type** - ✅ Formate TOUTES les infos en **YAML structuré** pour le champ `cli` - ✅ Vérifie si le périphérique existe déjà - ✅ Pré-remplit le formulaire 6. **Utilisateur complète et enregistre** ## Extraction des champs ### Champs généraux (formulaire) Extraits automatiquement : - **`nom`** ← `Product string` ou `iProduct` - **`marque`** ← `Vendor string` ou `iManufacturer` - **`numero_serie`** ← `Numéro de série` (si présent) ### Caractéristiques spécifiques (JSON) Pour recherche et filtrage : ```json { "vendor_id": "0x2b89", "product_id": "0x8761", "usb_version": "USB 1.10", "vitesse_negociee": "Full Speed (12 Mbps)", "device_class": "224", "device_class_nom": "Wireless", "device_subclass": "1", "device_subclass_nom": "Radio Frequency", "device_protocol": "1", "device_protocol_nom": "Bluetooth", "max_power": "500 mA", "power_mode": "Self Powered" } ``` ### Section CLI (YAML structuré) **TOUTES** les informations en format YAML pour une vue complète : ```yaml # Informations USB extraites bus: '003' device: '040' identification: vendor_id: '0x2b89' product_id: '0x8761' vendor_string: Realtek product_string: Bluetooth Radio numero_serie: 00E04C239987 usb: version: USB 1.10 vitesse_negociee: Full Speed (12 Mbps) classe: device_class: '224' device_class_nom: Wireless device_subclass: '1' device_subclass_nom: Radio Frequency device_protocol: '1' device_protocol_nom: Bluetooth alimentation: max_power: 500 mA power_mode: Self Powered interfaces: - numero: 0 classe: code: '224' nom: Wireless sous_classe: code: '1' nom: Radio Frequency protocole: code: '1' nom: Bluetooth nombre_endpoints: 3 endpoints: - adresse: '0x81' direction: IN type_transfert: Interrupt taille_max_paquet: 16 intervalle: 1 - adresse: '0x02' direction: OUT type_transfert: Bulk taille_max_paquet: 64 ``` ## Détection automatique du type Le système utilise le même classificateur intelligent que l'import lsusb : **Exemple 1 : Bluetooth** ``` Classe périphérique : 224 → Wireless Protocole périphérique : 1 → Bluetooth ``` → **Détecté : `type_principal = "Bluetooth"`, `sous_type = "Autre"`** **Exemple 2 : Clé USB** ``` Classe périphérique : 0 [unknown] Classe interface : 8 → Mass Storage Product string : SanDisk 3.2Gen1 ``` → **Détecté : `type_principal = "Stockage"`, `sous_type = "Clé USB"`** **Exemple 3 : Disque dur externe** ``` Classe interface : 8 → Mass Storage Product string : My Passport 25A2 ``` → **Détecté : `type_principal = "Stockage"`, `sous_type = "Disque dur externe"`** ## API Endpoint ### POST /api/peripherals/import/usb-structured **Request:** ``` POST /api/peripherals/import/usb-structured Content-Type: multipart/form-data usb_info: ``` **Response (nouveau périphérique):** ```json { "success": true, "already_exists": false, "suggested_peripheral": { "nom": "Bluetooth Radio", "marque": "Realtek", "numero_serie": "00E04C239987", "type_principal": "Bluetooth", "sous_type": "Autre", "cli": "# Informations USB\n\n## Données structurées (YAML)\n\n```yaml\n...\n```\n\n## Sortie brute\n\n```\n...\n```", "caracteristiques_specifiques": { "vendor_id": "0x2b89", "product_id": "0x8761", ... } }, "parsed_data": { "bus": "003", "device": "040", ... } } ``` **Response (périphérique existant):** ```json { "success": true, "already_exists": true, "existing_peripheral_id": 42, "existing_peripheral": { "id": 42, "nom": "Bluetooth Radio", "marque": "Realtek", ... } } ``` ## Fichiers modifiés ### Backend #### 1. Parser USB structuré - `backend/app/utils/usb_info_parser.py` (NOUVEAU) Fonctions principales : - `parse_structured_usb_info()` - Parse le texte structuré - `extract_interfaces()` - Extrait les interfaces - `extract_endpoints()` - Extrait les endpoints - `format_cli_as_yaml()` - Formate en YAML - `create_full_cli_section()` - Crée la section CLI complète (YAML + raw) #### 2. API Endpoint - `backend/app/api/endpoints/peripherals.py` **Ligne 29** - Import du parser : ```python from app.utils.usb_info_parser import parse_structured_usb_info, create_full_cli_section ``` **Ligne 865-972** - Nouvel endpoint `/import/usb-structured` : - Parse les informations structurées - Classification intelligente du type - Détection des doublons - Retour des données suggérées avec CLI en YAML ### Frontend #### 1. HTML - `frontend/peripherals.html` **Ligne 67-69** - Nouveau bouton dans la toolbar : ```html ``` **Ligne 342-376** - Nouveau modal `modal-import-usb-structured` : - Instructions - Zone de texte grande (20 lignes) - Placeholder avec exemple - Boutons Annuler/Importer #### 2. JavaScript - `frontend/js/peripherals.js` **Ligne 310-314** - Fonction d'affichage du modal : ```javascript function showImportUSBStructuredModal() { document.getElementById('form-import-usb-structured').reset(); document.getElementById('modal-import-usb-structured').style.display = 'block'; } ``` **Ligne 501-583** - Fonction d'import : ```javascript async function importUSBStructured(event) { // 1. Appel API // 2. Gestion doublon // 3. Pré-remplissage formulaire // 4. Pré-sélection type_principal et sous_type } ``` ## Exemples d'utilisation ### Exemple 1 : Import Bluetooth Realtek **Input :** ``` Bus : 003 Device : 040 Vendor ID : 0x2b89 Product ID : 0x8761 Vendor string : Realtek Product string : Bluetooth Radio Numéro de série : 00E04C239987 Vitesse négociée : Full Speed (12 Mbps) Version USB déclarée : USB 1.10 (bcdUSB 1.10) Classe périphérique : 224 → Wireless Sous-classe périphérique : 1 → Radio Frequency Protocole périphérique : 1 → Bluetooth Puissance maximale déclarée : 500 mA Mode d'alimentation : Self Powered ``` **Résultat :** - `nom` = "Bluetooth Radio" - `marque` = "Realtek" - `type_principal` = "Bluetooth" (détecté) - `sous_type` = "Autre" (détecté) - `cli` = YAML structuré + sortie brute ### Exemple 2 : Import Clé USB SanDisk **Input :** ``` Bus : 004 Device : 005 Vendor ID : 0x0781 Product ID : 0x55ab Vendor string : SanDisk Corp. Product string : SanDisk 3.2Gen1 Vitesse négociée : SuperSpeed (5 Gbps) Version USB déclarée : USB 3.20 (bcdUSB 3.20) Classe périphérique : 0 [unknown] Puissance maximale déclarée : 896 mA Mode d'alimentation : Bus Powered Interface 0 Classe interface : 8 → Mass Storage Sous-classe interface : 6 → SCSI Protocole interface : 80 → Bulk-Only ``` **Résultat :** - `nom` = "SanDisk 3.2Gen1" - `marque` = "SanDisk Corp." - `type_principal` = "Stockage" (détecté via classe 8) - `sous_type` = "Clé USB" (détecté via mots-clés) - `cli` = YAML avec interfaces et endpoints ## Comparaison des 3 méthodes d'import | Méthode | Source | Complexité | Format CLI | Cas d'usage | |---------|--------|------------|------------|-------------| | **lsusb -v** | Commande CLI | 2 étapes (sélection) | Markdown brut | Système Linux avec accès terminal | | **Info structurée** | Texte formaté | 1 étape (direct) | **YAML + brut** | Outils GUI, exports, documentation | | **Markdown (.md)** | Fichier | 1 étape (upload) | Stocké dans `synthese` | Spécifications existantes | ## Avantages de cette approche ✅ **Format YAML exploitable** - Facile à parser, requêter, afficher ✅ **Vue complète** - YAML structuré + sortie brute préservée ✅ **Détection automatique** - Type et sous-type détectés intelligemment ✅ **Flexible** - Accepte différentes sources d'information ✅ **Organisé** - Informations groupées logiquement (identification, USB, classe, alimentation, interfaces, endpoints) ✅ **Extensible** - Facile d'ajouter de nouveaux champs parsés ## Limitations ⚠️ **Format français uniquement** - Les patterns regex sont en français ⚠️ **Champs optionnels** - Si un champ manque, il n'apparaîtra pas dans le YAML ⚠️ **Numéro de série** - Peut être très long (hash pour certains périphériques) ## Améliorations futures 1. **Support multilingue** - Patterns en anglais + français 2. **Validation** - Vérifier la cohérence des données 3. **Templates** - Proposer des templates pour différents outils 4. **Export** - Générer le format structuré depuis une fiche existante 5. **Comparaison** - Comparer deux CLI YAML (avant/après)