---
name: gomonitoring-wizard
description: Guide de développement pour GoMonitoring. Aide à la création de collecteurs SSH (Linux/Windows), à l'utilisation du chiffrement AES-256-GCM et au respect des standards de performance (concurrence) du projet.
---

# 🧙 GoMonitoring Wizard

Cette skill fournit les modèles de code et les flux de travail pour étendre GoMonitoring en toute sécurité.

## 📡 Création d'un Collecteur SSH

Tous les collecteurs doivent supporter Linux (Bash) et Windows (PowerShell) si applicable.

### Modèle de Collecteur (`collectors/mon_service.go`)

```go
func CollectMonServiceInfo(client ssh.SSHExecutor, osType string) (models.MyInfo, error) {
	if osType == "windows" {
		return collectInfoWindows(client)
	}
	return collectInfoLinux(client)
}

func collectInfoLinux(client ssh.SSHExecutor) (models.MyInfo, error) {
	// Utiliser des commandes POSIX standards
	out, err := client.Execute("cat /proc/something | grep ...")
	// ... parsing ...
}

func collectInfoWindows(client ssh.SSHExecutor) (models.MyInfo, error) {
	// Utiliser Get-CimInstance pour la performance (WMI est plus lent)
	out, err := client.Execute(`powershell -Command "(Get-CimInstance Win32_Something).Property"`)
	// ... parsing ...
}
```

## 🔒 Sécurité et Chiffrement

### Chiffrer un secret (ex: mot de passe SSH)
Toujours utiliser `pkg/crypto`. La clé maître est récupérée via la variable d'environnement `GO_MONITORING_MASTER_KEY`.

```go
import "go-monitoring/pkg/crypto"

// Chiffrement
encrypted, err := crypto.Encrypt("mon-secret")

// Déchiffrement
decrypted, err := crypto.Decrypt(encrypted)
```

### Validation des commandes
Avant d'exécuter une commande SSH dynamique, la valider avec `pkg/security` pour éviter les injections.

## ⚡ Concurrence et Performance

La collecte sur plusieurs machines doit TOUJOURS être parallèle.

```go
var wg sync.WaitGroup
for _, machine := range machines {
    wg.Add(1)
    go func(m config.MachineConfig) {
        defer wg.Done()
        // Collecte avec timeout court (ex: 5-10s)
    }(machine)
}
wg.Wait()
```

## 🎨 Mise à jour du Frontend

Si vous modifiez un fichier dans `frontend/src/` :
1. Testez avec `npm run dev` (proxy configuré vers `:8080`).
2. Build obligatoire : `npm run build` pour mettre à jour `static/dist/`.
3. Vérifiez que les templates Go (`templates/*.html`) pointent vers les bons assets hashés si nécessaire.

## 📝 Journal d'Audit
Toute action d'administration (modification de config, action sur un service distant) doit être logguée :
`storage.SaveAudit(db, username, machineID, action, "Détails...")`
