7.9 KiB
Session 2026-01-05 - Améliorations de l'import PCI
Contexte
Suite à l'implémentation de l'import PCI, l'utilisateur a testé avec ses périphériques réels:
- NVMe SSD: Micron/Crucial Technology P2/P3/P3 Plus NVMe PCIe SSD
- Carte graphique: NVIDIA GeForce RTX 3060 Lite Hash Rate (Gigabyte)
Problèmes identifiés
1. Parsing incorrect du vendor/device name
Problème initial:
Description: "Micron/Crucial Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD"
├─ Vendor: "Micron/Crucial" ❌ (incomplet)
└─ Device: "Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD" ❌ (incorrect)
Description: "NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate]"
├─ Vendor: "NVIDIA" ❌ (incomplet)
└─ Device: "Corporation GA106 [GeForce RTX 3060 Lite Hash Rate]" ❌ (incorrect)
Le parser divisait simplement sur le premier espace, ce qui ne fonctionnait pas avec les vendor names multi-mots.
Solution implémentée:
Nouvelle fonction _split_vendor_device() dans lspci_parser.py qui détecte les suffixes de vendor:
- Corporation
- Technology
- Semiconductor
- Co., Ltd.
- Inc.
- GmbH
- AG
def _split_vendor_device(description: str) -> Tuple[str, str]:
vendor_suffixes = [
r'\bCo\.,?\s*Ltd\.?',
r'\bCorporation\b',
r'\bTechnology\b',
r'\bSemiconductor\b',
# ... autres patterns
]
# Trouve le suffixe et divise à sa fin
Résultat:
✅ NVMe:
Vendor: "Micron/Crucial Technology"
Device: "P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less)"
✅ GPU:
Vendor: "NVIDIA Corporation"
Device: "GA106 [GeForce RTX 3060 Lite Hash Rate]"
2. Device name contenait prog-if et revision
Problème:
Device: "P2 [Nick P2] / P3 Plus NVMe PCIe SSD (prog-if 02 [NVM Express])"
Solution: Nettoyage du device_name après extraction:
# Clean prog-if from device_name
result["device_name"] = re.sub(r'\s*\(prog-if\s+[0-9a-fA-F]+\s*\[[^\]]+\]\)', '', result["device_name"])
Résultat:
✅ Device: "P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less)"
3. Extraction incorrecte de la marque et du modèle
Problème:
- Marque: vendor name complet au lieu du premier mot
- Modèle: device name complet au lieu du nom commercial
Solution:
Nouvelle fonction extract_brand_model() dans lspci_parser.py:
def extract_brand_model(vendor_name: str, device_name: str, device_class: str) -> Tuple[str, str]:
# Extract brand (first word of vendor, before /)
brand = vendor_name.split()[0] if vendor_name else ""
if '/' in brand:
brand = brand.split('/')[0] # "Micron/Crucial" -> "Micron"
# For GPUs: use bracket content
if 'vga' in device_class.lower():
# "GA106 [GeForce RTX 3060]" -> "GeForce RTX 3060"
bracket_content = extract_from_brackets(device_name)
model = bracket_content
# For NVMe: clean brackets and combine
elif 'nvme' in device_class.lower():
# "P2 [Nick P2] / P3 / P3 Plus NVMe SSD"
# -> "P2/P3/P3 Plus NVMe PCIe SSD"
cleaned = remove_brackets(device_name)
model = cleaned
Résultats:
✅ NVMe:
Marque: "Micron"
Modèle: "P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less)"
Nom: "Micron P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less)"
✅ GPU:
Marque: "NVIDIA"
Modèle: "GeForce RTX 3060 Lite Hash Rate"
Nom: "NVIDIA GeForce RTX 3060 Lite Hash Rate"
4. Fabricant de la carte graphique non extrait
Problème: Pour les GPU, le subsystem contient le fabricant de la carte (Gigabyte, ASUS, MSI, etc.) mais n'était pas extrait.
Solution:
Ajout dans l'endpoint /import/pci/extract:
# For GPUs, extract card manufacturer from subsystem
if sous_type == "Carte graphique" and device_info.get("subsystem"):
subsystem_parts = device_info["subsystem"].split()
if subsystem_parts:
card_manufacturer = subsystem_parts[0]
if card_manufacturer.lower() not in ["device", "subsystem"]:
suggested["fabricant"] = card_manufacturer
Résultat:
✅ GPU:
Marque: "NVIDIA" (chipset manufacturer)
Fabricant: "Gigabyte" (card manufacturer)
Modèle: "GeForce RTX 3060 Lite Hash Rate"
Fichiers modifiés
1. /backend/app/utils/lspci_parser.py
Nouvelles fonctions:
extract_brand_model()- Extraction intelligente marque/modèle_split_vendor_device()- Division vendor/device basée sur suffixes
Améliorations:
- Nettoyage du
prog-ifdans device_name - Meilleure extraction du vendor name
2. /backend/app/api/endpoints/peripherals.py
Import ajouté:
from app.utils.lspci_parser import extract_brand_model
Amélioration de la construction du peripheral suggéré:
# Extract brand and model
brand, model = extract_brand_model(
device_info.get("vendor_name", ""),
device_info.get("device_name", ""),
device_info.get("device_class", "")
)
# Build name
nom = f"{brand} {model}".strip()
suggested = {
"nom": nom,
"marque": brand,
"modele": model,
# ... autres champs
}
# For GPUs, add card manufacturer
if sous_type == "Carte graphique":
suggested["fabricant"] = extract_from_subsystem()
Résultats des tests
Test NVMe - Micron/Crucial P2/P3
{
"nom": "Micron P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less)",
"type_principal": "PCI",
"sous_type": "SSD NVMe",
"marque": "Micron",
"modele": "P2/P3/P3 Plus NVMe PCIe SSD (DRAM-less)",
"pci_device_id": "c0a9:5407",
"caracteristiques_specifiques": {
"slot": "01:00.0",
"device_class": "Non-Volatile memory controller",
"vendor_name": "Micron/Crucial Technology",
"subsystem": "Micron/Crucial Technology P2 [Nick P2] / P3 / P3 Plus NVMe PCIe SSD (DRAM-less)",
"driver": "nvme",
"iommu_group": "14",
"revision": "01",
"modules": "nvme"
}
}
Test GPU - NVIDIA RTX 3060
{
"nom": "NVIDIA GeForce RTX 3060 Lite Hash Rate",
"type_principal": "PCI",
"sous_type": "Carte graphique",
"marque": "NVIDIA",
"modele": "GeForce RTX 3060 Lite Hash Rate",
"pci_device_id": "10de:2504",
"fabricant": "Gigabyte",
"caracteristiques_specifiques": {
"slot": "08:00.0",
"device_class": "VGA compatible controller",
"vendor_name": "NVIDIA Corporation",
"subsystem": "Gigabyte Technology Co., Ltd Device 4074",
"driver": "nvidia",
"iommu_group": "16",
"revision": "a1",
"modules": "nvidia"
}
}
Workflow complet de l'import PCI
- Détection: Utilisateur colle
lspci -vetlspci -ndans la modale - Parsing: Backend détecte tous les périphériques avec slots
- Sélection: Frontend affiche les périphériques avec checkboxes
- Queue: Périphériques sélectionnés ajoutés à
window.pciImportQueue - Import séquentiel: Pour chaque périphérique:
- Backend extrait et classifie
- Détecte les doublons
- Construit le peripheral suggéré avec marque/modèle
- Frontend ouvre la modale d'ajout pré-remplie
- Utilisateur valide/modifie
- Sauvegarde et passe au suivant automatiquement
Améliorations futures possibles
- Base de données PCI IDs: Intégrer une base pour résoudre les vendor:device IDs en noms
- Photos automatiques: Rechercher des photos de produits via API (Google Images, etc.)
- Détection de specs: Extraire RAM pour GPU, capacité pour NVMe depuis autres sources
- Import groupé: Option pour importer tous les périphériques sélectionnés sans validation individuelle
Conclusion
✅ Le parsing PCI est maintenant intelligent et extrait correctement:
- Vendor names multi-mots (Corporation, Technology, Co., Ltd.)
- Device names nettoyés (sans prog-if, rev)
- Marques commerciales (premier mot du vendor)
- Modèles commerciaux (contenu des brackets pour GPU, nettoyé pour storage)
- Fabricant de carte (pour GPU, depuis subsystem)
Les périphériques importés auront des noms propres et exploitables pour l'inventaire.