# 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 ``` #### 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).