108 lines
7.0 KiB
HTML
108 lines
7.0 KiB
HTML
{{define "edit-body"}}<div class="page" data-module="edit">
|
||
<div class="wrap">
|
||
<h1>{{.Agent.Name}}</h1>
|
||
|
||
<div class="card">
|
||
<h2>Имя</h2>
|
||
<form method="post" action="/agents/{{.Agent.ID}}/rename" class="row">
|
||
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
||
<input type="text" name="name" value="{{.Agent.Name}}" style="max-width:360px" required>
|
||
<button type="submit">Сохранить</button>
|
||
</form>
|
||
<p class="muted" style="margin-top:12px">
|
||
Hostname: <code>{{.Agent.Hostname}}</code> · ОС: <code>{{.Agent.OS}}/{{.Agent.Arch}}</code> · ID: <code>{{.Agent.ID}}</code>
|
||
</p>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<h2>Пользователь</h2>
|
||
{{if .UserOK}}<div class="err" style="background:#1d3a24;border-color:#2b6b3a;color:#b3ffcb">{{.UserOK}}</div>{{end}}
|
||
{{if .UserErr}}<div class="err">{{.UserErr}}</div>{{end}}
|
||
<p class="muted">
|
||
Клиент запущен от: <code>{{if .Users}}{{.Users.Current}}{{else if .Agent.RunUser}}{{.Agent.RunUser}}{{else}}неизвестно{{end}}</code>
|
||
· Терминал открывается от: <code>{{.Agent.TerminalUser}}</code>
|
||
</p>
|
||
{{if .Users}}
|
||
<form method="post" action="/agents/{{.Agent.ID}}/user" class="row">
|
||
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
||
<select name="user" {{if not .Users.CanSwitch}}disabled{{end}}>
|
||
{{range .Users.Users}}<option value="{{.}}" {{if eq . $.Agent.TerminalUser}}selected{{end}}>{{.}}</option>{{end}}
|
||
</select>
|
||
<button type="submit" {{if not .Users.CanSwitch}}disabled{{end}}>Сохранить</button>
|
||
{{if .Users.CanSwitch}}<button type="button" class="btn ghost" onclick="document.getElementById('newuser').hidden = !document.getElementById('newuser').hidden">Создать нового</button>{{end}}
|
||
</form>
|
||
{{if .Users.CanSwitch}}
|
||
<form id="newuser" method="post" action="/agents/{{.Agent.ID}}/users/add" style="max-width:360px; margin-top:16px" hidden>
|
||
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
||
<label for="nu-name">Имя нового пользователя</label>
|
||
<input type="text" id="nu-name" name="name" pattern="[a-z_][a-z0-9_\-]{0,31}" autocomplete="off" required>
|
||
<label for="nu-pass">Пароль</label>
|
||
<input type="password" id="nu-pass" name="password" autocomplete="new-password">
|
||
<label style="color:var(--text); font-size:14px">
|
||
<input type="checkbox" name="sudo" value="1"> Добавить в sudo
|
||
</label>
|
||
<p class="muted" style="font-size:13px">Без пароля вход по паролю (и sudo) для него работать не будет - только терминал из панели.</p>
|
||
<button type="submit">Создать пользователя</button>
|
||
</form>
|
||
{{else}}
|
||
<p class="muted" style="font-size:13px; margin-top:12px">Клиент запущен не от root, поэтому сменить или создать пользователя нельзя.</p>
|
||
{{end}}
|
||
{{else if .UsersErr}}
|
||
<p class="muted" style="font-size:13px">Список пользователей недоступен: {{.UsersErr}}.</p>
|
||
{{else}}
|
||
<p class="muted" style="font-size:13px">Машина офлайн - сменить пользователя можно, когда она на связи.</p>
|
||
{{end}}
|
||
</div>
|
||
|
||
<div class="card">
|
||
<h2>Связь с сервером</h2>
|
||
<p class="muted">
|
||
Сейчас: {{if not .Online}}<span>офлайн</span>{{else if .OnWS}}<span style="color:var(--ok)">WebSocket</span>{{else}}<span>long polling</span>{{end}}{{if and .Online .ViaDirect}} <span class="muted">(direct)</span>{{end}}
|
||
</p>
|
||
<form method="post" action="/agents/{{.Agent.ID}}/transport" class="row">
|
||
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
||
<select name="transport">
|
||
<option value="auto" {{if eq .Transport "auto"}}selected{{end}}>Авто: WebSocket, а если не выходит - long polling</option>
|
||
<option value="ws" {{if eq .Transport "ws"}}selected{{end}}>Только WebSocket</option>
|
||
<option value="lp" {{if eq .Transport "lp"}}selected{{end}}>Только long polling</option>
|
||
</select>
|
||
<button type="submit">Сохранить</button>
|
||
</form>
|
||
<p class="muted" style="font-size:13px; margin-top:10px">WebSocket держит одно соединение: команды и терминал идут по нему без отдельного запроса на каждое нажатие.
|
||
В режиме «Авто» клиент, потеряв WebSocket, переходит на long polling и раз в минуту пробует вернуться.
|
||
Нужен клиент 0.1.0+ и прокси, пропускающий WebSocket (nginx: заголовки Upgrade и Connection).</p>
|
||
</div>
|
||
|
||
<div class="card">
|
||
<h2>Версия клиента</h2>
|
||
{{if .Updated}}<div class="err" style="background:#1d3a24;border-color:#2b6b3a;color:#b3ffcb">Клиент {{if .UpdateMsg}}{{.UpdateMsg}}{{else}}обновлён и перезапускается{{end}}. Через несколько секунд он вернётся с новой версией.</div>{{end}}
|
||
{{if .UpdateErr}}<div class="err">Обновление не вышло: {{.UpdateErr}}</div>{{end}}
|
||
<p class="muted">
|
||
Клиент: <code>{{if .Agent.Version}}{{.Agent.Version}}{{else}}неизвестно{{end}}</code>
|
||
· Сервер: <code>{{.ServerVersion}}</code>
|
||
{{if .Outdated}}<span style="color:var(--danger)"> · требуется обновление</span>{{else}}<span style="color:var(--ok)"> · актуальна</span>{{end}}
|
||
</p>
|
||
{{if .Outdated}}
|
||
<form method="post" action="/agents/{{.Agent.ID}}/update"
|
||
onsubmit="return confirm('Обновить клиента до версии {{.ServerVersion}}? Бинарник будет заменён, сервис перезапущен (без удаления).')">
|
||
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
||
<button type="submit">Обновить клиента</button>
|
||
</form>
|
||
{{else}}
|
||
<p class="muted" style="font-size:13px">Обновление доступно, когда версия клиента отличается от версии сервера.</p>
|
||
{{end}}
|
||
</div>
|
||
|
||
{{if .IsAdmin}}<div class="card">
|
||
<h2>Удаление</h2>
|
||
<p class="muted">Удаляет машину из панели. Сервис на самой машине продолжит работать,
|
||
но перестанет быть виден; чтобы подключиться снова - переустановите агента.</p>
|
||
<form method="post" action="/agents/{{.Agent.ID}}/delete"
|
||
onsubmit="return confirm('Удалить машину {{.Agent.Name}}?')">
|
||
<input type="hidden" name="csrf" value="{{.CSRF}}">
|
||
<button class="btn danger" type="submit">Удалить машину</button>
|
||
</form>
|
||
</div>{{end}}
|
||
</div>
|
||
</div>{{end}}
|