This commit is contained in:
Mateusz Gruszczyński committed 2026-10-05 22:29:54 +02:00
1 parent b9d137eee1
commit 32e6875980
51 files changed
+1255 -452

No files matched your search

+48 -62
View File
@@ -64,13 +64,18 @@
<header class="topbar"><span class="breadcrumb">CONTROL ROOM <span>/</span> <b
id="page-label">Overview</b></span>
<div class="top-actions"><a class="quiet" href="/docs" data-i18n="documentation" id="api-docs"
hidden="">Documentation</a><button class="quiet" data-i18n="logs" hidden="" id="file-logs-open"
type="button">Logs</button><button class="quiet" data-i18n="liveLogs" hidden="" id="logs-open"
type="button">Live
access logs</button><select aria-label="Language" class="language-select"
data-i18n-aria="language" id="language"></select><button class="quiet" data-i18n="about"
id="about-open" type="button">About</button><button class="quiet" data-i18n="logout" hidden=""
id="logout">Lock</button></div>
hidden="">Documentation</a>
<details class="top-log-menu" hidden="" id="logs-menu">
<summary class="quiet" data-i18n="logs">Logs</summary>
<div class="top-log-menu-items"><button class="quiet" data-i18n="storedLogs" hidden=""
id="file-logs-open" type="button">Stored logs</button><button class="quiet"
data-i18n="liveLogs" hidden="" id="logs-open" type="button">Live access logs</button>
</div>
</details><select aria-label="Language" class="language-select" data-i18n-aria="language"
id="language"></select><button class="quiet" data-i18n="about" id="about-open"
type="button">About</button><button class="quiet" data-i18n="logout" hidden=""
id="logout">Lock</button>
</div>
</header>
<section class="login-section" hidden="" id="login">
<div class="eyebrow" data-i18n="firstSlice">THE FIRST WORKING SLICE</div>
@@ -551,7 +556,7 @@
<option data-i18n="vhLastRecovery" value="lastRecovery">Last recovery</option>
</select></label>
<button class="quiet backend-sort-direction" data-i18n-aria="backendSortAscending"
id="pool-sort-direction" type="button">A-Z</button>
id="pool-sort-direction" type="button">↑</button>
<details class="backend-column-picker">
<summary class="quiet" data-i18n="backendColumns">Columns</summary>
<div class="backend-column-options">
@@ -595,8 +600,6 @@
vhosts</button>
</div>
</div>
<p class="fine" data-i18n="vhHealthHint">Live state: leases cover the entire exchange; traffic
is an EWMA of payload bytes.</p>
<div class="table-scroll">
<table class="pool-table">
<thead>
@@ -1502,75 +1505,58 @@
<div><span class="small-label" data-i18n="fileLogsMode">LOCAL / READ-ONLY / BOUNDED</span>
<h2 data-i18n="fileLogsTitle">Stored log explorer</h2>
</div>
<button class="outline" data-i18n="refresh" id="file-logs-refresh"
type="button">Refresh</button>
<div class="file-logs-heading-actions">
<details class="file-log-search-help">
<summary class="quiet" data-i18n="fileLogsSearchHelp">Search syntax</summary>
<div class="file-log-search-help-popover">
<strong data-i18n="fileLogsSearchHelpTitle">Kibana-style field search</strong>
<p class="fine" data-i18n="fileLogsSearchHelpText">Use field:value clauses.
Clauses are joined with AND; prefix a clause with ! to exclude it. Quotes
keep spaces together.</p>
<code>req: GET AND !country: PL</code>
<code>status:&gt;=500 AND path:/api/*</code>
<code>error:"connection reset"</code>
</div>
</details>
<button class="outline" data-i18n="refresh" id="file-logs-refresh"
type="button">Refresh</button>
</div>
</div>
<p class="fine" data-i18n="fileLogsHelp">Reads only configured RustProxy log files. It is
independent from Live Logs and never accepts an arbitrary filesystem path.</p>
<p class="fine" data-i18n="fileLogsHelp">Searches bounded RustProxy access/error logs and parses
structured fields without exposing filesystem paths.</p>
<form class="file-logs-filter" id="file-logs-filter">
<label><span data-i18n="fileLogsSource">Source</span><select id="file-log-source">
<option value="all">All configured files</option>
<label class="file-log-source"><span data-i18n="fileLogsSource">Source</span><select
id="file-log-source">
<option data-i18n="fileLogsAllSources" value="all">All configured files</option>
</select></label>
<label class="file-log-search"><span data-i18n="search">Search</span><input id="file-log-q"
maxlength="256" data-i18n-placeholder="fileLogsSearchPlaceholder"
placeholder="IP, path, error, request id..." /></label>
<label><span data-i18n="fileLogsEvent">Event</span><select id="file-log-event">
<option data-i18n="all" value="all">All</option>
<option value="request">request</option>
<option value="protocol_error">protocol_error</option>
<option value="error">error</option>
</select></label>
<label><span data-i18n="status">Status</span><select id="file-log-status">
<option data-i18n="all" value="all">All</option>
<option value="1xx">1xx</option>
<option value="2xx">2xx</option>
<option value="3xx">3xx</option>
<option value="4xx">4xx</option>
<option value="5xx">5xx</option>
</select></label>
<label><span data-i18n="clientIp">Client IP</span><input id="file-log-client"
maxlength="128" placeholder="192.0.2.10" /></label>
<label><span data-i18n="vhost">Vhost</span><input id="file-log-vhost"
maxlength="256" /></label>
<label><span data-i18n="fileLogsPageSize">Page size</span><select id="file-log-limit">
maxlength="512" data-i18n-placeholder="fileLogsSearchPlaceholder"
placeholder="req: GET AND !country: Poland" type="search" /></label>
<label class="file-log-limit"><span data-i18n="fileLogsPageSize">Page size</span><select
id="file-log-limit">
<option>50</option>
<option selected>100</option>
<option>250</option>
<option>500</option>
</select></label>
<button class="primary" data-i18n="applyFilters" type="submit">Apply filters</button>
</form>
<div class="file-logs-table-toolbar">
<p class="fine" id="file-log-summary" role="status"></p>
<details class="log-column-picker file-log-column-picker">
<summary data-i18n="logColumns">Columns</summary>
<div class="log-column-options" id="file-log-column-options"></div>
</details>
</form>
<details class="file-log-inventory-details">
<summary data-i18n="fileLogsSourcesRead">Configured files</summary>
<p class="fine file-log-inventory" id="file-log-inventory"></p>
</details>
<p class="fine" id="file-log-summary" role="status"></p>
</div>
<div class="table-scroll file-logs-table">
<table>
<thead id="file-logs-table-head">
<tr>
<th data-file-log-column="time" data-i18n="time">Time</th>
<th data-file-log-column="event" data-i18n="fileLogsEvent">Event</th>
<th data-file-log-column="status" data-i18n="status">Status</th>
<th data-file-log-column="client_ip" data-i18n="clientIp">Client IP</th>
<th data-file-log-column="vhost" data-i18n="vhost">Vhost</th>
<th data-file-log-column="transport" data-i18n="logTransport" hidden>Transport</th>
<th data-file-log-column="matched_by" data-i18n="fileLogsMatchedBy" hidden>Matched by</th>
<th data-file-log-column="sni" data-i18n="fileLogsSni" hidden>SNI</th>
<th data-file-log-column="authority" data-i18n="fileLogsAuthority" hidden>Authority</th>
<th data-file-log-column="record" data-i18n="fileLogsRecord">Request / reason</th>
<th data-file-log-column="source" data-i18n="fileLogsSource">Source</th>
</tr>
<tr></tr>
</thead>
<tbody id="file-log-rows"></tbody>
</table>
</div>
<p class="empty" data-i18n="fileLogsEmpty" id="file-logs-empty">No records match the current
filters.</p>
search.</p>
<div class="file-logs-pager"><button class="quiet" data-i18n="previous" disabled
id="file-logs-prev" type="button">Previous</button><button class="quiet"
data-i18n="next" disabled id="file-logs-next" type="button">Next</button></div>
@@ -1749,7 +1735,7 @@
<option data-i18n="serverCustom" value="custom">Replace / add custom value</option>
</select>
<label data-i18n="serverValue" for="server-value">Custom Server value</label><input
id="server-value" maxlength="256" placeholder="RustProxy/v0.26.1"
id="server-value" maxlength="256" placeholder="RustProxy/v0.26.2"
spellcheck="false" />
<h3 class="subheading" data-i18n="diagnosticHeaders">Diagnostic headers</h3>
<div class="switch-grid">
@@ -2548,7 +2534,7 @@
</section>
</div>
</section>
<footer class="page-footer"><span>RustProxy <b>0.26.1</b></span><span id="footer-status">API - /
<footer class="page-footer"><span>RustProxy <b>0.26.2</b></span><span id="footer-status">API - /
dropped: 0</span></footer>
</div>
</main>
@@ -2658,7 +2644,7 @@
</div>
<article class="card audit-dialog-card">
<div class="field-grid tunnel-controls">
<div><label data-i18n="tunnelKillReason" for="tunnel-kill-reason">Close reason</label><input
<div><label data-i18n="tunnelKillReason" for="tunnel-kill-reason">Kill reason</label><input
id="tunnel-kill-reason" maxlength="256" data-i18n-placeholder="tunnelKillReasonPlaceholder"
placeholder="Administrative close" /></div>
</div>
@@ -3259,7 +3245,7 @@ max_execution_time = 30</code></pre>
<article class="card about-card">
<div class="about-product">
<span aria-hidden="true" class="brand-mark">r<span>/</span>p</span>
<div><span class="small-label">RustProxy</span><strong>0.26.1</strong></div>
<div><span class="small-label">RustProxy</span><strong>0.26.2</strong></div>
</div>
<dl class="about-meta">
<div>