secubox-openwrt/docs-fr/module-implementation-guide.md
CyberMind-FR ccfb58124c docs: Add trilingual documentation (French and Chinese translations)
Add complete French (fr) and Chinese (zh) translations for all documentation:

- Root files: README, CHANGELOG, SECURITY, BETA-RELEASE
- docs/: All 16 core documentation files
- DOCS/: All 19 deep-dive documents including embedded/ and archive/
- package/secubox/: All 123+ package READMEs
- Misc: secubox-tools/, scripts/, EXAMPLES/, config-backups/, streamlit-apps/

Total: 346 translation files created

Each file includes language switcher links for easy navigation between
English, French, and Chinese versions.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 10:00:18 +01:00

904 lines
29 KiB
Markdown

# Guide d'Implementation des Modules SecuBox
> **Langues:** [English](../docs/module-implementation-guide.md) | **Francais** | [中文](../docs-zh/module-implementation-guide.md)
**Version :** 1.0.0
**Derniere mise a jour :** 2025-12-28
**Statut :** Actif
**Objectif :** Guide complet pour regenerer les modules SecuBox correspondant a la demo live
---
## Voir aussi
- **Briefing d'automatisation :** [CODEX.md](codex.md)
- **Prompts de modules :** [FEATURE-REGENERATION-PROMPTS.md](feature-regeneration-prompts.md)
- **Modeles de code :** [CODE-TEMPLATES.md](code-templates.md)
- **Commandes rapides :** [QUICK-START.md](quick-start.md)
---
## Navigation rapide
- **[FEATURE-REGENERATION-PROMPTS.md](feature-regeneration-prompts.md)** - Specifications completes des fonctionnalites pour les 15 modules
- **[CODE-TEMPLATES.md](code-templates.md)** - Modeles de code prets a l'emploi et exemples d'implementation
- **[DEVELOPMENT-GUIDELINES.md](development-guidelines.md)** - Guide de developpement complet et systeme de design
- **[QUICK-START.md](quick-start.md)** - Reference rapide pour les taches courantes
- **[CLAUDE.md](claude.md)** - Reference du systeme de build et de l'architecture
---
## Apercu du document
Ce guide vous montre comment utiliser la documentation complete pour regenerer ou creer des modules SecuBox correspondant a la demo live sur **secubox.cybermood.eu**.
### Contenu
1. **Specifications fonctionnelles** - Exigences detaillees pour les 15 modules
2. **Modeles de code** - Exemples d'implementation fonctionnels
3. **Systeme de design** - Variables CSS, typographie, composants
4. **Outils de validation** - Tests automatises et corrections
5. **Scripts de deploiement** - Build local et deploiement distant
---
## Workflow d'implementation
### Etape 1 : Choisissez votre approche
**Option A : Utiliser Claude.ai pour la generation de code**
1. Ouvrez [claude.ai](https://claude.ai)
2. Copiez le prompt de module pertinent depuis [FEATURE-REGENERATION-PROMPTS.md](feature-regeneration-prompts.md)
3. Collez le prompt et demandez l'implementation
4. Claude generera tous les fichiers requis selon les modeles
5. Examinez et integrez le code genere
**Option B : Implementation manuelle avec les modeles**
1. Copiez les modeles depuis [CODE-TEMPLATES.md](code-templates.md)
2. Remplacez les placeholders par les valeurs specifiques au module
3. Implementez la logique specifique au module
4. Validez et testez
**Option C : Approche hybride (Recommandee)**
1. Utilisez Claude.ai pour la generation initiale du code
2. Affinez avec les modeles et les guidelines
3. Validez avec les outils automatises
4. Deployez et testez sur l'appareil cible
---
## Pas a pas : Regenerer un module avec Claude.ai
### Exemple : Regeneration du module System Hub
#### 1. Rassembler le contexte
Avant de prompter Claude, rassemblez ces ressources :
```bash
# Lire la specification du module
cat FEATURE-REGENERATION-PROMPTS.md | grep -A 200 "System Hub"
# Examiner le systeme de design
cat DEVELOPMENT-GUIDELINES.md | grep -A 100 "Design System"
# Verifier l'implementation existante (si disponible)
ls -la luci-app-system-hub/
```
#### 2. Preparer le prompt
Creez un prompt complet pour Claude.ai :
```
Je dois implementer le module System Hub pour le framework LuCI d'OpenWrt.
CONTRAINTES IMPORTANTES :
- OpenWrt utilise le framework LuCI (pas React/Vue)
- JavaScript utilise le pattern L.view.extend() (pas les modules ES6)
- Le backend est RPCD (scripts shell) communiquant via ubus
- Le CSS doit utiliser les variables de system-hub/common.css
- Tout le code doit etre pret pour la production et correspondre a la demo live
- Suivre exactement le systeme de design
EXIGENCES TECHNIQUES :
- Le script RPCD DOIT etre nomme : luci.system-hub
- Les chemins de menu DOIVENT correspondre aux emplacements des fichiers de vue
- Utiliser les variables CSS (--sh-*) pour toutes les couleurs
- Supporter le mode sombre avec [data-theme="dark"]
- Implementer une gestion d'erreur appropriee
- Ajouter des etats de chargement pour les operations asynchrones
DOCUMENTS DE REFERENCE :
1. Demo live : https://secubox.cybermood.eu/system-hub
2. Specification fonctionnelle : [coller depuis FEATURE-REGENERATION-PROMPTS.md]
3. Modeles de code : [coller les modeles pertinents de CODE-TEMPLATES.md]
Veuillez fournir :
1. Fichiers JavaScript de vue complets (overview.js, services.js, etc.)
2. Script RPCD backend (luci.system-hub)
3. Module API (system-hub/api.js)
4. Styles CSS (system-hub/dashboard.css)
5. Configuration JSON du menu
6. Configuration JSON des ACL
Assurez-vous que tout le code correspond au design visuel et aux fonctionnalites de la demo live.
```
#### 3. Generer le code
Collez votre prompt dans Claude.ai et laissez-le generer l'implementation.
#### 4. Examiner le code genere
Verifiez le code genere par rapport a ces exigences :
**Checklist du module API :**
- [ ] Utilise `'use strict';`
- [ ] Requiert `baseclass` et `rpc`
- [ ] Toutes les methodes RPC utilisent `rpc.declare()`
- [ ] Les noms d'objets correspondent au nom du script RPCD (`luci.system-hub`)
- [ ] Fonctions d'aide incluses si necessaire
- [ ] Exporte depuis `baseclass.extend()`
**Checklist du module View :**
- [ ] Etend `view.extend()`
- [ ] Implemente la methode `load()` retournant une Promise
- [ ] Implemente la methode `render(data)`
- [ ] Utilise l'aide `E()` pour la construction DOM
- [ ] Implemente `poll.add()` pour l'auto-rafraichissement
- [ ] Gestion d'erreur appropriee avec try/catch
- [ ] Utilise `ui.showModal()` pour les etats de chargement
- [ ] Utilise `ui.addNotification()` pour les retours utilisateur
**Checklist du backend RPCD :**
- [ ] Commence par `#!/bin/sh`
- [ ] Source `/lib/functions.sh` et `/usr/share/libubox/jshn.sh`
- [ ] Implemente le cas `list` avec les declarations de methodes
- [ ] Implemente le cas `call` avec le routage des methodes
- [ ] Toutes les methodes produisent du JSON valide avec les fonctions `json_*`
- [ ] Validation appropriee des parametres
- [ ] Gestion d'erreur avec messages appropries
**Checklist du JSON Menu :**
- [ ] Les chemins suivent `admin/secubox/<category>/<module>`
- [ ] La premiere entree utilise `"type": "firstchild"`
- [ ] Les entrees de vue utilisent `"type": "view"` avec le bon `"path"`
- [ ] Les chemins correspondent aux emplacements des fichiers de vue
- [ ] Valeurs `"order"` appropriees pour le positionnement du menu
- [ ] Depend de la bonne entree ACL
**Checklist du JSON ACL :**
- [ ] Le nom de l'entree correspond au nom du package
- [ ] Toutes les methodes de lecture listees sous `"read"."ubus"`
- [ ] Toutes les methodes d'ecriture listees sous `"write"."ubus"`
- [ ] Les noms d'objets ubus correspondent au nom du script RPCD
- [ ] Acces a la config UCI accorde si necessaire
**Checklist CSS :**
- [ ] Importe `system-hub/common.css`
- [ ] Utilise les variables CSS (`var(--sh-*)`)
- [ ] Supporte le mode sombre avec `[data-theme="dark"]`
- [ ] Layouts de grille responsive
- [ ] Transitions et animations fluides
- [ ] JetBrains Mono pour les valeurs numeriques
#### 5. Integrer dans le codebase
```bash
# Creer la structure de repertoires du module
mkdir -p luci-app-system-hub/htdocs/luci-static/resources/system-hub
mkdir -p luci-app-system-hub/htdocs/luci-static/resources/view/system-hub
mkdir -p luci-app-system-hub/root/usr/libexec/rpcd
mkdir -p luci-app-system-hub/root/usr/share/luci/menu.d
mkdir -p luci-app-system-hub/root/usr/share/rpcd/acl.d
# Copier les fichiers generes aux emplacements appropries
# (Copier depuis la sortie de Claude vers les fichiers respectifs)
# Rendre le script RPCD executable
chmod +x luci-app-system-hub/root/usr/libexec/rpcd/luci.system-hub
```
#### 6. Valider l'implementation
```bash
# Corriger les permissions d'abord (CRITIQUE)
./secubox-tools/fix-permissions.sh --local
# Executer la validation complete (7 verifications)
./secubox-tools/validate-modules.sh
# Sortie attendue :
# Toutes les verifications passees
# OU
# Erreurs trouvees avec instructions de correction specifiques
```
#### 7. Build local
```bash
# Build d'un seul module
./secubox-tools/local-build.sh build luci-app-system-hub
# Ou build de tous les modules
./secubox-tools/local-build.sh build
# Ou validation complete + build
./secubox-tools/local-build.sh full
```
#### 8. Deployer sur le routeur de test
```bash
# Transferer le package
scp build/x86-64/luci-app-system-hub*.ipk root@192.168.1.1:/tmp/
# Installer sur le routeur
ssh root@192.168.1.1 << 'EOF'
opkg install /tmp/luci-app-system-hub*.ipk
/etc/init.d/rpcd restart
/etc/init.d/uhttpd restart
EOF
# Corriger les permissions sur le routeur deploye (si necessaire)
./secubox-tools/fix-permissions.sh --remote
```
#### 9. Tester dans le navigateur
1. Naviguez vers `http://192.168.1.1/cgi-bin/luci`
2. Allez dans SecuBox -> System -> System Hub
3. Verifiez :
- La page se charge sans erreurs
- Les donnees s'affichent correctement
- Les actions fonctionnent (boutons, formulaires)
- L'auto-rafraichissement met a jour les donnees
- Le style correspond a la demo
- Le mode sombre fonctionne
- Le design responsive fonctionne sur mobile
#### 10. Iterer et affiner
Si des problemes sont trouves :
1. Verifiez la console du navigateur pour les erreurs JavaScript
2. Verifiez les logs du routeur : `ssh root@192.168.1.1 "logread | tail -50"`
3. Verifiez que les methodes RPCD fonctionnent : `ubus call luci.system-hub status`
4. Corrigez les problemes dans les fichiers locaux
5. Reconstruisez et redeployez
6. Testez a nouveau
---
## Patterns d'implementation courants
### Pattern 1 : Dashboard multi-onglets
**Exemple :** System Hub avec 9 onglets
```javascript
// Dans render()
var tabs = [
{ id: 'overview', title: 'Vue d\'ensemble', icon: '🏠' },
{ id: 'services', title: 'Services', icon: '⚙️' },
{ id: 'logs', title: 'Logs', icon: '📋' }
];
var activeTab = 'overview';
// Rendre la navigation par onglets
var tabNav = E('div', { 'class': 'sh-nav-tabs' },
tabs.map(function(tab) {
return E('div', {
'class': 'sh-nav-tab' + (activeTab === tab.id ? ' active' : ''),
'click': function() {
// Logique de changement d'onglet
document.querySelectorAll('.sh-nav-tab').forEach(function(t) {
t.classList.remove('active');
});
this.classList.add('active');
// Afficher/masquer le contenu de l'onglet
}
}, [
E('span', {}, tab.icon),
E('span', {}, tab.title)
]);
})
);
// Rendre le contenu de l'onglet
var tabContent = E('div', { 'class': 'tab-content' }, [
// Onglet overview
E('div', { 'class': 'tab-pane' + (activeTab === 'overview' ? ' active' : ''), 'data-tab': 'overview' }, [
this.renderOverviewContent()
]),
// Onglet services
E('div', { 'class': 'tab-pane' + (activeTab === 'services' ? ' active' : ''), 'data-tab': 'services' }, [
this.renderServicesContent()
])
]);
```
### Pattern 2 : Onglets de filtre avec filtrage de donnees
**Exemple :** Grille de modules SecuBox avec filtrage par categorie
```javascript
// Onglets de filtre
var filterTabs = E('div', { 'class': 'sh-filter-tabs' }, [
E('div', {
'class': 'sh-filter-tab active',
'data-filter': 'all',
'click': function(ev) {
document.querySelectorAll('.sh-filter-tab').forEach(function(t) {
t.classList.remove('active');
});
this.classList.add('active');
self.filterModules('all');
}
}, [
E('span', { 'class': 'sh-tab-icon' }, '📦'),
E('span', { 'class': 'sh-tab-label' }, 'Tous')
]),
E('div', {
'class': 'sh-filter-tab',
'data-filter': 'security',
'click': function(ev) {
document.querySelectorAll('.sh-filter-tab').forEach(function(t) {
t.classList.remove('active');
});
this.classList.add('active');
self.filterModules('security');
}
}, [
E('span', { 'class': 'sh-tab-icon' }, '🛡️'),
E('span', { 'class': 'sh-tab-label' }, 'Securite')
])
]);
// Fonction de filtrage
filterModules: function(category) {
var modules = document.querySelectorAll('.module-card');
modules.forEach(function(module) {
if (category === 'all' || module.dataset.category === category) {
module.style.display = 'block';
} else {
module.style.display = 'none';
}
});
}
```
### Pattern 3 : Visualiseur de logs en temps reel
**Exemple :** Onglet logs du System Hub
```javascript
// Vue des logs avec auto-scroll et auto-rafraichissement
renderLogsTab: function() {
var self = this;
var autoScroll = true;
var autoRefresh = true;
var refreshInterval = 5; // secondes
var logsContainer = E('div', { 'class': 'logs-container' });
// Charger les logs
var loadLogs = function() {
API.getLogs(100, '').then(function(result) {
var logs = result.logs || [];
dom.content(logsContainer,
logs.map(function(log) {
return E('div', { 'class': 'log-line' }, log);
})
);
// Auto-scroll vers le bas
if (autoScroll) {
logsContainer.scrollTop = logsContainer.scrollHeight;
}
});
};
// Chargement initial
loadLogs();
// Auto-rafraichissement
if (autoRefresh) {
setInterval(loadLogs, refreshInterval * 1000);
}
return E('div', {}, [
// Controles
E('div', { 'class': 'logs-controls' }, [
E('label', {}, [
E('input', {
'type': 'checkbox',
'checked': autoScroll,
'change': function() { autoScroll = this.checked; }
}),
' Auto-scroll'
]),
E('label', {}, [
E('input', {
'type': 'checkbox',
'checked': autoRefresh,
'change': function() { autoRefresh = this.checked; }
}),
' Auto-rafraichissement'
]),
E('button', {
'class': 'sh-btn sh-btn-primary',
'click': loadLogs
}, 'Rafraichir maintenant')
]),
// Affichage des logs
logsContainer
]);
}
```
### Pattern 4 : Boutons d'action avec confirmation
**Exemple :** Boutons de gestion des services
```javascript
// Rendre un bouton d'action avec confirmation
renderActionButton: function(service, action, label, btnClass) {
var self = this;
return E('button', {
'class': 'sh-btn ' + btnClass,
'click': function(ev) {
// Afficher la modale de confirmation
ui.showModal(_('Confirmer l\'action'), [
E('p', {}, _('Etes-vous sur de vouloir %s le service %s ?').format(action, service)),
E('div', { 'class': 'right' }, [
E('button', {
'class': 'sh-btn sh-btn-secondary',
'click': ui.hideModal
}, _('Annuler')),
E('button', {
'class': 'sh-btn sh-btn-primary',
'click': function() {
ui.hideModal();
self.performServiceAction(service, action);
}
}, _('Confirmer'))
])
]);
}
}, label);
},
// Executer l'action sur le service
performServiceAction: function(service, action) {
var self = this;
ui.showModal(_('Action en cours'), [
E('p', {}, E('em', { 'class': 'spinning' }, _('Veuillez patienter...')))
]);
API.serviceAction(service, action).then(function(result) {
ui.hideModal();
if (result.success) {
ui.addNotification(null, E('p', _('Action completee avec succes')), 'success');
self.handleRefresh();
} else {
ui.addNotification(null, E('p', _('Action echouee : %s').format(result.message)), 'error');
}
}).catch(function(error) {
ui.hideModal();
ui.addNotification(null, E('p', _('Erreur : %s').format(error.message)), 'error');
});
}
```
### Pattern 5 : Formulaire avec validation
**Exemple :** Page de parametres
```javascript
renderSettingsForm: function() {
var self = this;
var settings = this.settingsData || {};
return E('form', { 'class': 'settings-form' }, [
// Champ texte
E('div', { 'class': 'form-group' }, [
E('label', {}, 'Nom d\'hote'),
E('input', {
'type': 'text',
'class': 'form-control',
'value': settings.hostname || '',
'id': 'input-hostname'
})
]),
// Champ numerique avec validation
E('div', { 'class': 'form-group' }, [
E('label', {}, 'Intervalle de rafraichissement (secondes)'),
E('input', {
'type': 'number',
'class': 'form-control',
'value': settings.refresh_interval || 30,
'min': 10,
'max': 300,
'id': 'input-refresh'
})
]),
// Case a cocher
E('div', { 'class': 'form-group' }, [
E('label', {}, [
E('input', {
'type': 'checkbox',
'checked': settings.auto_refresh || false,
'id': 'input-auto-refresh'
}),
' Activer l\'auto-rafraichissement'
])
]),
// Bouton de soumission
E('div', { 'class': 'form-actions' }, [
E('button', {
'class': 'sh-btn sh-btn-primary',
'type': 'submit',
'click': function(ev) {
ev.preventDefault();
self.handleSaveSettings();
}
}, 'Enregistrer les parametres')
])
]);
},
handleSaveSettings: function() {
var hostname = document.getElementById('input-hostname').value;
var refreshInterval = parseInt(document.getElementById('input-refresh').value);
var autoRefresh = document.getElementById('input-auto-refresh').checked;
// Validation
if (!hostname) {
ui.addNotification(null, E('p', _('Le nom d\'hote est requis')), 'error');
return;
}
if (refreshInterval < 10 || refreshInterval > 300) {
ui.addNotification(null, E('p', _('L\'intervalle de rafraichissement doit etre entre 10 et 300 secondes')), 'error');
return;
}
// Sauvegarder via API
API.saveSettings(hostname, refreshInterval, autoRefresh).then(function(result) {
if (result.success) {
ui.addNotification(null, E('p', _('Parametres enregistres avec succes')), 'success');
} else {
ui.addNotification(null, E('p', _('Echec de l\'enregistrement des parametres : %s').format(result.message)), 'error');
}
});
}
```
---
## Notes specifiques aux modules
### System Hub (luci-app-system-hub)
- **Complexite :** Elevee - 9 onglets, nombreuses fonctionnalites
- **Fonctionnalites cles :** Monitoring de sante, gestion des services, logs systeme, sauvegarde/restauration
- **Exigences speciales :** Integration avec SecuBox pour la liste des composants
- **Dependances :** Appelle `luci.secubox` pour l'enumeration des modules
### Dashboard WireGuard (luci-app-wireguard-dashboard)
- **Complexite :** Moyenne
- **Fonctionnalites cles :** Gestion des pairs, generation de QR code, statistiques de trafic
- **Exigences speciales :** Generation de QR code (utiliser qrencode ou bibliotheque JavaScript)
- **Dependances :** Outils WireGuard (commande `wg`)
### Dashboard CrowdSec (luci-app-crowdsec-dashboard)
- **Complexite :** Moyenne
- **Fonctionnalites cles :** Renseignement sur les menaces, gestion des decisions, bouncers
- **Exigences speciales :** Parser la sortie CLI de CrowdSec
- **Dependances :** CrowdSec (commande `cscli`)
### Dashboard Netdata (luci-app-netdata-dashboard)
- **Complexite :** Faible - principalement integration d'iframe
- **Fonctionnalites cles :** UI Netdata embarquee, apercu rapide des metriques
- **Exigences speciales :** Integration de l'API Netdata
- **Dependances :** Service Netdata
### Modes reseau (luci-app-network-modes)
- **Complexite :** Elevee - manipulation UCI
- **Fonctionnalites cles :** Assistant de topologie reseau, apercu de configuration
- **Exigences speciales :** Validation de config UCI, mecanisme de rollback
- **Dependances :** Configs Network, firewall, DHCP
#### Modes disponibles (v0.3.6)
Le build de production inclut maintenant neuf profils entierement supportes. Chaque profil expose son propre RPC (`*_config`), vue et valeurs par defaut sous `network-modes.<mode>` :
| ID Mode | Description | Fonctionnalites notables |
| --- | --- | --- |
| `router` | Routeur standard | NAT + pare-feu, DHCP, aides proxy/HTTPS front-end |
| `doublenat` | Derriere CPE FAI | Client DHCP WAN, bridge LAN/invite isole, controles UPnP/DMZ |
| `multiwan` | Double liaison montante | Verifications de sante, timers de basculement, equilibrage de charge/mwan3 |
| `vpnrelay` | Passerelle VPN | WireGuard/OpenVPN, kill switch, override DNS, split tunnel |
| `bridge` | Pass-through Layer-2 | Pas de NAT, tous les ports bridged, client DHCP |
| `accesspoint` | Point d'acces WiFi | Bridge upstream, desactivation routage/DHCP, toggles 802.11r/k/v |
| `relay` | Repeteur WiFi | STA+AP, relayd/WDS, assistance WireGuard, tuning MTU/MSS |
| `travel` | Routeur portable | Scan WiFi client, clone MAC, hotspot WPA3, LAN sandbox |
| `sniffer` | TAP/sniffer | Bridge promiscuous, integration Netifyd, support pcap |
Lors de l'ajout d'un autre mode, mettez a jour : les defauts UCI (`root/etc/config/network-modes`), le script RPC (`get_<mode>_config`, `update_settings`, `generate_config`, liste d'autorisation `set_mode`), l'API/vue/menu JS, et la documentation.
---
## Guide de depannage
### Probleme : Erreur "Object not found"
**Symptomes :**
```
RPC call to luci.module-name/method failed with error -32000: Object not found
```
**Diagnostic :**
```bash
# 1. Verifier que le script RPCD existe et est executable
ls -la luci-app-module-name/root/usr/libexec/rpcd/
# 2. Verifier que le nom du script RPCD correspond a l'objet ubus
grep "object:" luci-app-module-name/htdocs/luci-static/resources/module-name/api.js
# 3. Tester le script RPCD manuellement
ssh root@router "/usr/libexec/rpcd/luci.module-name list"
# 4. Verifier les logs RPCD
ssh root@router "logread | grep rpcd | tail -20"
```
**Solutions :**
1. Renommer le script RPCD pour correspondre au nom de l'objet ubus (doit inclure le prefixe `luci.`)
2. Rendre le script executable : `chmod +x luci.module-name`
3. Redemarrer RPCD : `/etc/init.d/rpcd restart`
4. Reinstaller le package si deploye
### Probleme : Vue non chargee (404)
**Symptomes :**
```
HTTP error 404 while loading class file '/luci-static/resources/view/module-name/overview.js'
```
**Diagnostic :**
```bash
# 1. Verifier le chemin du menu
cat luci-app-module-name/root/usr/share/luci/menu.d/*.json | grep "path"
# 2. Verifier que le fichier de vue existe
ls -la luci-app-module-name/htdocs/luci-static/resources/view/
# 3. Verifier que les chemins correspondent
# Menu: "path": "module-name/overview"
# Fichier: view/module-name/overview.js
```
**Solutions :**
1. Mettre a jour le chemin du menu pour correspondre a l'emplacement du fichier de vue
2. OU deplacer les fichiers de vue pour correspondre au chemin du menu
3. Reconstruire et redeployer le package
### Probleme : CSS non applique
**Symptomes :**
- Page sans style
- Couleurs, polices ou mise en page manquantes
**Diagnostic :**
```bash
# 1. Verifier la console du navigateur pour les erreurs 404 CSS
# (Ouvrir les outils de developpement du navigateur)
# 2. Verifier l'import CSS dans le fichier de vue
grep "stylesheet" luci-app-module-name/htdocs/luci-static/resources/view/*/overview.js
# 3. Verifier que le fichier CSS existe
ls -la luci-app-module-name/htdocs/luci-static/resources/module-name/dashboard.css
```
**Solutions :**
1. Verifier le chemin d'import CSS : `L.resource('module-name/dashboard.css')`
2. Importer common.css : `@import url('../system-hub/common.css');`
3. Verifier les permissions de fichier : `644` pour les fichiers CSS
4. Vider le cache du navigateur (Ctrl+Shift+R)
### Probleme : Donnees non mises a jour
**Symptomes :**
- Le dashboard affiche des donnees obsoletes
- L'auto-rafraichissement ne fonctionne pas
**Diagnostic :**
```bash
# 1. Verifier que le poll est enregistre
# (Chercher poll.add() dans la methode render())
# 2. Verifier que les appels API retournent des Promises
# (Verifier que les methodes retournent des resultats de rpc.declare())
# 3. Tester les methodes API directement
ssh root@router "ubus call luci.module-name status"
```
**Solutions :**
1. Ajouter poll.add() a la methode render()
2. Verifier que les appels API dans le callback poll retournent des Promises
3. S'assurer que updateDashboard() met a jour les bons elements DOM
4. Verifier la console du navigateur pour les erreurs JavaScript
---
## Bonnes pratiques
### 1. Organisation du code
**FAIRE :**
- Garder le code lie ensemble (methodes API, helpers)
- Utiliser des noms de variables et fonctions descriptifs
- Ajouter des commentaires pour la logique complexe
- Decouper les grandes fonctions en petits helpers
**NE PAS FAIRE :**
- Mettre tout le code dans une seule fonction massive
- Utiliser des noms de variables d'une seule lettre (sauf dans les boucles)
- Dupliquer le code - creer des fonctions d'aide a la place
- Laisser du code commente en production
### 2. Gestion des erreurs
**FAIRE :**
```javascript
API.getData().then(function(result) {
if (result && result.data) {
// Traiter les donnees
} else {
console.warn('Aucune donnee retournee');
// Afficher un etat vide
}
}).catch(function(error) {
console.error('Erreur API:', error);
ui.addNotification(null, E('p', 'Echec du chargement des donnees'), 'error');
});
```
**NE PAS FAIRE :**
```javascript
API.getData().then(function(result) {
// Traiter les donnees sans verification
result.data.forEach(function(item) { ... }); // Crashera si data est null
});
```
### 3. Performance
**FAIRE :**
- Utiliser poll.add() au lieu de setInterval pour l'auto-rafraichissement
- Mettre a jour des elements DOM specifiques au lieu de re-rendre entierement
- Debounce les champs de recherche
- Charger les donnees paresseusement seulement quand necessaire
**NE PAS FAIRE :**
- Re-rendre la vue entiere a chaque mise a jour
- Poller trop frequemment (<10 secondes)
- Charger toutes les donnees d'avance
- Effectuer des operations couteuses dans render()
### 4. Experience utilisateur
**FAIRE :**
- Afficher des etats de chargement (spinners, ecrans squelettes)
- Fournir des retours pour les actions (notifications succes/erreur)
- Confirmer les actions destructives (supprimer, redemarrer)
- Utiliser des messages d'erreur descriptifs
**NE PAS FAIRE :**
- Laisser les utilisateurs attendre sans retour
- Echecs silencieux
- Messages d'erreur generiques ("Une erreur s'est produite")
- Permettre les actions destructives sans confirmation
---
## Checklist de deploiement
Avant de deployer en production :
- [ ] **Qualite du code**
- [ ] Toutes les verifications de validation passent
- [ ] Pas d'erreurs JavaScript dans la console
- [ ] Pas d'erreurs de script shell (shellcheck)
- [ ] Tous les fichiers JSON valides (jsonlint)
- [ ] **Fonctionnalite**
- [ ] Tous les onglets/pages se chargent correctement
- [ ] Toutes les actions fonctionnent comme prevu
- [ ] Les donnees s'affichent correctement
- [ ] L'auto-rafraichissement met a jour les donnees
- [ ] Les formulaires valident les entrees
- [ ] La gestion des erreurs fonctionne
- [ ] **Design**
- [ ] Correspond visuellement a la demo live
- [ ] Le mode sombre fonctionne
- [ ] Responsive sur mobile
- [ ] Coherent avec les autres modules
- [ ] Pas de problemes de mise en page
- [ ] **Performance**
- [ ] La page se charge rapidement (<2s)
- [ ] L'auto-rafraichissement ne bloque pas l'UI
- [ ] Pas de fuites memoire
- [ ] Recuperation de donnees efficace
- [ ] **Securite**
- [ ] Permissions ACL correctes
- [ ] Validation des entrees cote frontend et backend
- [ ] Pas de credentials codes en dur
- [ ] Execution de commandes securisee (pas d'injection)
- [ ] **Documentation**
- [ ] README.md mis a jour
- [ ] Commentaires dans le code complexe
- [ ] Les entrees de menu ont des descriptions
- [ ] Les entrees ACL ont des descriptions
---
## Ressources supplementaires
### Documentation
- [Reference API LuCI](https://openwrt.github.io/luci/api/)
- [Guide developpeur OpenWrt](https://openwrt.org/docs/guide-developer/start)
- [Configuration UCI](https://openwrt.org/docs/guide-user/base-system/uci)
- [Documentation ubus](https://openwrt.org/docs/techref/ubus)
### Demo live
- **Demo principale :** https://secubox.cybermood.eu
- **System Hub :** https://secubox.cybermood.eu/system-hub
- **CrowdSec :** https://secubox.cybermood.eu/crowdsec
- **WireGuard :** https://secubox.cybermood.eu/wireguard
### Documentation interne
- [FEATURE-REGENERATION-PROMPTS.md](feature-regeneration-prompts.md) - Toutes les specifications de modules
- [CODE-TEMPLATES.md](code-templates.md) - Modeles d'implementation
- [DEVELOPMENT-GUIDELINES.md](development-guidelines.md) - Guide de developpement complet
- [QUICK-START.md](quick-start.md) - Reference rapide
- [CLAUDE.md](claude.md) - Reference du systeme de build
### Outils
- [SecuBox Tools](https://github.com/CyberMind-FR/secubox-openwrt/tree/master/secubox-tools/) - Scripts de validation, build, deploiement
- [GitHub Actions](https://github.com/CyberMind-FR/secubox-openwrt/tree/master/.github/workflows/) - Workflows CI/CD
- [Templates](https://github.com/CyberMind-FR/secubox-openwrt/tree/master/templates/) - Modeles de modules
---
## Obtenir de l'aide
Si vous rencontrez des problemes non couverts dans ce guide :
1. **Verifier les modules existants :** Regardez les modules fonctionnels pour des implementations de reference
2. **Executer la validation :** `./secubox-tools/validate-modules.sh` pour les verifications automatisees
3. **Verifier les logs :** `logread | grep -i error` sur le routeur
4. **Consulter la documentation :** Lire DEVELOPMENT-GUIDELINES.md pour des explications detaillees
5. **Contacter le support :** support@cybermind.fr
---
**Version du document :** 1.0.0
**Derniere mise a jour :** 2025-12-27
**Mainteneur :** CyberMind.fr
**Demo live :** https://secubox.cybermood.eu