All state/data file paths in scripts and PHP now resolve via STATE_DIR / DATA_DIR / PERSISTENT_CONF_CACHE instead of hardcoded /boot/config/ or /tmp/ paths, so the ecosystem works in both internal and appdata storage modes. PHP layer (watchdog.php, partnership.php, fallback.php, monitor.php, snapshot.php, config.php): all state reads switched to STATE_DIR constant; remote state reads use the new vv_remote_state_cmd() helper which resolves the remote's SCRIPTS_DIR via their varaverk.cfg before building the path. conf_sync.sh: fixed SCRIPTS_ROOT → SCRIPTS_DIR bug on MY_CONF path; added _remote_scripts_dir() to resolve partner's SCRIPTS_DIR before SCP pull. fallback.php page: added controls card (PARTNERSHIP_ENABLED, FALLBACK_ENABLED, FALLBACK_RSYNC_ENABLED toggles), status grid, and settings card. README and Manual updated for System_Essentials, Watchdogs, Fallback, Rsync, Media, Monitors, Orchestrators, Partnership: added new scripts (conf_sync, conf_cache_save/restore, conf_cache_watchdog, play_state_sync, start_webhook_listener, upgrade_webhook_handler), corrected all stale /boot/config/ state file paths to $STATE_DIR/$DATA_DIR, noted webgui/php_fpm/mover/user_scripts scripts moved to Plugin/unraid/System_Essentials, fixed start_webhook_listener.sh header (Node.js, not PHP -S).
48 lines
1.7 KiB
PHP
48 lines
1.7 KiB
PHP
<?php
|
|
header('Content-Type: application/json');
|
|
require_once dirname(__DIR__) . '/include/monitor.php';
|
|
require_once dirname(__DIR__) . '/include/media.php';
|
|
|
|
// CPU% — shares /tmp/vv_cpu_stat.json with vv_cpu_per_core() so both read the same baseline
|
|
$cpuPct = vv_cpu_per_core()['overall'] ?? 0;
|
|
|
|
// RAM%
|
|
$res = vv_system_resources();
|
|
$ramTotalMb = $res['ram_total_mb'];
|
|
$ramUsedMb = $ramTotalMb - $res['ram_free_mb'];
|
|
$ramPct = $ramTotalMb > 0 ? (int)round($ramUsedMb / $ramTotalMb * 100) : 0;
|
|
|
|
// Fallback state (fast file read, no exec)
|
|
$fbRaw = @file_get_contents(STATE_DIR . '/fallback_state.db') ?: '';
|
|
$fbData = vv_parse_kv_db($fbRaw);
|
|
$fallbackState = $fbData['state'] ?? 'UNKNOWN';
|
|
|
|
// Partner
|
|
$partner = vv_partner_state();
|
|
$peers = array_values(array_filter($partner['hosts'], fn($h) => !$h['is_me']));
|
|
|
|
// Media sessions — cached 30s so the HTTP calls don't hold up every snapshot poll
|
|
$mediaCache = vv_cache_read('snap_media', 30);
|
|
if (!$mediaCache) {
|
|
$media = vv_media_sessions();
|
|
$mediaCache = [
|
|
'stream_count' => count($media['sessions']),
|
|
'transcode_count' => count(array_filter($media['sessions'], fn($s) => !empty($s['is_tc']))),
|
|
];
|
|
vv_cache_write('snap_media', $mediaCache);
|
|
}
|
|
$streamCount = (int)($mediaCache['stream_count'] ?? 0);
|
|
$transcodeCount = (int)($mediaCache['transcode_count'] ?? 0);
|
|
|
|
echo json_encode([
|
|
'cpu_pct' => $cpuPct,
|
|
'ram_pct' => $ramPct,
|
|
'ram_used_mb' => $ramUsedMb,
|
|
'ram_total_mb' => $ramTotalMb,
|
|
'fallback' => $fallbackState,
|
|
'partner_enabled' => $partner['enabled'],
|
|
'peers' => $peers,
|
|
'stream_count' => $streamCount,
|
|
'transcode_count' => $transcodeCount,
|
|
]);
|