mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			278 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
			
		
		
	
	
			278 lines
		
	
	
		
			16 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> {{if eq $.Device.Type "server"}}(server mode){{end}}{{if eq $.Device.Type "client"}}(client mode){{end}}</span>
 | |
|                     <a href="/admin/device/write?dev={{.Device.DeviceName}}" title="Write interface configuration"><i class="fas fa-save"></i></a>
 | |
|                        
 | |
|                     <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">
 | |
|                     {{if eq $.Device.Type "server"}}
 | |
|                     <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>
 | |
|                     {{end}}
 | |
|                     {{if eq $.Device.Type "client"}}
 | |
|                     <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>Enabled Endpoints:</td>
 | |
|                                 <td>{{len .Device.Interface.Peers}}</td>
 | |
|                             </tr>
 | |
|                             <tr>
 | |
|                                 <td>Total Endpoints:</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>DNS servers:</td>
 | |
|                                 <td>{{.Device.DNSStr}}</td>
 | |
|                             </tr>
 | |
|                             <tr>
 | |
|                                 <td>Default MTU:</td>
 | |
|                                 <td>{{.Device.Mtu}}</td>
 | |
|                             </tr>
 | |
|                             </tbody>
 | |
|                         </table>
 | |
|                     </div>
 | |
|                     {{end}}
 | |
|                 </div>
 | |
| 
 | |
|             </div>
 | |
|         </div>
 | |
|         <div class="mt-4 row">
 | |
|             <div class="col-sm-8 col-12">
 | |
|                 {{if eq $.Device.Type "server"}}
 | |
|                 <h2 class="mt-2">Current VPN Peers</h2>
 | |
|                 {{end}}
 | |
|                 {{if eq $.Device.Type "client"}}
 | |
|                 <h2 class="mt-2">Current VPN Endpoints</h2>
 | |
|                 {{end}}
 | |
|             </div>
 | |
|             <div class="col-sm-4 col-12 text-right">
 | |
|                 <a href="/admin/peer/emailall" data-toggle="confirmation" data-title="Send mail to all peers?" title="Send mail to all peers" class="btn btn-light"><i class="fa fa-fw fa-paper-plane"></i></a>
 | |
|                 {{if eq $.Device.Type "server"}}
 | |
|                 <a href="/admin/peer/createldap" title="Add multiple peers" class="btn btn-primary"><i class="fa fa-fw fa-plus"></i><i class="fa fa-fw fa-users"></i></a>
 | |
|                 {{end}}
 | |
|                 <a href="/admin/peer/create" title="Add a peer" class="btn btn-primary"><i class="fa fa-fw fa-plus"></i><i class="fa fa-fw fa-user"></i></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>
 | |
|                     {{if eq $.Device.Type "server"}}
 | |
|                     <th scope="col"><a href="?sort=mail">E-Mail <i class="fa fa-fw {{.Session.GetSortIcon "peers" "mail"}}"></i></a></th>
 | |
|                     {{end}}
 | |
|                     {{if eq $.Device.Type "server"}}
 | |
|                     <th scope="col"><a href="?sort=ip">IP's <i class="fa fa-fw {{.Session.GetSortIcon "peers" "ip"}}"></i></a></th>
 | |
|                     {{end}}
 | |
|                     {{if eq $.Device.Type "client"}}
 | |
|                     <th scope="col"><a href="?sort=endpoint">Endpoint <i class="fa fa-fw {{.Session.GetSortIcon "peers" "endpoint"}}"></i></a></th>
 | |
|                     {{end}}
 | |
|                     <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}}{{if $p.WillExpire}} <i class="fas fa-hourglass-end expiring-peer" data-toggle="tooltip" data-placement="right" title="" data-original-title="Expires at: {{formatDate $p.ExpiresAt}}"></i>{{end}}</td>
 | |
|                         <td>{{$p.PublicKey}}</td>
 | |
|                         {{if eq $.Device.Type "server"}}
 | |
|                         <td>{{$p.Email}}</td>
 | |
|                         {{end}}
 | |
|                         {{if eq $.Device.Type "server"}}
 | |
|                         <td>{{$p.IPsStr}}</td>
 | |
|                         {{end}}
 | |
|                         {{if eq $.Device.Type "client"}}
 | |
|                         <td>{{$p.Endpoint}}</td>
 | |
|                         {{end}}
 | |
|                         <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>
 | |
|                                             {{if eq $.Device.Type "server"}}
 | |
|                                             <li class="nav-item">
 | |
|                                                 <a class="nav-link" data-toggle="tab" href="#t2{{$p.UID}}">Configuration</a>
 | |
|                                             </li>
 | |
|                                             {{end}}
 | |
|                                             <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>
 | |
|                                             {{if eq $.Device.Type "server"}}
 | |
|                                             <div id="t2{{$p.UID}}" class="tab-pane fade">
 | |
|                                                 <pre>{{$p.Config}}</pre>
 | |
|                                             </div>
 | |
|                                             {{end}}
 | |
|                                             <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">
 | |
|                                         {{if eq $.Device.Type "server"}}
 | |
|                                         <img class="list-image-large" loading="lazy" alt="Configuration QR Code" src="/user/qrcode?pkey={{$p.PublicKey}}"/>
 | |
|                                         {{end}}
 | |
|                                     </div>
 | |
|                                     <div class="col-md-3">
 | |
|                                         {{if $p.DeactivatedAt}}
 | |
|                                         <div class="pull-right-lg mt-lg-5 disabled-peer">Peer is disabled! <i class="fas fa-comment-dots" data-toggle="tooltip" data-placement="left" title="" data-original-title="Reason: {{$p.DeactivatedReason}}"></i></div>
 | |
|                                         {{end}}
 | |
|                                         {{if $p.WillExpire}}
 | |
|                                         <div class="pull-right-lg mt-lg-5 expiring-peer"><i class="fas fa-exclamation-triangle"></i> Peer will expire on {{ formatDate $p.ExpiresAt}}</div>
 | |
|                                         {{end}}
 | |
|                                         {{if eq $.Device.Type "server"}}
 | |
|                                         <div class="pull-right-lg mt-lg-5 mt-md-3">
 | |
|                                         <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>
 | |
|                                         {{end}}
 | |
|                                     </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/jquery.easing.js"></script>
 | |
|     <script src="/js/popper.min.js"></script>
 | |
|     <script src="/js/bootstrap.bundle.min.js"></script>
 | |
|     <script src="/js/bootstrap-confirmation.min.js"></script>
 | |
|     <script src="/js/custom.js"></script>
 | |
| </body>
 | |
| 
 | |
| </html> |