# Filtrage des périphériques système PCI

## Contexte

Lors de l'import de périphériques via `lspci`, de nombreux périphériques système sont détectés:
- **Host bridges**: Ponts système entre CPU et bus PCI
- **PCI bridges**: Ponts internes entre bus PCI
- **ISA bridges**: Ponts vers le bus ISA (legacy)
- **SMBus**: Contrôleurs de bus système
- **IOMMU**: Contrôleurs de gestion mémoire
- **Signal processing controllers**: Contrôleurs de traitement du signal
- Autres périphériques d'infrastructure système

Ces périphériques ne sont **généralement pas pertinents pour un inventaire** car:
- Ils sont intégrés à la carte mère
- Ils ne peuvent pas être retirés ou remplacés individuellement
- Ils ne représentent pas du matériel "inventoriable"
- Ils polluent la liste des périphériques à importer

## Solution implémentée

### Option de filtrage activée par défaut

Un paramètre `exclude_system_devices` a été ajouté pour filtrer automatiquement ces périphériques.

**Par défaut: `True`** (filtrage activé)

### Backend

#### 1. Parser - `lspci_parser.py`

Modification de la fonction `detect_pci_devices()`:

```python
def detect_pci_devices(
    lspci_output: str,
    exclude_system_devices: bool = True
) -> List[Dict[str, str]]:
    """
    Detect all PCI devices from lspci -v output.

    Args:
        exclude_system_devices: If True (default), exclude system infrastructure
    """
    # System device classes to exclude
    SYSTEM_DEVICE_CLASSES = [
        "Host bridge",
        "PCI bridge",
        "ISA bridge",
        "SMBus",
        "IOMMU",
        "Signal processing controller",
        "System peripheral",
        "RAM memory",
        "Non-Essential Instrumentation",
    ]

    # ... parsing logic ...

    if exclude_system_devices:
        is_system_device = any(
            sys_class.lower() in device_class.lower()
            for sys_class in SYSTEM_DEVICE_CLASSES
        )
        if is_system_device:
            continue  # Skip this device
```

#### 2. API Endpoint - `peripherals.py`

Ajout du paramètre dans l'endpoint `/import/pci/detect`:

```python
@router.post("/import/pci/detect")
async def detect_pci_peripherals(
    lspci_output: str = Form(...),
    lspci_n_output: Optional[str] = Form(None),
    exclude_system_devices: bool = Form(
        True,
        description="Exclude system infrastructure devices"
    )
):
    devices = detect_pci_devices(
        lspci_output,
        exclude_system_devices=exclude_system_devices
    )
```

### Frontend

#### 1. HTML - `peripherals.html`

Ajout d'une checkbox dans la modale d'import PCI:

```html
<div class="form-group">
    <label>
        <input type="checkbox" id="pci-exclude-system" checked>
        <span>Ignorer les périphériques système (PCI bridge, Host bridge, SMBus, IOMMU, etc.)</span>
    </label>
    <small>
        Par défaut, les ponts système et contrôleurs internes sont exclus
        car ils ne sont généralement pas pertinents pour l'inventaire.
    </small>
</div>
```

#### 2. JavaScript - `peripherals.js`

Envoi du paramètre dans la requête:

```javascript
async function detectPCIDevices(event) {
    const excludeSystem = document.getElementById('pci-exclude-system').checked;

    const formData = new FormData();
    formData.append('lspci_output', lspciOutput);
    formData.append('exclude_system_devices', excludeSystem ? 'true' : 'false');

    // ... fetch API ...
}
```

## Résultats

### Exemple avec un système AMD Renoir

**Sans filtrage** (`exclude_system_devices=False`):
```
10 périphériques détectés:
  00:00.0  | Host bridge                    | AMD Renoir/Cezanne Root Complex
  00:01.0  | Host bridge                    | AMD Renoir PCIe Dummy Host Bridge
  00:02.0  | Host bridge                    | AMD Renoir PCIe Dummy Host Bridge
  00:08.0  | Host bridge                    | AMD Renoir PCIe Dummy Host Bridge
  00:08.1  | PCI bridge                     | AMD Renoir Internal PCIe GPP Bridge
  01:00.0  | Non-Volatile memory controller | Micron/Crucial P2/P3 NVMe SSD  ✅
  00:14.0  | SMBus                          | AMD FCH SMBus Controller
  00:18.0  | Host bridge                    | AMD Renoir Device 24: Function 0
  04:00.0  | Ethernet controller            | Realtek RTL8111/8168  ✅
  08:00.0  | VGA compatible controller      | NVIDIA GeForce RTX 3060  ✅
```

**Avec filtrage** (`exclude_system_devices=True`, défaut):
```
3 périphériques détectés:
  01:00.0  | Non-Volatile memory controller | Micron/Crucial P2/P3 NVMe SSD  ✅
  04:00.0  | Ethernet controller            | Realtek RTL8111/8168  ✅
  08:00.0  | VGA compatible controller      | NVIDIA GeForce RTX 3060  ✅
```

**Périphériques exclus**: 7 (5 Host bridges, 1 PCI bridge, 1 SMBus)

### Bénéfices

✅ **Réduction du bruit**: 70% de périphériques en moins dans la liste
✅ **Import plus rapide**: Moins de périphériques à parcourir
✅ **Meilleur inventaire**: Seuls les périphériques pertinents sont importés
✅ **Flexible**: L'utilisateur peut désactiver le filtre si besoin

## Types de périphériques système exclus

| Type | Description | Raison de l'exclusion |
|------|-------------|----------------------|
| **Host bridge** | Pont entre CPU et bus PCI | Intégré à la carte mère, non remplaçable |
| **PCI bridge** | Pont interne entre bus PCI | Infrastructure système, non pertinent |
| **ISA bridge** | Pont vers bus ISA (legacy) | Infrastructure système |
| **SMBus** | Bus de gestion système | Contrôleur interne, non inventoriable |
| **IOMMU** | Contrôleur de virtualisation mémoire | Fonction CPU/chipset |
| **Signal processing controller** | Contrôleur de traitement du signal | Généralement intégré |
| **System peripheral** | Périphérique système générique | Infrastructure |
| **RAM memory** | Contrôleur mémoire | Intégré au CPU/chipset |
| **Non-Essential Instrumentation** | Instrumentation système | Debugging/monitoring |

## Périphériques pertinents conservés

Ces types de périphériques sont **toujours conservés**:

- ✅ **Cartes graphiques** (VGA compatible controller, 3D controller)
- ✅ **Stockage** (Non-Volatile memory controller, SATA controller, RAID)
- ✅ **Réseau** (Ethernet controller, Network controller, Wireless)
- ✅ **Audio** (Audio device, Multimedia audio controller)
- ✅ **USB** (USB controller)
- ✅ **Contrôleurs série** (Serial controller)
- ✅ **Sécurité** (Encryption controller)
- ✅ **Autres périphériques** non système

## Utilisation

### Import normal (filtrage activé)

1. Ouvrir la modale d'import PCI
2. Coller la sortie de `lspci -v`
3. La checkbox "Ignorer les périphériques système" est **cochée par défaut**
4. Cliquer sur "Détecter les périphériques"
5. Seuls les périphériques pertinents sont affichés

### Import avec périphériques système (filtrage désactivé)

Si l'utilisateur a besoin d'importer des périphériques système:

1. **Décocher** la checkbox "Ignorer les périphériques système"
2. Tous les périphériques PCI seront détectés et affichables
3. Utile pour:
   - Inventaire technique complet
   - Debugging
   - Documentation système
   - Cas spécifiques

## Configuration

Le filtrage est configurable à deux niveaux:

### 1. Frontend (par import)
- Checkbox dans la modale
- État par défaut: **coché** (filtrage activé)
- L'utilisateur peut changer pour chaque import

### 2. Backend (par API)
- Paramètre `exclude_system_devices` (défaut: `True`)
- Peut être modifié par appel API direct
- Utilisé par le frontend

## Tests

### Test unitaire

```python
from app.utils.lspci_parser import detect_pci_devices

# Test avec filtrage
devices = detect_pci_devices(lspci_output, exclude_system_devices=True)
assert len(devices) == 3  # Seulement NVMe, Ethernet, GPU

# Test sans filtrage
devices_all = detect_pci_devices(lspci_output, exclude_system_devices=False)
assert len(devices_all) == 10  # Tous les périphériques
```

### Test d'intégration

Voir `/tmp/test_filtering.py` pour un test complet avec sortie lspci réelle.

## Améliorations futures possibles

1. **Liste personnalisable**: Permettre à l'utilisateur de définir quels types exclure
2. **Profils de filtrage**: Créer des profils (Inventaire, Technique, Complet, etc.)
3. **Filtrage intelligent**: Détecter automatiquement les périphériques inutiles
4. **Configuration globale**: Option pour définir le comportement par défaut
5. **Statistiques**: Afficher le nombre de périphériques exclus

## Conclusion

✅ Le filtrage des périphériques système PCI permet un import propre et pertinent
✅ Par défaut, seuls les périphériques inventoriables sont détectés
✅ L'utilisateur garde le contrôle avec l'option de désactivation
✅ Réduction significative du bruit (70% sur système AMD Renoir)
✅ Amélioration de l'expérience utilisateur pour l'import PCI
