Files
UNITRONIX dd0889e3d6 Add SessionManager; update docs, i18n & CI
Introduce a SessionManager for relay-based remote sessions in the Tauri MGMT client: new SessionCommand API, start/stop/session input routing, clipboard/recording/quality controls, and notification read/dismiss state. Wire AppState with new mutexes and show main window on startup. CI: add SBOM generation (anchore) and Trivy vulnerability scan steps. Misc: change console Docker DB path, large README/CHANGELOG updates (chat E2E, unattended access/WOL, i18n expansion, CDAP/SDK docs), and many web-nodejs assets/locales/routes/views/services and server-side changes.
2026-04-05 13:42:07 +02:00

246 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<%- include('layouts/main', {
title: typeof title !== 'undefined' ? title : 'Resource Control',
pageStyles: typeof pageStyles !== 'undefined' ? pageStyles : ['resource-control'],
pageScripts: typeof pageScripts !== 'undefined' ? pageScripts : ['resource-control'],
currentPage: typeof currentPage !== 'undefined' ? currentPage : 'resource-control',
breadcrumb: typeof breadcrumb !== 'undefined' ? breadcrumb : [{ label: 'Resource Control' }],
body: `
<div class="page-content" style="max-width: 1400px; margin: 0 auto;">
<div class="rc-header">
<h2>${_('resource_control.title')}</h2>
<div class="rc-tabs" id="rc-tabs">
<button class="rc-tab active" data-tab="overview" onclick="ResourceControl.switchTab('overview')">
<span class="material-icons-round">dashboard</span>
${_('resource_control.tab_overview')}
</button>
<button class="rc-tab" data-tab="usb" onclick="ResourceControl.switchTab('usb')">
<span class="material-icons-round">usb</span>
${_('resource_control.tab_usb')}
</button>
<button class="rc-tab" data-tab="optical" onclick="ResourceControl.switchTab('optical')">
<span class="material-icons-round">album</span>
${_('resource_control.tab_optical')}
</button>
<button class="rc-tab" data-tab="monitors" onclick="ResourceControl.switchTab('monitors')">
<span class="material-icons-round">monitor</span>
${_('resource_control.tab_monitors')}
</button>
<button class="rc-tab" data-tab="disks" onclick="ResourceControl.switchTab('disks')">
<span class="material-icons-round">storage</span>
${_('resource_control.tab_disks')}
</button>
<button class="rc-tab" data-tab="quotas" onclick="ResourceControl.switchTab('quotas')">
<span class="material-icons-round">speed</span>
${_('resource_control.tab_quotas')}
</button>
</div>
</div>
<div class="rc-content">
<!-- Overview tab -->
<div class="rc-panel active" id="panel-overview">
<div class="rc-compliance-row" id="compliance-stats"></div>
<div class="rc-section">
<h3>${_('resource_control.compliance_by_category')}</h3>
<div class="rc-category-grid" id="compliance-categories"></div>
</div>
<div class="rc-section">
<h3>${_('resource_control.device_compliance')}</h3>
<div class="rc-device-filter">
<input type="text" class="rc-search" id="rc-device-search"
placeholder="${_('resource_control.search_devices')}"
oninput="ResourceControl.filterDevices()">
</div>
<div class="rc-table-scroll">
<table class="rc-table" id="rc-device-table">
<thead>
<tr>
<th>${_('resource_control.col_device')}</th>
<th>${_('resource_control.col_platform')}</th>
<th>${_('resource_control.col_status')}</th>
<th>${_('resource_control.col_usb')}</th>
<th>${_('resource_control.col_optical')}</th>
<th>${_('resource_control.col_monitors')}</th>
<th>${_('resource_control.col_disks')}</th>
<th>${_('resource_control.col_quotas')}</th>
<th>${_('resource_control.col_actions')}</th>
</tr>
</thead>
<tbody id="rc-device-tbody"></tbody>
</table>
</div>
</div>
</div>
<!-- USB tab -->
<div class="rc-panel" id="panel-usb">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">usb</span> ${_('resource_control.usb_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.usb_hint')}</p>
<div class="rc-policy-form" id="usb-form">
<div class="rc-form-group">
<label>${_('resource_control.usb_storage_policy')}</label>
<select id="usb-storage-policy">
<option value="allowed">${_('resource_control.policy_allowed')}</option>
<option value="blocked">${_('resource_control.policy_blocked')}</option>
<option value="whitelist">${_('resource_control.policy_whitelist')}</option>
</select>
</div>
<div class="rc-form-group">
<label>${_('resource_control.usb_whitelist')}</label>
<textarea id="usb-whitelist" placeholder="${_('resource_control.usb_whitelist_hint')}" rows="4"></textarea>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="usb-audit-log"> ${_('resource_control.usb_audit_log')}
</label>
</div>
</div>
</div>
</div>
<!-- Optical tab -->
<div class="rc-panel" id="panel-optical">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">album</span> ${_('resource_control.optical_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.optical_hint')}</p>
<div class="rc-policy-form" id="optical-form">
<div class="rc-form-group">
<label>${_('resource_control.optical_policy')}</label>
<select id="optical-policy">
<option value="allowed">${_('resource_control.policy_allowed')}</option>
<option value="blocked">${_('resource_control.policy_blocked')}</option>
</select>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="optical-audit-log"> ${_('resource_control.optical_audit_log')}
</label>
</div>
</div>
</div>
</div>
<!-- Monitors tab -->
<div class="rc-panel" id="panel-monitors">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">monitor</span> ${_('resource_control.monitors_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.monitors_hint')}</p>
<div class="rc-policy-form" id="monitors-form">
<div class="rc-form-group">
<label>${_('resource_control.monitors_max_count')}</label>
<input type="number" id="monitors-max-count" min="0" max="16" value="0"
placeholder="${_('resource_control.monitors_max_hint')}">
</div>
<div class="rc-form-group">
<label>${_('resource_control.monitors_resolution')}</label>
<select id="monitors-resolution">
<option value="any">${_('resource_control.policy_any')}</option>
<option value="1920x1080">1920×1080 (Full HD)</option>
<option value="2560x1440">2560×1440 (QHD)</option>
<option value="3840x2160">3840×2160 (4K UHD)</option>
</select>
</div>
<div class="rc-form-group">
<label>${_('resource_control.monitors_brightness')}</label>
<input type="range" id="monitors-brightness" min="0" max="100" value="100">
<span id="monitors-brightness-val">100%</span>
</div>
<div class="rc-form-group">
<label>${_('resource_control.monitors_power_schedule')}</label>
<input type="text" id="monitors-power-schedule"
placeholder="${_('resource_control.monitors_power_hint')}">
</div>
</div>
</div>
</div>
<!-- Disks tab -->
<div class="rc-panel" id="panel-disks">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">storage</span> ${_('resource_control.disks_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.disks_hint')}</p>
<div class="rc-policy-form" id="disks-form">
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="disks-readonly"> ${_('resource_control.disks_readonly')}
</label>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="disks-encryption"> ${_('resource_control.disks_encryption')}
</label>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="disks-smart"> ${_('resource_control.disks_smart')}
</label>
</div>
<div class="rc-form-group">
<label>${_('resource_control.disks_hidden')}</label>
<input type="text" id="disks-hidden-partitions"
placeholder="${_('resource_control.disks_hidden_hint')}">
</div>
</div>
</div>
</div>
<!-- Quotas tab -->
<div class="rc-panel" id="panel-quotas">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">speed</span> ${_('resource_control.quotas_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.quotas_hint')}</p>
<div class="rc-policy-form" id="quotas-form">
<div class="rc-form-group">
<label>${_('resource_control.quotas_cpu')}</label>
<div class="rc-range-group">
<input type="range" id="quotas-cpu" min="0" max="100" value="100">
<span id="quotas-cpu-val">100%</span>
</div>
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_ram')}</label>
<div class="rc-range-group">
<input type="range" id="quotas-ram" min="0" max="100" value="100">
<span id="quotas-ram-val">100%</span>
</div>
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_bandwidth')}</label>
<input type="number" id="quotas-bandwidth" min="0" value="0"
placeholder="${_('resource_control.quotas_bandwidth_hint')}">
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_disk_quota')}</label>
<input type="number" id="quotas-disk" min="0" value="0"
placeholder="${_('resource_control.quotas_disk_hint')}">
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_process_whitelist')}</label>
<textarea id="quotas-process-whitelist" rows="4"
placeholder="${_('resource_control.quotas_process_hint')}"></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
if (window.ResourceControl) ResourceControl.init();
});
</script>
`
}) %>