secubox-openwrt/deploy-module-template.sh
CyberMind-FR 8e53825ad5 release: v0.2.2 - Design System v0.3.0 & Comprehensive Documentation
🎨 Design System v0.3.0 (Demo-inspired)
- New dark palette: #0a0a0f, #6366f1→#8b5cf6 gradients
- Typography: Inter + JetBrains Mono
- Compact stats grid (130px min)
- Gradient text effects with background-clip
- Sticky navigation tabs
- Enhanced card borders and hover effects

📚 Comprehensive Documentation Suite
- DEVELOPMENT-GUIDELINES.md (33KB, 900+ lines)
  - 9 major sections: Design, Architecture, RPCD, ACL, JS, CSS, Errors, Validation, Deployment
  - Complete code templates and best practices
  - Common error diagnostics and solutions
- QUICK-START.md (6.4KB)
  - 8 critical rules for immediate reference
  - Quick code templates
  - Error quick fixes table
- deploy-module-template.sh (8.1KB)
  - Standardized deployment with automatic backup
  - Permission fixes, cache clearing, verification
- Updated CLAUDE.md, README.md with documentation index
- Updated .claude/README.md to v2.0

🔄 Version Updates
- luci-app-secubox: 0.1.2 → 0.2.2
- luci-app-system-hub: 0.1.1 → 0.2.2
- Updated all version strings (api.js, overview.js, CSS files)

🎯 CSS Enhancements
- common.css: Complete rewrite with demo palette
- overview.css: Dashboard header with gradient
- services.css: Updated version to 0.2.2
- components.css: Updated version to 0.2.2

🔧 Critical Rules Documented
1. RPCD naming: file = ubus object (luci. prefix)
2. Menu path = view file location
3. Permissions: 755 (RPCD), 644 (CSS/JS)
4. ALWAYS run validate-modules.sh
5. CSS variables only (no hardcode)
6. Dark mode mandatory
7. Typography: Inter + JetBrains Mono
8. Gradients: --sh-primary → --sh-primary-end

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-26 18:55:19 +01:00

269 lines
8.0 KiB
Bash
Executable File

#!/bin/bash
# Template de déploiement standardisé pour modules SecuBox/System Hub
# Usage: ./deploy-module-template.sh <module-name>
#
# Exemple: ./deploy-module-template.sh system-hub
set -e # Exit on error
# === Configuration ===
ROUTER="${ROUTER:-root@192.168.8.191}"
MODULE_NAME="${1}"
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
# Chemins
LOCAL_RESOURCES="$BASE_DIR/luci-app-$MODULE_NAME/htdocs/luci-static/resources"
LOCAL_ROOT="$BASE_DIR/luci-app-$MODULE_NAME/root"
REMOTE_RESOURCES="/www/luci-static/resources"
REMOTE_ROOT=""
# Couleurs pour output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# === Functions ===
print_header() {
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} 📦 Déploiement: $MODULE_NAME${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
}
print_step() {
echo -e "${GREEN}${NC} $1"
}
print_error() {
echo -e "${RED}${NC} $1"
}
print_success() {
echo -e "${GREEN}${NC} $1"
}
print_warning() {
echo -e "${YELLOW}${NC} $1"
}
check_prerequisites() {
print_step "Vérification des prérequis..."
# Vérifier que le module existe
if [ ! -d "luci-app-$MODULE_NAME" ]; then
print_error "Module luci-app-$MODULE_NAME non trouvé!"
exit 1
fi
# Vérifier connectivité routeur
if ! ssh -o ConnectTimeout=5 "$ROUTER" "exit" 2>/dev/null; then
print_error "Impossible de se connecter à $ROUTER"
exit 1
fi
print_success "Prérequis OK"
}
backup_remote() {
print_step "Création backup sur le routeur..."
BACKUP_DIR="/root/luci-backups/$(date +%Y%m%d-%H%M%S)"
ssh "$ROUTER" "mkdir -p $BACKUP_DIR"
# Backup view files
if ssh "$ROUTER" "[ -d $REMOTE_RESOURCES/view/$MODULE_NAME ]" 2>/dev/null; then
ssh "$ROUTER" "cp -r $REMOTE_RESOURCES/view/$MODULE_NAME $BACKUP_DIR/"
fi
# Backup module files
if ssh "$ROUTER" "[ -d $REMOTE_RESOURCES/$MODULE_NAME ]" 2>/dev/null; then
ssh "$ROUTER" "cp -r $REMOTE_RESOURCES/$MODULE_NAME $BACKUP_DIR/"
fi
# Backup RPCD
if ssh "$ROUTER" "[ -f /usr/libexec/rpcd/luci.$MODULE_NAME ]" 2>/dev/null; then
ssh "$ROUTER" "cp /usr/libexec/rpcd/luci.$MODULE_NAME $BACKUP_DIR/"
fi
print_success "Backup créé: $BACKUP_DIR"
}
deploy_js_files() {
print_step "Déploiement fichiers JavaScript..."
if [ -d "$LOCAL_RESOURCES/view/$MODULE_NAME" ]; then
ssh "$ROUTER" "mkdir -p $REMOTE_RESOURCES/view/$MODULE_NAME"
scp -q "$LOCAL_RESOURCES/view/$MODULE_NAME/"*.js "$ROUTER:$REMOTE_RESOURCES/view/$MODULE_NAME/" 2>/dev/null || true
print_success "Fichiers JS vues déployés"
fi
if [ -f "$LOCAL_RESOURCES/$MODULE_NAME/api.js" ]; then
ssh "$ROUTER" "mkdir -p $REMOTE_RESOURCES/$MODULE_NAME"
scp -q "$LOCAL_RESOURCES/$MODULE_NAME/api.js" "$ROUTER:$REMOTE_RESOURCES/$MODULE_NAME/" 2>/dev/null || true
print_success "API JS déployé"
fi
}
deploy_css_files() {
print_step "Déploiement fichiers CSS..."
if [ -d "$LOCAL_RESOURCES/$MODULE_NAME" ]; then
ssh "$ROUTER" "mkdir -p $REMOTE_RESOURCES/$MODULE_NAME"
scp -q "$LOCAL_RESOURCES/$MODULE_NAME/"*.css "$ROUTER:$REMOTE_RESOURCES/$MODULE_NAME/" 2>/dev/null || true
print_success "Fichiers CSS déployés"
fi
}
deploy_rpcd() {
print_step "Déploiement backend RPCD..."
RPCD_FILE="$LOCAL_ROOT/usr/libexec/rpcd/luci.$MODULE_NAME"
if [ -f "$RPCD_FILE" ]; then
scp -q "$RPCD_FILE" "$ROUTER:/usr/libexec/rpcd/" 2>/dev/null || true
print_success "RPCD backend déployé"
else
print_warning "Pas de backend RPCD trouvé"
fi
}
deploy_menu_acl() {
print_step "Déploiement menu et ACL..."
# Menu
MENU_FILE="$LOCAL_ROOT/usr/share/luci/menu.d/luci-app-$MODULE_NAME.json"
if [ -f "$MENU_FILE" ]; then
ssh "$ROUTER" "mkdir -p /usr/share/luci/menu.d"
scp -q "$MENU_FILE" "$ROUTER:/usr/share/luci/menu.d/" 2>/dev/null || true
print_success "Menu déployé"
fi
# ACL
ACL_FILE="$LOCAL_ROOT/usr/share/rpcd/acl.d/luci-app-$MODULE_NAME.json"
if [ -f "$ACL_FILE" ]; then
ssh "$ROUTER" "mkdir -p /usr/share/rpcd/acl.d"
scp -q "$ACL_FILE" "$ROUTER:/usr/share/rpcd/acl.d/" 2>/dev/null || true
print_success "ACL déployé"
fi
}
fix_permissions() {
print_step "Correction des permissions..."
# RPCD = 755
ssh "$ROUTER" "chmod 755 /usr/libexec/rpcd/luci.$MODULE_NAME 2>/dev/null" || true
# CSS/JS = 644
ssh "$ROUTER" "chmod 644 $REMOTE_RESOURCES/$MODULE_NAME/*.css 2>/dev/null" || true
ssh "$ROUTER" "chmod 644 $REMOTE_RESOURCES/$MODULE_NAME/*.js 2>/dev/null" || true
ssh "$ROUTER" "chmod 644 $REMOTE_RESOURCES/view/$MODULE_NAME/*.js 2>/dev/null" || true
print_success "Permissions corrigées"
}
clear_cache() {
print_step "Nettoyage du cache LuCI..."
ssh "$ROUTER" "rm -f /tmp/luci-indexcache /tmp/luci-modulecache/* 2>/dev/null" || true
print_success "Cache nettoyé"
}
restart_services() {
print_step "Redémarrage des services..."
ssh "$ROUTER" "/etc/init.d/rpcd restart" >/dev/null 2>&1
sleep 1
ssh "$ROUTER" "/etc/init.d/uhttpd restart" >/dev/null 2>&1
sleep 1
print_success "Services redémarrés"
}
verify_deployment() {
print_step "Vérification du déploiement..."
# Vérifier ubus object
if ssh "$ROUTER" "ubus list | grep -q luci.$MODULE_NAME" 2>/dev/null; then
print_success "ubus object 'luci.$MODULE_NAME' détecté"
else
print_warning "ubus object 'luci.$MODULE_NAME' non trouvé"
fi
# Vérifier fichiers
FILE_COUNT=$(ssh "$ROUTER" "find $REMOTE_RESOURCES -name '*$MODULE_NAME*' -type f | wc -l" 2>/dev/null)
print_success "$FILE_COUNT fichiers déployés"
}
print_summary() {
echo ""
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}✓ Déploiement terminé avec succès!${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""
echo -e "${YELLOW}📋 Prochaines étapes:${NC}"
echo ""
echo "1. Tester en mode privé (Ctrl+Shift+N):"
echo -e " ${BLUE}https://192.168.8.191/cgi-bin/luci/${NC}"
echo ""
echo "2. Vérifier console navigateur (F12):"
echo " - Onglet Console: pas d'erreurs"
echo " - Onglet Network: tous fichiers chargent (200)"
echo ""
echo "3. Tester fonctionnalités:"
echo " - Navigation entre pages"
echo " - Chargement des données"
echo " - Actions (boutons, formulaires)"
echo ""
echo "4. Tester responsive:"
echo " - Mode mobile (F12 > Toggle device toolbar)"
echo " - Dark/Light mode"
echo ""
echo -e "${YELLOW}🔧 Debug (si problème):${NC}"
echo ""
echo "# Vérifier ubus"
echo "ssh $ROUTER 'ubus list | grep $MODULE_NAME'"
echo "ssh $ROUTER 'ubus call luci.$MODULE_NAME getStatus'"
echo ""
echo "# Vérifier logs"
echo "ssh $ROUTER 'logread | grep -i error | tail -20'"
echo ""
echo "# Rollback (si nécessaire)"
echo "ssh $ROUTER 'ls -la /root/luci-backups/'"
echo ""
}
# === Main Execution ===
main() {
# Vérifier argument
if [ -z "$MODULE_NAME" ]; then
echo "Usage: $0 <module-name>"
echo ""
echo "Exemples:"
echo " $0 system-hub"
echo " $0 secubox"
echo " $0 netdata-dashboard"
exit 1
fi
print_header
check_prerequisites
backup_remote
deploy_js_files
deploy_css_files
deploy_rpcd
deploy_menu_acl
fix_permissions
clear_cache
restart_services
verify_deployment
print_summary
}
# Run main
main