182 lines
7.9 KiB
HTML
182 lines
7.9 KiB
HTML
{{define "content"}}
|
|
<div class="row row-cards">
|
|
<div class="col-12">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h3 class="card-title"><i class="ti ti-clock"></i> Temporary Access</h3>
|
|
<div class="card-actions">
|
|
<a href="/cron/add" class="btn btn-primary">
|
|
<i class="ti ti-plus"></i> New Access
|
|
</a>
|
|
</div>
|
|
</div>
|
|
<div class="table-responsive">
|
|
<table class="table table-vcenter card-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Name</th>
|
|
<th>User</th>
|
|
<th>Key</th>
|
|
<th>Target</th>
|
|
<th>System User</th>
|
|
<th>Password</th>
|
|
<th>Schedule</th>
|
|
<th>Auto-Remove</th>
|
|
<th>On Expiry</th>
|
|
<th>Next Run</th>
|
|
<th>Last Run</th>
|
|
<th>Status</th>
|
|
<th class="text-end">Actions</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range .CronJobs}}
|
|
<tr>
|
|
<td><strong>{{.Name}}</strong></td>
|
|
<td>
|
|
{{if .TargetUsername}}
|
|
<i class="ti ti-user"></i> {{.TargetUsername}}
|
|
{{else}}
|
|
<span class="text-secondary">—</span>
|
|
{{end}}
|
|
</td>
|
|
<td><span class="badge bg-blue-lt">{{.KeyName}}</span></td>
|
|
<td>
|
|
{{if eq .TargetType "host"}}
|
|
<i class="ti ti-server"></i> {{.TargetName}}
|
|
{{else}}
|
|
<i class="ti ti-folders"></i> {{.TargetName}}
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if .SystemUser}}
|
|
<code>{{.SystemUser}}</code>
|
|
{{else}}
|
|
<span class="text-secondary">root</span>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if .InitialPassword}}
|
|
<span class="d-inline-flex align-items-center">
|
|
<code class="cron-pw-hidden" id="cron-pw-hidden-{{.ID}}">••••••••••</code>
|
|
<code class="cron-pw-visible d-none" id="cron-pw-visible-{{.ID}}">{{.InitialPassword}}</code>
|
|
<button class="btn btn-sm btn-icon btn-ghost-secondary ms-1" type="button" onclick="toggleCronPassword({{.ID}})" title="Show/Hide password">
|
|
<i class="ti ti-eye"></i>
|
|
</button>
|
|
<button class="btn btn-sm btn-icon btn-ghost-secondary" type="button" onclick="navigator.clipboard.writeText(document.getElementById('cron-pw-visible-{{.ID}}').textContent); this.innerHTML='<i class=\'ti ti-check\'></i>'; setTimeout(()=>this.innerHTML='<i class=\'ti ti-copy\'></i>', 2000);" title="Copy password">
|
|
<i class="ti ti-copy"></i>
|
|
</button>
|
|
</span>
|
|
{{else}}
|
|
<span class="text-secondary">—</span>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if eq .Schedule "once"}}
|
|
<span class="badge bg-cyan-lt"><i class="ti ti-clock"></i> Once</span>
|
|
{{else if eq .Schedule "hourly"}}
|
|
<span class="badge bg-orange-lt"><i class="ti ti-clock-hour-1"></i> Hourly at :{{printf "%02d" .MinuteOfHour}}</span>
|
|
{{else if eq .Schedule "daily"}}
|
|
<span class="badge bg-green-lt"><i class="ti ti-sun"></i> Daily at {{.TimeOfDay}}</span>
|
|
{{else if eq .Schedule "weekly"}}
|
|
<span class="badge bg-purple-lt"><i class="ti ti-calendar-week"></i> Weekly — {{.TimeOfDay}}</span>
|
|
{{else if eq .Schedule "monthly"}}
|
|
<span class="badge bg-pink-lt"><i class="ti ti-calendar"></i> Monthly on {{.DayOfMonth}}. — {{.TimeOfDay}}</span>
|
|
{{end}}
|
|
{{if and .Timezone (ne .Timezone "UTC")}}
|
|
<br><small class="text-secondary"><i class="ti ti-world"></i> {{.Timezone}}</small>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if gt .RemoveAfterMin 0}}
|
|
<span class="badge bg-yellow-lt">{{.RemoveAfterMin}} min</span>
|
|
{{else}}
|
|
<span class="text-secondary">—</span>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if eq .ExpiryAction "remove_key"}}
|
|
<span class="badge bg-blue-lt"><i class="ti ti-key-off"></i> Remove Key</span>
|
|
{{else if eq .ExpiryAction "disable_user"}}
|
|
<span class="badge bg-warning-lt"><i class="ti ti-user-off"></i> Disable User</span>
|
|
{{else if eq .ExpiryAction "delete_user"}}
|
|
<span class="badge bg-danger-lt"><i class="ti ti-user-minus"></i> Delete User</span>
|
|
{{else}}
|
|
<span class="text-secondary">—</span>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if eq .Status "done"}}
|
|
<span class="text-secondary">—</span>
|
|
{{else}}
|
|
{{formatTime .NextRun}}
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if .LastRun}}
|
|
{{formatTime .LastRun}}
|
|
{{else}}
|
|
<span class="text-secondary">never</span>
|
|
{{end}}
|
|
</td>
|
|
<td>
|
|
{{if eq .Status "active"}}
|
|
<span class="badge bg-success-lt"><i class="ti ti-check"></i> Active</span>
|
|
{{else if eq .Status "paused"}}
|
|
<span class="badge bg-warning-lt"><i class="ti ti-player-pause"></i> Paused</span>
|
|
{{else if eq .Status "running"}}
|
|
<span class="badge bg-blue-lt"><i class="ti ti-loader"></i> Running</span>
|
|
{{else if eq .Status "done"}}
|
|
<span class="badge bg-secondary-lt"><i class="ti ti-check"></i> Done</span>
|
|
{{else if eq .Status "failed"}}
|
|
<span class="badge bg-danger-lt"><i class="ti ti-x"></i> Failed</span>
|
|
{{end}}
|
|
</td>
|
|
<td class="text-end">
|
|
<div class="btn-list flex-nowrap justify-content-end">
|
|
{{if or (eq .Status "active") (eq .Status "paused")}}
|
|
<form method="POST" action="/cron/{{.ID}}/toggle" class="d-inline">
|
|
{{if eq .Status "active"}}
|
|
<button type="submit" class="btn btn-sm btn-icon btn-outline-warning" title="Pause">
|
|
<i class="ti ti-player-pause"></i>
|
|
</button>
|
|
{{else}}
|
|
<button type="submit" class="btn btn-sm btn-icon btn-outline-success" title="Resume">
|
|
<i class="ti ti-player-play"></i>
|
|
</button>
|
|
{{end}}
|
|
</form>
|
|
{{end}}
|
|
<a href="/cron/{{.ID}}/edit" class="btn btn-sm btn-icon btn-outline-primary" title="Edit">
|
|
<i class="ti ti-edit"></i>
|
|
</a>
|
|
<form method="POST" action="/cron/{{.ID}}/delete" class="d-inline" onsubmit="return confirm('Delete this job?');">
|
|
<button type="submit" class="btn btn-sm btn-icon btn-outline-danger" title="Delete">
|
|
<i class="ti ti-trash"></i>
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{{else}}
|
|
<tr>
|
|
<td colspan="13" class="text-center text-secondary">No temporary access jobs yet. Create one to grant time-limited access.</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function toggleCronPassword(id) {
|
|
var hidden = document.getElementById('cron-pw-hidden-' + id);
|
|
var visible = document.getElementById('cron-pw-visible-' + id);
|
|
hidden.classList.toggle('d-none');
|
|
visible.classList.toggle('d-none');
|
|
}
|
|
</script>
|
|
{{end}}
|