Show SOCKS5 proxy exit IP
This commit is contained in:
+1
-1
@@ -15,7 +15,7 @@ let DATA=null, editingProxy=null, editingChannel=null; const $=id=>document.getE
|
||||
document.querySelectorAll('.tab').forEach(b=>b.onclick=()=>{closeDrawer();document.querySelectorAll('.tab,.section').forEach(x=>x.classList.remove('active'));b.classList.add('active');$(b.dataset.tab).classList.add('active')})
|
||||
function statusPill(s){let c=s||'unknown';return `<span class="pill ${c}"><span class="dot"></span>${esc(c)}</span>`}
|
||||
async function refresh(){DATA=await api('/api/status'); $('now').textContent='当前时间:'+DATA.now_text; let ps=DATA.proxies, up=ps.filter(x=>x.state.status==='up').length, down=ps.filter(x=>x.state.status==='down').length; $('mTotal').textContent=ps.length;$('mUp').textContent=up;$('mDown').textContent=down;$('mChan').textContent=(DATA.notifications.channels||[]).length; renderSettings(); renderProxies(); renderChannels(); renderLogs()}
|
||||
function renderProxies(){let cards='', list=''; for(const it of DATA.proxies){let p=it.proxy,s=it.state; let recent=(it.recent||[]).slice(0,5).map(r=>`<tr><td>${ts(r.ts)}</td><td class="${r.ok?'up':'down'}">${r.ok?'OK':'FAIL'}</td><td>${r.latency_ms??'-'}ms</td><td class="err">${esc(r.error||'')}</td></tr>`).join(''); let color=s.status==='up'?'green':s.status==='down'?'pink':'blue'; let block=`<div class="card ${color}"><div class="row"><div><h2 style="margin:.1em 0">${esc(p.name||p.id)}</h2><div class="muted mono">${esc(p.host)}:${esc(p.port)} → ${esc(p.target_host)}:${esc(p.target_port)} · ${esc(p.interval_seconds||DATA.settings.interval_seconds)}s</div></div>${statusPill(s.status)}</div><div class="kv"><div class="muted">最后检测</div><div>${ts(s.last_ts)}</div><div class="muted">延迟</div><div>${s.latency_ms??'-'} ms</div><div class="muted">失败/成功</div><div>${s.fail_count} / ${s.ok_count}</div><div class="muted">错误</div><div class="err">${esc(s.error||'-')}</div></div><div class="toolbar"><button class="btn small" onclick="checkProxy('${esc(p.id)}')">立即检测</button><button class="btn small" onclick="openProxy('${esc(p.id)}')">编辑</button><button class="btn small danger" onclick="delProxy('${esc(p.id)}')">删除</button></div><table style="margin-top:12px"><thead><tr><th>时间</th><th>结果</th><th>延迟</th><th>错误</th></tr></thead><tbody>${recent}</tbody></table></div>`; cards+=block; list+=block } $('proxyCards').innerHTML=cards||'<div class="card muted">还没有节点,点击新增节点。</div>'; $('proxyList').innerHTML=list||'<p class="muted">暂无节点</p>'}
|
||||
function renderProxies(){let cards='', list=''; for(const it of DATA.proxies){let p=it.proxy,s=it.state; let recent=(it.recent||[]).slice(0,5).map(r=>`<tr><td>${ts(r.ts)}</td><td class="${r.ok?'up':'down'}">${r.ok?'OK':'FAIL'}</td><td>${r.latency_ms??'-'}ms</td><td class="mono">${esc(r.exit_ip||'-')}</td><td class="err">${esc(r.error||'')}</td></tr>`).join(''); let color=s.status==='up'?'green':s.status==='down'?'pink':'blue'; let block=`<div class="card ${color}"><div class="row"><div><h2 style="margin:.1em 0">${esc(p.name||p.id)}</h2><div class="muted mono">${esc(p.host)}:${esc(p.port)} → ${esc(p.target_host)}:${esc(p.target_port)} · ${esc(p.interval_seconds||DATA.settings.interval_seconds)}s</div></div>${statusPill(s.status)}</div><div class="kv"><div class="muted">最后检测</div><div>${ts(s.last_ts)}</div><div class="muted">延迟</div><div>${s.latency_ms??'-'} ms</div><div class="muted">代理出口 IP</div><div class="mono">${esc(s.exit_ip||'-')}</div><div class="muted">失败/成功</div><div>${s.fail_count} / ${s.ok_count}</div><div class="muted">错误</div><div class="err">${esc(s.error||'-')}</div></div><div class="toolbar"><button class="btn small" onclick="checkProxy('${esc(p.id)}')">立即检测</button><button class="btn small" onclick="openProxy('${esc(p.id)}')">编辑</button><button class="btn small danger" onclick="delProxy('${esc(p.id)}')">删除</button></div><table style="margin-top:12px"><thead><tr><th>时间</th><th>结果</th><th>延迟</th><th>出口 IP</th><th>错误</th></tr></thead><tbody>${recent}</tbody></table></div>`; cards+=block; list+=block } $('proxyCards').innerHTML=cards||'<div class="card muted">还没有节点,点击新增节点。</div>'; $('proxyList').innerHTML=list||'<p class="muted">暂无节点</p>'}
|
||||
function channelSummary(c){let x=cfg(c); if(c.type==='bark')return x.key?'Key 已配置':'Key 未配置'; if(c.type==='pushplus')return x.token?'Token 已配置':'Token 未配置'; if(c.type==='autman')return x.access_token?'Token 已配置':'Token 未配置'; return x.url||''}
|
||||
function renderSettings(){let s=DATA.settings||{}; if($('sTarget')){$('sTarget').textContent=(s.target_host||'-')+':'+(s.target_port||'-');$('sInterval').textContent=s.interval_seconds||'-';$('sTimeout').textContent=s.timeout_seconds||'-';$('sThreshold').textContent='失败 '+(s.fail_threshold||'-')+' / 恢复 '+(s.recover_threshold||'-')}}
|
||||
function renderChannels(){let html=''; for(const c of DATA.notifications.channels||[]){html+=`<div class="card channel"><div><div class="row" style="justify-content:flex-start"><h3 style="margin:0">${esc(c.name)}</h3><span class="pill">${esc(c.type)}</span><span class="pill ${c.enabled?'up':'unknown'}"><span class="dot"></span>${c.enabled?'启用':'停用'}</span></div><div class="muted mono">${esc(channelSummary(c))}</div></div><div class="toolbar"><button class="btn small" onclick="testChannel('${esc(c.id)}')">测试</button><button class="btn small" onclick="openChannel('${esc(c.id)}')">编辑</button><button class="btn small danger" onclick="delChannel('${esc(c.id)}')">删除</button></div></div>`} $('channelList').innerHTML=html||'<p class="muted">暂无通知渠道</p>'}
|
||||
|
||||
Reference in New Issue
Block a user