This commit is contained in:
2026-02-07 16:57:37 +01:00
parent 8383104454
commit dff1b03e42
129 changed files with 19769 additions and 0 deletions

272
todo.md Executable file
View File

@@ -0,0 +1,272 @@
# 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).