# TODO IPWatch - Fonctionnalités à développer

## 🔧 Correctifs immédiats

### 1. ✅ Fuseau horaire Europe/Paris
**Statut :** Terminé
- Remplacé tous les `datetime.utcnow()` par `datetime.now()`
- Le container utilise déjà `TZ=Europe/Paris` dans docker-compose.yml

### 2. Section "autres" manquante dans subnets
**Problème :** Le fichier `IPGridTree.vue` (ligne 96-99) contient des subnets en dur sans "autres"
**Solution :**
- Charger dynamiquement les subnets depuis l'API `/api/config/options`
- Ajouter la section "autres" (10.0.3.0/24) dans la liste

### 3. Alerte changement MAC address
**Problème :** Pas de détection quand une IP change de MAC address
**Couleur proposée :** Orange Monokai (#FD971F) - avertissement
**Solution :**
- Lors du scan, comparer la MAC détectée avec celle en DB
- Si différente (et MAC DB non vide), marquer l'IP avec état "mac_changed"
- Modifier IPCell.vue pour afficher la bordure orange
- Ajouter dans la légende : "MAC modifiée (attention)"

---

## 🚀 Nouvelle fonctionnalité : Wake-on-LAN

### Objectif
Permettre d'allumer/éteindre des machines depuis l'interface IPWatch avec un popup dédié.

### Analyse technique

#### 1. Configuration (config.yaml)
Ajouter une nouvelle section `wakeonlan` :

```yaml
wakeonlan:
  enabled: true
  refresh_interval: 10  # Actualisation état toutes les 10 secondes dans le popup
  machines:
    - name: "Serveur Proxmox"
      ip: "10.0.0.10"
      mac: "AA:BB:CC:DD:EE:FF"
      switch_on:
        enabled: true
        method: "wol"  # wake-on-lan magicpacket
      switch_off:
        enabled: true
        method: "ssh"  # ou "api", "none"
        command: "sudo poweroff"
        user: "root"
        port: 22
    - name: "PC Bureau"
      ip: "10.0.1.50"
      mac: "11:22:33:44:55:66"
      switch_on:
        enabled: true
        method: "wol"
      switch_off:
        enabled: false  # Pas d'extinction à distance
```

**Paramètres détaillés :**
- `name` : Nom affiché dans l'interface
- `ip` : Adresse IP de la machine
- `mac` : Adresse MAC (obligatoire pour WOL)
- `switch_on.enabled` : Activer le bouton "Allumer"
- `switch_on.method` : Toujours "wol" (magic packet)
- `switch_off.enabled` : Activer le bouton "Éteindre"
- `switch_off.method` : "ssh", "api", "none"
- `switch_off.command` : Commande à exécuter (pour SSH)
- `switch_off.user` : Utilisateur SSH
- `switch_off.port` : Port SSH (défaut 22)

#### 2. Base de données (models/wol.py - NOUVEAU)
Créer une table pour logger l'historique des actions WOL :

```python
class WOLHistory(Base):
    __tablename__ = "wol_history"

    id = Column(Integer, primary_key=True)
    machine_name = Column(String, nullable=False)
    ip = Column(String, nullable=False)
    mac = Column(String, nullable=False)
    action = Column(String, nullable=False)  # "power_on", "power_off"
    status = Column(String, nullable=False)  # "success", "failed", "timeout"
    timestamp = Column(DateTime, default=datetime.now)
    error_message = Column(String, nullable=True)
```

**Pas besoin de modifier la table IP** - Les infos WOL restent dans config.yaml

#### 3. Backend (routers/wol.py - NOUVEAU)
Endpoints à créer :

```python
# GET /api/wol/machines
# Retourne la liste des machines WOL depuis config.yaml avec leur état actuel

# POST /api/wol/power-on/{machine_name}
# Envoie un magic packet WOL

# POST /api/wol/power-off/{machine_name}
# Exécute la commande d'extinction (SSH/API selon config)

# GET /api/wol/status/{machine_name}
# Vérifie l'état (online/offline) via ping

# GET /api/wol/history
# Retourne l'historique des actions WOL
```

**Bibliothèque Python :** `wakeonlan` (à ajouter dans requirements.txt)

#### 4. Frontend - Popup WOL (components/WOLPopup.vue - NOUVEAU)

**Interface :**
```
┌─────────────────────────────────────────┐
│  Wake-on-LAN Manager              [✕]   │
├─────────────────────────────────────────┤
│  🔄 Dernière actualisation: 12:34:56    │
├─────────────────────────────────────────┤
│                                          │
│  📟 Serveur Proxmox                     │
│  • IP: 10.0.0.10                        │
│  • État: 🟢 En ligne                    │
│  [💡 Allumer] [🔴 Éteindre]             │
│                                          │
│  ─────────────────────────────────────  │
│                                          │
│  📟 PC Bureau                           │
│  • IP: 10.0.1.50                        │
│  • État: ⚫ Hors ligne                  │
│  [💡 Allumer] [Éteindre désactivé]      │
│                                          │
└─────────────────────────────────────────┘
```

**Fonctionnalités :**
- Actualisation automatique de l'état toutes les X secondes (config)
- Affichage horodatage dernière actualisation
- Boutons désactivés si action en cours
- Feedback visuel (spinner, couleur) pendant l'action
- Message d'erreur si échec

#### 5. Frontend - Bouton d'ouverture (AppHeader.vue)
Ajouter un bouton dans le header à côté du bouton "Scan" :

```vue
<button
  @click="openWOLPopup"
  class="px-4 py-2 bg-monokai-orange text-monokai-bg rounded hover:bg-monokai-yellow"
>
  💡 Wake-on-LAN
</button>
```

#### 6. Services backend (services/wol.py - NOUVEAU)

**Fonctions à implémenter :**

```python
async def send_magic_packet(mac: str, ip: str = None, port: int = 9):
    """Envoie un magic packet WOL"""
    # Utiliser la lib wakeonlan

async def power_off_ssh(ip: str, user: str, command: str, port: int = 22):
    """Extinction via SSH"""
    # Utiliser asyncssh ou subprocess

async def check_machine_status(ip: str) -> bool:
    """Vérifie si machine online via ping"""
    # Réutiliser NetworkScanner.ping()
```

### Plan d'implémentation (ordre recommandé)

1. **Backend - Configuration**
   - Ajouter section `wakeonlan` dans config.yaml
   - Mettre à jour config_manager pour parser cette section
   - Créer endpoint `/api/wol/config` pour récupérer la config WOL

2. **Backend - Base de données**
   - Créer modèle `WOLHistory`
   - Générer migration (si utilisé) ou créer table automatiquement

3. **Backend - Service WOL**
   - Installer lib `wakeonlan`
   - Créer `services/wol.py` avec send_magic_packet, power_off_ssh, check_status

4. **Backend - Endpoints**
   - Créer `routers/wol.py`
   - Implémenter tous les endpoints listés ci-dessus
   - Ajouter logs dans WOLHistory

5. **Frontend - Store**
   - Créer `stores/wolStore.js` pour gérer état WOL

---

## 🧭 Architecture réseau (à venir)

### Objectif
Créer une vue dédiée pour modéliser l’arbre réseau de l’installation.

### Premiers éléments
- [ ] Bouton "Architecture réseau" dans le header
- [ ] Page `/architecture` avec squelette (header + colonnes Édition / Action)
- [ ] Définir le modèle de données de l’arbre réseau
- [ ] Ajouter des outils d’édition (nœuds, liens, positions)

---

## 🧪 Tests réseau (à venir)

### Objectif
Proposer des tests réseau (ping, traceroute, DNS) depuis l’interface.

### Premiers éléments
- [ ] Bouton "Test" dans le header
- [ ] Page `/test` avec squelette (Commandes / Test / Historique)
- [ ] Définir les types de tests et la sauvegarde d’historique
   - Actions : fetchMachines, powerOn, powerOff, refreshStatus

6. **Frontend - Popup**
   - Créer `components/WOLPopup.vue`
   - Implémenter UI avec liste des machines
   - Actualisation auto avec setInterval
   - Gestion des états (loading, success, error)

7. **Frontend - Intégration**
   - Ajouter bouton dans AppHeader.vue
   - Gérer ouverture/fermeture popup
   - WebSocket pour notifications temps réel (optionnel)

### Dépendances Python à ajouter
```txt
wakeonlan==3.0.0
asyncssh==2.13.2  # Pour extinction SSH
```

### Sécurité
- **SSH** : Utiliser authentification par clé (pas de mot de passe)
- **API** : Token d'authentification si extinction via API REST
- **Validation** : Vérifier que l'IP/MAC existent dans la config avant action

### Tests
- Test magic packet envoyé correctement
- Test extinction SSH fonctionne
- Test détection état online/offline
- Test historique enregistré en DB
- Test UI : boutons désactivés pendant action

---

## 📝 Notes
- Le WOL fonctionne uniquement sur le réseau local
- La machine cible doit avoir WOL activé dans le BIOS
- Pour l'extinction SSH, nécessite configuration SSH sans mot de passe (clé publique)
- alternatice service mqtt pour le shutdown



### autre implementation:

ajouter dans la base de donnée une section notes d estyle markdown, qui permet d'ajouter des notes styles: users et passwords et autres remarques

### Architecture
- Étudier migration vers IndexedDB si l’app devient lente (cache local + sync backend).
