Add active user session tracking from agent user :0 2026-07-16 15:46
user pts/0 2026-07-16 15:50 (:0) user pts/1 2026-07-16 16:46 (:0) user pts/2 2026-07-17 09:05 (:0) to server UI
This commit is contained in:
@@ -23,7 +23,11 @@
|
||||
<div class="card text-center shadow-sm">
|
||||
<div class="card-body">
|
||||
<div class="text-muted small">Пользователь</div>
|
||||
{% if computer.current_user and ',' in computer.current_user %}
|
||||
<span class="badge bg-info text-dark" title="{{ computer.current_user }}">за ПК работают {{ computer.current_user.split(',') | length }} пользователя</span>
|
||||
{% else %}
|
||||
<div class="fw-bold">{{ computer.current_user or '-' }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -45,6 +49,31 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card shadow-sm mb-4">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Активные сессии</h5>
|
||||
{% if latest_sessions %}
|
||||
<table class="table table-sm mb-0">
|
||||
<thead>
|
||||
<tr><th>Пользователь</th><th>TTY</th><th>Время входа</th><th>Откуда</th></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in latest_sessions %}
|
||||
<tr>
|
||||
<td>{{ s.username or '-' }}</td>
|
||||
<td>{{ s.tty or '-' }}</td>
|
||||
<td>{{ s.login_time or '-' }}</td>
|
||||
<td>{{ s.origin or '-' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<div class="text-muted">Нет данных о сессиях.</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-4 mb-4">
|
||||
<div class="col-md-6">
|
||||
<div class="card shadow-sm">
|
||||
|
||||
@@ -64,11 +64,17 @@
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tbody>
|
||||
{% for c in computers %}
|
||||
<tr data-id="{{ c.id }}">
|
||||
<td><strong>{{ c.hostname }}</strong></td>
|
||||
<td>{{ c.current_user or '-' }}</td>
|
||||
<td>
|
||||
{% if c.current_user and ',' in c.current_user %}
|
||||
<span class="badge bg-info text-dark" title="{{ c.current_user }}">за ПК работают {{ c.current_user.split(',') | length }} пользователя</span>
|
||||
{% else %}
|
||||
{{ c.current_user or '-' }}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ c.current_ip or '-' }}</td>
|
||||
<td>
|
||||
{% if c.status == 'online' %}
|
||||
@@ -101,6 +107,15 @@
|
||||
<script>
|
||||
const isAdmin = {{ 'true' if user.role == 'admin' else 'false' }};
|
||||
|
||||
function formatCurrentUser(value) {
|
||||
if (!value) return '-';
|
||||
if (value.includes(',')) {
|
||||
const count = value.split(',').length;
|
||||
return `<span class="badge bg-info text-dark" title="${escapeHtml(value)}">за ПК работают ${count} пользователя</span>`;
|
||||
}
|
||||
return escapeHtml(value);
|
||||
}
|
||||
|
||||
function currentQuery() {
|
||||
return new URLSearchParams(window.location.search).toString();
|
||||
}
|
||||
@@ -152,7 +167,7 @@ async function loadDashboard() {
|
||||
tbody.innerHTML = data.map(c => `
|
||||
<tr data-id="${c.id}">
|
||||
<td><strong>${escapeHtml(c.hostname)}</strong></td>
|
||||
<td>${escapeHtml(c.current_user || '-')}</td>
|
||||
<td>${formatCurrentUser(c.current_user)}</td>
|
||||
<td>${escapeHtml(c.current_ip || '-')}</td>
|
||||
<td>${c.status === 'online' ? '<span class="badge bg-success">Online</span>' : '<span class="badge bg-secondary">Offline</span>'}</td>
|
||||
<td>${c.current_cpu_percent != null ? c.current_cpu_percent.toFixed(1) : '-'}%</td>
|
||||
|
||||
Reference in New Issue
Block a user