espilon-source/tools/C3PO/templates/mlat.html
Eun0us 79c2a4d4bf c3po: full server rewrite with modular routes and honeypot dashboard
Replace monolithic CLI and web server with route-based Flask API.
New routes: api_commands, api_build, api_can, api_monitor, api_ota,
api_tunnel. Add honeypot security dashboard with real-time SSE,
MITRE ATT&CK mapping, kill chain analysis.

New TUI with commander/help modules. Add session management,
tunnel proxy core, CAN bus data store. Docker support.
2026-02-28 20:12:27 +01:00

141 lines
7.7 KiB
HTML

{% extends "base.html" %}
{% block title %}MLAT - ESPILON{% endblock %}
{% block head %}
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
{% endblock %}
{% block content %}
<div class="page">
<div class="mlat-layout">
<!-- Main: Map/Plan views -->
<div class="mlat-main">
<!-- View toggle toolbar -->
<div class="toolbar">
<button class="btn btn-sm" :class="currentView==='map'?'btn-primary':''" data-view="map" onclick="switchView('map')">Map</button>
<button class="btn btn-sm" :class="currentView==='plan'?'btn-primary':''" data-view="plan" onclick="switchView('plan')">Plan</button>
<div class="toolbar-sep"></div>
<span class="toolbar-label" id="coord-mode-label">GPS</span>
</div>
<!-- Leaflet Map -->
<div id="map-view" class="mlat-view active">
<div id="leaflet-map"></div>
</div>
<!-- Plan Canvas -->
<div id="plan-view" class="mlat-view">
<div class="plan-controls">
<input type="file" id="plan-upload" accept="image/*" style="display:none" onchange="uploadPlanImage(this)">
<button class="btn btn-sm" onclick="document.getElementById('plan-upload').click()">Upload</button>
<button class="btn btn-sm" id="grid-toggle" onclick="toggleGrid()">Grid</button>
<button class="btn btn-sm" id="labels-toggle" onclick="toggleLabels()">Labels</button>
<div class="toolbar-sep"></div>
<button class="btn btn-sm" onclick="zoomPlan(-1)">-</button>
<span class="zoom-level" id="zoom-level">100%</span>
<button class="btn btn-sm" onclick="zoomPlan(1)">+</button>
<button class="btn btn-sm" onclick="resetZoom()">Reset</button>
</div>
<div class="plan-canvas-wrapper">
<canvas id="plan-canvas"></canvas>
</div>
</div>
</div>
<!-- Sidebar -->
<div class="mlat-sidebar-panel" style="display:flex;flex-direction:column;gap:0;">
<!-- Target -->
<div class="panel" style="border:none;border-bottom:1px solid var(--border);">
<div class="panel-header"><span>Target</span></div>
<div class="panel-body">
<div class="kv">
<div class="kv-row"><span class="kv-key" id="target-coord1-label">Latitude</span><span class="kv-val" id="target-coord1">-</span></div>
<div class="kv-row"><span class="kv-key" id="target-coord2-label">Longitude</span><span class="kv-val" id="target-coord2">-</span></div>
<div class="kv-row"><span class="kv-key">Confidence</span><span class="kv-val" id="target-confidence">-</span></div>
<div class="kv-row"><span class="kv-key">Last Update</span><span class="kv-val" id="target-age">-</span></div>
<div class="kv-row"><span class="kv-key">Mode</span><span class="kv-val" id="coord-mode">GPS</span></div>
</div>
</div>
</div>
<!-- Scanners -->
<div class="panel" style="border:none;border-bottom:1px solid var(--border);flex:1;overflow:hidden;">
<div class="panel-header"><span>Scanners (<span id="scanner-count">0</span>)</span></div>
<div class="panel-body" id="scanner-list" style="overflow-y:auto;padding:4px;">
<div class="text-muted text-xs" style="padding:8px;">No scanners</div>
</div>
</div>
<!-- Map/Plan Settings -->
<div class="panel" id="map-settings" style="border:none;border-bottom:1px solid var(--border);">
<div class="panel-header"><span>Map Settings</span></div>
<div class="panel-body panel-body-pad">
<div class="form-row">
<span class="form-label">Lat</span>
<input type="number" class="input flex-1" id="map-center-lat" value="48.8566" step="0.0001">
</div>
<div class="form-row">
<span class="form-label">Lon</span>
<input type="number" class="input flex-1" id="map-center-lon" value="2.3522" step="0.0001">
</div>
<div class="form-row">
<span class="form-label">Zoom</span>
<input type="number" class="input" id="map-zoom" value="18" min="1" max="20" style="width:60px;">
<button class="btn btn-sm" onclick="centerMap()">Center</button>
<button class="btn btn-sm" onclick="fitMapToBounds()">Fit</button>
</div>
</div>
</div>
<div class="panel" id="plan-settings" style="border:none;border-bottom:1px solid var(--border);display:none;">
<div class="panel-header"><span>Plan Settings</span></div>
<div class="panel-body panel-body-pad">
<div class="form-row">
<span class="form-label">W (m)</span>
<input type="number" class="input flex-1" id="plan-width" value="50" min="1">
</div>
<div class="form-row">
<span class="form-label">H (m)</span>
<input type="number" class="input flex-1" id="plan-height" value="30" min="1">
</div>
<div class="form-row">
<span class="form-label">Origin</span>
<input type="number" class="input" id="plan-origin-x" value="0" step="0.1" style="width:60px;" placeholder="X">
<input type="number" class="input" id="plan-origin-y" value="0" step="0.1" style="width:60px;" placeholder="Y">
<button class="btn btn-sm" onclick="applyPlanSettings()">Apply</button>
</div>
</div>
</div>
<!-- MLAT Config -->
<div class="panel" style="border:none;">
<div class="panel-header"><span>Config</span></div>
<div class="panel-body panel-body-pad">
<div class="form-row">
<span class="form-label">RSSI@1m</span>
<input type="number" class="input" id="config-rssi" value="-40" step="1" style="width:70px;">
</div>
<div class="form-row">
<span class="form-label">Loss (n)</span>
<input type="number" class="input" id="config-n" value="2.5" step="0.1" style="width:70px;">
</div>
<div class="form-row">
<span class="form-label">Smooth</span>
<input type="number" class="input" id="config-smooth" value="5" min="1" max="20" style="width:70px;">
</div>
<div class="form-row">
<span class="form-label"></span>
<button class="btn btn-sm btn-primary" onclick="saveConfig()">Save</button>
<button class="btn btn-sm btn-danger" onclick="clearData()">Clear</button>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/mlat.js') }}"></script>
{% endblock %}