mirror of
https://github.com/DJSundog/wg-portal.git
synced 2024-11-27 09:00:03 -05:00
205 lines
12 KiB
HTML
205 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
|
|
<title>{{ .Static.WebsiteTitle }} - Admin</title>
|
|
<meta name="description" content="{{ .Static.WebsiteTitle }}">
|
|
<link rel="stylesheet" href="/css/bootstrap.min.css">
|
|
<link rel="stylesheet" href="/fonts/fontawesome-all.min.css">
|
|
<link rel="stylesheet" href="/css/custom.css">
|
|
</head>
|
|
|
|
<body id="page-top" class="d-flex flex-column min-vh-100">
|
|
{{template "prt_nav.html" .}}
|
|
<div class="container mt-5">
|
|
<h1>WireGuard VPN Administration</h1>
|
|
{{template "prt_flashes.html" .}}
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<div class="d-flex align-items-center">
|
|
<span class="mr-auto">Interface status for <strong>{{.Device.DeviceName}}</strong></span>
|
|
<a href="/admin/device/download?dev={{.Device.DeviceName}}" title="Download interface configuration"><i class="fas fa-download"></i></a>
|
|
|
|
<a href="/admin/device/edit?dev={{.Device.DeviceName}}" title="Edit interface settings"><i class="fas fa-cog"></i></a>
|
|
</div>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="row">
|
|
<div class="col-sm-6">
|
|
<table class="table table-sm table-borderless device-status-table">
|
|
<tbody>
|
|
<tr>
|
|
<td>Public Key:</td>
|
|
<td>{{.Device.PublicKey}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Public Endpoint:</td>
|
|
<td>{{.Device.DefaultEndpoint}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Listening Port:</td>
|
|
<td>{{.Device.ListenPort}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Enabled Peers:</td>
|
|
<td>{{len .Device.Interface.Peers}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Total Peers:</td>
|
|
<td>{{.TotalPeers}}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<table class="table table-sm table-borderless device-status-table">
|
|
<tbody>
|
|
<tr>
|
|
<td>IP Address:</td>
|
|
<td>{{.Device.IPsStr}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Default allowed IP's:</td>
|
|
<td>{{.Device.DefaultAllowedIPsStr}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Default DNS servers:</td>
|
|
<td>{{.Device.DNSStr}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Default MTU:</td>
|
|
<td>{{.Device.Mtu}}</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Default Keepalive Interval:</td>
|
|
<td>{{.Device.DefaultPersistentKeepalive}}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="mt-4 row">
|
|
<div class="col-sm-10 col-12">
|
|
{{with or (eq $.Device.Type "server") (eq $.Device.Type "custom")}}
|
|
<h2 class="mt-2">Current VPN Peers</h2>
|
|
{{end}}
|
|
{{with eq $.Device.Type "client"}}
|
|
<h2 class="mt-2">Current VPN Endpoints</h2>
|
|
{{end}}
|
|
</div>
|
|
<div class="col-sm-2 col-12 text-right">
|
|
{{with eq $.Device.Type "server"}}
|
|
<a href="/admin/peer/createldap" title="Add multiple peers" class="btn btn-primary"><i class="fa fa-fw fa-user-plus"></i></a>
|
|
{{end}}
|
|
<a href="/admin/peer/create" title="Add a peer" class="btn btn-primary"><i class="fa fa-fw fa-plus"></i>M</a>
|
|
</div>
|
|
</div>
|
|
<div class="mt-2 table-responsive">
|
|
<table class="table table-sm" id="userTable">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col" class="list-image-cell"></th><!-- Status and expand -->
|
|
<th scope="col"><a href="?sort=id">Identifier <i class="fa fa-fw {{.Session.GetSortIcon "peers" "id"}}"></i></a></th>
|
|
<th scope="col"><a href="?sort=pubKey">Public Key <i class="fa fa-fw {{.Session.GetSortIcon "peers" "pubKey"}}"></i></a></th>
|
|
<th scope="col"><a href="?sort=mail">E-Mail <i class="fa fa-fw {{.Session.GetSortIcon "peers" "mail"}}"></i></a></th>
|
|
<th scope="col"><a href="?sort=ip">IP's <i class="fa fa-fw {{.Session.GetSortIcon "peers" "ip"}}"></i></a></th>
|
|
<th scope="col"><a href="?sort=handshake">Handshake <i class="fa fa-fw {{.Session.GetSortIcon "peers" "handshake"}}"></i></a></th>
|
|
<th scope="col"></th><!-- Actions -->
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{{range $i, $p :=.Peers}}
|
|
{{$peerUser:=(userForEmail $.Users $p.Email)}}
|
|
<tr id="user-pos-{{$i}}" {{if $p.DeactivatedAt}}class="disabled-peer"{{end}}>
|
|
<th scope="row" class="list-image-cell">
|
|
<a href="#{{$p.UID}}" data-toggle="collapse" class="collapse-indicator collapsed"></a>
|
|
<!-- online check -->
|
|
<span title="Online status" class="online-status" id="online-{{$p.UID}}" data-pkey="{{$p.PublicKey}}"><i class="fas fa-unlink"></i></span>
|
|
</th>
|
|
<td>{{$p.Identifier}}</td>
|
|
<td>{{$p.PublicKey}}</td>
|
|
<td>{{$p.Email}}</td>
|
|
<td>{{$p.IPsStr}}</td>
|
|
<td><span data-toggle="tooltip" data-placement="left" title="" data-original-title="{{$p.LastHandshakeTime}}">{{$p.LastHandshake}}</span></td>
|
|
<td>
|
|
{{if eq $.Session.IsAdmin true}}
|
|
<a href="/admin/peer/edit?pkey={{$p.PublicKey}}" title="Edit peer"><i class="fas fa-cog"></i></a>
|
|
{{end}}
|
|
</td>
|
|
</tr>
|
|
<tr class="hiddenRow">
|
|
<td colspan="7" class="hiddenCell" style="white-space:nowrap">
|
|
<div class="collapse" id="{{$p.UID}}" data-parent="#userTable">
|
|
<div class="row collapsedRow">
|
|
<div class="col-md-6 leftBorder">
|
|
<ul class="nav nav-tabs">
|
|
<li class="nav-item">
|
|
<a class="nav-link active" data-toggle="tab" href="#t1{{$p.UID}}">Personal</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#t2{{$p.UID}}">Configuration</a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" data-toggle="tab" href="#t3{{$p.UID}}">Danger Zone</a>
|
|
</li>
|
|
</ul>
|
|
<div class="tab-content" id="tabContent{{$p.UID}}">
|
|
<div id="t1{{$p.UID}}" class="tab-pane fade active show">
|
|
<h4>User details</h4>
|
|
{{if not $peerUser}}
|
|
<p>No user information available...</p>
|
|
{{else}}
|
|
<ul>
|
|
<li>Firstname: {{$peerUser.Firstname}}</li>
|
|
<li>Lastname: {{$peerUser.Lastname}}</li>
|
|
<li>Phone: {{$peerUser.Phone}}</li>
|
|
<li>Mail: {{$peerUser.Email}}</li>
|
|
</ul>
|
|
{{end}}
|
|
<h4>Connection / Traffic</h4>
|
|
{{if not $p.Peer}}
|
|
<p>No Traffic data available...</p>
|
|
{{else}}
|
|
<p class="ml-4">{{if $p.DeactivatedAt}}-{{else}}<i class="fas fa-network-wired" title="Last Endpoint"></i> {{$p.Peer.Endpoint}}{{end}}</p>
|
|
<p class="ml-4">{{if $p.DeactivatedAt}}-{{else}}<i class="fas fa-long-arrow-alt-down" title="Download"></i> {{formatBytes $p.Peer.ReceiveBytes}} / <i class="fas fa-long-arrow-alt-up" title="Upload"></i> {{formatBytes $p.Peer.TransmitBytes}}{{end}}</p>
|
|
{{end}}
|
|
</div>
|
|
<div id="t2{{$p.UID}}" class="tab-pane fade">
|
|
<pre>{{$p.Config}}</pre>
|
|
</div>
|
|
<div id="t3{{$p.UID}}" class="tab-pane fade">
|
|
<a href="/admin/peer/delete?pkey={{$p.PublicKey}}" class="btn btn-danger" title="Delete peer">Delete</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<img class="list-image-large" src="/user/qrcode?pkey={{$p.PublicKey}}"/>
|
|
</div>
|
|
<div class="col-md-3">
|
|
<div class="float-right mt-5">
|
|
<a href="/admin/peer/download?pkey={{$p.PublicKey}}" class="btn btn-primary" title="Download configuration">Download</a>
|
|
<a href="/admin/peer/email?pkey={{$p.PublicKey}}" class="btn btn-primary" title="Send configuration via Email">Email</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
{{end}}
|
|
</tbody>
|
|
</table>
|
|
<p>Currently listed peers: <strong>{{len .Peers}}</strong></p>
|
|
</div>
|
|
</div>
|
|
{{template "prt_footer.html" .}}
|
|
<script src="/js/jquery.min.js"></script>
|
|
<script src="/js/bootstrap.bundle.min.js"></script>
|
|
<script src="/js/jquery.easing.js"></script>
|
|
<script src="/js/custom.js"></script>
|
|
</body>
|
|
|
|
</html> |