Consolidate all paths to plugin flash dir, fix watchdog 7.3 triggers
- Move SCRIPTS_DIR/DATA_DIR/STATE_DIR from appdata to /boot/config/plugins/varaverk - All state files now in STATE_DIR (no more /tmp or /boot/config root writes) - Bootstrap: Gitea-first clone with GitHub fallback, no array dependency - varaverk.cfg seeded with Gitea connection settings - .gitignore: add State_Files/, varaverk.cfg, varaverk-*.txz - Partnership/transcode/fallback scripts use STATE_DIR variables - PHP config.php: DATA_DIR/STATE_DIR constants, VV_SETUP_STATE_FILE dynamic - deploy.sh PROD_ROOT updated to plugin flash dir Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
9191a54637
commit
fb0530deba
@@ -467,7 +467,10 @@ function vvRenderScripts() {
|
||||
const color = s.status === 'running' ? '#4fc3f7' : s.status === 'ok' ? '#4caf50' : s.status === 'warn' ? '#ff9800' : s.status === 'error' ? '#f44336' : '#555';
|
||||
const name = s.name.length > 24 ? s.name.slice(0, 23) + '…' : s.name;
|
||||
const dur = s.duration != null ? ` ${s.duration}s` : '';
|
||||
listHtml += `<div style="display:flex;align-items:center;gap:5px;margin-bottom:4px;font-size:11px;">
|
||||
const sid = (s.id || '').replace(/\\/g,'\\\\').replace(/'/g,"\\'");
|
||||
listHtml += `<div onclick="vvOpenScript('${sid}')" title="Open ${name} in Scheduler"
|
||||
style="display:flex;align-items:center;gap:5px;margin-bottom:4px;font-size:11px;cursor:pointer;"
|
||||
onmouseover="this.style.background='#161616'" onmouseout="this.style.background=''">
|
||||
<span style="color:${color};flex-shrink:0;width:10px;text-align:center;">${icon}</span>
|
||||
<span style="color:#888;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">${name}</span>
|
||||
<span style="color:#444;font-size:10px;flex-shrink:0;">${ago}${dur}</span>
|
||||
@@ -485,6 +488,12 @@ function vvScriptsFilterSet(type) {
|
||||
vvRenderScripts();
|
||||
}
|
||||
|
||||
// Deep-link a script row to the Scheduler tab (opens its settings/log panel there).
|
||||
function vvOpenScript(id) {
|
||||
if (!id) { window.location.href = '?tab=scheduler'; return; }
|
||||
window.location.href = '?tab=scheduler&vv_script=' + encodeURIComponent(id);
|
||||
}
|
||||
|
||||
// ── Disk / storage helpers (module-level so vvRenderPools can call them) ─────
|
||||
|
||||
function vvTempColor(tempC, transport) {
|
||||
@@ -575,6 +584,16 @@ function vvPollMonitor() {
|
||||
const _runningVMs = (d.vms?.vms ?? []).filter(v => v.state === 'running').length;
|
||||
const _threadInfo = sys.cpu_threads ? `${sys.cpu_cores}c / ${sys.cpu_threads}t` : '';
|
||||
|
||||
// Load average (1/5/15m) — colour by load[0] vs core count
|
||||
const _load = Array.isArray(sys.load_avg) ? sys.load_avg : null;
|
||||
const _cores = sys.cpu_cores || 0;
|
||||
const _loadColor = _load && _cores
|
||||
? (_load[0] > _cores * 2 ? '#f44336' : _load[0] > _cores ? '#ff9800' : '#888') : '#888';
|
||||
const _loadStr = _load
|
||||
? `${_load[0].toFixed(2)} <span style="color:#444;">·</span> ${_load[1].toFixed(2)} <span style="color:#444;">·</span> ${_load[2].toFixed(2)}`
|
||||
: '—';
|
||||
const _coreMeta = _threadInfo ? ` <span style="color:#444;">(${_threadInfo})</span>` : '';
|
||||
|
||||
document.getElementById('vv-system-body').innerHTML =
|
||||
`<div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px;">
|
||||
<div style="min-width:0;">
|
||||
@@ -608,9 +627,10 @@ function vvPollMonitor() {
|
||||
<div style="font-size:20px;font-weight:300;color:#ccc;line-height:1;">${timeStr}</div>
|
||||
<div style="font-size:10px;color:#555;margin-bottom:10px;">${dateStr} · ${tz}</div>
|
||||
<div style="display:grid;grid-template-columns:auto 1fr;gap:3px 8px;font-size:11px;">
|
||||
<span style="color:#444;">Model</span> <span style="color:#888;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">${sys.cpu_model}${_threadInfo ? ` <span style="color:#444;">(${_threadInfo})</span>` : ''}</span>
|
||||
<span style="color:#444;">Model</span> <span style="color:#888;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">${sys.cpu_model}${_coreMeta}</span>
|
||||
<span style="color:#444;">Array</span> <span style="color:${arrayColor};font-weight:600;">${sys.array_state}</span>
|
||||
<span style="color:#444;">Uptime</span> <span style="color:#888;">${sys.uptime}</span>
|
||||
<span style="color:#444;">Load</span> <span style="color:${_loadColor};">${_loadStr}</span>
|
||||
<span style="color:#444;">Running</span> <span style="color:#888;">${_runningCtrs} ctr${_runningCtrs !== 1 ? 's' : ''}${_runningVMs > 0 ? ` · ${_runningVMs} VM` : ''}</span>
|
||||
<span style="color:#444;">Version</span> <span style="color:#3a3a3a;">${ver}</span>
|
||||
</div>`;
|
||||
@@ -856,6 +876,8 @@ function vvPollMonitor() {
|
||||
|
||||
const maxSeen = Math.max(...vvNetRxHistory, ...vvNetTxHistory, 1);
|
||||
const maxBps = maxSeen * 1.25; // auto-scale with 25% headroom
|
||||
const peakRx = Math.max(...vvNetRxHistory, 0); // window peak (last 2 min)
|
||||
const peakTx = Math.max(...vvNetTxHistory, 0);
|
||||
|
||||
const ipRows = [
|
||||
net.local_ip ? `<div><span style="color:#555;font-size:9px;">LAN </span>${net.local_ip}</div>` : '',
|
||||
@@ -868,8 +890,8 @@ function vvPollMonitor() {
|
||||
<div>
|
||||
<div style="font-size:12px;color:#888;margin-bottom:4px;">${net.iface} · ${linkLabel}</div>
|
||||
<div style="display:flex;gap:16px;font-size:13px;font-weight:600;">
|
||||
<span><span style="color:#4caf50;font-size:9px;margin-right:4px;">━ IN (RX)</span><span style="color:#4caf50;">${vvFmtBps(rx)}</span></span>
|
||||
<span><span style="color:#ff9800;font-size:9px;margin-right:4px;">━ OUT (TX)</span><span style="color:#ff9800;">${vvFmtBps(tx)}</span></span>
|
||||
<span><span style="color:#4caf50;font-size:9px;margin-right:4px;">━ IN (RX)</span><span style="color:#4caf50;">${vvFmtBps(rx)}</span><span style="color:#444;font-size:9px;font-weight:400;margin-left:4px;">peak ${vvFmtBps(peakRx)}</span></span>
|
||||
<span><span style="color:#ff9800;font-size:9px;margin-right:4px;">━ OUT (TX)</span><span style="color:#ff9800;">${vvFmtBps(tx)}</span><span style="color:#444;font-size:9px;font-weight:400;margin-left:4px;">peak ${vvFmtBps(peakTx)}</span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div style="text-align:right;font-size:11px;color:#aaa;line-height:1.6;">${ipRows}</div>
|
||||
@@ -881,9 +903,15 @@ function vvPollMonitor() {
|
||||
document.getElementById('vv-network-body').innerHTML = '<p style="color:#555;font-style:italic">No network interface detected</p>';
|
||||
}
|
||||
|
||||
// ── CPU title ────────────────────────────────────────────────────────────
|
||||
// ── CPU title (core count + temp to its right) ────────────────────────────
|
||||
const _cpuTitleEl = document.getElementById('vv-cpu-title');
|
||||
if (_cpuTitleEl && sys.cpu_threads) _cpuTitleEl.textContent = `CPU · ${sys.cpu_cores}c/${sys.cpu_threads}t`;
|
||||
if (_cpuTitleEl) {
|
||||
const _cpuTemp = d.watchdog?.stability?.cpu_temp ?? null;
|
||||
const _tColor = _cpuTemp == null ? '#888' : _cpuTemp >= 88 ? '#f44336' : _cpuTemp >= 75 ? '#ff9800' : '#4caf50';
|
||||
const _coreLbl = sys.cpu_threads ? `CPU · ${sys.cpu_cores}c/${sys.cpu_threads}t` : 'CPU';
|
||||
_cpuTitleEl.innerHTML = _coreLbl
|
||||
+ (_cpuTemp != null ? ` <span style="color:${_tColor};font-weight:400;">${_cpuTemp}°</span>` : '');
|
||||
}
|
||||
|
||||
// ── UPS / Power ─────────────────────────────────────────────────────────
|
||||
const ups = d.ups ?? {};
|
||||
@@ -1072,13 +1100,15 @@ function vvPollMonitor() {
|
||||
const sshdOk = stab.sshd_ok ?? true;
|
||||
const zombies = stab.zombies ?? 0;
|
||||
|
||||
let statsHtml = `<div style="display:grid;grid-template-columns:auto 1fr;gap:2px 8px;font-size:11px;margin-top:8px;margin-bottom:6px;">
|
||||
const cpuRow = stab.cpu_temp != null
|
||||
? `<span style="color:#444;">CPU</span><span style="color:${wdPct(stab.cpu_temp,75,90)};">${stab.cpu_temp}°C</span>` : '';
|
||||
let statsHtml = `<div style="display:grid;grid-template-columns:auto 1fr auto 1fr;gap:2px 8px;font-size:11px;margin-top:8px;margin-bottom:6px;">
|
||||
<span style="color:#444;">rootfs</span><span style="color:${wdPct(stab.rootfs_pct??0,75,90)};">${stab.rootfs_pct??0}%</span>
|
||||
<span style="color:#444;">/var/log</span><span style="color:${wdPct(stab.log_pct??0,75,90)};">${stab.log_pct??0}%</span>
|
||||
<span style="color:#444;">/tmp</span><span style="color:${wdPct(stab.tmp_pct??0,75,90)};">${stab.tmp_pct??0}%</span>
|
||||
<span style="color:#444;">RAM free</span><span style="color:${ramColor};">${ramFree}GB</span>
|
||||
<span style="color:#444;">Load</span><span style="color:${loadColor};">${load}</span>
|
||||
${stab.cpu_temp != null ? `<span style="color:#444;">CPU</span><span style="color:${wdPct(stab.cpu_temp,75,90)};">${stab.cpu_temp}°C</span>` : ''}
|
||||
${cpuRow}
|
||||
<span style="color:#444;">Zombies</span><span style="color:${zombies>0?'#ff9800':'#4caf50'};">${zombies}</span>
|
||||
<span style="color:#444;">${stab.nic??'nic'}</span><span style="color:${nicOk?'#4caf50':'#f44336'};">● ${stab.nic_state??'?'}</span>
|
||||
<span style="color:#444;">sshd</span><span style="color:${sshdOk?'#4caf50':'#f44336'};">${sshdOk?'● ok':'✗ down'}</span>
|
||||
@@ -1208,6 +1238,22 @@ function vvPollMonitor() {
|
||||
const procCount = gpuProcs.length;
|
||||
const procColor = procCount > 0 ? '#4caf50' : '#555';
|
||||
|
||||
// Process list — which apps are actually using the GPU (name + VRAM)
|
||||
let gpuProcHtml = '';
|
||||
if (procCount > 0) {
|
||||
const rows = gpuProcs.map(p => {
|
||||
const pname = (p.name || '').split('/').pop() || p.name || 'proc';
|
||||
return `<div style="display:flex;justify-content:space-between;font-size:10px;margin-bottom:2px;">
|
||||
<span style="color:#888;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;">${pname}</span>
|
||||
<span style="color:#555;flex-shrink:0;margin-left:6px;">${p.memory_mb} MB</span>
|
||||
</div>`;
|
||||
}).join('');
|
||||
gpuProcHtml = `<div style="margin-top:6px;border-top:1px solid #2a2a2a;padding-top:6px;">
|
||||
<div style="font-size:10px;color:#555;margin-bottom:3px;">GPU processes</div>
|
||||
<div style="max-height:60px;overflow-y:auto;">${rows}</div>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
document.getElementById('vv-gpu-body').innerHTML =
|
||||
// header row: name + process count pill
|
||||
`<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;">
|
||||
@@ -1224,7 +1270,7 @@ function vvPollMonitor() {
|
||||
<span style="color:${tempColor};font-weight:bold;">${temp}°C</span>
|
||||
<span style="color:#666;margin-left:12px;">Power</span>
|
||||
<span style="color:#aaa;font-weight:bold;">${powerStr}</span>
|
||||
</div>`;
|
||||
</div>` + gpuProcHtml;
|
||||
} else {
|
||||
document.getElementById('vv-gpu-body').innerHTML = '<p style="color:#555;font-style:italic">No GPU detected</p>';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user