secubox-deb/scripts/generate-docs.py
CyberMind-FR eef430e123 feat(docs): Add screenshot capture system and multilingual wiki generator
- scripts/capture-screenshots.py: Auto-discovers 117 modules from packages/
  - Playwright-based capture with JWT authentication
  - 30-second delay per page for cache refresh
  - Thumbnail generation (400x225)
  - JSON manifest output

- scripts/generate-docs.py: Extended to 105 modules
  - Multilingual descriptions (EN, FR, DE, ZH)
  - --include-screenshots flag for wiki integration
  - Category index pages (CATEGORIES-XX.md)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-05-09 10:09:21 +02:00

1941 lines
82 KiB
Python
Executable File

#!/usr/bin/env python3
"""
SecuBox Documentation Generator
================================
Generates READMEs for all packages and multilingual wiki pages.
Features:
- Auto-discovers all 120+ modules from packages/
- Generates multilingual wiki pages (EN, FR, DE, ZH)
- Integrates screenshots from docs/screenshots/vm/
- Creates category index pages
Usage:
python scripts/generate-docs.py
python scripts/generate-docs.py --include-screenshots
python scripts/generate-docs.py --lang fr
"""
import argparse
from pathlib import Path
from typing import Optional
# ============================================================================
# Module Metadata - All 120+ modules with multilingual descriptions
# ============================================================================
MODULES = {
# =========================================================================
# DASHBOARD
# =========================================================================
"hub": {
"name": "SecuBox Hub", "icon": "🏠", "category": "Dashboard",
"description": {
"en": "Central dashboard and control center",
"fr": "Tableau de bord central et centre de contrôle",
"de": "Zentrales Dashboard und Kontrollzentrum",
"zh": "中央仪表板和控制中心"
},
"features": {
"en": ["System overview", "Service monitoring", "Quick actions", "Metrics"],
"fr": ["Vue système", "Surveillance services", "Actions rapides", "Métriques"],
"de": ["Systemübersicht", "Service-Überwachung", "Schnellaktionen", "Metriken"],
"zh": ["系统概览", "服务监控", "快速操作", "指标"]
}
},
"soc": {
"name": "Security Operations Center", "icon": "🛡️", "category": "Dashboard",
"description": {
"en": "SOC with world clock, threat map, tickets",
"fr": "SOC avec horloge mondiale, carte menaces, tickets",
"de": "SOC mit Weltuhr, Bedrohungskarte, Tickets",
"zh": "安全运营中心,包含世界时钟、威胁地图、工单"
},
"features": {
"en": ["World clock", "Threat map", "Ticket system", "P2P intel", "Alerts"],
"fr": ["Horloge mondiale", "Carte menaces", "Tickets", "Intel P2P", "Alertes"],
"de": ["Weltuhr", "Bedrohungskarte", "Ticketsystem", "P2P-Intel", "Warnungen"],
"zh": ["世界时钟", "威胁地图", "工单系统", "P2P情报", "告警"]
}
},
"roadmap": {
"name": "Migration Roadmap", "icon": "📋", "category": "Dashboard",
"description": {
"en": "OpenWRT to Debian migration tracking",
"fr": "Suivi migration OpenWRT vers Debian",
"de": "OpenWRT zu Debian Migration-Tracking",
"zh": "OpenWRT到Debian迁移跟踪"
},
"features": {
"en": ["Progress tracking", "Module status", "Category view"],
"fr": ["Suivi progression", "État modules", "Vue catégories"],
"de": ["Fortschrittsverfolgung", "Modulstatus", "Kategorieansicht"],
"zh": ["进度跟踪", "模块状态", "分类视图"]
}
},
"metrics": {
"name": "System Metrics", "icon": "📈", "category": "Dashboard",
"description": {
"en": "Real-time system metrics dashboard",
"fr": "Tableau de bord métriques système temps réel",
"de": "Echtzeit-Systemmetriken-Dashboard",
"zh": "实时系统指标仪表板"
},
"features": {
"en": ["CPU/Memory", "Network stats", "Disk I/O", "Historical data"],
"fr": ["CPU/Mémoire", "Stats réseau", "I/O disque", "Historique"],
"de": ["CPU/Speicher", "Netzwerkstatistiken", "Disk-I/O", "Verlaufsdaten"],
"zh": ["CPU/内存", "网络统计", "磁盘I/O", "历史数据"]
}
},
"admin": {
"name": "Admin Panel", "icon": "⚙️", "category": "Dashboard",
"description": {
"en": "System administration panel",
"fr": "Panneau d'administration système",
"de": "Systemverwaltungspanel",
"zh": "系统管理面板"
},
"features": {
"en": ["User management", "System config", "Logs", "Diagnostics"],
"fr": ["Gestion utilisateurs", "Config système", "Logs", "Diagnostics"],
"de": ["Benutzerverwaltung", "Systemkonfiguration", "Logs", "Diagnose"],
"zh": ["用户管理", "系统配置", "日志", "诊断"]
}
},
# =========================================================================
# SECURITY
# =========================================================================
"crowdsec": {
"name": "CrowdSec", "icon": "🛡️", "category": "Security",
"description": {
"en": "Collaborative security engine with behavior analysis",
"fr": "Moteur de sécurité collaboratif avec analyse comportementale",
"de": "Kollaborative Sicherheits-Engine mit Verhaltensanalyse",
"zh": "具有行为分析的协作式安全引擎"
},
"features": {
"en": ["Decision management", "Alerts", "Bouncers", "Collections", "Community blocklists"],
"fr": ["Gestion décisions", "Alertes", "Bouncers", "Collections", "Listes communautaires"],
"de": ["Entscheidungsverwaltung", "Warnungen", "Bouncers", "Sammlungen", "Community-Blocklisten"],
"zh": ["决策管理", "告警", "Bouncer", "集合", "社区黑名单"]
}
},
"waf": {
"name": "Web Application Firewall", "icon": "🔥", "category": "Security",
"description": {
"en": "WAF with 300+ OWASP security rules",
"fr": "WAF avec 300+ règles de sécurité OWASP",
"de": "WAF mit 300+ OWASP-Sicherheitsregeln",
"zh": "具有300+条OWASP安全规则的WAF"
},
"features": {
"en": ["OWASP rules", "Custom rules", "CrowdSec integration", "Request logging"],
"fr": ["Règles OWASP", "Règles custom", "Intégration CrowdSec", "Logs requêtes"],
"de": ["OWASP-Regeln", "Eigene Regeln", "CrowdSec-Integration", "Anforderungsprotokollierung"],
"zh": ["OWASP规则", "自定义规则", "CrowdSec集成", "请求日志"]
}
},
"vortex-firewall": {
"name": "Vortex Firewall", "icon": "🔥", "category": "Security",
"description": {
"en": "nftables-based threat enforcement firewall",
"fr": "Pare-feu d'application des menaces basé sur nftables",
"de": "nftables-basierte Bedrohungsdurchsetzungs-Firewall",
"zh": "基于nftables的威胁执行防火墙"
},
"features": {
"en": ["IP blocklists", "nftables sets", "Threat feeds", "Geo-blocking"],
"fr": ["Listes IP", "Sets nftables", "Flux menaces", "Géo-blocage"],
"de": ["IP-Blocklisten", "nftables-Sets", "Bedrohungsfeeds", "Geo-Blocking"],
"zh": ["IP黑名单", "nftables集合", "威胁源", "地理封锁"]
}
},
"hardening": {
"name": "System Hardening", "icon": "🔒", "category": "Security",
"description": {
"en": "Kernel and system hardening for ANSSI CSPN compliance",
"fr": "Durcissement système et noyau pour conformité ANSSI CSPN",
"de": "Kernel- und Systemhärtung für ANSSI CSPN-Konformität",
"zh": "符合ANSSI CSPN的内核和系统加固"
},
"features": {
"en": ["Sysctl hardening", "Module blacklist", "Security score", "AppArmor"],
"fr": ["Durcissement sysctl", "Blacklist modules", "Score sécurité", "AppArmor"],
"de": ["Sysctl-Härtung", "Modul-Blacklist", "Sicherheitsbewertung", "AppArmor"],
"zh": ["sysctl加固", "模块黑名单", "安全评分", "AppArmor"]
}
},
"mitmproxy": {
"name": "MITM Proxy", "icon": "🔍", "category": "Security",
"description": {
"en": "Traffic inspection and WAF proxy with auto-ban",
"fr": "Inspection trafic et proxy WAF avec auto-ban",
"de": "Verkehrsinspektion und WAF-Proxy mit Auto-Ban",
"zh": "具有自动封禁功能的流量检查和WAF代理"
},
"features": {
"en": ["Traffic inspection", "Request logging", "Auto-ban", "SSL interception"],
"fr": ["Inspection trafic", "Logs requêtes", "Auto-ban", "Interception SSL"],
"de": ["Verkehrsinspektion", "Anforderungsprotokollierung", "Auto-Ban", "SSL-Interception"],
"zh": ["流量检查", "请求日志", "自动封禁", "SSL拦截"]
}
},
"auth": {
"name": "Auth Guardian", "icon": "🔐", "category": "Security",
"description": {
"en": "Unified authentication management",
"fr": "Gestion unifiée de l'authentification",
"de": "Einheitliche Authentifizierungsverwaltung",
"zh": "统一认证管理"
},
"features": {
"en": ["OAuth2", "LDAP", "2FA/TOTP", "Session management"],
"fr": ["OAuth2", "LDAP", "2FA/TOTP", "Sessions"],
"de": ["OAuth2", "LDAP", "2FA/TOTP", "Sitzungen"],
"zh": ["OAuth2", "LDAP", "双因素/TOTP", "会话管理"]
}
},
"nac": {
"name": "Network Access Control", "icon": "🛡️", "category": "Security",
"description": {
"en": "Client guardian and NAC with quarantine",
"fr": "Guardian client et NAC avec quarantaine",
"de": "Client-Guardian und NAC mit Quarantäne",
"zh": "具有隔离功能的客户端守护和NAC"
},
"features": {
"en": ["Device control", "MAC filtering", "Quarantine", "VLAN assignment"],
"fr": ["Contrôle appareils", "Filtrage MAC", "Quarantaine", "Assignation VLAN"],
"de": ["Gerätesteuerung", "MAC-Filterung", "Quarantäne", "VLAN-Zuweisung"],
"zh": ["设备控制", "MAC过滤", "隔离", "VLAN分配"]
}
},
"ipblock": {
"name": "IP Block Manager", "icon": "🚫", "category": "Security",
"description": {
"en": "IP and network blocking management",
"fr": "Gestion du blocage IP et réseau",
"de": "IP- und Netzwerksperrverwaltung",
"zh": "IP和网络封锁管理"
},
"features": {
"en": ["IP blocklists", "Network ranges", "Temporary bans", "Import/Export"],
"fr": ["Listes IP", "Plages réseau", "Bans temporaires", "Import/Export"],
"de": ["IP-Blocklisten", "Netzwerkbereiche", "Temporäre Sperren", "Import/Export"],
"zh": ["IP黑名单", "网络范围", "临时封禁", "导入/导出"]
}
},
"mac-guard": {
"name": "MAC Guard", "icon": "🔐", "category": "Security",
"description": {
"en": "MAC address access control",
"fr": "Contrôle d'accès par adresse MAC",
"de": "MAC-Adress-Zugangskontrolle",
"zh": "MAC地址访问控制"
},
"features": {
"en": ["MAC whitelist/blacklist", "Auto-discovery", "Alerts", "VLAN binding"],
"fr": ["Liste MAC blanche/noire", "Auto-découverte", "Alertes", "Liaison VLAN"],
"de": ["MAC-Whitelist/Blacklist", "Auto-Erkennung", "Warnungen", "VLAN-Bindung"],
"zh": ["MAC白名单/黑名单", "自动发现", "告警", "VLAN绑定"]
}
},
"interceptor": {
"name": "Traffic Interceptor", "icon": "📡", "category": "Security",
"description": {
"en": "Network traffic interception and analysis",
"fr": "Interception et analyse du trafic réseau",
"de": "Netzwerkverkehrs-Interception und -Analyse",
"zh": "网络流量拦截和分析"
},
"features": {
"en": ["Packet capture", "Protocol analysis", "Session tracking", "Forensics"],
"fr": ["Capture paquets", "Analyse protocoles", "Suivi sessions", "Forensique"],
"de": ["Paketerfassung", "Protokollanalyse", "Sitzungsverfolgung", "Forensik"],
"zh": ["数据包捕获", "协议分析", "会话跟踪", "取证"]
}
},
"cookies": {
"name": "Cookie Manager", "icon": "🍪", "category": "Security",
"description": {
"en": "Cookie and session security management",
"fr": "Gestion de la sécurité des cookies et sessions",
"de": "Cookie- und Sitzungssicherheitsverwaltung",
"zh": "Cookie和会话安全管理"
},
"features": {
"en": ["Cookie policies", "Session security", "SameSite enforcement", "Audit"],
"fr": ["Politiques cookies", "Sécurité sessions", "Enforcement SameSite", "Audit"],
"de": ["Cookie-Richtlinien", "Sitzungssicherheit", "SameSite-Durchsetzung", "Audit"],
"zh": ["Cookie策略", "会话安全", "SameSite执行", "审计"]
}
},
"threats": {
"name": "Threat Dashboard", "icon": "⚠️", "category": "Security",
"description": {
"en": "Unified threat visualization",
"fr": "Visualisation unifiée des menaces",
"de": "Einheitliche Bedrohungsvisualisierung",
"zh": "统一威胁可视化"
},
"features": {
"en": ["Threat feeds", "Attack timeline", "Severity levels", "Correlation"],
"fr": ["Flux menaces", "Timeline attaques", "Niveaux gravité", "Corrélation"],
"de": ["Bedrohungsfeeds", "Angriffszeitachse", "Schweregrade", "Korrelation"],
"zh": ["威胁源", "攻击时间线", "严重级别", "关联"]
}
},
"threat-analyst": {
"name": "Threat Analyst", "icon": "🔬", "category": "Security",
"description": {
"en": "AI-powered threat analysis",
"fr": "Analyse des menaces assistée par IA",
"de": "KI-gestützte Bedrohungsanalyse",
"zh": "AI驱动的威胁分析"
},
"features": {
"en": ["ML detection", "Behavioral analysis", "IOC extraction", "Reports"],
"fr": ["Détection ML", "Analyse comportementale", "Extraction IOC", "Rapports"],
"de": ["ML-Erkennung", "Verhaltensanalyse", "IOC-Extraktion", "Berichte"],
"zh": ["ML检测", "行为分析", "IOC提取", "报告"]
}
},
"cve-triage": {
"name": "CVE Triage", "icon": "🔴", "category": "Security",
"description": {
"en": "CVE vulnerability tracking and triage",
"fr": "Suivi et triage des vulnérabilités CVE",
"de": "CVE-Schwachstellenverfolgung und -Triage",
"zh": "CVE漏洞跟踪和分类"
},
"features": {
"en": ["CVE database", "Affected packages", "Risk scoring", "Remediation"],
"fr": ["Base CVE", "Paquets affectés", "Score risque", "Remédiation"],
"de": ["CVE-Datenbank", "Betroffene Pakete", "Risikobewertung", "Behebung"],
"zh": ["CVE数据库", "受影响包", "风险评分", "修复"]
}
},
"wazuh": {
"name": "Wazuh SIEM", "icon": "🛡️", "category": "Security",
"description": {
"en": "Wazuh SIEM integration",
"fr": "Intégration SIEM Wazuh",
"de": "Wazuh SIEM-Integration",
"zh": "Wazuh SIEM集成"
},
"features": {
"en": ["Log analysis", "File integrity", "Vulnerability detection", "Compliance"],
"fr": ["Analyse logs", "Intégrité fichiers", "Détection vulnérabilités", "Conformité"],
"de": ["Log-Analyse", "Dateiintegrität", "Schwachstellenerkennung", "Compliance"],
"zh": ["日志分析", "文件完整性", "漏洞检测", "合规"]
}
},
"ossec": {
"name": "OSSEC HIDS", "icon": "🔒", "category": "Security",
"description": {
"en": "OSSEC host-based intrusion detection",
"fr": "Détection d'intrusion basée hôte OSSEC",
"de": "OSSEC-hostbasierte Einbruchserkennung",
"zh": "OSSEC主机入侵检测"
},
"features": {
"en": ["Log analysis", "Rootkit detection", "File integrity", "Active response"],
"fr": ["Analyse logs", "Détection rootkits", "Intégrité fichiers", "Réponse active"],
"de": ["Log-Analyse", "Rootkit-Erkennung", "Dateiintegrität", "Aktive Reaktion"],
"zh": ["日志分析", "Rootkit检测", "文件完整性", "主动响应"]
}
},
"openclaw": {
"name": "OpenClaw Scanner", "icon": "🦞", "category": "Security",
"description": {
"en": "Network vulnerability scanner",
"fr": "Scanner de vulnérabilités réseau",
"de": "Netzwerk-Schwachstellen-Scanner",
"zh": "网络漏洞扫描器"
},
"features": {
"en": ["Port scanning", "Service detection", "Vulnerability checks", "Reports"],
"fr": ["Scan ports", "Détection services", "Vérifications vulnérabilités", "Rapports"],
"de": ["Port-Scanning", "Diensterkennung", "Schwachstellenprüfungen", "Berichte"],
"zh": ["端口扫描", "服务检测", "漏洞检查", "报告"]
}
},
"iot-guard": {
"name": "IoT Guard", "icon": "🔌", "category": "Security",
"description": {
"en": "IoT device security monitoring",
"fr": "Surveillance sécurité appareils IoT",
"de": "IoT-Gerätesicherheitsüberwachung",
"zh": "IoT设备安全监控"
},
"features": {
"en": ["Device fingerprinting", "Anomaly detection", "Isolation", "Firmware checks"],
"fr": ["Empreinte appareils", "Détection anomalies", "Isolation", "Vérif firmware"],
"de": ["Geräte-Fingerprinting", "Anomalieerkennung", "Isolation", "Firmware-Prüfungen"],
"zh": ["设备指纹", "异常检测", "隔离", "固件检查"]
}
},
# =========================================================================
# NETWORK
# =========================================================================
"netmodes": {
"name": "Network Modes", "icon": "🌐", "category": "Network",
"description": {
"en": "Network topology configuration",
"fr": "Configuration topologie réseau",
"de": "Netzwerktopologie-Konfiguration",
"zh": "网络拓扑配置"
},
"features": {
"en": ["Router mode", "Bridge mode", "AP mode", "VLAN"],
"fr": ["Mode routeur", "Mode pont", "Mode AP", "VLAN"],
"de": ["Router-Modus", "Bridge-Modus", "AP-Modus", "VLAN"],
"zh": ["路由模式", "桥接模式", "AP模式", "VLAN"]
}
},
"qos": {
"name": "QoS Manager", "icon": "📊", "category": "Network",
"description": {
"en": "Quality of Service with HTB/VLAN",
"fr": "QoS avec HTB/VLAN",
"de": "QoS mit HTB/VLAN",
"zh": "HTB/VLAN服务质量"
},
"features": {
"en": ["Bandwidth control", "VLAN policies", "802.1p PCP", "Per-user limits"],
"fr": ["Contrôle bande passante", "Politiques VLAN", "802.1p PCP", "Limites utilisateur"],
"de": ["Bandbreitenkontrolle", "VLAN-Richtlinien", "802.1p PCP", "Pro-Benutzer-Limits"],
"zh": ["带宽控制", "VLAN策略", "802.1p PCP", "每用户限制"]
}
},
"traffic": {
"name": "Traffic Shaping", "icon": "📈", "category": "Network",
"description": {
"en": "TC/CAKE traffic shaping",
"fr": "Mise en forme trafic TC/CAKE",
"de": "TC/CAKE Verkehrsformung",
"zh": "TC/CAKE流量整形"
},
"features": {
"en": ["Per-interface QoS", "CAKE algorithm", "Statistics", "Real-time graphs"],
"fr": ["QoS par interface", "Algorithme CAKE", "Statistiques", "Graphes temps réel"],
"de": ["Pro-Schnittstelle QoS", "CAKE-Algorithmus", "Statistiken", "Echtzeit-Graphen"],
"zh": ["每接口QoS", "CAKE算法", "统计", "实时图表"]
}
},
"haproxy": {
"name": "HAProxy", "icon": "", "category": "Network",
"description": {
"en": "Load balancer with TLS 1.3",
"fr": "Load balancer avec TLS 1.3",
"de": "Load Balancer mit TLS 1.3",
"zh": "支持TLS 1.3的负载均衡器"
},
"features": {
"en": ["Backend management", "Stats", "ACLs", "SSL termination", "Health checks"],
"fr": ["Gestion backends", "Stats", "ACLs", "Terminaison SSL", "Health checks"],
"de": ["Backend-Verwaltung", "Statistiken", "ACLs", "SSL-Terminierung", "Health-Checks"],
"zh": ["后端管理", "统计", "ACL", "SSL终止", "健康检查"]
}
},
"cdn": {
"name": "CDN Cache", "icon": "🚀", "category": "Network",
"description": {
"en": "Content delivery cache",
"fr": "Cache de diffusion de contenu",
"de": "Content-Delivery-Cache",
"zh": "内容分发缓存"
},
"features": {
"en": ["Cache management", "Purge", "Statistics", "Edge rules"],
"fr": ["Gestion cache", "Purge", "Statistiques", "Règles edge"],
"de": ["Cache-Verwaltung", "Bereinigung", "Statistiken", "Edge-Regeln"],
"zh": ["缓存管理", "清除", "统计", "边缘规则"]
}
},
"vhost": {
"name": "Virtual Hosts", "icon": "🏗️", "category": "Network",
"description": {
"en": "Nginx virtual host management",
"fr": "Gestion hôtes virtuels Nginx",
"de": "Nginx Virtual Host Verwaltung",
"zh": "Nginx虚拟主机管理"
},
"features": {
"en": ["Site management", "SSL certificates", "Reverse proxy", "Let's Encrypt"],
"fr": ["Gestion sites", "Certificats SSL", "Reverse proxy", "Let's Encrypt"],
"de": ["Site-Verwaltung", "SSL-Zertifikate", "Reverse-Proxy", "Let's Encrypt"],
"zh": ["站点管理", "SSL证书", "反向代理", "Let's Encrypt"]
}
},
"routes": {
"name": "Routing Manager", "icon": "🛤️", "category": "Network",
"description": {
"en": "Static and policy-based routing",
"fr": "Routage statique et basé sur politiques",
"de": "Statisches und richtlinienbasiertes Routing",
"zh": "静态和基于策略的路由"
},
"features": {
"en": ["Static routes", "Policy routing", "Multi-WAN", "Failover"],
"fr": ["Routes statiques", "Routage politique", "Multi-WAN", "Failover"],
"de": ["Statische Routen", "Policy-Routing", "Multi-WAN", "Failover"],
"zh": ["静态路由", "策略路由", "多WAN", "故障转移"]
}
},
"nettweak": {
"name": "Network Tweaks", "icon": "🔧", "category": "Network",
"description": {
"en": "Network kernel parameters tuning",
"fr": "Réglage des paramètres réseau du noyau",
"de": "Netzwerk-Kernelparameter-Tuning",
"zh": "网络内核参数调优"
},
"features": {
"en": ["TCP tuning", "Buffer sizes", "Congestion control", "Profiles"],
"fr": ["Réglage TCP", "Tailles buffer", "Contrôle congestion", "Profils"],
"de": ["TCP-Tuning", "Puffergrößen", "Überlastungskontrolle", "Profile"],
"zh": ["TCP调优", "缓冲区大小", "拥塞控制", "配置文件"]
}
},
"netdiag": {
"name": "Network Diagnostics", "icon": "🔍", "category": "Network",
"description": {
"en": "Network troubleshooting tools",
"fr": "Outils de diagnostic réseau",
"de": "Netzwerk-Diagnosetools",
"zh": "网络故障排除工具"
},
"features": {
"en": ["Ping/Traceroute", "DNS lookup", "Port scan", "Speed test"],
"fr": ["Ping/Traceroute", "Recherche DNS", "Scan ports", "Test vitesse"],
"de": ["Ping/Traceroute", "DNS-Suche", "Port-Scan", "Geschwindigkeitstest"],
"zh": ["Ping/Traceroute", "DNS查询", "端口扫描", "速度测试"]
}
},
"network-anomaly": {
"name": "Network Anomaly", "icon": "📉", "category": "Network",
"description": {
"en": "Network anomaly detection",
"fr": "Détection d'anomalies réseau",
"de": "Netzwerk-Anomalieerkennung",
"zh": "网络异常检测"
},
"features": {
"en": ["Traffic baselines", "Anomaly alerts", "ML detection", "Visualization"],
"fr": ["Baselines trafic", "Alertes anomalies", "Détection ML", "Visualisation"],
"de": ["Verkehrs-Baselines", "Anomalie-Warnungen", "ML-Erkennung", "Visualisierung"],
"zh": ["流量基线", "异常告警", "ML检测", "可视化"]
}
},
"modem": {
"name": "Modem Manager", "icon": "📶", "category": "Network",
"description": {
"en": "3G/4G/5G modem management",
"fr": "Gestion modem 3G/4G/5G",
"de": "3G/4G/5G-Modemverwaltung",
"zh": "3G/4G/5G调制解调器管理"
},
"features": {
"en": ["Connection status", "Signal strength", "SMS", "Failover"],
"fr": ["État connexion", "Force signal", "SMS", "Failover"],
"de": ["Verbindungsstatus", "Signalstärke", "SMS", "Failover"],
"zh": ["连接状态", "信号强度", "短信", "故障转移"]
}
},
# =========================================================================
# DNS
# =========================================================================
"dns": {
"name": "DNS Server", "icon": "🌍", "category": "DNS",
"description": {
"en": "BIND DNS zone management",
"fr": "Gestion zones DNS BIND",
"de": "BIND DNS-Zonenverwaltung",
"zh": "BIND DNS区域管理"
},
"features": {
"en": ["Zone management", "Records", "DNSSEC", "Reverse DNS"],
"fr": ["Gestion zones", "Enregistrements", "DNSSEC", "DNS inverse"],
"de": ["Zonenverwaltung", "Einträge", "DNSSEC", "Reverse-DNS"],
"zh": ["区域管理", "记录", "DNSSEC", "反向DNS"]
}
},
"vortex-dns": {
"name": "Vortex DNS", "icon": "🛡️", "category": "DNS",
"description": {
"en": "DNS firewall with RPZ blocklists",
"fr": "Pare-feu DNS avec listes de blocage RPZ",
"de": "DNS-Firewall mit RPZ-Blocklisten",
"zh": "带RPZ黑名单的DNS防火墙"
},
"features": {
"en": ["Blocklists", "RPZ", "Threat feeds", "DoH/DoT"],
"fr": ["Listes blocage", "RPZ", "Flux menaces", "DoH/DoT"],
"de": ["Blocklisten", "RPZ", "Bedrohungsfeeds", "DoH/DoT"],
"zh": ["黑名单", "RPZ", "威胁源", "DoH/DoT"]
}
},
"meshname": {
"name": "Mesh DNS", "icon": "📡", "category": "DNS",
"description": {
"en": "Mesh network domain resolution",
"fr": "Résolution domaines réseau mesh",
"de": "Mesh-Netzwerk-Domänenauflösung",
"zh": "Mesh网络域名解析"
},
"features": {
"en": ["mDNS/Avahi", "Local DNS", "Service discovery", "Mesh integration"],
"fr": ["mDNS/Avahi", "DNS local", "Découverte services", "Intégration mesh"],
"de": ["mDNS/Avahi", "Lokales DNS", "Diensterkennung", "Mesh-Integration"],
"zh": ["mDNS/Avahi", "本地DNS", "服务发现", "Mesh集成"]
}
},
"dns-guard": {
"name": "DNS Guard", "icon": "🛡️", "category": "DNS",
"description": {
"en": "DNS-based threat protection",
"fr": "Protection basée sur DNS contre les menaces",
"de": "DNS-basierter Bedrohungsschutz",
"zh": "基于DNS的威胁防护"
},
"features": {
"en": ["Malware blocking", "Phishing protection", "Analytics", "Whitelist"],
"fr": ["Blocage malware", "Protection phishing", "Analytiques", "Liste blanche"],
"de": ["Malware-Blockierung", "Phishing-Schutz", "Analysen", "Whitelist"],
"zh": ["恶意软件拦截", "钓鱼防护", "分析", "白名单"]
}
},
"dns-provider": {
"name": "DNS Provider", "icon": "🌐", "category": "DNS",
"description": {
"en": "External DNS provider integration",
"fr": "Intégration fournisseur DNS externe",
"de": "Externe DNS-Anbieter-Integration",
"zh": "外部DNS提供商集成"
},
"features": {
"en": ["Cloudflare", "Route53", "DigitalOcean", "Dynamic DNS"],
"fr": ["Cloudflare", "Route53", "DigitalOcean", "DNS dynamique"],
"de": ["Cloudflare", "Route53", "DigitalOcean", "Dynamisches DNS"],
"zh": ["Cloudflare", "Route53", "DigitalOcean", "动态DNS"]
}
},
"ad-guard": {
"name": "AdGuard", "icon": "🚫", "category": "DNS",
"description": {
"en": "AdGuard Home DNS blocking",
"fr": "Blocage DNS AdGuard Home",
"de": "AdGuard Home DNS-Blockierung",
"zh": "AdGuard Home DNS拦截"
},
"features": {
"en": ["Ad blocking", "Tracking protection", "Parental control", "Statistics"],
"fr": ["Blocage pubs", "Protection tracking", "Contrôle parental", "Statistiques"],
"de": ["Werbungsblockierung", "Tracking-Schutz", "Jugendschutz", "Statistiken"],
"zh": ["广告拦截", "追踪保护", "家长控制", "统计"]
}
},
# =========================================================================
# VPN & PRIVACY
# =========================================================================
"wireguard": {
"name": "WireGuard VPN", "icon": "🔗", "category": "VPN",
"description": {
"en": "Modern VPN with kernel integration",
"fr": "VPN moderne avec intégration noyau",
"de": "Modernes VPN mit Kernel-Integration",
"zh": "具有内核集成的现代VPN"
},
"features": {
"en": ["Peer management", "QR codes", "Traffic stats", "Multi-tunnel"],
"fr": ["Gestion pairs", "QR codes", "Stats trafic", "Multi-tunnel"],
"de": ["Peer-Verwaltung", "QR-Codes", "Verkehrsstatistiken", "Multi-Tunnel"],
"zh": ["节点管理", "二维码", "流量统计", "多隧道"]
}
},
"mesh": {
"name": "Mesh Network", "icon": "🕸️", "category": "VPN",
"description": {
"en": "Mesh networking with Yggdrasil",
"fr": "Réseau mesh avec Yggdrasil",
"de": "Mesh-Netzwerk mit Yggdrasil",
"zh": "使用Yggdrasil的Mesh网络"
},
"features": {
"en": ["Peer discovery", "Routing", "Encryption", "IPv6 overlay"],
"fr": ["Découverte pairs", "Routage", "Chiffrement", "Overlay IPv6"],
"de": ["Peer-Erkennung", "Routing", "Verschlüsselung", "IPv6-Overlay"],
"zh": ["节点发现", "路由", "加密", "IPv6覆盖"]
}
},
"p2p": {
"name": "P2P Network", "icon": "🔗", "category": "VPN",
"description": {
"en": "Peer-to-peer networking",
"fr": "Réseau pair-à-pair",
"de": "Peer-to-Peer-Netzwerk",
"zh": "点对点网络"
},
"features": {
"en": ["Direct connections", "NAT traversal", "Encryption", "DHT"],
"fr": ["Connexions directes", "Traversée NAT", "Chiffrement", "DHT"],
"de": ["Direktverbindungen", "NAT-Traversal", "Verschlüsselung", "DHT"],
"zh": ["直接连接", "NAT穿透", "加密", "DHT"]
}
},
"master-link": {
"name": "MasterLink", "icon": "🔗", "category": "VPN",
"description": {
"en": "SecuBox mesh federation",
"fr": "Fédération mesh SecuBox",
"de": "SecuBox Mesh-Föderation",
"zh": "SecuBox网格联邦"
},
"features": {
"en": ["Box discovery", "Federation", "Shared policies", "Sync"],
"fr": ["Découverte box", "Fédération", "Politiques partagées", "Sync"],
"de": ["Box-Erkennung", "Föderation", "Gemeinsame Richtlinien", "Sync"],
"zh": ["盒子发现", "联邦", "共享策略", "同步"]
}
},
"tor": {
"name": "Tor Network", "icon": "🧅", "category": "Privacy",
"description": {
"en": "Tor anonymity and hidden services",
"fr": "Anonymat Tor et services cachés",
"de": "Tor-Anonymität und versteckte Dienste",
"zh": "Tor匿名和隐藏服务"
},
"features": {
"en": ["Circuits", "Hidden services", "Bridges", "Transparent proxy"],
"fr": ["Circuits", "Services cachés", "Bridges", "Proxy transparent"],
"de": ["Schaltkreise", "Versteckte Dienste", "Bridges", "Transparenter Proxy"],
"zh": ["电路", "隐藏服务", "桥接", "透明代理"]
}
},
"exposure": {
"name": "Exposure Settings", "icon": "🌐", "category": "Privacy",
"description": {
"en": "Unified exposure management",
"fr": "Gestion unifiée de l'exposition",
"de": "Einheitliche Expositionsverwaltung",
"zh": "统一暴露管理"
},
"features": {
"en": ["Tor exposure", "SSL certs", "DNS records", "Mesh access"],
"fr": ["Exposition Tor", "Certificats SSL", "Enregistrements DNS", "Accès mesh"],
"de": ["Tor-Exposition", "SSL-Zertifikate", "DNS-Einträge", "Mesh-Zugang"],
"zh": ["Tor暴露", "SSL证书", "DNS记录", "Mesh访问"]
}
},
"zkp": {
"name": "Zero-Knowledge Proofs", "icon": "🔐", "category": "Privacy",
"description": {
"en": "ZKP Hamiltonian authentication",
"fr": "Authentification ZKP Hamiltonien",
"de": "ZKP Hamiltonian-Authentifizierung",
"zh": "ZKP哈密顿认证"
},
"features": {
"en": ["Proof generation", "Verification", "Key management", "MirrorNet"],
"fr": ["Génération preuves", "Vérification", "Gestion clés", "MirrorNet"],
"de": ["Beweisgenerierung", "Verifizierung", "Schlüsselverwaltung", "MirrorNet"],
"zh": ["证明生成", "验证", "密钥管理", "MirrorNet"]
}
},
"simplex": {
"name": "SimpleX Chat", "icon": "💬", "category": "Privacy",
"description": {
"en": "Privacy-focused messaging",
"fr": "Messagerie axée sur la vie privée",
"de": "Datenschutzorientiertes Messaging",
"zh": "注重隐私的消息"
},
"features": {
"en": ["E2E encryption", "No user IDs", "Self-hosted", "Groups"],
"fr": ["Chiffrement E2E", "Sans identifiants", "Auto-hébergé", "Groupes"],
"de": ["E2E-Verschlüsselung", "Keine Benutzer-IDs", "Selbst gehostet", "Gruppen"],
"zh": ["端到端加密", "无用户ID", "自托管", "群组"]
}
},
"vault": {
"name": "Secret Vault", "icon": "🔐", "category": "Privacy",
"description": {
"en": "Secrets and credentials management",
"fr": "Gestion des secrets et identifiants",
"de": "Geheimnis- und Anmeldedatenverwaltung",
"zh": "密钥和凭据管理"
},
"features": {
"en": ["Encrypted storage", "Access control", "Rotation", "Audit"],
"fr": ["Stockage chiffré", "Contrôle d'accès", "Rotation", "Audit"],
"de": ["Verschlüsselter Speicher", "Zugriffskontrolle", "Rotation", "Audit"],
"zh": ["加密存储", "访问控制", "轮换", "审计"]
}
},
# =========================================================================
# MONITORING
# =========================================================================
"netdata": {
"name": "Netdata", "icon": "📊", "category": "Monitoring",
"description": {
"en": "Real-time system monitoring",
"fr": "Surveillance système temps réel",
"de": "Echtzeit-Systemüberwachung",
"zh": "实时系统监控"
},
"features": {
"en": ["Metrics", "Alerts", "Charts", "Plugins"],
"fr": ["Métriques", "Alertes", "Graphiques", "Plugins"],
"de": ["Metriken", "Warnungen", "Diagramme", "Plugins"],
"zh": ["指标", "告警", "图表", "插件"]
}
},
"dpi": {
"name": "Deep Packet Inspection", "icon": "🔬", "category": "Monitoring",
"description": {
"en": "DPI with netifyd/nDPId",
"fr": "DPI avec netifyd/nDPId",
"de": "DPI mit netifyd/nDPId",
"zh": "使用netifyd/nDPId的DPI"
},
"features": {
"en": ["Protocol detection", "App identification", "Flow analysis", "Statistics"],
"fr": ["Détection protocoles", "Identification apps", "Analyse flux", "Statistiques"],
"de": ["Protokollerkennung", "App-Identifizierung", "Flussanalyse", "Statistiken"],
"zh": ["协议检测", "应用识别", "流量分析", "统计"]
}
},
"netifyd": {
"name": "Netifyd DPI", "icon": "🔬", "category": "Monitoring",
"description": {
"en": "Netifyd deep packet inspection",
"fr": "Inspection paquets profonde Netifyd",
"de": "Netifyd Deep Packet Inspection",
"zh": "Netifyd深度包检测"
},
"features": {
"en": ["Application detection", "Protocol analysis", "Flow stats", "API"],
"fr": ["Détection applications", "Analyse protocoles", "Stats flux", "API"],
"de": ["Anwendungserkennung", "Protokollanalyse", "Flussstatistiken", "API"],
"zh": ["应用检测", "协议分析", "流量统计", "API"]
}
},
"ndpid": {
"name": "nDPId", "icon": "🔬", "category": "Monitoring",
"description": {
"en": "nDPI daemon for traffic analysis",
"fr": "Démon nDPI pour analyse trafic",
"de": "nDPI-Daemon für Verkehrsanalyse",
"zh": "用于流量分析的nDPI守护进程"
},
"features": {
"en": ["Protocol detection", "Flow tracking", "JSON API", "Real-time"],
"fr": ["Détection protocoles", "Suivi flux", "API JSON", "Temps réel"],
"de": ["Protokollerkennung", "Flussverfolgung", "JSON-API", "Echtzeit"],
"zh": ["协议检测", "流量跟踪", "JSON API", "实时"]
}
},
"device-intel": {
"name": "Device Intelligence", "icon": "📱", "category": "Monitoring",
"description": {
"en": "Asset discovery and fingerprinting",
"fr": "Découverte actifs et empreintes",
"de": "Asset-Erkennung und Fingerprinting",
"zh": "资产发现和指纹识别"
},
"features": {
"en": ["ARP scanning", "MAC vendor lookup", "OS detection", "Services"],
"fr": ["Scan ARP", "Recherche vendeur MAC", "Détection OS", "Services"],
"de": ["ARP-Scanning", "MAC-Vendor-Suche", "OS-Erkennung", "Dienste"],
"zh": ["ARP扫描", "MAC厂商查询", "OS检测", "服务"]
}
},
"watchdog": {
"name": "Watchdog", "icon": "👁️", "category": "Monitoring",
"description": {
"en": "Service and container monitoring",
"fr": "Surveillance services et conteneurs",
"de": "Service- und Container-Überwachung",
"zh": "服务和容器监控"
},
"features": {
"en": ["Health checks", "Auto-restart", "Alerts", "Logs"],
"fr": ["Vérifications santé", "Auto-redémarrage", "Alertes", "Logs"],
"de": ["Gesundheitsprüfungen", "Auto-Neustart", "Warnungen", "Logs"],
"zh": ["健康检查", "自动重启", "告警", "日志"]
}
},
"mediaflow": {
"name": "Media Flow", "icon": "🎬", "category": "Monitoring",
"description": {
"en": "Media traffic analytics",
"fr": "Analyse trafic média",
"de": "Medienverkehrsanalyse",
"zh": "媒体流量分析"
},
"features": {
"en": ["Stream detection", "Bandwidth usage", "Protocol analysis", "QoE"],
"fr": ["Détection flux", "Utilisation bande passante", "Analyse protocoles", "QoE"],
"de": ["Stream-Erkennung", "Bandbreitennutzung", "Protokollanalyse", "QoE"],
"zh": ["流检测", "带宽使用", "协议分析", "QoE"]
}
},
"glances": {
"name": "Glances", "icon": "👀", "category": "Monitoring",
"description": {
"en": "System monitoring dashboard",
"fr": "Tableau de bord surveillance système",
"de": "System-Überwachungs-Dashboard",
"zh": "系统监控仪表板"
},
"features": {
"en": ["CPU/Memory", "Disk/Network", "Docker", "Web UI"],
"fr": ["CPU/Mémoire", "Disque/Réseau", "Docker", "Interface web"],
"de": ["CPU/Speicher", "Disk/Netzwerk", "Docker", "Web-UI"],
"zh": ["CPU/内存", "磁盘/网络", "Docker", "Web界面"]
}
},
# =========================================================================
# ACCESS CONTROL
# =========================================================================
"portal": {
"name": "Login Portal", "icon": "🔐", "category": "Access",
"description": {
"en": "Authentication portal with JWT",
"fr": "Portail authentification avec JWT",
"de": "Authentifizierungsportal mit JWT",
"zh": "JWT认证门户"
},
"features": {
"en": ["JWT auth", "Sessions", "Password recovery", "Captive portal"],
"fr": ["Auth JWT", "Sessions", "Récupération mot de passe", "Portail captif"],
"de": ["JWT-Auth", "Sitzungen", "Passwortwiederherstellung", "Captive Portal"],
"zh": ["JWT认证", "会话", "密码恢复", "强制门户"]
}
},
"users": {
"name": "User Management", "icon": "👥", "category": "Access",
"description": {
"en": "Unified identity management",
"fr": "Gestion identité unifiée",
"de": "Einheitliche Identitätsverwaltung",
"zh": "统一身份管理"
},
"features": {
"en": ["User CRUD", "Groups", "Service provisioning", "RBAC"],
"fr": ["CRUD utilisateurs", "Groupes", "Provisioning services", "RBAC"],
"de": ["Benutzer-CRUD", "Gruppen", "Service-Bereitstellung", "RBAC"],
"zh": ["用户CRUD", "", "服务配置", "RBAC"]
}
},
"identity": {
"name": "Identity Provider", "icon": "🪪", "category": "Access",
"description": {
"en": "SAML/OIDC identity provider",
"fr": "Fournisseur d'identité SAML/OIDC",
"de": "SAML/OIDC-Identitätsanbieter",
"zh": "SAML/OIDC身份提供者"
},
"features": {
"en": ["SAML 2.0", "OpenID Connect", "Federation", "SSO"],
"fr": ["SAML 2.0", "OpenID Connect", "Fédération", "SSO"],
"de": ["SAML 2.0", "OpenID Connect", "Föderation", "SSO"],
"zh": ["SAML 2.0", "OpenID Connect", "联邦", "SSO"]
}
},
# =========================================================================
# SERVICES
# =========================================================================
"c3box": {
"name": "Services Portal", "icon": "📦", "category": "Services",
"description": {
"en": "C3Box services portal",
"fr": "Portail services C3Box",
"de": "C3Box-Dienstportal",
"zh": "C3Box服务门户"
},
"features": {
"en": ["Service links", "Status overview", "Quick access", "Categories"],
"fr": ["Liens services", "Vue état", "Accès rapide", "Catégories"],
"de": ["Service-Links", "Statusübersicht", "Schnellzugriff", "Kategorien"],
"zh": ["服务链接", "状态概览", "快速访问", "分类"]
}
},
"gitea": {
"name": "Gitea", "icon": "🦊", "category": "Services",
"description": {
"en": "Git server (LXC)",
"fr": "Serveur Git (LXC)",
"de": "Git-Server (LXC)",
"zh": "Git服务器(LXC)"
},
"features": {
"en": ["Repositories", "Users", "SSH/HTTP", "LFS", "Actions"],
"fr": ["Dépôts", "Utilisateurs", "SSH/HTTP", "LFS", "Actions"],
"de": ["Repositories", "Benutzer", "SSH/HTTP", "LFS", "Actions"],
"zh": ["仓库", "用户", "SSH/HTTP", "LFS", "Actions"]
}
},
"nextcloud": {
"name": "Nextcloud", "icon": "☁️", "category": "Services",
"description": {
"en": "File sync (LXC)",
"fr": "Synchronisation fichiers (LXC)",
"de": "Dateisynchronisierung (LXC)",
"zh": "文件同步(LXC)"
},
"features": {
"en": ["File sync", "WebDAV", "CalDAV", "CardDAV", "Talk"],
"fr": ["Sync fichiers", "WebDAV", "CalDAV", "CardDAV", "Talk"],
"de": ["Dateisync", "WebDAV", "CalDAV", "CardDAV", "Talk"],
"zh": ["文件同步", "WebDAV", "CalDAV", "CardDAV", "Talk"]
}
},
# =========================================================================
# AI
# =========================================================================
"ollama": {
"name": "Ollama", "icon": "🦙", "category": "AI",
"description": {
"en": "Local LLM server",
"fr": "Serveur LLM local",
"de": "Lokaler LLM-Server",
"zh": "本地LLM服务器"
},
"features": {
"en": ["Model management", "API", "Chat", "GPU support"],
"fr": ["Gestion modèles", "API", "Chat", "Support GPU"],
"de": ["Modellverwaltung", "API", "Chat", "GPU-Unterstützung"],
"zh": ["模型管理", "API", "聊天", "GPU支持"]
}
},
"localai": {
"name": "LocalAI", "icon": "🤖", "category": "AI",
"description": {
"en": "OpenAI-compatible local API",
"fr": "API locale compatible OpenAI",
"de": "OpenAI-kompatible lokale API",
"zh": "兼容OpenAI的本地API"
},
"features": {
"en": ["OpenAI API", "Multiple models", "Embeddings", "Image generation"],
"fr": ["API OpenAI", "Modèles multiples", "Embeddings", "Génération images"],
"de": ["OpenAI-API", "Mehrere Modelle", "Embeddings", "Bildgenerierung"],
"zh": ["OpenAI API", "多模型", "嵌入", "图像生成"]
}
},
"ai-gateway": {
"name": "AI Gateway", "icon": "🚪", "category": "AI",
"description": {
"en": "AI model API gateway",
"fr": "Passerelle API modèles IA",
"de": "AI-Modell-API-Gateway",
"zh": "AI模型API网关"
},
"features": {
"en": ["Rate limiting", "Load balancing", "Caching", "Logging"],
"fr": ["Limitation débit", "Équilibrage charge", "Cache", "Logs"],
"de": ["Ratenbegrenzung", "Lastverteilung", "Caching", "Protokollierung"],
"zh": ["速率限制", "负载均衡", "缓存", "日志"]
}
},
"ai-insights": {
"name": "AI Insights", "icon": "💡", "category": "AI",
"description": {
"en": "AI-powered security insights",
"fr": "Aperçus sécurité assistés par IA",
"de": "KI-gestützte Sicherheitseinblicke",
"zh": "AI驱动的安全洞察"
},
"features": {
"en": ["Anomaly detection", "Recommendations", "Predictions", "Reports"],
"fr": ["Détection anomalies", "Recommandations", "Prédictions", "Rapports"],
"de": ["Anomalieerkennung", "Empfehlungen", "Vorhersagen", "Berichte"],
"zh": ["异常检测", "建议", "预测", "报告"]
}
},
"localrecall": {
"name": "LocalRecall", "icon": "🧠", "category": "AI",
"description": {
"en": "Local RAG memory system",
"fr": "Système mémoire RAG local",
"de": "Lokales RAG-Gedächtnissystem",
"zh": "本地RAG记忆系统"
},
"features": {
"en": ["Vector storage", "Semantic search", "Document indexing", "API"],
"fr": ["Stockage vecteurs", "Recherche sémantique", "Indexation documents", "API"],
"de": ["Vektorspeicher", "Semantische Suche", "Dokumentenindizierung", "API"],
"zh": ["向量存储", "语义搜索", "文档索引", "API"]
}
},
"mcp-server": {
"name": "MCP Server", "icon": "🔌", "category": "AI",
"description": {
"en": "Model Context Protocol server",
"fr": "Serveur Model Context Protocol",
"de": "Model Context Protocol-Server",
"zh": "模型上下文协议服务器"
},
"features": {
"en": ["Tool integration", "Context management", "Multi-model", "API"],
"fr": ["Intégration outils", "Gestion contexte", "Multi-modèle", "API"],
"de": ["Tool-Integration", "Kontextverwaltung", "Multi-Modell", "API"],
"zh": ["工具集成", "上下文管理", "多模型", "API"]
}
},
# =========================================================================
# EMAIL
# =========================================================================
"mail": {
"name": "Mail Server", "icon": "📧", "category": "Email",
"description": {
"en": "Postfix/Dovecot mail server",
"fr": "Serveur mail Postfix/Dovecot",
"de": "Postfix/Dovecot-Mailserver",
"zh": "Postfix/Dovecot邮件服务器"
},
"features": {
"en": ["Domains", "Mailboxes", "DKIM", "SpamAssassin", "ClamAV"],
"fr": ["Domaines", "Boîtes mail", "DKIM", "SpamAssassin", "ClamAV"],
"de": ["Domänen", "Postfächer", "DKIM", "SpamAssassin", "ClamAV"],
"zh": ["域名", "邮箱", "DKIM", "SpamAssassin", "ClamAV"]
}
},
"webmail": {
"name": "Webmail", "icon": "💌", "category": "Email",
"description": {
"en": "Roundcube/SOGo webmail",
"fr": "Webmail Roundcube/SOGo",
"de": "Roundcube/SOGo-Webmail",
"zh": "Roundcube/SOGo网页邮箱"
},
"features": {
"en": ["Web interface", "Address book", "Calendar", "Mobile"],
"fr": ["Interface web", "Carnet adresses", "Calendrier", "Mobile"],
"de": ["Web-Oberfläche", "Adressbuch", "Kalender", "Mobil"],
"zh": ["Web界面", "通讯录", "日历", "移动端"]
}
},
"smtp-relay": {
"name": "SMTP Relay", "icon": "📤", "category": "Email",
"description": {
"en": "SMTP relay and smarthost",
"fr": "Relais SMTP et smarthost",
"de": "SMTP-Relay und Smarthost",
"zh": "SMTP中继和智能主机"
},
"features": {
"en": ["Relay", "Authentication", "Rate limiting", "Logging"],
"fr": ["Relais", "Authentification", "Limitation débit", "Logs"],
"de": ["Relay", "Authentifizierung", "Ratenbegrenzung", "Protokollierung"],
"zh": ["中继", "认证", "速率限制", "日志"]
}
},
"jabber": {
"name": "Jabber/XMPP", "icon": "💬", "category": "Email",
"description": {
"en": "XMPP messaging server",
"fr": "Serveur messagerie XMPP",
"de": "XMPP-Messaging-Server",
"zh": "XMPP消息服务器"
},
"features": {
"en": ["Chat", "Groups", "File transfer", "Federation"],
"fr": ["Chat", "Groupes", "Transfert fichiers", "Fédération"],
"de": ["Chat", "Gruppen", "Dateiübertragung", "Föderation"],
"zh": ["聊天", "群组", "文件传输", "联邦"]
}
},
# =========================================================================
# MEDIA
# =========================================================================
"jellyfin": {
"name": "Jellyfin", "icon": "🎬", "category": "Media",
"description": {
"en": "Media server",
"fr": "Serveur média",
"de": "Medienserver",
"zh": "媒体服务器"
},
"features": {
"en": ["Video streaming", "Live TV", "Transcoding", "Mobile apps"],
"fr": ["Streaming vidéo", "TV en direct", "Transcodage", "Apps mobiles"],
"de": ["Video-Streaming", "Live-TV", "Transcoding", "Mobile Apps"],
"zh": ["视频流", "直播电视", "转码", "移动应用"]
}
},
"lyrion": {
"name": "Lyrion Music", "icon": "🎵", "category": "Media",
"description": {
"en": "Music streaming server",
"fr": "Serveur streaming musique",
"de": "Musik-Streaming-Server",
"zh": "音乐流媒体服务器"
},
"features": {
"en": ["Music library", "Playlists", "Radio", "Multi-room"],
"fr": ["Bibliothèque musique", "Playlists", "Radio", "Multi-pièces"],
"de": ["Musikbibliothek", "Playlists", "Radio", "Multi-Room"],
"zh": ["音乐库", "播放列表", "电台", "多房间"]
}
},
"webradio": {
"name": "Web Radio", "icon": "📻", "category": "Media",
"description": {
"en": "Internet radio streaming",
"fr": "Streaming radio Internet",
"de": "Internet-Radio-Streaming",
"zh": "网络电台流媒体"
},
"features": {
"en": ["Radio stations", "Recording", "Schedule", "Favorites"],
"fr": ["Stations radio", "Enregistrement", "Programmation", "Favoris"],
"de": ["Radiosender", "Aufnahme", "Zeitplan", "Favoriten"],
"zh": ["电台", "录制", "计划", "收藏"]
}
},
"photoprism": {
"name": "PhotoPrism", "icon": "📸", "category": "Media",
"description": {
"en": "AI-powered photo management",
"fr": "Gestion photos assistée par IA",
"de": "KI-gestützte Fotoverwaltung",
"zh": "AI驱动的照片管理"
},
"features": {
"en": ["Face recognition", "Auto-tagging", "Search", "Albums"],
"fr": ["Reconnaissance faciale", "Auto-tagging", "Recherche", "Albums"],
"de": ["Gesichtserkennung", "Auto-Tagging", "Suche", "Alben"],
"zh": ["人脸识别", "自动标签", "搜索", "相册"]
}
},
"peertube": {
"name": "PeerTube", "icon": "📺", "category": "Media",
"description": {
"en": "Federated video platform",
"fr": "Plateforme vidéo fédérée",
"de": "Föderierte Videoplattform",
"zh": "联邦视频平台"
},
"features": {
"en": ["Video hosting", "Federation", "Live streaming", "Comments"],
"fr": ["Hébergement vidéo", "Fédération", "Live streaming", "Commentaires"],
"de": ["Video-Hosting", "Föderation", "Live-Streaming", "Kommentare"],
"zh": ["视频托管", "联邦", "直播", "评论"]
}
},
"torrent": {
"name": "Torrent", "icon": "🌊", "category": "Media",
"description": {
"en": "BitTorrent client",
"fr": "Client BitTorrent",
"de": "BitTorrent-Client",
"zh": "BitTorrent客户端"
},
"features": {
"en": ["Downloads", "RSS", "Remote control", "Bandwidth limits"],
"fr": ["Téléchargements", "RSS", "Contrôle distant", "Limites bande passante"],
"de": ["Downloads", "RSS", "Fernsteuerung", "Bandbreitenlimits"],
"zh": ["下载", "RSS", "远程控制", "带宽限制"]
}
},
"newsbin": {
"name": "Newsbin", "icon": "📰", "category": "Media",
"description": {
"en": "Usenet/NNTP client",
"fr": "Client Usenet/NNTP",
"de": "Usenet/NNTP-Client",
"zh": "Usenet/NNTP客户端"
},
"features": {
"en": ["NZB downloads", "Auto-processing", "Search", "Categories"],
"fr": ["Téléchargements NZB", "Traitement auto", "Recherche", "Catégories"],
"de": ["NZB-Downloads", "Auto-Verarbeitung", "Suche", "Kategorien"],
"zh": ["NZB下载", "自动处理", "搜索", "分类"]
}
},
# =========================================================================
# PUBLISHING
# =========================================================================
"publish": {
"name": "Publishing Platform", "icon": "📰", "category": "Publishing",
"description": {
"en": "Unified publishing dashboard",
"fr": "Tableau de bord publication unifié",
"de": "Einheitliches Veröffentlichungs-Dashboard",
"zh": "统一发布仪表板"
},
"features": {
"en": ["Multi-platform", "Scheduling", "Analytics", "Templates"],
"fr": ["Multi-plateforme", "Planification", "Analytiques", "Templates"],
"de": ["Multi-Plattform", "Planung", "Analysen", "Vorlagen"],
"zh": ["多平台", "计划", "分析", "模板"]
}
},
"droplet": {
"name": "Droplet", "icon": "💧", "category": "Publishing",
"description": {
"en": "File upload and publish",
"fr": "Upload et publication fichiers",
"de": "Datei-Upload und Veröffentlichung",
"zh": "文件上传和发布"
},
"features": {
"en": ["File upload", "Share links", "Expiration", "Password protection"],
"fr": ["Upload fichiers", "Liens partage", "Expiration", "Protection mot de passe"],
"de": ["Datei-Upload", "Freigabelinks", "Ablauf", "Passwortschutz"],
"zh": ["文件上传", "分享链接", "过期", "密码保护"]
}
},
"metablogizer": {
"name": "Metablogizer", "icon": "📝", "category": "Publishing",
"description": {
"en": "Static site publisher with Tor",
"fr": "Éditeur site statique avec Tor",
"de": "Statischer Site-Publisher mit Tor",
"zh": "带Tor的静态站点发布器"
},
"features": {
"en": ["Static sites", "Tor publishing", "Templates", "Markdown"],
"fr": ["Sites statiques", "Publication Tor", "Templates", "Markdown"],
"de": ["Statische Sites", "Tor-Veröffentlichung", "Vorlagen", "Markdown"],
"zh": ["静态站点", "Tor发布", "模板", "Markdown"]
}
},
"hexo": {
"name": "Hexo Blog", "icon": "✏️", "category": "Publishing",
"description": {
"en": "Static blog generator",
"fr": "Générateur blog statique",
"de": "Statischer Blog-Generator",
"zh": "静态博客生成器"
},
"features": {
"en": ["Markdown", "Themes", "Plugins", "Deploy"],
"fr": ["Markdown", "Thèmes", "Plugins", "Déploiement"],
"de": ["Markdown", "Themes", "Plugins", "Deploy"],
"zh": ["Markdown", "主题", "插件", "部署"]
}
},
"gotosocial": {
"name": "GoToSocial", "icon": "🐘", "category": "Publishing",
"description": {
"en": "ActivityPub social server",
"fr": "Serveur social ActivityPub",
"de": "ActivityPub-Social-Server",
"zh": "ActivityPub社交服务器"
},
"features": {
"en": ["Mastodon compatible", "Federation", "Media", "Privacy"],
"fr": ["Compatible Mastodon", "Fédération", "Média", "Vie privée"],
"de": ["Mastodon-kompatibel", "Föderation", "Medien", "Datenschutz"],
"zh": ["兼容Mastodon", "联邦", "媒体", "隐私"]
}
},
"cyberfeed": {
"name": "CyberFeed", "icon": "📡", "category": "Publishing",
"description": {
"en": "RSS/Atom feed aggregator",
"fr": "Agrégateur flux RSS/Atom",
"de": "RSS/Atom-Feed-Aggregator",
"zh": "RSS/Atom订阅聚合器"
},
"features": {
"en": ["Feed management", "Categories", "Search", "Export"],
"fr": ["Gestion flux", "Catégories", "Recherche", "Export"],
"de": ["Feed-Verwaltung", "Kategorien", "Suche", "Export"],
"zh": ["订阅管理", "分类", "搜索", "导出"]
}
},
# =========================================================================
# APPS
# =========================================================================
"streamlit": {
"name": "Streamlit", "icon": "🎨", "category": "Apps",
"description": {
"en": "Streamlit app platform",
"fr": "Plateforme apps Streamlit",
"de": "Streamlit-App-Plattform",
"zh": "Streamlit应用平台"
},
"features": {
"en": ["App hosting", "Deployment", "Management", "Logs"],
"fr": ["Hébergement apps", "Déploiement", "Gestion", "Logs"],
"de": ["App-Hosting", "Bereitstellung", "Verwaltung", "Logs"],
"zh": ["应用托管", "部署", "管理", "日志"]
}
},
"streamforge": {
"name": "StreamForge", "icon": "", "category": "Apps",
"description": {
"en": "Streamlit app development",
"fr": "Développement apps Streamlit",
"de": "Streamlit-App-Entwicklung",
"zh": "Streamlit应用开发"
},
"features": {
"en": ["Templates", "Code editor", "Preview", "Deploy"],
"fr": ["Templates", "Éditeur code", "Aperçu", "Déploiement"],
"de": ["Vorlagen", "Code-Editor", "Vorschau", "Deploy"],
"zh": ["模板", "代码编辑器", "预览", "部署"]
}
},
"repo": {
"name": "APT Repository", "icon": "📦", "category": "Apps",
"description": {
"en": "APT repository management",
"fr": "Gestion dépôt APT",
"de": "APT-Repository-Verwaltung",
"zh": "APT仓库管理"
},
"features": {
"en": ["Package management", "GPG signing", "Multi-distro", "Uploads"],
"fr": ["Gestion paquets", "Signature GPG", "Multi-distro", "Uploads"],
"de": ["Paketverwaltung", "GPG-Signierung", "Multi-Distro", "Uploads"],
"zh": ["包管理", "GPG签名", "多发行版", "上传"]
}
},
# =========================================================================
# IOT
# =========================================================================
"domoticz": {
"name": "Domoticz", "icon": "🏠", "category": "IoT",
"description": {
"en": "Home automation",
"fr": "Domotique",
"de": "Hausautomation",
"zh": "家庭自动化"
},
"features": {
"en": ["Devices", "Scenes", "Scripts", "History"],
"fr": ["Appareils", "Scènes", "Scripts", "Historique"],
"de": ["Geräte", "Szenen", "Skripte", "Verlauf"],
"zh": ["设备", "场景", "脚本", "历史"]
}
},
"homeassistant": {
"name": "Home Assistant", "icon": "🏡", "category": "IoT",
"description": {
"en": "Home automation hub",
"fr": "Hub domotique",
"de": "Hausautomations-Hub",
"zh": "家庭自动化中心"
},
"features": {
"en": ["Integrations", "Automations", "Dashboard", "Voice"],
"fr": ["Intégrations", "Automatisations", "Tableau de bord", "Voix"],
"de": ["Integrationen", "Automatisierungen", "Dashboard", "Sprache"],
"zh": ["集成", "自动化", "仪表板", "语音"]
}
},
"zigbee": {
"name": "Zigbee Gateway", "icon": "📡", "category": "IoT",
"description": {
"en": "Zigbee2MQTT gateway",
"fr": "Passerelle Zigbee2MQTT",
"de": "Zigbee2MQTT-Gateway",
"zh": "Zigbee2MQTT网关"
},
"features": {
"en": ["Device pairing", "MQTT", "Groups", "OTA updates"],
"fr": ["Appairage appareils", "MQTT", "Groupes", "Mises à jour OTA"],
"de": ["Gerätekopplung", "MQTT", "Gruppen", "OTA-Updates"],
"zh": ["设备配对", "MQTT", "群组", "OTA更新"]
}
},
"mqtt": {
"name": "MQTT Broker", "icon": "📡", "category": "IoT",
"description": {
"en": "Mosquitto MQTT broker",
"fr": "Broker MQTT Mosquitto",
"de": "Mosquitto MQTT-Broker",
"zh": "Mosquitto MQTT代理"
},
"features": {
"en": ["Topics", "ACL", "TLS", "WebSocket"],
"fr": ["Topics", "ACL", "TLS", "WebSocket"],
"de": ["Topics", "ACL", "TLS", "WebSocket"],
"zh": ["主题", "ACL", "TLS", "WebSocket"]
}
},
# =========================================================================
# COMMUNICATION
# =========================================================================
"matrix": {
"name": "Matrix Server", "icon": "💬", "category": "Communication",
"description": {
"en": "Matrix/Synapse chat server",
"fr": "Serveur chat Matrix/Synapse",
"de": "Matrix/Synapse-Chat-Server",
"zh": "Matrix/Synapse聊天服务器"
},
"features": {
"en": ["E2E encryption", "Federation", "Bridges", "Calls"],
"fr": ["Chiffrement E2E", "Fédération", "Bridges", "Appels"],
"de": ["E2E-Verschlüsselung", "Föderation", "Bridges", "Anrufe"],
"zh": ["端到端加密", "联邦", "桥接", "通话"]
}
},
"jitsi": {
"name": "Jitsi Meet", "icon": "📹", "category": "Communication",
"description": {
"en": "Video conferencing",
"fr": "Visioconférence",
"de": "Videokonferenzen",
"zh": "视频会议"
},
"features": {
"en": ["Video calls", "Screen share", "Recording", "Lobby"],
"fr": ["Appels vidéo", "Partage écran", "Enregistrement", "Lobby"],
"de": ["Videoanrufe", "Bildschirmfreigabe", "Aufnahme", "Lobby"],
"zh": ["视频通话", "屏幕共享", "录制", "等候室"]
}
},
"voip": {
"name": "VoIP Server", "icon": "📞", "category": "Communication",
"description": {
"en": "Asterisk/FreePBX VoIP",
"fr": "VoIP Asterisk/FreePBX",
"de": "Asterisk/FreePBX VoIP",
"zh": "Asterisk/FreePBX VoIP"
},
"features": {
"en": ["Extensions", "Trunks", "IVR", "Voicemail"],
"fr": ["Extensions", "Trunks", "IVR", "Messagerie vocale"],
"de": ["Extensions", "Trunks", "IVR", "Voicemail"],
"zh": ["分机", "中继", "IVR", "语音信箱"]
}
},
"turn": {
"name": "TURN Server", "icon": "🔄", "category": "Communication",
"description": {
"en": "TURN/STUN relay server",
"fr": "Serveur relais TURN/STUN",
"de": "TURN/STUN-Relay-Server",
"zh": "TURN/STUN中继服务器"
},
"features": {
"en": ["NAT traversal", "WebRTC", "TLS", "Statistics"],
"fr": ["Traversée NAT", "WebRTC", "TLS", "Statistiques"],
"de": ["NAT-Traversal", "WebRTC", "TLS", "Statistiken"],
"zh": ["NAT穿透", "WebRTC", "TLS", "统计"]
}
},
# =========================================================================
# SYSTEM
# =========================================================================
"system": {
"name": "System Hub", "icon": "⚙️", "category": "System",
"description": {
"en": "System configuration and management",
"fr": "Configuration et gestion système",
"de": "Systemkonfiguration und -verwaltung",
"zh": "系统配置和管理"
},
"features": {
"en": ["Settings", "Logs", "Services", "Updates"],
"fr": ["Paramètres", "Logs", "Services", "Mises à jour"],
"de": ["Einstellungen", "Protokolle", "Dienste", "Updates"],
"zh": ["设置", "日志", "服务", "更新"]
}
},
"backup": {
"name": "Backup Manager", "icon": "💾", "category": "System",
"description": {
"en": "System and LXC backup",
"fr": "Sauvegarde système et LXC",
"de": "System- und LXC-Backup",
"zh": "系统和LXC备份"
},
"features": {
"en": ["Config backup", "LXC snapshots", "Restore", "Scheduling"],
"fr": ["Sauvegarde config", "Snapshots LXC", "Restauration", "Planification"],
"de": ["Config-Backup", "LXC-Snapshots", "Wiederherstellung", "Planung"],
"zh": ["配置备份", "LXC快照", "恢复", "计划"]
}
},
"config-advisor": {
"name": "Config Advisor", "icon": "📋", "category": "System",
"description": {
"en": "Configuration recommendations",
"fr": "Recommandations de configuration",
"de": "Konfigurationsempfehlungen",
"zh": "配置建议"
},
"features": {
"en": ["Security audit", "Best practices", "Optimization", "Reports"],
"fr": ["Audit sécurité", "Bonnes pratiques", "Optimisation", "Rapports"],
"de": ["Sicherheits-Audit", "Best Practices", "Optimierung", "Berichte"],
"zh": ["安全审计", "最佳实践", "优化", "报告"]
}
},
"reporter": {
"name": "Reporter", "icon": "📊", "category": "System",
"description": {
"en": "System reporting and analytics",
"fr": "Rapports et analytiques système",
"de": "Systemberichterstattung und -analyse",
"zh": "系统报告和分析"
},
"features": {
"en": ["Reports", "Scheduling", "Export", "Email"],
"fr": ["Rapports", "Planification", "Export", "Email"],
"de": ["Berichte", "Planung", "Export", "E-Mail"],
"zh": ["报告", "计划", "导出", "邮件"]
}
},
"mirror": {
"name": "Mirror Manager", "icon": "🪞", "category": "System",
"description": {
"en": "APT mirror management",
"fr": "Gestion miroir APT",
"de": "APT-Mirror-Verwaltung",
"zh": "APT镜像管理"
},
"features": {
"en": ["Mirror sync", "Bandwidth", "Scheduling", "Cache"],
"fr": ["Sync miroir", "Bande passante", "Planification", "Cache"],
"de": ["Mirror-Sync", "Bandbreite", "Planung", "Cache"],
"zh": ["镜像同步", "带宽", "计划", "缓存"]
}
},
"cloner": {
"name": "System Cloner", "icon": "📀", "category": "System",
"description": {
"en": "System image cloning",
"fr": "Clonage image système",
"de": "System-Image-Klonen",
"zh": "系统镜像克隆"
},
"features": {
"en": ["Disk imaging", "Clone to USB", "Restore", "Compression"],
"fr": ["Image disque", "Clone USB", "Restauration", "Compression"],
"de": ["Disk-Imaging", "Clone auf USB", "Wiederherstellung", "Kompression"],
"zh": ["磁盘镜像", "克隆到USB", "恢复", "压缩"]
}
},
"eye-remote": {
"name": "Eye Remote", "icon": "👁️", "category": "System",
"description": {
"en": "Remote management interface",
"fr": "Interface de gestion à distance",
"de": "Remote-Verwaltungsoberfläche",
"zh": "远程管理界面"
},
"features": {
"en": ["USB gadget", "Serial console", "Boot media", "Recovery"],
"fr": ["Gadget USB", "Console série", "Média boot", "Récupération"],
"de": ["USB-Gadget", "Serielle Konsole", "Boot-Medium", "Wiederherstellung"],
"zh": ["USB设备", "串口控制台", "启动媒体", "恢复"]
}
},
"rtty": {
"name": "RTTY Console", "icon": "🖥️", "category": "System",
"description": {
"en": "Remote terminal access",
"fr": "Accès terminal distant",
"de": "Remote-Terminal-Zugriff",
"zh": "远程终端访问"
},
"features": {
"en": ["Web terminal", "SSH", "File transfer", "Recording"],
"fr": ["Terminal web", "SSH", "Transfert fichiers", "Enregistrement"],
"de": ["Web-Terminal", "SSH", "Dateiübertragung", "Aufnahme"],
"zh": ["Web终端", "SSH", "文件传输", "录制"]
}
},
}
LANGUAGES = {
"en": {"name": "English", "flag": "🇬🇧"},
"fr": {"name": "Français", "flag": "🇫🇷"},
"de": {"name": "Deutsch", "flag": "🇩🇪"},
"zh": {"name": "中文", "flag": "🇨🇳"},
}
def check_screenshot_exists(module_id: str, screenshots_dir: Path) -> bool:
"""Check if screenshot exists for module."""
return (screenshots_dir / f"{module_id}.png").exists()
def generate_package_readme(module_id: str, module_info: dict, lang: str = "en", include_screenshot: bool = True) -> str:
"""Generate README for a package."""
name = module_info["name"]
icon = module_info["icon"]
category = module_info["category"]
desc = module_info["description"].get(lang, module_info["description"]["en"])
features = module_info["features"].get(lang, module_info["features"]["en"])
labels = {
"en": {"features": "Features", "install": "Installation", "config": "Configuration", "api": "API Endpoints", "screenshot": "Screenshot", "license": "License"},
"fr": {"features": "Fonctionnalités", "install": "Installation", "config": "Configuration", "api": "Points d'accès API", "screenshot": "Capture d'écran", "license": "Licence"},
"de": {"features": "Funktionen", "install": "Installation", "config": "Konfiguration", "api": "API-Endpunkte", "screenshot": "Screenshot", "license": "Lizenz"},
"zh": {"features": "功能", "install": "安装", "config": "配置", "api": "API端点", "screenshot": "截图", "license": "许可证"},
}
L = labels.get(lang, labels["en"])
readme = f"""# {icon} {name}
{desc}
**Category:** {category}
"""
if include_screenshot:
readme += f"""## {L['screenshot']}
![{name}](../../docs/screenshots/vm/{module_id}.png)
"""
readme += f"""## {L['features']}
"""
for feature in features:
readme += f"- {feature}\n"
readme += f"""
## {L['install']}
```bash
# Add SecuBox repository
curl -fsSL https://apt.secubox.in/install.sh | sudo bash
# Install package
sudo apt install secubox-{module_id}
```
## {L['config']}
Configuration file: `/etc/secubox/{module_id}.toml`
## {L['api']}
- `GET /api/v1/{module_id}/status` - Module status
- `GET /api/v1/{module_id}/health` - Health check
## {L['license']}
MIT License - CyberMind © 2024-2026
"""
return readme
def generate_wiki_page(lang: str, include_screenshots: bool = True, screenshots_dir: Optional[Path] = None) -> str:
"""Generate wiki page for a language."""
labels = {
"en": {
"title": "SecuBox Modules",
"subtitle": "Complete module documentation",
"overview": "Overview",
"modules": "Modules",
"category": "Category",
"description": "Description",
"screenshot": "Screenshot",
"total": "Total modules",
"features": "Features",
},
"fr": {
"title": "Modules SecuBox",
"subtitle": "Documentation complète des modules",
"overview": "Aperçu",
"modules": "Modules",
"category": "Catégorie",
"description": "Description",
"screenshot": "Capture d'écran",
"total": "Total des modules",
"features": "Fonctionnalités",
},
"de": {
"title": "SecuBox Module",
"subtitle": "Vollständige Moduldokumentation",
"overview": "Übersicht",
"modules": "Module",
"category": "Kategorie",
"description": "Beschreibung",
"screenshot": "Screenshot",
"total": "Module insgesamt",
"features": "Funktionen",
},
"zh": {
"title": "SecuBox模块",
"subtitle": "完整的模块文档",
"overview": "概述",
"modules": "模块",
"category": "类别",
"description": "描述",
"screenshot": "截图",
"total": "模块总数",
"features": "功能",
},
}
L = labels.get(lang, labels["en"])
# Language selector
lang_links = " | ".join([f"[{LANGUAGES[l]['flag']} {LANGUAGES[l]['name']}](MODULES-{l.upper()}.md)" for l in LANGUAGES])
wiki = f"""# {L['title']}
*{L['subtitle']}*
**{L['total']}:** {len(MODULES)}
{lang_links}
---
## {L['overview']}
| {L['modules']} | {L['category']} | {L['description']} |
|--------|----------|-------------|
"""
for mid, info in MODULES.items():
desc = info["description"].get(lang, info["description"]["en"])
wiki += f"| {info['icon']} **{info['name']}** | {info['category']} | {desc} |\n"
wiki += f"""
---
## {L['modules']}
"""
# Group by category
by_category = {}
for mid, info in MODULES.items():
cat = info["category"]
if cat not in by_category:
by_category[cat] = []
by_category[cat].append((mid, info))
for category, modules_list in sorted(by_category.items()):
wiki += f"### {category}\n\n"
for mid, info in modules_list:
desc = info["description"].get(lang, info["description"]["en"])
features = info["features"].get(lang, info["features"]["en"])
wiki += f"""#### {info['icon']} {info['name']}
{desc}
**{L['features']}:** {', '.join(features)}
"""
# Add screenshot if exists
if include_screenshots:
if screenshots_dir and check_screenshot_exists(mid, screenshots_dir):
wiki += f"![{info['name']}](screenshots/vm/{mid}.png)\n\n"
wiki += "---\n\n"
return wiki
def generate_category_index(lang: str = "en") -> str:
"""Generate category index page."""
labels = {
"en": {"title": "Module Categories", "count": "modules"},
"fr": {"title": "Catégories de Modules", "count": "modules"},
"de": {"title": "Modul-Kategorien", "count": "Module"},
"zh": {"title": "模块分类", "count": "个模块"},
}
L = labels.get(lang, labels["en"])
# Count by category
categories = {}
for info in MODULES.values():
cat = info["category"]
if cat not in categories:
categories[cat] = 0
categories[cat] += 1
md = f"# {L['title']}\n\n"
for cat, count in sorted(categories.items(), key=lambda x: -x[1]):
md += f"- **{cat}**: {count} {L['count']}\n"
return md
def main():
parser = argparse.ArgumentParser(description="Generate SecuBox documentation")
parser.add_argument("--include-screenshots", action="store_true", help="Include screenshots in docs")
parser.add_argument("--lang", help="Generate for specific language only")
parser.add_argument("--readme-only", action="store_true", help="Generate package READMEs only")
parser.add_argument("--wiki-only", action="store_true", help="Generate wiki pages only")
args = parser.parse_args()
base_dir = Path(__file__).parent.parent
packages_dir = base_dir / "packages"
docs_dir = base_dir / "docs"
wiki_dir = docs_dir / "wiki"
screenshots_dir = docs_dir / "screenshots" / "vm"
wiki_dir.mkdir(parents=True, exist_ok=True)
languages = [args.lang] if args.lang else list(LANGUAGES.keys())
if not args.wiki_only:
print(f"Generating package READMEs for {len(MODULES)} modules...")
created = 0
for module_id, module_info in MODULES.items():
pkg_dir = packages_dir / f"secubox-{module_id}"
if pkg_dir.exists():
readme_path = pkg_dir / "README.md"
has_screenshot = check_screenshot_exists(module_id, screenshots_dir)
readme = generate_package_readme(
module_id, module_info, "en",
include_screenshot=args.include_screenshots and has_screenshot
)
readme_path.write_text(readme)
created += 1
print(f" Created {created} READMEs")
if not args.readme_only:
print(f"\nGenerating multilingual wiki pages ({', '.join(languages)})...")
for lang in languages:
wiki_path = wiki_dir / f"MODULES-{lang.upper()}.md"
wiki = generate_wiki_page(
lang,
include_screenshots=args.include_screenshots,
screenshots_dir=screenshots_dir
)
wiki_path.write_text(wiki)
print(f" Created {wiki_path.name}")
# Category index
for lang in languages:
index_path = wiki_dir / f"CATEGORIES-{lang.upper()}.md"
index = generate_category_index(lang)
index_path.write_text(index)
print(f" Created {index_path.name}")
print(f"\nDone! Total modules: {len(MODULES)}")
if __name__ == "__main__":
main()