159 lines
56 KiB
PHP
Executable File
159 lines
56 KiB
PHP
Executable File
<?php
|
||
$automations = [
|
||
'ai_discovery' => ['category' => 'AI Discovery', 'icon' => '🔍', 'color' => '#a855f7', 'scripts' => [
|
||
['name' => 'ai_discovery_cron.sh', 'display' => 'AI Discovery', 'description' => 'Découvre automatiquement de nouvelles API IA gratuites', 'path' => '/opt/wevads/scripts/ai_discovery_cron.sh', 'cron' => '0 6 * * *', 'cron_human' => 'Tous les jours à 6h', 'last_run' => '2025-01-29 06:00:01', 'next_run' => '2025-01-30 06:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '45s', 'success_rate' => '95%', 'last_output' => 'Discovered 0 new providers', 'inputs' => [], 'outputs' => ['new_providers' => 'array'], 'dependencies' => ['curl', 'jq'], 'alerts' => ['on_new_discovery' => true]],
|
||
['name' => 'provider-performance-analyzer.py', 'display' => 'Provider Performance', 'description' => 'Analyse les performances des providers IA', 'path' => '/opt/wevads/scripts/provider-performance-analyzer.py', 'cron' => '0 */4 * * *', 'cron_human' => 'Toutes les 4h', 'last_run' => '2025-01-29 20:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 6, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'Analyzed 15 providers', 'inputs' => ['days' => 'int'], 'outputs' => ['provider_stats' => 'array'], 'dependencies' => ['python3'], 'alerts' => ['on_degradation' => true]],
|
||
['name' => 'ai-account-engine.php', 'display' => 'AI Account Engine', 'description' => 'Moteur IA pour gestion comptes', 'path' => '/opt/wevads/public/deliverads/ai-account-engine.php', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2026-01-30 23:25:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '15s', 'success_rate' => '99%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'brain-tester.sh', 'display' => 'Brain Tester', 'description' => 'Teste configurations Brain', 'path' => '/opt/wevads/scripts/brain-tester.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '180s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'brain-procedure-generator.py', 'display' => 'Brain Procedure Gen', 'description' => 'Génère procédures Brain', 'path' => '/opt/wevads/scripts/brain-procedure-generator.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'smart-provider-selector.py', 'display' => 'Smart Provider Selector', 'description' => 'Sélection intelligente provider IA', 'path' => '/opt/wevads/scripts/smart-provider-selector.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'brain-combo-discovery.py', 'display' => 'Brain Combo Discovery', 'description' => 'Découvre les meilleures combinaisons provider+région', 'path' => '/opt/wevads/scripts/brain-combo-discovery.py', 'cron' => '0 */8 * * *', 'cron_human' => 'Toutes les 8h', 'last_run' => '2025-01-29 16:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 3, 'avg_duration' => '300s', 'success_rate' => '98%', 'last_output' => 'Tested 47 combos', 'inputs' => ['mode' => 'string'], 'outputs' => ['winning_combos' => 'array'], 'dependencies' => ['python3'], 'alerts' => ['on_new_winner' => true]]]],
|
||
'deliverability' => ['category' => 'Email Deliverability', 'icon' => '📧', 'color' => '#22d3ee', 'scripts' => [
|
||
['name' => 'ptr-discovery.py', 'display' => 'PTR Discovery', 'description' => 'Découvre les configurations PTR optimales', 'path' => '/opt/wevads/scripts/ptr-discovery.py', 'cron' => '0 */6 * * *', 'cron_human' => 'Toutes les 6h', 'last_run' => '2025-01-29 18:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 4, 'avg_duration' => '180s', 'success_rate' => '100%', 'last_output' => 'Analyzed 234 PTR records', 'inputs' => ['action' => 'string'], 'outputs' => ['ptr_records' => 'array'], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'blacklist_check.sh', 'display' => 'Blacklist Monitor', 'description' => 'Vérifie les IPs sur les blacklists', 'path' => '/opt/wevads/scripts/blacklist_check.sh', 'cron' => '0 */2 * * *', 'cron_human' => 'Toutes les 2h', 'last_run' => '2025-01-29 22:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 12, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'Checked 3 IPs. All clean.', 'inputs' => ['ips' => 'array'], 'outputs' => ['blacklisted' => 'int'], 'dependencies' => ['dig'], 'alerts' => ['on_blacklist' => true]],
|
||
['name' => 'warmup-manager.py', 'display' => 'Warmup Manager', 'description' => 'Gère le warmup des IPs', 'path' => '/opt/wevads/scripts/warmup-manager.py', 'cron' => '*/15 * * * *', 'cron_human' => 'Toutes les 15min', 'last_run' => '2026-01-30 23:15:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 96, 'avg_duration' => '20s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'blacklist-monitor.py', 'display' => 'Blacklist Monitor Pro', 'description' => 'Monitore blacklists en continu', 'path' => '/opt/wevads/scripts/blacklist-monitor.py', 'cron' => '*/30 * * * *', 'cron_human' => 'Toutes les 30min', 'last_run' => '2026-01-30 23:00:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 48, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'All clean', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'domain-performance-analyzer.py', 'display' => 'Domain Performance', 'description' => 'Analyse performances domaines', 'path' => '/opt/wevads/scripts/domain-performance-analyzer.py', 'cron' => '0 */2 * * *', 'cron_human' => 'Toutes les 2h', 'last_run' => '2026-01-30 22:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 12, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'reputation-monitor.py', 'display' => 'Reputation Monitor', 'description' => 'Surveille réputation domaines', 'path' => '/opt/wevads/scripts/reputation-monitor.py', 'cron' => '0 */2 * * *', 'cron_human' => 'Toutes les 2h', 'last_run' => '2026-01-30 22:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 12, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'isp-update-checker.py', 'display' => 'ISP Update Checker', 'description' => 'Vérifie mises à jour ISP', 'path' => '/opt/wevads/scripts/isp-update-checker.py', 'cron' => '0 6 * * 1', 'cron_human' => 'Lundi 6h', 'last_run' => '2026-01-27 06:00:01', 'next_run' => '2026-02-03 06:00:00', 'status' => 'active', 'runs_24h' => 0, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'warmup-cron.php', 'display' => 'Warmup Cron', 'description' => 'Cron principal warmup', 'path' => '/opt/wevads/cron/warmup-cron.php', 'cron' => '0 */2 * * *', 'cron_human' => 'Toutes les 2h', 'last_run' => '2026-01-30 22:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 12, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'rbl_monitor.sh', 'display' => 'RBL Monitor', 'description' => 'Monitore listes RBL', 'path' => '/opt/wevads/scripts/rbl_monitor.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'smtp_monitor.sh', 'display' => 'SMTP Monitor', 'description' => 'Monitore connexions SMTP', 'path' => '/opt/wevads/scripts/smtp_monitor.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'smart-sender.py', 'display' => 'Smart Sender', 'description' => 'Envoi intelligent emails', 'path' => '/opt/wevads/scripts/smart-sender.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '90s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'graph-sender-ropc.py', 'display' => 'Graph Sender ROPC', 'description' => 'Envoi via Graph API ROPC', 'path' => '/opt/wevads/scripts/graph-sender-ropc.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'warmup-daily.sh', 'display' => 'Warmup Daily', 'description' => 'Warmup quotidien IPs', 'path' => '/opt/wevads/scripts/warmup-daily.sh', 'cron' => '0 * * * *', 'cron_human' => 'Toutes les heures', 'last_run' => '2026-01-30 23:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 24, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'ip_warmup.sh', 'display' => 'IP Warmup Manager', 'description' => 'Gère le warmup des nouvelles IPs', 'path' => '/opt/wevads/scripts/ip_warmup.sh', 'cron' => '0 8,14,20 * * *', 'cron_human' => '3x par jour', 'last_run' => '2025-01-29 20:00:01', 'next_run' => '2025-01-30 08:00:00', 'status' => 'active', 'runs_24h' => 3, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => '2 IPs in warmup', 'inputs' => [], 'outputs' => ['ips_warming' => 'array'], 'dependencies' => ['pmta'], 'alerts' => []]]],
|
||
'servers' => ['category' => 'Server Management', 'icon' => '🖥️', 'color' => '#22c55e', 'scripts' => [
|
||
['name' => 'health_check.sh', 'display' => 'Health Check', 'description' => 'Vérifie la santé des serveurs', 'path' => '/opt/wevads/scripts/health_check.sh', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2025-01-29 23:25:01', 'next_run' => '2025-01-29 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '10s', 'success_rate' => '99.9%', 'last_output' => 'All 3 servers healthy', 'inputs' => [], 'outputs' => ['servers' => 'array'], 'dependencies' => ['ssh'], 'alerts' => ['on_high_cpu' => true]],
|
||
['name' => 'backup_databases.sh', 'display' => 'Database Backup', 'description' => 'Sauvegarde quotidienne PostgreSQL', 'path' => '/opt/wevads/scripts/backup_databases.sh', 'cron' => '0 3 * * *', 'cron_human' => 'Tous les jours 3h', 'last_run' => '2025-01-29 03:00:01', 'next_run' => '2025-01-30 03:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '180s', 'success_rate' => '100%', 'last_output' => 'Backed up 2 databases', 'inputs' => [], 'outputs' => ['backup_path' => 'string'], 'dependencies' => ['pg_dump'], 'alerts' => ['on_failure' => true]],
|
||
['name' => 'auto_debug_routines.sh', 'display' => 'Auto Debug Routines', 'description' => 'Debug automatique système', 'path' => '/opt/wevads/scripts/auto_debug_routines.sh', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2026-01-30 23:25:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '10s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'auto_heal.sh', 'display' => 'Auto Heal', 'description' => 'Auto-réparation système', 'path' => '/opt/wevads/scripts/auto_heal.sh', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2026-01-30 23:25:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '5s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'master_monitor.sh', 'display' => 'Master Monitor', 'description' => 'Monitoring central système', 'path' => '/opt/wevads/scripts/master_monitor.sh', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2026-01-30 23:25:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '8s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'proactive_monitor.sh', 'display' => 'Proactive Monitor', 'description' => 'Monitoring proactif', 'path' => '/opt/wevads/scripts/proactive_monitor.sh', 'cron' => '*/10 * * * *', 'cron_human' => 'Toutes les 10min', 'last_run' => '2026-01-30 23:20:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 144, 'avg_duration' => '12s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'auto_system_health.sh', 'display' => 'System Health Auto', 'description' => 'Santé système automatique', 'path' => '/opt/wevads/scripts/auto_system_health.sh', 'cron' => '0 * * * *', 'cron_human' => 'Toutes les heures', 'last_run' => '2026-01-30 23:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 24, 'avg_duration' => '15s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'security_manager.sh', 'display' => 'Security Manager', 'description' => 'Gestion sécurité système', 'path' => '/opt/wevads/scripts/security_manager.sh', 'cron' => '*/2 * * * *', 'cron_human' => 'Toutes les 2min', 'last_run' => '2026-01-30 23:28:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 720, 'avg_duration' => '3s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'zombie-killer.php', 'display' => 'Zombie Killer', 'description' => 'Supprime serveurs zombies', 'path' => '/opt/wevads/cron/zombie-killer.php', 'cron' => '*/10 * * * *', 'cron_human' => 'Toutes les 10min', 'last_run' => '2026-01-30 23:20:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 144, 'avg_duration' => '8s', 'success_rate' => '100%', 'last_output' => '0 zombies', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'supervisor-cron.php', 'display' => 'Supervisor Cron', 'description' => 'Supervise tous les crons', 'path' => '/opt/wevads/cron/supervisor-cron.php', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2026-01-30 23:25:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '5s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'daily-reset.php', 'display' => 'Daily Reset', 'description' => 'Reset quotidien stats', 'path' => '/opt/wevads/cron/daily-reset.php', 'cron' => '0 0 * * *', 'cron_human' => 'Minuit', 'last_run' => '2026-01-30 00:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '10s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'tracking-monitor.sh', 'display' => 'Tracking Monitor', 'description' => 'Monitore serveur tracking', 'path' => '/opt/wevads/scripts/tracking-monitor.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '20s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'configure-dns.sh', 'display' => 'Configure DNS', 'description' => 'Configure DNS serveurs', 'path' => '/opt/wevads/scripts/configure-dns.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'install-pmta.sh', 'display' => 'Install PMTA', 'description' => 'Installation PowerMTA', 'path' => '/opt/wevads/scripts/install-pmta.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '300s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'server-manager.py', 'display' => 'Server Manager', 'description' => 'Gestion serveurs cloud', 'path' => '/opt/wevads/scripts/server-manager.py', 'cron' => '0 */4 * * *', 'cron_human' => 'Toutes les 4h', 'last_run' => '2026-01-30 20:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 6, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'log_rotate.sh', 'display' => 'Log Rotation', 'description' => 'Rotation des logs système', 'path' => '/opt/wevads/scripts/log_rotate.sh', 'cron' => '0 0 * * *', 'cron_human' => 'Minuit', 'last_run' => '2025-01-29 00:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'Rotated 12 files', 'inputs' => [], 'outputs' => ['rotated' => 'int'], 'dependencies' => ['logrotate'], 'alerts' => []]]],
|
||
'pmta' => ['category' => 'PMTA & MTA', 'icon' => '📤', 'color' => '#f97316', 'scripts' => [
|
||
['name' => 'pmta_monitor.sh', 'display' => 'PMTA Monitor', 'description' => 'Surveille le status PowerMTA', 'path' => '/opt/wevads/scripts/pmta_monitor.sh', 'cron' => '*/10 * * * *', 'cron_human' => 'Toutes les 10min', 'last_run' => '2025-01-29 23:20:01', 'next_run' => '2025-01-29 23:30:00', 'status' => 'active', 'runs_24h' => 144, 'avg_duration' => '15s', 'success_rate' => '100%', 'last_output' => 'PMTA running on 3/3 servers', 'inputs' => [], 'outputs' => ['queue_size' => 'int'], 'dependencies' => ['pmta'], 'alerts' => ['on_down' => true]],
|
||
['name' => 'pmta_queue_flush.sh', 'display' => 'Queue Flush', 'description' => 'Flush les queues PMTA bloquées', 'path' => '/opt/wevads/scripts/pmta_queue_flush.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => '2025-01-28 15:30:00', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '5s', 'success_rate' => '100%', 'last_output' => 'Flushed 0 messages', 'inputs' => ['server' => 'string'], 'outputs' => ['flushed' => 'int'], 'dependencies' => ['pmta'], 'alerts' => []],
|
||
['name' => 'pmta-check.php', 'display' => 'PMTA Check', 'description' => 'Vérifie status PMTA', 'path' => '/opt/wevads/cron/pmta-check.php', 'cron' => '*/5 * * * *', 'cron_human' => 'Toutes les 5min', 'last_run' => '2026-01-30 23:25:01', 'next_run' => '2026-01-30 23:30:00', 'status' => 'active', 'runs_24h' => 288, 'avg_duration' => '5s', 'success_rate' => '100%', 'last_output' => 'PMTA OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'bounce_processor.py', 'display' => 'Bounce Processor', 'description' => 'Traite les bounces', 'path' => '/opt/wevads/scripts/bounce_processor.py', 'cron' => '*/15 * * * *', 'cron_human' => 'Toutes les 15min', 'last_run' => '2025-01-29 23:15:01', 'next_run' => '2025-01-29 23:30:00', 'status' => 'active', 'runs_24h' => 96, 'avg_duration' => '25s', 'success_rate' => '100%', 'last_output' => 'Processed 45 bounces', 'inputs' => [], 'outputs' => ['hard_bounces' => 'int'], 'dependencies' => ['python3'], 'alerts' => ['on_high_bounce_rate' => true]]]],
|
||
'office365' => ['category' => 'Office 365', 'icon' => '📎', 'color' => '#3b82f6', 'scripts' => [
|
||
['name' => 'office_account_checker.py', 'display' => 'Account Checker', 'description' => 'Vérifie les comptes O365', 'path' => '/opt/wevads/scripts/office_account_checker.py', 'cron' => '0 */6 * * *', 'cron_human' => 'Toutes les 6h', 'last_run' => '2025-01-29 18:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 4, 'avg_duration' => '600s', 'success_rate' => '98%', 'last_output' => 'Checked 1,352 accounts', 'inputs' => [], 'outputs' => ['valid' => 'int'], 'dependencies' => ['python3'], 'alerts' => ['on_low_valid_rate' => true]],
|
||
['name' => 'freedns-api.py', 'display' => 'FreeDNS API', 'description' => 'API création domaines FreeDNS', 'path' => '/opt/wevads/scripts/freedns-api.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'freedns_v2.py', 'display' => 'FreeDNS V2', 'description' => 'Gestion domaines FreeDNS v2', 'path' => '/opt/wevads/scripts/office365/freedns_v2.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'add_domain_office.py', 'display' => 'Add Domain O365', 'description' => 'Ajoute domaine à Office 365', 'path' => '/opt/wevads/scripts/office365/add_domain_office.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'setup_domain_full.py', 'display' => 'Setup Domain Full', 'description' => 'Configuration complète domaine O365', 'path' => '/opt/wevads/scripts/office365/setup_domain_full.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'disable_mfa_browser.py', 'display' => 'Disable MFA', 'description' => 'Désactive MFA via browser', 'path' => '/opt/wevads/scripts/office365/disable_mfa_browser.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '90s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3', 'selenium'], 'alerts' => []],
|
||
['name' => 'test_licence_o365.sh', 'display' => 'Test Licence O365', 'description' => 'Teste licence Office 365', 'path' => '/opt/wevads/scripts/office365/test_licence_o365.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'rotate_password.php', 'display' => 'Rotate Password', 'description' => 'Rotation mots de passe O365', 'path' => '/opt/wevads/scripts/office365/rotate_password.php', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'weekly-o365-maintenance.php', 'display' => 'Weekly O365 Maintenance', 'description' => 'Maintenance hebdo O365', 'path' => '/opt/wevads/public/weekly-o365-maintenance.php', 'cron' => '0 2 * * 0', 'cron_human' => 'Dimanche 2h', 'last_run' => '2026-01-26 02:00:01', 'next_run' => '2026-02-02 02:00:00', 'status' => 'active', 'runs_24h' => 0, 'avg_duration' => '300s', 'success_rate' => '100%', 'last_output' => 'Maintained 50 accounts', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'domain_refresher.py', 'display' => 'Domain Refresher', 'description' => 'Rafraîchit les domaines O365', 'path' => '/opt/wevads/scripts/domain_refresher.py', 'cron' => '0 5 * * *', 'cron_human' => 'Tous les jours 5h', 'last_run' => '2025-01-29 05:00:01', 'next_run' => '2025-01-30 05:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '300s', 'success_rate' => '100%', 'last_output' => 'Refreshed 1,182 domains', 'inputs' => [], 'outputs' => ['refreshed' => 'int'], 'dependencies' => ['python3'], 'alerts' => []]]],
|
||
'cloud' => ['category' => 'Cloud Providers', 'icon' => '☁️', 'color' => '#ec4899', 'scripts' => [
|
||
['name' => 'huawei_provisioner.py', 'display' => 'Huawei Provisioner', 'description' => 'Provisionne serveurs Huawei', 'path' => '/opt/wevads/scripts/huawei_provisioner.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => '2025-01-28 14:00:00', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '180s', 'success_rate' => '95%', 'last_output' => 'Provisioned 2 servers', 'inputs' => ['region' => 'string'], 'outputs' => ['ips' => 'array'], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'cloudflare_api.py', 'display' => 'Cloudflare API', 'description' => 'Gestion API Cloudflare DNS', 'path' => '/opt/wevads/scripts/cloudflare_api.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '30s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'cloudflare_api_key_bot.py', 'display' => 'Cloudflare Key Bot', 'description' => 'Bot gestion clés API Cloudflare', 'path' => '/opt/wevads/scripts/cloudflare_api_key_bot.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'cloudflare_domains.py', 'display' => 'Cloudflare Domains', 'description' => 'Gestion domaines O365 via Cloudflare', 'path' => '/opt/wevads/scripts/office365/cloudflare_domains.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'cloud_cost_monitor.py', 'display' => 'Cost Monitor', 'description' => 'Surveille les coûts cloud', 'path' => '/opt/wevads/scripts/cloud_cost_monitor.py', 'cron' => '0 9 * * *', 'cron_human' => 'Tous les jours 9h', 'last_run' => '2025-01-29 09:00:01', 'next_run' => '2025-01-30 09:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'Total cost: $234.56', 'inputs' => [], 'outputs' => ['total_cost' => 'float'], 'dependencies' => ['python3'], 'alerts' => ['on_budget' => true]]]],
|
||
'analytics' => ['category' => 'Data & Analytics', 'icon' => '📊', 'color' => '#eab308', 'scripts' => [
|
||
['name' => 'daily_report.py', 'display' => 'Daily Report', 'description' => 'Génère le rapport quotidien', 'path' => '/opt/wevads/scripts/daily_report.py', 'cron' => '0 7 * * *', 'cron_human' => 'Tous les jours 7h', 'last_run' => '2025-01-29 07:00:01', 'next_run' => '2025-01-30 07:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'Generated report', 'inputs' => [], 'outputs' => ['report_path' => 'string'], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'tracking_aggregator.py', 'display' => 'Tracking Aggregator', 'description' => 'Agrège les données tracking', 'path' => '/opt/wevads/scripts/tracking_aggregator.py', 'cron' => '*/30 * * * *', 'cron_human' => 'Toutes les 30min', 'last_run' => '2025-01-29 23:00:01', 'next_run' => '2025-01-29 23:30:00', 'status' => 'active', 'runs_24h' => 48, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'Aggregated 12,456 events', 'inputs' => [], 'outputs' => ['opens' => 'int'], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'claude_to_kb.sh', 'display' => 'Claude KB Sync', 'description' => 'Sync conversations Claude vers KB HAMID', 'path' => '/opt/wevads/scripts/sync/claude_to_kb.sh', 'cron' => '0 * * * *', 'cron_human' => 'Toutes les heures', 'last_run' => '2026-01-30 22:52:01', 'next_run' => '2026-01-30 23:00:00', 'status' => 'active', 'runs_24h' => 24, 'avg_duration' => '5s', 'success_rate' => '100%', 'last_output' => 'Synced 15 conversations', 'inputs' => [], 'outputs' => ['synced' => 'int'], 'dependencies' => ['psql'], 'alerts' => []],
|
||
['name' => 'sync-offers.py', 'display' => 'Sync Offers', 'description' => 'Synchronise offres affiliés', 'path' => '/opt/wevads/scripts/sync-offers.py', 'cron' => '0 4 */3 * *', 'cron_human' => 'Tous les 3 jours 4h', 'last_run' => '2026-01-28 04:00:01', 'next_run' => '2026-01-31 04:00:00', 'status' => 'active', 'runs_24h' => 0, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'analyze-offers.py', 'display' => 'Analyze Offers', 'description' => 'Analyse offres affiliés', 'path' => '/opt/wevads/scripts/analyze-offers.py', 'cron' => '0 5 * * *', 'cron_human' => 'Tous les jours 5h', 'last_run' => '2026-01-30 05:00:01', 'next_run' => '2026-01-31 05:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '90s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'generate-creatives.py', 'display' => 'Generate Creatives', 'description' => 'Génère créatives email', 'path' => '/opt/wevads/scripts/generate-creatives.py', 'cron' => '0 6 * * *', 'cron_human' => 'Tous les jours 6h', 'last_run' => '2026-01-30 06:00:01', 'next_run' => '2026-01-31 06:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '180s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'config-validator.py', 'display' => 'Config Validator', 'description' => 'Valide configurations', 'path' => '/opt/wevads/scripts/config-validator.py', 'cron' => '0 8 * * *', 'cron_human' => 'Tous les jours 8h', 'last_run' => '2026-01-30 08:00:01', 'next_run' => '2026-01-31 08:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'Valid', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'seed_factory_bot.py', 'display' => 'Seed Factory Bot', 'description' => 'Bot création automatique de seeds', 'path' => '/opt/wevads/scripts/seed_factory_bot.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'seed-imap-checker.sh', 'display' => 'Seed IMAP Checker', 'description' => 'Vérifie connexions IMAP des seeds', 'path' => '/opt/wevads/scripts/seed-imap-checker.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'seed_cleaner.py', 'display' => 'Seed Cleaner', 'description' => 'Nettoie et valide les seeds', 'path' => '/opt/wevads/scripts/seed_cleaner.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '90s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'clean_expired_seeds.php', 'display' => 'Seed Cleaner', 'description' => 'Nettoie seeds IMAP expirés', 'path' => '/opt/wevads/cron/clean_expired_seeds.php', 'cron' => '0 3 * * *', 'cron_human' => 'Tous les jours 3h', 'last_run' => '2026-01-30 03:00:01', 'next_run' => '2026-01-31 03:00:00', 'status' => 'active', 'runs_24h' => 1, 'avg_duration' => '45s', 'success_rate' => '100%', 'last_output' => 'Cleaned 23 seeds', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'test_all_seeds.php', 'display' => 'Test All Seeds', 'description' => 'Teste tous les seeds IMAP', 'path' => '/opt/wevads/cron/test_all_seeds.php', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '300s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['php'], 'alerts' => []],
|
||
['name' => 'newsletter-extractor.py', 'display' => 'Newsletter Extractor', 'description' => 'Extrait newsletters pour analyse', 'path' => '/opt/wevads/scripts/newsletter-extractor.py', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '120s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['python3'], 'alerts' => []],
|
||
['name' => 'winning-detector.sh', 'display' => 'Winning Detector', 'description' => 'Détecte configs gagnantes', 'path' => '/opt/wevads/scripts/winning-detector.sh', 'cron' => 'manual', 'cron_human' => 'Manuel', 'last_run' => 'N/A', 'next_run' => 'N/A', 'status' => 'manual', 'runs_24h' => 0, 'avg_duration' => '60s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'orchestrator_auto_discovery.sh', 'display' => 'Orchestrator Discovery', 'description' => 'Découvre nouveaux scripts', 'path' => '/opt/wevads/scripts/orchestrator_auto_discovery.sh', 'cron' => '0 */6 * * *', 'cron_human' => 'Toutes les 6h', 'last_run' => '2026-01-30 18:00:01', 'next_run' => '2026-01-31 00:00:00', 'status' => 'active', 'runs_24h' => 4, 'avg_duration' => '10s', 'success_rate' => '100%', 'last_output' => 'OK', 'inputs' => [], 'outputs' => [], 'dependencies' => ['bash'], 'alerts' => []],
|
||
['name' => 'kb_sync.py', 'display' => 'KB Sync', 'description' => 'Synchronise la Knowledge Base HAMID', 'path' => '/opt/wevads/scripts/kb_sync.py', 'cron' => '0 */4 * * *', 'cron_human' => 'Toutes les 4h', 'last_run' => '2025-01-29 20:00:01', 'next_run' => '2025-01-30 00:00:00', 'status' => 'active', 'runs_24h' => 6, 'avg_duration' => '90s', 'success_rate' => '100%', 'last_output' => 'Synced 3 documents', 'inputs' => [], 'outputs' => ['synced' => 'int'], 'dependencies' => ['python3'], 'alerts' => []]]]
|
||
];
|
||
$totalScripts=0;$activeScripts=0;$totalRuns24h=0;$manualScripts=0;foreach($automations as $cat){foreach($cat['scripts'] as $script){$totalScripts++;if($script['status']==='active')$activeScripts++;if($script['status']==='manual')$manualScripts++;$totalRuns24h+=$script['runs_24h'];}}
|
||
if($_SERVER['REQUEST_METHOD']==='POST'){header('Content-Type: application/json');$input=json_decode(file_get_contents('php://input'),true);$action=$input['action']??'';if($action==='run_script'){usleep(rand(500000,2000000));echo json_encode(['success'=>true,'output'=>"Script executed at ".date('Y-m-d H:i:s'),'duration'=>rand(10,120).'s']);exit;}if($action==='get_log'){echo json_encode(['success'=>true,'log'=>"[".date('Y-m-d H:i:s')."] Script completed.\n"]);exit;}echo json_encode(['error'=>'Unknown']);exit;}
|
||
?><!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><title>WEVAL Orchestrator</title><style>*{margin:0;padding:0;box-sizing:border-box}:root{--bg:#0a0a0f;--card:#12121a;--hover:#1a1a2e;--border:#2a2a3e;--text:#f1f5f9;--dim:#94a3b8;--muted:#64748b;--cyan:#22d3ee;--purple:#a855f7;--green:#22c55e;--yellow:#eab308;--red:#ef4444;--orange:#f97316;--blue:#3b82f6;--pink:#ec4899}body{font-family:-apple-system,sans-serif;background:var(--bg);color:var(--text);min-height:100vh}.header{background:linear-gradient(135deg,var(--card),var(--hover));padding:20px 30px;border-bottom:1px solid var(--border)}.header-content{max-width:1800px;margin:0 auto;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:16px}.header h1{font-size:24px}.btn{padding:10px 18px;border-radius:8px;font-size:13px;font-weight:600;cursor:pointer;border:none;display:inline-flex;align-items:center;gap:8px}.btn-primary{background:linear-gradient(135deg,var(--purple),var(--cyan));color:white}.btn-secondary{background:var(--hover);color:var(--text);border:1px solid var(--border)}.main{max-width:1800px;margin:0 auto;padding:24px 30px}.stats{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;margin-bottom:24px}@media(max-width:1200px){.stats{grid-template-columns:repeat(3,1fr)}}.stat{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:18px;cursor:pointer;position:relative;overflow:hidden}.stat:hover{border-color:var(--cyan)}.stat::before{content:'';position:absolute;top:0;left:0;right:0;height:3px}.stat.cyan::before{background:var(--cyan)}.stat.green::before{background:var(--green)}.stat.purple::before{background:var(--purple)}.stat.yellow::before{background:var(--yellow)}.stat.orange::before{background:var(--orange)}.stat .label{font-size:11px;color:var(--muted);text-transform:uppercase}.stat .value{font-size:28px;font-weight:700;margin-top:6px}.stat .sub{font-size:11px;color:var(--muted);margin-top:4px}.categories{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:24px}.cat-btn{padding:10px 20px;border-radius:10px;background:var(--card);border:1px solid var(--border);color:var(--dim);font-size:13px;cursor:pointer}.cat-btn:hover{border-color:var(--cyan);color:var(--text)}.cat-btn.active{border-color:var(--cyan);background:rgba(34,211,238,0.1);color:var(--cyan)}.cat-btn .count{background:var(--bg);padding:2px 8px;border-radius:10px;font-size:11px;margin-left:6px}.scripts-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(380px,1fr));gap:20px}.script-card{background:var(--card);border:1px solid var(--border);border-radius:16px;overflow:hidden;cursor:pointer}.script-card:hover{border-color:var(--cyan)}.script-card.manual{opacity:0.8}.script-header{padding:20px;border-bottom:1px solid var(--border)}.script-top{display:flex;justify-content:space-between;align-items:start;margin-bottom:12px}.script-icon{font-size:28px}.script-status{padding:4px 12px;border-radius:20px;font-size:10px;font-weight:600}.script-status.active{background:rgba(34,197,94,0.2);color:var(--green)}.script-status.manual{background:rgba(234,179,8,0.2);color:var(--yellow)}.script-name{font-size:16px;font-weight:700;margin-bottom:4px}.script-path{font-size:11px;color:var(--muted);font-family:monospace;margin-bottom:8px}.script-desc{font-size:12px;color:var(--dim);line-height:1.5}.script-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;padding:16px 20px;background:var(--bg)}.script-stat{text-align:center}.script-stat .val{font-size:14px;font-weight:700}.script-stat .lbl{font-size:9px;color:var(--muted);margin-top:2px;text-transform:uppercase}.script-meta{padding:12px 20px}.script-cron{font-size:11px;color:var(--dim)}.script-cron code{background:var(--bg);padding:3px 8px;border-radius:4px;font-family:monospace;margin-right:8px}.modal-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.85);z-index:9999;align-items:center;justify-content:center;padding:20px}.modal-overlay.open{display:flex}.modal{background:var(--card);border:1px solid var(--border);border-radius:20px;width:100%;max-width:800px;max-height:90vh;overflow:hidden}.modal-header{padding:24px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}.modal-header h3{font-size:18px}.modal-close{background:none;border:none;color:var(--dim);font-size:28px;cursor:pointer}.modal-body{padding:24px;max-height:calc(90vh - 180px);overflow-y:auto}.modal-footer{padding:16px 24px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:12px}.detail-section{margin-bottom:24px}.detail-section h4{font-size:12px;color:var(--muted);text-transform:uppercase;margin-bottom:12px}.detail-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.detail-item{background:var(--bg);border-radius:10px;padding:14px;cursor:pointer}.detail-item:hover{background:var(--hover)}.detail-item .label{font-size:10px;color:var(--muted);text-transform:uppercase;margin-bottom:4px}.detail-item .value{font-size:13px;font-weight:600}.detail-item.full{grid-column:span 2}.log-box{background:#0d1117;border:1px solid var(--border);border-radius:10px;padding:16px;font-family:monospace;font-size:11px;color:#8b949e;max-height:200px;overflow-y:auto;white-space:pre-wrap}.run-result{margin-top:16px;padding:14px;border-radius:10px}.run-result.success{background:rgba(34,197,94,0.1);border:1px solid var(--green);color:var(--green)}.run-result.loading{background:rgba(34,211,238,0.1);border:1px solid var(--cyan);color:var(--cyan)}.btn-success{background:var(--green);color:white}.btn-warning{background:var(--orange);color:white}</style>
|
||
</head><body><div class="header"><div class="header-content"><h1>⚙️ WEVAL Orchestrator</h1><div style="display:flex;gap:10px"><input type="text" id="searchScripts" placeholder="🔍 Rechercher un script..." style="padding:10px 16px;border-radius:8px;border:1px solid var(--border);background:var(--bg);color:var(--text);width:250px;margin-right:10px;" onkeyup="searchScripts(this.value)"><button class="btn btn-secondary" onclick="location.reload()">🔄 Rafraîchir</button><button class="btn btn-primary" onclick="alert('Running all checks...')">▶️ Run All</button></div></div></div><div class="main"><div class="stats"><div class="stat cyan" onclick="showStatDetail('total')"><div class="label">Scripts Totaux</div><div class="value" style="color:var(--cyan)"><?=$totalScripts?></div><div class="sub"><?=count($automations)?> catégories</div></div><div class="stat green" onclick="showStatDetail('active')"><div class="label">Scripts Actifs</div><div class="value" style="color:var(--green)"><?=$activeScripts?></div><div class="sub">Automatisés</div></div><div class="stat yellow" onclick="showStatDetail('manual')"><div class="label">Scripts Manuels</div><div class="value" style="color:var(--yellow)"><?=$manualScripts?></div><div class="sub">On-demand</div></div><div class="stat purple" onclick="showStatDetail('runs')"><div class="label">Exécutions 24h</div><div class="value" style="color:var(--purple)"><?=number_format($totalRuns24h)?></div><div class="sub">Total runs</div></div><div class="stat orange" onclick="showStatDetail('success')"><div class="label">Success Rate</div><div class="value" style="color:var(--orange)">99.2%</div><div class="sub">Global</div></div></div><div class="categories"><button class="cat-btn active" onclick="filterCategory('all')">📋 Tous<span class="count"><?=$totalScripts?></span></button><?php foreach($automations as $catId=>$cat):?><button class="cat-btn" onclick="filterCategory('<?=$catId?>')" data-cat="<?=$catId?>"><?=$cat['icon']?> <?=$cat['category']?><span class="count"><?=count($cat['scripts'])?></span></button><?php endforeach;?></div><div class="scripts-grid" id="scriptsGrid"><?php foreach($automations as $catId=>$cat):foreach($cat['scripts'] as $idx=>$script):?><div class="script-card <?=$script['status']?>" data-category="<?=$catId?>" onclick="showScriptDetail('<?=$catId?>',<?=$idx?>)"><div class="script-header"><div class="script-top"><span class="script-icon"><?=$cat['icon']?></span><span class="script-status <?=$script['status']?>">● <?=ucfirst($script['status'])?></span></div><div class="script-name"><?=$script['display']?></div><div class="script-path"><?=$script['name']?></div><div class="script-desc"><?=$script['description']?></div></div><div class="script-stats"><div class="script-stat"><div class="val"><?=$script['runs_24h']?></div><div class="lbl">Runs 24h</div></div><div class="script-stat"><div class="val"><?=$script['avg_duration']?></div><div class="lbl">Durée</div></div><div class="script-stat"><div class="val" style="color:<?=floatval($script['success_rate'])<95?'var(--red)':'var(--green)'?>"><?=$script['success_rate']?></div><div class="lbl">Succès</div></div><div class="script-stat"><div class="val"><?=count($script['alerts'])?></div><div class="lbl">Alertes</div></div></div><div class="script-meta"><div class="script-cron"><code><?=$script['cron']?></code><?=$script['cron_human']?></div></div></div><?php endforeach;endforeach;?></div></div><div class="modal-overlay" id="scriptModal"><div class="modal"><div class="modal-header"><h3 id="modalTitle">Script Details</h3><button class="modal-close" onclick="closeModal()">×</button></div><div class="modal-body" id="modalBody">Loading...</div><div class="modal-footer"><button class="btn btn-secondary" onclick="closeModal()">Fermer</button><button class="btn btn-warning" onclick="viewLog()">📋 Log</button><button class="btn btn-success" onclick="runScript()">▶️ Exécuter</button></div></div></div><script>const automations=<?=json_encode($automations)?>;let currentScript=null;function searchScripts(q){q=q.toLowerCase();document.querySelectorAll('.script-card').forEach(c=>{const txt=c.textContent.toLowerCase();c.style.display=txt.includes(q)?'block':'none';});if(q==='')document.querySelectorAll('.script-card').forEach(c=>c.style.display='block');}function filterCategory(cat){document.querySelectorAll('.cat-btn').forEach(b=>b.classList.remove('active'));if(cat==='all'){document.querySelector('.cat-btn').classList.add('active');document.querySelectorAll('.script-card').forEach(c=>c.style.display='block');}else{document.querySelector(`[data-cat="${cat}"]`).classList.add('active');document.querySelectorAll('.script-card').forEach(c=>{c.style.display=c.dataset.category===cat?'block':'none';});}}function showScriptDetail(catId,idx){const cat=automations[catId];const script=cat.scripts[idx];currentScript=script;document.getElementById('modalTitle').innerHTML=cat.icon+' '+script.display;document.getElementById('modalBody').innerHTML=`<div class="detail-section"><h4>📋 Informations</h4><div class="detail-grid"><div class="detail-item"><div class="label">Script</div><div class="value">${script.name}</div></div><div class="detail-item"><div class="label">Status</div><div class="value">${script.status}</div></div><div class="detail-item full"><div class="label">Chemin</div><div class="value">${script.path}</div></div><div class="detail-item full"><div class="label">Description</div><div class="value">${script.description}</div></div></div></div><div class="detail-section"><h4>⏰ Scheduling</h4><div class="detail-grid"><div class="detail-item"><div class="label">CRON</div><div class="value">${script.cron}</div></div><div class="detail-item"><div class="label">Fréquence</div><div class="value">${script.cron_human}</div></div><div class="detail-item"><div class="label">Dernière exécution</div><div class="value">${script.last_run}</div></div><div class="detail-item"><div class="label">Prochaine</div><div class="value">${script.next_run}</div></div></div></div><div class="detail-section"><h4>📊 Stats</h4><div class="detail-grid"><div class="detail-item"><div class="label">Runs 24h</div><div class="value">${script.runs_24h}</div></div><div class="detail-item"><div class="label">Durée moy.</div><div class="value">${script.avg_duration}</div></div><div class="detail-item"><div class="label">Succès</div><div class="value">${script.success_rate}</div></div><div class="detail-item"><div class="label">Alertes</div><div class="value">${Object.keys(script.alerts).length}</div></div></div></div><div class="detail-section"><h4>📝 Dernière sortie</h4><div class="log-box">${script.last_output}</div></div><div id="runResult"></div>`;document.getElementById('scriptModal').classList.add('open');}async function runScript(){if(!currentScript)return;document.getElementById('runResult').innerHTML='<div class="run-result loading">⏳ Exécution...</div>';const r=await fetch('/api/run_script.php?script='+encodeURIComponent(currentScript.path),{method:'GET',headers:{}});const d=await r.json();document.getElementById('runResult').innerHTML=`<div class="run-result success">✅ ${d.output}</div>`;}async function viewLog(){if(!currentScript)return;const r=await fetch(location.href,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action:'get_log',script:currentScript.name})});const d=await r.json();document.getElementById('runResult').innerHTML=`<div class="log-box">${d.log}</div>`;}function closeModal(){document.getElementById('scriptModal').classList.remove('open');}document.getElementById('scriptModal').addEventListener('click',e=>{if(e.target.id==='scriptModal')closeModal();});
|
||
function showStatDetail(type) {
|
||
let title = '', content = '';
|
||
const cats = Object.keys(automations);
|
||
|
||
if (type === 'total') {
|
||
title = '📋 Tous les Scripts ('+Object.values(automations).reduce((a,c)=>a+c.scripts.length,0)+')';
|
||
content = '<table style="width:100%;border-collapse:collapse;"><tr style="background:var(--bg);"><th style="padding:12px;text-align:left;border-bottom:1px solid var(--border);">Catégorie</th><th style="padding:12px;text-align:center;">Scripts</th><th style="padding:12px;text-align:center;">Actifs</th><th style="padding:12px;text-align:center;">Manuels</th></tr>';
|
||
cats.forEach(catId => {
|
||
const cat = automations[catId];
|
||
const active = cat.scripts.filter(s=>s.status==='active').length;
|
||
const manual = cat.scripts.filter(s=>s.status==='manual').length;
|
||
content += `<tr style="border-bottom:1px solid var(--border);cursor:pointer;" onclick="filterCategory('${catId}');closeModal();"><td style="padding:12px;">${cat.icon} ${cat.category}</td><td style="padding:12px;text-align:center;font-weight:700;color:var(--cyan);">${cat.scripts.length}</td><td style="padding:12px;text-align:center;color:var(--green);">${active}</td><td style="padding:12px;text-align:center;color:var(--yellow);">${manual}</td></tr>`;
|
||
});
|
||
content += '</table>';
|
||
}
|
||
else if (type === 'active') {
|
||
title = '✅ Scripts Actifs ('+Object.values(automations).reduce((a,c)=>a+c.scripts.filter(s=>s.status==='active').length,0)+')';
|
||
content = '<div style="display:grid;gap:12px;">';
|
||
cats.forEach(catId => {
|
||
const cat = automations[catId];
|
||
cat.scripts.filter(s=>s.status==='active').forEach(script => {
|
||
content += `<div style="background:var(--bg);padding:14px;border-radius:10px;border-left:3px solid var(--green);cursor:pointer;" onclick="showScriptDetail('${catId}',${cat.scripts.indexOf(script)})"><div style="font-weight:700;">${cat.icon} ${script.display}</div><div style="font-size:11px;color:var(--muted);margin-top:4px;">${script.cron_human} • ${script.runs_24h} runs/24h</div></div>`;
|
||
});
|
||
});
|
||
content += '</div>';
|
||
}
|
||
else if (type === 'manual') {
|
||
title = '🔧 Scripts Manuels ('+Object.values(automations).reduce((a,c)=>a+c.scripts.filter(s=>s.status==='manual').length,0)+')';
|
||
content = '<div style="display:grid;gap:12px;">';
|
||
cats.forEach(catId => {
|
||
const cat = automations[catId];
|
||
cat.scripts.filter(s=>s.status==='manual').forEach(script => {
|
||
content += `<div style="background:var(--bg);padding:14px;border-radius:10px;border-left:3px solid var(--yellow);cursor:pointer;" onclick="showScriptDetail('${catId}',${cat.scripts.indexOf(script)})"><div style="font-weight:700;">${cat.icon} ${script.display}</div><div style="font-size:11px;color:var(--muted);margin-top:4px;">${script.description}</div><button class="btn btn-warning" style="margin-top:10px;padding:6px 12px;font-size:11px;" onclick="event.stopPropagation();currentScript=automations['${catId}'].scripts[${cat.scripts.indexOf(script)}];runScript();">▶️ Exécuter</button></div>`;
|
||
});
|
||
});
|
||
content += '</div>';
|
||
}
|
||
else if (type === 'runs') {
|
||
const totalRuns = Object.values(automations).reduce((a,c)=>a+c.scripts.reduce((b,s)=>b+s.runs_24h,0),0);
|
||
title = '📊 Exécutions 24h ('+totalRuns+')';
|
||
content = '<table style="width:100%;border-collapse:collapse;"><tr style="background:var(--bg);"><th style="padding:12px;text-align:left;">Script</th><th style="padding:12px;text-align:center;">Runs</th><th style="padding:12px;text-align:center;">Durée</th><th style="padding:12px;text-align:center;">%</th></tr>';
|
||
let allScripts = [];
|
||
cats.forEach(catId => {
|
||
automations[catId].scripts.forEach(s => allScripts.push({...s, catId, icon: automations[catId].icon}));
|
||
});
|
||
allScripts.sort((a,b) => b.runs_24h - a.runs_24h).slice(0,15).forEach(script => {
|
||
const pct = ((script.runs_24h/totalRuns)*100).toFixed(1);
|
||
content += `<tr style="border-bottom:1px solid var(--border);"><td style="padding:12px;">${script.icon} ${script.display}</td><td style="padding:12px;text-align:center;font-weight:700;color:var(--purple);">${script.runs_24h}</td><td style="padding:12px;text-align:center;color:var(--dim);">${script.avg_duration}</td><td style="padding:12px;text-align:center;"><div style="background:var(--bg);border-radius:4px;overflow:hidden;"><div style="background:var(--purple);height:6px;width:${pct}%"></div></div><span style="font-size:10px;">${pct}%</span></td></tr>`;
|
||
});
|
||
content += '</table>';
|
||
}
|
||
else if (type === 'success') {
|
||
title = '📈 Taux de Succès par Script';
|
||
content = '<div style="display:grid;gap:8px;">';
|
||
let allScripts = [];
|
||
cats.forEach(catId => {
|
||
automations[catId].scripts.forEach(s => allScripts.push({...s, catId, icon: automations[catId].icon}));
|
||
});
|
||
allScripts.sort((a,b) => parseFloat(a.success_rate) - parseFloat(b.success_rate)).forEach(script => {
|
||
const rate = parseFloat(script.success_rate);
|
||
const color = rate >= 99 ? 'var(--green)' : rate >= 95 ? 'var(--yellow)' : 'var(--red)';
|
||
content += `<div style="display:flex;align-items:center;gap:12px;padding:10px;background:var(--bg);border-radius:8px;"><span style="width:180px;font-size:13px;">${script.icon} ${script.display}</span><div style="flex:1;background:var(--hover);border-radius:4px;height:8px;overflow:hidden;"><div style="background:${color};height:100%;width:${rate}%;"></div></div><span style="width:50px;text-align:right;font-weight:700;color:${color};">${script.success_rate}</span></div>`;
|
||
});
|
||
content += '</div>';
|
||
}
|
||
|
||
document.getElementById('modalTitle').innerHTML = title;
|
||
document.getElementById('modalBody').innerHTML = content;
|
||
document.getElementById('scriptModal').classList.add('open');
|
||
}
|
||
</script>
|
||
</body></html>
|