wireguard: Show list of added clients

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
This commit is contained in:
James Valleroy 2019-09-05 15:15:54 -04:00
parent aa02f4d710
commit e00c28f36e
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
4 changed files with 58 additions and 5 deletions

View File

@ -20,6 +20,7 @@ Configuration helper for WireGuard.
"""
import argparse
import json
import subprocess
SERVER_INTERFACE = 'wg0'
@ -30,6 +31,9 @@ def parse_arguments():
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='subcommand', help='Sub command')
subparsers.add_parser('setup', help='Setup WireGuard')
subparsers.add_parser('list-clients', help='List all clients')
add_client = subparsers.add_parser('add-client', help='Add a client')
add_client.add_argument('publickey', help='Public key for the client')
@ -37,6 +41,28 @@ def parse_arguments():
return parser.parse_args()
def subcommand_setup(_):
"""Setup WireGuard."""
subprocess.run(
['ip', 'link', 'add', 'dev', SERVER_INTERFACE, 'type', 'wireguard'],
check=True)
def subcommand_list_clients(_):
"""List all clients."""
clients = []
output = subprocess.check_output(
['wg', 'show', SERVER_INTERFACE, 'latest-handshakes']).decode().strip()
for client_info in output.split('\n'):
public_key, latest_handshake = client_info.split()
clients.append({
'public_key': public_key,
'latest_handshake': latest_handshake,
})
print(json.dumps(clients))
def subcommand_add_client(arguments):
"""Add a client."""
subprocess.run(

View File

@ -21,6 +21,7 @@ FreedomBox app for wireguard.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.modules.firewall.components import Firewall
@ -95,4 +96,5 @@ def init():
def setup(helper, old_version=None):
"""Install and configure the module."""
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'wireguard', ['setup'])
helper.call('post', app.enable)

View File

@ -23,10 +23,24 @@
{% block configuration %}
<h3>{% trans "Server" %}</h3>
<p>{% trans "Peers allowed to connect to this server" %}</p>
<ul>{% trans "public key" %}</ul>
<ul>{% trans "last connected time" %}</ul>
<ul>{% trans "edit" %}</ul>
<table class="table table-bordered table-condensed table-striped"
id="server-clients-list">
<tr>
<th>{% trans "Public Key" %}</th>
<th>{% trans "Last Connected Time" %}</th>
<th>{% trans "Edit" %}</th>
</tr>
{% for client in server_clients %}
<tr>
<td>{{ client.public_key }}</td>
<td>{{ client.latest_handshake }}</td>
<td>Edit</td>
</tr>
{% endfor %}
</table>
<a title="{% trans 'Add a new peer' %}"
role="button" class="btn btn-default"
href="{% url 'wireguard:add-client' %}">

View File

@ -18,8 +18,10 @@
Views for WireGuard application.
"""
from django.contrib import messages
import json
from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.utils.translation import ugettext as _
from django.views.generic import FormView
@ -41,11 +43,20 @@ class WireguardView(AppView):
template_name = 'wireguard.html'
port_forwarding_info = wireguard.port_forwarding_info
def get_context_data(self, **kwargs):
"""Return additional context for rendering the template."""
context = super().get_context_data(**kwargs)
clients_list = actions.superuser_run('wireguard', ['list-clients'])
context['server_clients'] = json.loads(clients_list)
return context
class AddClientView(SuccessMessageMixin, FormView):
"""View to add a client."""
form_class = forms.AddClientForm
template_name = 'wireguard_add_client.html'
success_url = reverse_lazy('wireguard:index')
success_message = _('Added new client.')
def get_context_data(self, **kwargs):
"""Return additional context for rendering the template."""
@ -58,4 +69,4 @@ class AddClientView(SuccessMessageMixin, FormView):
public_key = form.cleaned_data.get('public_key')
actions.superuser_run(
'wireguard', ['add-client', public_key])
messages.success(self.request, _('Added new client.'))
return super().form_valid(form)