Initial Commit

This commit is contained in:
2026-09-23 09:16:09 -04:00
commit 0cd2a516bb
49 changed files with 10134 additions and 0 deletions
+251
View File
@@ -0,0 +1,251 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="styles.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Argus</title>
</head>
<body>
<!-- Update Banner -->
<div id="update-banner" class="update-banner">
<span id="update-message"></span>
<a id="update-link" href="#" target="_blank" class="update-link">Download</a>
<button id="update-dismiss" class="update-dismiss">&times;</button>
</div>
<!-- Toolbar -->
<div id="toolbar">
<svg class="toolbar-circuit" viewBox="0 0 400 50" xmlns="http://www.w3.org/2000/svg">
<line x1="400" y1="12" x2="280" y2="12" stroke="url(#cyanFade)" stroke-width="1" />
<line x1="400" y1="38" x2="310" y2="38" stroke="url(#cyanFade)" stroke-width="1" />
<line x1="400" y1="25" x2="240" y2="25" stroke="url(#cyanFade)" stroke-width="1" />
<polyline points="280,12 260,25 240,25" fill="none" stroke="url(#cyanFade)" stroke-width="1" />
<polyline points="310,38 290,25 260,25" fill="none" stroke="url(#cyanFade)" stroke-width="1" />
<polyline points="340,12 340,22 360,32 360,38" fill="none" stroke="url(#cyanFade)" stroke-width="1" />
<polyline points="250,12 230,12 220,20" fill="none" stroke="url(#cyanFade)" stroke-width="0.8" />
<polyline points="370,38 370,28 385,18 400,18" fill="none" stroke="url(#cyanFade)" stroke-width="0.8" />
<circle cx="280" cy="12" r="2.5" fill="#00d4ff" opacity="0.9" />
<circle cx="260" cy="25" r="2" fill="#00d4ff" opacity="0.7" />
<circle cx="240" cy="25" r="3" fill="#00d4ff" opacity="0.9">
<animate attributeName="opacity" values="0.9;0.4;0.9" dur="3s" repeatCount="indefinite" />
</circle>
<circle cx="310" cy="38" r="2.5" fill="#00d4ff" opacity="0.8" />
<circle cx="290" cy="25" r="2" fill="#00d4ff" opacity="0.6" />
<circle cx="340" cy="12" r="2" fill="#00d4ff" opacity="0.7" />
<circle cx="360" cy="38" r="2" fill="#00d4ff" opacity="0.6" />
<circle cx="250" cy="12" r="1.5" fill="#00d4ff" opacity="0.5" />
<circle cx="220" cy="20" r="2" fill="#00d4ff" opacity="0.5">
<animate attributeName="opacity" values="0.5;0.2;0.5" dur="4s" repeatCount="indefinite" />
</circle>
<circle cx="370" cy="28" r="1.5" fill="#00d4ff" opacity="0.5" />
<circle cx="240" cy="25" r="6" fill="none" stroke="#00d4ff" stroke-width="0.5" opacity="0.3">
<animate attributeName="r" values="6;10;6" dur="3s" repeatCount="indefinite" />
<animate attributeName="opacity" values="0.3;0;0.3" dur="3s" repeatCount="indefinite" />
</circle>
<defs>
<linearGradient id="cyanFade" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#00d4ff" stop-opacity="0" />
<stop offset="40%" stop-color="#00d4ff" stop-opacity="0.5" />
<stop offset="100%" stop-color="#00d4ff" stop-opacity="0.15" />
</linearGradient>
</defs>
</svg>
<div class="toolbar-group">
<span class="app-title">ARGUS</span>
<input type="text" id="ip-range-input" placeholder="IP range (e.g. 192.168.1.0/24)" spellcheck="false" />
<button id="btn-scan" class="btn btn-primary">Scan</button>
<button id="btn-stop" class="btn btn-danger" disabled>Stop</button>
<label class="toggle-label">
<input type="checkbox" id="chk-portscan" />
<span>Simple Port Scan</span>
</label>
</div>
<div class="toolbar-group toolbar-right">
<span id="status-text" class="status-text">Ready</span>
<div id="progress-bar" class="progress-bar" hidden>
<div id="progress-fill" class="progress-fill"></div>
</div>
</div>
</div>
<!-- Tabs -->
<div id="tab-bar">
<button class="tab active" data-tab="scanner">Scanner</button>
<button class="tab" data-tab="monitor">Monitor</button>
<button class="tab" data-tab="nmap">Nmap</button>
</div>
<!-- Views -->
<div id="views">
<div id="view-scanner" class="view active">
<div id="results-toolbar">
<input type="text" id="filter-input" placeholder="Filter results..." spellcheck="false" />
<div class="toolbar-group">
<button id="btn-export-all" class="btn-sm">Export All</button>
<button id="btn-export-up" class="btn-sm">Export Up</button>
</div>
<div class="col-picker-wrap">
<button id="btn-columns" class="btn-sm">Columns</button>
<div id="col-picker" class="col-picker" hidden>
<label><input type="checkbox" data-col="ip" checked disabled /> IP Address</label>
<label><input type="checkbox" data-col="status" checked /> Status</label>
<label><input type="checkbox" data-col="rtt" checked /> Latency</label>
<label><input type="checkbox" data-col="hostname" checked /> Hostname</label>
<label><input type="checkbox" data-col="ports" checked /> Open Ports</label>
</div>
</div>
<div class="send-group">
<div class="send-wrap">
<button id="btn-send-monitor" class="btn-sm">Send to Monitor &#9662;</button>
<div class="send-menu" id="send-monitor-menu" hidden>
<button class="ctx-item" data-send="monitor-all">All Hosts</button>
<button class="ctx-item" data-send="monitor-up">Up Hosts</button>
<button class="ctx-item" data-send="monitor-checked">Checked Hosts</button>
</div>
</div>
<div class="send-wrap">
<button id="btn-send-nmap" class="btn-sm">Send to Nmap &#9662;</button>
<div class="send-menu" id="send-nmap-menu" hidden>
<button class="ctx-item" data-send="nmap-all">All Hosts</button>
<button class="ctx-item" data-send="nmap-up">Up Hosts</button>
<button class="ctx-item" data-send="nmap-checked">Checked Hosts</button>
</div>
</div>
</div>
<span id="host-count" class="host-count"></span>
</div>
<div id="results-table-container">
<table id="results-table">
<thead>
<tr>
<th class="col-check"><input type="checkbox" id="check-all" /></th>
<th data-sort="ip" class="sortable sorted-asc">IP Address</th>
<th data-sort="status" class="sortable">Status</th>
<th data-sort="rtt" class="sortable">Latency (ms)</th>
<th data-sort="hostname" class="sortable">Hostname</th>
<th data-sort="ports" class="sortable">Open Ports</th>
</tr>
</thead>
<tbody id="results-body"></tbody>
</table>
</div>
</div>
<div id="view-monitor" class="view">
<div id="monitor-toolbar">
<input type="text" id="monitor-input" placeholder="Add hosts (e.g. 192.168.1.1, 10.0.0.0/24)"
spellcheck="false" />
<button id="btn-monitor-add" class="btn-sm">Add</button>
<select id="monitor-interval">
<option value="1000">1s interval</option>
<option value="2000" selected>2s interval</option>
<option value="5000">5s interval</option>
<option value="10000">10s interval</option>
<option value="30000">30s interval</option>
</select>
<button id="btn-monitor-start" class="btn btn-primary">Start</button>
<button id="btn-monitor-stop" class="btn btn-danger" disabled>Stop</button>
<button id="btn-monitor-clear" class="btn-sm">Clear All</button>
</div>
<div id="monitor-table-container">
<table id="monitor-table">
<thead>
<tr>
<th>IP Address</th>
<th>Label</th>
<th>Status</th>
<th>Last RTT</th>
<th>Min</th>
<th>Avg</th>
<th>Max</th>
<th>Sent</th>
<th>Recv</th>
<th>Loss %</th>
<th>Consec. Fail</th>
<th></th>
</tr>
</thead>
<tbody id="monitor-body"></tbody>
</table>
</div>
</div>
<div id="view-nmap" class="view">
<div id="nmap-toolbar">
<input type="text" id="nmap-target" placeholder="Target (e.g. 192.168.1.1 or 192.168.1.0/24)"
spellcheck="false" />
<select id="nmap-preset">
<option value="quick">Quick Scan (-sT -T4)</option>
<option value="service">Service Detection (-sT -sV)</option>
<option value="os">OS Detection (-sT -O) *privileged</option>
<option value="full">Full Scan (-sT -sV -sC)</option>
<option value="custom">Custom</option>
</select>
<input type="text" id="nmap-custom-args" placeholder="Custom nmap args..." spellcheck="false" hidden />
<button id="btn-nmap-scan" class="btn btn-primary">Scan</button>
<button id="btn-nmap-stop" class="btn btn-danger" disabled>Stop</button>
<label class="toggle-label">
<input type="checkbox" id="chk-nmap-verbose" checked />
<span>Verbose</span>
</label>
</div>
<div id="nmap-output" class="nmap-output"></div>
</div>
</div>
<!-- Status Bar -->
<div id="status-bar">
<span class="status-bar-item" id="status-bar-version">Argus</span>
<button id="btn-settings" class="status-bar-btn">Settings</button>
<span class="status-bar-item" id="privilege-status">unprivileged</span>
</div>
<!-- Traceroute Modal -->
<div id="traceroute-modal" class="modal-overlay">
<div class="modal-panel">
<div class="modal-header">
<span class="modal-title">Traceroute to <span id="traceroute-target"></span></span>
<button id="traceroute-close" class="modal-close">&times;</button>
</div>
<div id="traceroute-output" class="traceroute-output"></div>
</div>
</div>
<!-- Settings Modal -->
<div id="settings-modal" class="modal-overlay">
<div class="modal-panel" style="width: 480px;">
<div class="modal-header">
<span class="modal-title">Settings</span>
<button id="settings-close" class="modal-close">&times;</button>
</div>
<div class="settings-body">
<div class="settings-field">
<label for="setting-update-url">Release API URL</label>
<input type="text" id="setting-update-url" placeholder="https://your-server.com/argus/update.json"
spellcheck="false" />
<p class="settings-hint">JSON file with version, url, and notes fields. Leave empty to disable.</p>
</div>
<button id="btn-settings-save" class="btn btn-primary">Save</button>
</div>
</div>
</div>
<!-- Context Menu -->
<div id="context-menu" class="context-menu" hidden>
<button class="ctx-item" data-action="copy-ip">Copy IP</button>
<button class="ctx-item" data-action="copy-hostname">Copy Hostname</button>
<div class="ctx-divider"></div>
<button class="ctx-item" data-action="open-http">Open HTTP</button>
<button class="ctx-item" data-action="open-https">Open HTTPS</button>
<div class="ctx-divider"></div>
<button class="ctx-item" data-action="traceroute">Traceroute</button>
<div class="ctx-divider"></div>
<button class="ctx-item" data-action="send-monitor">Send to Monitor</button>
<button class="ctx-item" data-action="send-nmap">Send to Nmap</button>
</div>
<script src="main.js"></script>
</body>
</html>