$id, 'enabled' => $enabled, 'cron' => $cron, 'updated' => date('c'), ]; if (!vv_schedule_save($schedule)) return false; return vv_cron_rebuild($schedule); } function vv_cron_rebuild(array $schedule): bool { $lines = ["# Varaverk — managed by plugin, do not edit manually"]; $lines[] = "# Regenerated: " . date('Y-m-d H:i:s'); $lines[] = ""; $scriptsDir = SCRIPTS_DIR; foreach ($schedule as $entry) { if (empty($entry['enabled']) || empty($entry['cron']) || empty($entry['id'])) continue; $script = "$scriptsDir/{$entry['id']}"; $cron = $entry['cron']; $lines[] = "$cron " . CRON_USER . " bash \"$script\" >> /var/log/varaverk/jobs.log 2>&1"; } $lines[] = ""; return file_put_contents(CRON_FILE, implode("\n", $lines)) !== false; } // Walk the scripts repo and return the job tree: // orchestrators as top-level, individual scripts as children function vv_job_tree(): array { $scriptsDir = SCRIPTS_DIR; $schedule = vv_schedule_load(); // Orchestrators are in Orchestrators/ and their children are all scripts they call // For now: walk top-level folders, treat *_management.sh or *_maintenance.sh as orchs $orchPattern = "$scriptsDir/Orchestrators/*.sh"; $orchs = []; foreach (glob($orchPattern) ?: [] as $path) { $id = 'Orchestrators/' . basename($path); $entry = $schedule[$id] ?? ['enabled' => false, 'cron' => '']; $orchs[] = [ 'id' => $id, 'label' => basename($path, '.sh'), 'type' => 'orchestrator', 'enabled' => (bool)($entry['enabled'] ?? false), 'cron' => $entry['cron'] ?? '', 'children' => vv_script_children($path, $schedule), ]; } return $orchs; } // Parse an orchestrator script to find which child scripts it calls function vv_script_children(string $orchPath, array $schedule): array { $scriptsDir = SCRIPTS_DIR; $content = file_get_contents($orchPath) ?: ''; $children = []; // Match: bash "path/to/script.sh" or source path/to/script.sh preg_match_all('/(?:bash|source|\.)\s+"?([^"\s]+\.sh)"?/m', $content, $m); foreach ($m[1] as $rel) { // Normalise relative paths $rel = ltrim(str_replace($scriptsDir . '/', '', $rel), './'); $id = $rel; $entry = $schedule[$id] ?? ['enabled' => false, 'cron' => '']; $children[] = [ 'id' => $id, 'label' => basename($rel, '.sh'), 'type' => 'script', 'enabled' => (bool)($entry['enabled'] ?? false), 'cron' => $entry['cron'] ?? '', ]; } return $children; }