Files
ipwatch/todo.md
2026-02-07 16:57:37 +01:00

273 lines
9.0 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 larbre réseau de linstallation.
### 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 larbre 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 linterface.
### Premiers éléments
- [ ] Bouton "Test" dans le header
- [ ] Page `/test` avec squelette (Commandes / Test / Historique)
- [ ] Définir les types de tests et la sauvegarde dhistorique
- 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 lapp devient lente (cache local + sync backend).