Add Varaverk plugin scaffold (PHP, unRAID native)
Plugin lives in Plugin/ — invisible to User Script Plugin. dev_install.sh symlinks into /usr/local/emhttp/plugins/varaverk/ for development. Pages: Monitor (5s poll), Scheduler (orchs + Advanced children, toggle + cron), Config (raw editor, host-aware file access), Docs (markdown + live $VAR substitution). API endpoints: monitor.php (JSON), scheduler.php (writes schedule.json + cron.d), config.php (writes conf files with host permission check). Includes: config.php (parser, host detection, var map), scheduler.php (job tree, cron.d rebuild), monitor.php (docker, GPU, resources, fallback, transcode), docs.php (file tree, var substitution, Parsedown renderer).
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
<?php
|
||||
// Scheduler — manages schedule.json and /etc/cron.d/varaverk.
|
||||
// schedule.json is per-host, never synced.
|
||||
|
||||
define('SCHEDULE_FILE', '/boot/config/plugins/varaverk/schedule.json');
|
||||
define('CRON_FILE', '/etc/cron.d/varaverk');
|
||||
define('CRON_USER', 'root');
|
||||
|
||||
function vv_schedule_load(): array {
|
||||
if (!file_exists(SCHEDULE_FILE)) return [];
|
||||
$data = json_decode(file_get_contents(SCHEDULE_FILE), true);
|
||||
return is_array($data) ? $data : [];
|
||||
}
|
||||
|
||||
function vv_schedule_save(array $schedule): bool {
|
||||
$dir = dirname(SCHEDULE_FILE);
|
||||
if (!is_dir($dir)) mkdir($dir, 0755, true);
|
||||
return file_put_contents(SCHEDULE_FILE, json_encode($schedule, JSON_PRETTY_PRINT)) !== false;
|
||||
}
|
||||
|
||||
function vv_schedule_update(string $id, bool $enabled, string $cron): bool {
|
||||
$schedule = vv_schedule_load();
|
||||
$schedule[$id] = [
|
||||
'id' => $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;
|
||||
}
|
||||
Reference in New Issue
Block a user