273 lines
9.0 KiB
Markdown
Executable File
273 lines
9.0 KiB
Markdown
Executable File
# 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).
|