Consolidations (config.php gains 5 shared utilities): - vv_format_uptime() replaces 4 inline uptime-formatting blocks - vv_parse_conf_scalar() replaces vv_arr_scalar/vv_wd_scalar/vv_fb_scalar/vv_media_conf_scalar - vv_known_hosts() replaces vv_arr_known_hosts/vv_fb_known_hosts + inline parser in watchdog - vv_parse_kv_db() replaces inline key=value parsing in snapshot and monitor - vv_local_ip() replaces duplicate in docker_folders.php and inline in docker.php All module-level function names kept as thin aliases so call sites unchanged. Critical bug fixes: - api/system.php: added require_once config.php and POST-only guard (no auth on shutdown) - api/movescript.php + reorderarray.php: use vv_write_conf_raw (atomic) + vv_push_master_conf - api/snapshot.php: share /tmp/vv_cpu_stat.json with vv_cpu_per_core() instead of own state file Correctness: - vv_cpu_per_core() and vv_network_stats(): atomic tmp+rename for state files (concurrent poll safety) - ext_ip curl cache moved from /tmp/vv_ext_ip.cache to vv_cache_read/write (canonical cache dir) - monitor_remote.php + board.php + snapshot.php: all use vv_cache_read/write instead of ad-hoc /tmp files HTTP method guards added to write-only APIs that were missing them: - api/scheduler.php, conf_toggle.php, flag_toggle.php
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('/tmp/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,
|
|
]);
|