ipwatch
This commit is contained in:
272
todo.md
Executable file
272
todo.md
Executable 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 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).
|
||||
Reference in New Issue
Block a user