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).
80 lines
3.0 KiB
PHP
80 lines
3.0 KiB
PHP
<?php
|
|
require_once dirname(__DIR__) . '/include/scheduler.php';
|
|
$tree = vv_job_tree();
|
|
?>
|
|
|
|
<div id="vv-scheduler">
|
|
|
|
<p class="vv-hint">Orchestrators run their child scripts in the correct order.
|
|
Disable an orchestrator and enable individual scripts below it to run them
|
|
in isolation for debugging or testing.</p>
|
|
|
|
<?php foreach ($tree as $orch): ?>
|
|
<div class="vv-job vv-orch" data-id="<?= htmlspecialchars($orch['id']) ?>">
|
|
<div class="vv-job-row">
|
|
<label class="vv-toggle">
|
|
<input type="checkbox" class="vv-enabled"
|
|
<?= $orch['enabled'] ? 'checked' : '' ?>
|
|
onchange="vvSaveJob(this)">
|
|
<span class="vv-slider"></span>
|
|
</label>
|
|
<span class="vv-job-label"><?= htmlspecialchars($orch['label']) ?></span>
|
|
<input type="text" class="vv-cron" value="<?= htmlspecialchars($orch['cron']) ?>"
|
|
placeholder="cron expression" onblur="vvSaveJob(this)">
|
|
<span class="vv-job-status" id="vv-status-<?= md5($orch['id']) ?>"></span>
|
|
<?php if (!empty($orch['children'])): ?>
|
|
<button class="vv-advanced-toggle" onclick="vvToggleAdvanced(this)">Advanced ▸</button>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<?php if (!empty($orch['children'])): ?>
|
|
<div class="vv-children" style="display:none;">
|
|
<?php foreach ($orch['children'] as $child): ?>
|
|
<div class="vv-job vv-script" data-id="<?= htmlspecialchars($child['id']) ?>">
|
|
<div class="vv-job-row">
|
|
<label class="vv-toggle">
|
|
<input type="checkbox" class="vv-enabled"
|
|
<?= $child['enabled'] ? 'checked' : '' ?>
|
|
onchange="vvSaveJob(this)">
|
|
<span class="vv-slider"></span>
|
|
</label>
|
|
<span class="vv-job-label"><?= htmlspecialchars($child['label']) ?></span>
|
|
<input type="text" class="vv-cron" value="<?= htmlspecialchars($child['cron']) ?>"
|
|
placeholder="cron expression" onblur="vvSaveJob(this)">
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
|
|
</div>
|
|
|
|
<script>
|
|
function vvSaveJob(el) {
|
|
const row = el.closest('.vv-job');
|
|
const id = row.dataset.id;
|
|
const enabled = row.querySelector('.vv-enabled').checked;
|
|
const cron = row.querySelector('.vv-cron').value.trim();
|
|
|
|
fetch('/plugins/varaverk/api/scheduler.php', {
|
|
method: 'POST',
|
|
headers: {'Content-Type': 'application/json'},
|
|
body: JSON.stringify({id, enabled, cron})
|
|
})
|
|
.then(r => r.json())
|
|
.then(d => {
|
|
const statusEl = document.getElementById('vv-status-' + btoa(id).replace(/=/g,''));
|
|
if (statusEl) statusEl.textContent = d.ok ? '✓' : '✗ ' + (d.error ?? '');
|
|
});
|
|
}
|
|
|
|
function vvToggleAdvanced(btn) {
|
|
const children = btn.closest('.vv-job').querySelector('.vv-children');
|
|
const visible = children.style.display !== 'none';
|
|
children.style.display = visible ? 'none' : 'block';
|
|
btn.textContent = visible ? 'Advanced ▸' : 'Advanced ▾';
|
|
}
|
|
</script>
|