442 lines
20 KiB
HTML
442 lines
20 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>PPF Dashboard</title>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
<link rel="stylesheet" href="/static/lib/uPlot.min.css">
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="hdr">
|
|
<h1>PPF Dashboard <a href="/map" style="font-size:12px;font-weight:normal;color:var(--dim);margin-left:12px">Map</a> <a href="/mitm" style="font-size:12px;font-weight:normal;color:var(--dim);margin-left:8px">MITM Search</a></h1>
|
|
<div class="status">
|
|
<span class="mode-badge mode-ssl" id="sslBadge" style="display:none">SSL</span>
|
|
<span id="checktypeBadges"></span>
|
|
<span class="mode-badge mode-profile" id="profileBadge" style="display:none">PROFILING</span>
|
|
<div class="status-item"><div class="dot" id="dot"></div><span id="statusTxt">Connecting</span></div>
|
|
<div class="status-item">Updated: <span id="lastUpdate">-</span></div>
|
|
<button class="theme-toggle" id="themeToggle" title="Toggle light/dark theme">
|
|
<span class="theme-toggle-icon">☾</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- System Monitor Bar -->
|
|
<div class="sysbar">
|
|
<div class="sysbar-item"><span class="sysbar-lbl">Load:</span><span class="sysbar-val" id="sysLoad">-</span></div>
|
|
<div class="sysbar-item"><span class="sysbar-lbl">Memory:</span><span class="sysbar-val" id="sysMemVal">-</span>
|
|
<div class="sysbar-bar"><div class="sysbar-fill" id="sysMemFill" style="width:0"></div></div>
|
|
<span class="sysbar-val" id="sysMemPct">-</span></div>
|
|
<div class="sysbar-item"><span class="sysbar-lbl">Disk:</span><span class="sysbar-val" id="sysDiskVal">-</span>
|
|
<div class="sysbar-bar"><div class="sysbar-fill" id="sysDiskFill" style="width:0"></div></div>
|
|
<span class="sysbar-val" id="sysDiskPct">-</span></div>
|
|
<div class="sysbar-item"><span class="sysbar-lbl">Process:</span><span class="sysbar-val" id="sysProcMem">-</span></div>
|
|
</div>
|
|
|
|
<!-- Distributed Workers (Primary) -->
|
|
<div class="g g3" style="margin-bottom:16px">
|
|
<div class="c">
|
|
<div class="lbl">Working Proxies</div>
|
|
<div class="val grn" id="working">-</div>
|
|
<div class="sub">of <span id="total">-</span> in database</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="lbl">Active Workers</div>
|
|
<div class="val cyn" id="dwActive">-</div>
|
|
<div class="sub">distributed nodes</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="lbl">Combined Rate</div>
|
|
<div class="val blu" id="dwRate">-</div>
|
|
<div class="sub">tests/sec (all workers)</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Worker Stats & Scraper Stats -->
|
|
<div class="g g2" style="margin-bottom:16px">
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Worker Testing</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Tests (Session)</span><span class="stat-val" id="dwTested">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Working Found</span><span class="stat-val grn" id="dwWorking">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Success Rate</span><span class="stat-val" id="successRate">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Uptime</span><span class="stat-val" id="uptime">-</span></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Scraper Network</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Tor Requests</span><span class="stat-val" id="torTotal">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Tor Success</span><span class="stat-val grn" id="torSuccess">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Engines Active</span><span class="stat-val cyn" id="engActive">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Proxies Added</span><span class="stat-val yel" id="proxiesAdded">-</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Tab Navigation -->
|
|
<div class="tabs">
|
|
<div class="tab-nav">
|
|
<button class="tab-btn active" data-tab="workers">Workers</button>
|
|
<button class="tab-btn" data-tab="perf">Performance</button>
|
|
<button class="tab-btn" data-tab="proto">Protocols</button>
|
|
<button class="tab-btn" data-tab="geo">Geography</button>
|
|
<button class="tab-btn" data-tab="scraper">Scraper</button>
|
|
<button class="tab-btn" data-tab="mitm">MITM</button>
|
|
<button class="tab-btn" data-tab="db">Database</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Workers Tab (default) -->
|
|
<div id="tab-workers" class="tab-content active">
|
|
<div class="sec">
|
|
<div class="sec-hdr">Distributed Worker Nodes</div>
|
|
<div class="g g4">
|
|
<div class="c c-sm">
|
|
<div class="lbl">Active</div>
|
|
<div class="val-sm cyn" id="wkActive">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Total Tested</div>
|
|
<div class="val-sm blu" id="wkTested">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Working Found</div>
|
|
<div class="val-sm grn" id="wkWorking">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Success Rate</div>
|
|
<div class="val-sm yel" id="wkSuccessRate">-</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sec">
|
|
<div class="sec-hdr">Worker Status</div>
|
|
<div class="g g2" id="workerCards">
|
|
<div class="c" style="text-align:center;color:var(--dim);padding:40px">
|
|
<div style="font-size:24px;margin-bottom:8px">No workers connected</div>
|
|
<div style="font-size:12px">Add workers with: <code>python ppf.py --worker --server URL</code></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sec">
|
|
<div class="sec-hdr">Queue Status</div>
|
|
<div class="g g4">
|
|
<div class="c c-sm">
|
|
<div class="lbl">Total Proxies</div>
|
|
<div class="val-sm" id="queueTotal">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Never Tested</div>
|
|
<div class="val-sm yel" id="queueUntested">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Claimed</div>
|
|
<div class="val-sm cyn" id="queueClaimed">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Due for Retest</div>
|
|
<div class="val-sm" id="queueDue">-</div>
|
|
</div>
|
|
</div>
|
|
<div style="margin-top:8px">
|
|
<div class="lbl" style="margin-bottom:4px">Session: <span id="queueSessionTested">-</span> / <span id="queueTotal2">-</span> tested (<span id="queueSessionPct">-</span>)</div>
|
|
<div style="background:#1a1a2e;border-radius:4px;height:8px;overflow:hidden">
|
|
<div id="queueProgressBar" style="background:#00ff88;height:100%;width:0%;transition:width 0.5s"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Performance Tab -->
|
|
<div id="tab-perf" class="tab-content">
|
|
<!-- Rate & Success Charts -->
|
|
<div class="g g2">
|
|
<div class="c c-lg">
|
|
<div class="lbl">Test Rate History (10 min)</div>
|
|
<div class="mini">
|
|
<div class="mini-item"><span class="mini-val blu" id="recentRate">-</span><span class="mini-lbl">current</span></div>
|
|
<div class="mini-item"><span class="mini-val yel" id="peakRate">-</span><span class="mini-lbl">peak</span></div>
|
|
<div class="mini-item"><span class="mini-val grn" id="passRate">-</span><span class="mini-lbl">pass/s</span></div>
|
|
</div>
|
|
<div class="chart-wrap">
|
|
<div class="chart chart-lg" id="rateChart"></div>
|
|
</div>
|
|
</div>
|
|
<div class="c c-lg">
|
|
<div class="lbl">Success Rate History</div>
|
|
<div class="mini">
|
|
<div class="mini-item"><span class="mini-val" id="recentSuccessRate">-</span><span class="mini-lbl">recent</span></div>
|
|
</div>
|
|
<div class="chart-wrap">
|
|
<div class="chart chart-lg" id="srChart"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Latency Section -->
|
|
<div class="sec">
|
|
<div class="sec-hdr">Latency Analysis</div>
|
|
<div class="g g2">
|
|
<div class="c">
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Average</span><span class="stat-val cyn" id="avgLatency">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Min</span><span class="stat-val grn" id="minLatency">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Max</span><span class="stat-val red" id="maxLatency">-</span></div>
|
|
</div>
|
|
<div class="pct-badges">
|
|
<div class="pct-badge"><div class="pct-label">P50</div><div class="pct-value cyn" id="p50">-</div></div>
|
|
<div class="pct-badge"><div class="pct-label">P90</div><div class="pct-value yel" id="p90">-</div></div>
|
|
<div class="pct-badge"><div class="pct-label">P99</div><div class="pct-value org" id="p99">-</div></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="lbl">Response Time Distribution</div>
|
|
<div class="histo-wrap">
|
|
<div class="histo" id="latencyHisto"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Protocols Tab -->
|
|
<div id="tab-proto" class="tab-content">
|
|
<!-- Protocol Breakdown -->
|
|
<div class="sec">
|
|
<div class="sec-hdr">Protocol Performance</div>
|
|
<div class="g g3">
|
|
<div class="c proto-card">
|
|
<div class="proto-icon">🌐</div>
|
|
<div class="proto-name">HTTP</div>
|
|
<div class="proto-val grn" id="httpPassed">-</div>
|
|
<div class="sub">of <span id="httpTested">-</span> tested</div>
|
|
<div class="proto-rate tag-ok" id="httpRate">-</div>
|
|
</div>
|
|
<div class="c proto-card">
|
|
<div class="proto-icon">🔌</div>
|
|
<div class="proto-name">SOCKS4</div>
|
|
<div class="proto-val blu" id="socks4Passed">-</div>
|
|
<div class="sub">of <span id="socks4Tested">-</span> tested</div>
|
|
<div class="proto-rate tag-ok" id="socks4Rate">-</div>
|
|
</div>
|
|
<div class="c proto-card">
|
|
<div class="proto-icon">🔒</div>
|
|
<div class="proto-name">SOCKS5</div>
|
|
<div class="proto-val pur" id="socks5Passed">-</div>
|
|
<div class="sub">of <span id="socks5Tested">-</span> tested</div>
|
|
<div class="proto-rate tag-ok" id="socks5Rate">-</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Results & Failures -->
|
|
<div class="g g2">
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Test Results</div>
|
|
<div class="pie-wrap">
|
|
<div class="pie" id="resultsPie"></div>
|
|
<div class="legend">
|
|
<div class="legend-item"><div class="legend-dot" style="background:#3fb950"></div><span class="legend-name">Passed</span><span class="legend-val grn" id="passedLeg">-</span><span class="sub" id="passedPct">-</span></div>
|
|
<div class="legend-item"><div class="legend-dot" style="background:#f85149"></div><span class="legend-name">Failed</span><span class="legend-val red" id="failedLeg">-</span><span class="sub" id="failedPct">-</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Failure Breakdown</div>
|
|
<div class="pie-wrap">
|
|
<div class="pie" id="failPie"></div>
|
|
<div class="legend" id="failLegend"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Geography Tab -->
|
|
<div id="tab-geo" class="tab-content">
|
|
<!-- Geographic Distribution -->
|
|
<div class="sec">
|
|
<div class="sec-hdr">Geographic Distribution <a href="/map" style="font-size:10px;font-weight:normal;margin-left:8px">View Map →</a></div>
|
|
<div class="g g2">
|
|
<div class="c">
|
|
<div class="lbl">Proxies by Country (Database)</div>
|
|
<div class="pie-wrap">
|
|
<div class="pie" id="countryPie"></div>
|
|
<div class="legend" id="countryLegend"></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="lbl">Top ASNs (Session)</div>
|
|
<div class="lb-wrap">
|
|
<div class="lb" id="topAsns"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Scraper Tab -->
|
|
<div id="tab-scraper" class="tab-content">
|
|
<!-- Search Engines -->
|
|
<div class="g g2">
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Search Engines</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Available</span><span class="stat-val grn" id="engAvail">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">In Backoff</span><span class="stat-val yel" id="engBackoff">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Total</span><span class="stat-val" id="engTotal">-</span></div>
|
|
</div>
|
|
<div class="lbl" style="margin-top:10px">Top Engines</div>
|
|
<div class="lb-wrap">
|
|
<div class="lb" id="topEngines"></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Tor Network (Scraping)</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Healthy Nodes</span><span class="stat-val grn" id="torHealthy">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Avg Latency</span><span class="stat-val cyn" id="torLatency">-</span></div>
|
|
</div>
|
|
<div class="lbl" style="margin-top:10px">Tor Exit Nodes</div>
|
|
<div class="g g2" id="torPool" style="margin-top:8px"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Judge Services -->
|
|
<div class="g g2">
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Judge Services</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Available</span><span class="stat-val grn" id="judgesAvail">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">In Cooldown</span><span class="stat-val yel" id="judgesCooldown">-</span></div>
|
|
</div>
|
|
<div class="lbl" style="margin-top:10px">Top Performers</div>
|
|
<div class="lb-wrap">
|
|
<div id="topJudges"></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">SSL/TLS Testing</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">SSL Tests</span><span class="stat-val" id="sslTested">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Passed</span><span class="stat-val grn" id="sslPassed">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Failed</span><span class="stat-val red" id="sslFailed">-</span></div>
|
|
<div class="bar-wrap" style="margin:8px 0"><div class="bar grn" id="sslBar" style="width:0"></div></div>
|
|
<div class="stat-row"><span class="stat-lbl">MITM Detected</span><span class="stat-val red" id="mitmDetected">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Cert Errors</span><span class="stat-val yel" id="certErrors">-</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- MITM Tab -->
|
|
<div id="tab-mitm" class="tab-content">
|
|
<!-- MITM Certificate Statistics -->
|
|
<div class="sec">
|
|
<div class="sec-hdr">MITM Detection Summary</div>
|
|
<div class="g g4">
|
|
<div class="c c-sm">
|
|
<div class="lbl">Total Detections</div>
|
|
<div class="val-sm red" id="mitmTotal">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Unique Certs</div>
|
|
<div class="val-sm yel" id="mitmUniqueCerts">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Unique Proxies</div>
|
|
<div class="val-sm org" id="mitmUniqueProxies">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">SSL Tests</div>
|
|
<div class="val-sm cyn" id="mitmSslTests">-</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="g g2">
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Top Organizations</div>
|
|
<div class="lb-wrap">
|
|
<div class="lb" id="mitmOrgs"></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="sec-hdr" style="margin-top:0">Top Issuers</div>
|
|
<div class="lb-wrap">
|
|
<div class="lb" id="mitmIssuers"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sec">
|
|
<div class="sec-hdr">Certificate Details</div>
|
|
<div class="stats-wrap" id="mitmCerts" style="max-height:300px;overflow-y:auto"></div>
|
|
</div>
|
|
<div class="sec">
|
|
<div class="sec-hdr">Recent Detections</div>
|
|
<div class="stats-wrap" id="mitmRecent" style="max-height:200px;overflow-y:auto"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Database Tab -->
|
|
<div id="tab-db" class="tab-content">
|
|
<!-- Database Stats -->
|
|
<div class="sec">
|
|
<div class="sec-hdr">Database Overview</div>
|
|
<div class="g g4">
|
|
<div class="c c-sm">
|
|
<div class="lbl">Database Size</div>
|
|
<div class="val-sm cyn" id="dbSize">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Tested (1h)</div>
|
|
<div class="val-sm blu" id="dbTestedHour">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Added (24h)</div>
|
|
<div class="val-sm grn" id="dbAddedDay">-</div>
|
|
</div>
|
|
<div class="c c-sm">
|
|
<div class="lbl">Dead Proxies</div>
|
|
<div class="val-sm red" id="dbDead">-</div>
|
|
</div>
|
|
</div>
|
|
<div class="g g3">
|
|
<div class="c">
|
|
<div class="lbl">Working by Protocol</div>
|
|
<div class="stats-wrap">
|
|
<div id="dbByProto"></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="lbl">Latency Stats</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Average</span><span class="stat-val cyn" id="dbAvgLat">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Min</span><span class="stat-val grn" id="dbMinLat">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Max</span><span class="stat-val red" id="dbMaxLat">-</span></div>
|
|
</div>
|
|
</div>
|
|
<div class="c">
|
|
<div class="lbl">Activity</div>
|
|
<div class="stats-wrap">
|
|
<div class="stat-row"><span class="stat-lbl">Failing</span><span class="stat-val yel" id="dbFailing">-</span></div>
|
|
<div class="stat-row"><span class="stat-lbl">Freelist</span><span class="stat-val" id="dbFreelist">-</span></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ftr">PPF Python Proxy Finder</div>
|
|
</div>
|
|
<script src="/static/lib/uPlot.min.js"></script>
|
|
<script src="/static/lib/chart.min.js"></script>
|
|
<script src="/static/dashboard.js"></script>
|
|
</body>
|
|
</html>
|