(() => { const root = document.querySelector('#content'); const fmtBytes = n => { if (!Number.isFinite(n)) return '-'; const u=['B','KB','MB','GB','TB']; let i=0,v=n; while(v>=1024&&i `${fmtBytes(n)}/s`; const fmtUp = n => { let s=Math.max(0,Math.floor(n||0)); const d=Math.floor(s/86400); s%=86400; const h=Math.floor(s/3600); s%=3600; const m=Math.floor(s/60); return d?`${d}天${h}小时`:h?`${h}小时${m}分`:`${m}分`; }; const esc = s => String(s??'-').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); let mode=localStorage.getItem('vpc_probe_view')||'card'; const setMode=m=>{mode=m;localStorage.setItem('vpc_probe_view',m);render(window.__data||[]);}; document.querySelector('#cardBtn').onclick=()=>setMode('card'); document.querySelector('#compactBtn').onclick=()=>setMode('compact'); const row=(d,card)=>{const p=d.profile||{}; return `
${esc(d.name)}${d.status==='online'?'在线':'离线'}
Uptime ${fmtUp(p.uptime_seconds)}Load ${[p.load_1m,p.load_5m,p.load_15m].map(x=>Number(x||0).toFixed(2)).join(' / ')}CPU ${p.cpu_usage_percent??'-'}%MEM ${p.mem_percent??'-'}%↓ ${fmtRate(p.net_rx_rate)} ↑ ${fmtRate(p.net_tx_rate)}流量 ↓ ${fmtBytes(p.net_rx_total)} ↑ ${fmtBytes(p.net_tx_total)}Disk ${p.disk_free||'-'} ${p.disk_percent??'-'}%
`;}; function render(data){document.querySelector('#cardBtn').classList.toggle('active',mode==='card');document.querySelector('#compactBtn').classList.toggle('active',mode==='compact');root.className=mode;root.innerHTML=mode==='card'?data.map(d=>row(d,true)).join(''):`
${data.map(d=>row(d,false)).join('')}
`;} async function load(){try{const r=await fetch('/probe/summary',{cache:'no-store'});if(!r.ok)throw Error();window.__data=await r.json();render(window.__data);}catch(e){root.innerHTML='

探针数据暂时不可用

';}} load();setInterval(load,5000); })();