diff --git a/api/views.py b/api/views.py index f64b8ae..06d3a9b 100644 --- a/api/views.py +++ b/api/views.py @@ -3,9 +3,11 @@ from django.views.decorators.http import require_http_methods from django.contrib.auth.decorators import login_required from django.conf import settings from django.utils import timezone -from wireguard.models import WebadminSettings +from wireguard.models import WebadminSettings, Peer, PeerStatus import requests import subprocess +import datetime +import pytz @login_required @@ -33,6 +35,8 @@ def wireguard_status(request): if len(parts) >= 3: interface, peer, value = parts[0], parts[1], " ".join(parts[2:]) current_interface = interface + elif len(parts) == 2 and current_interface: + peer, value = parts else: continue @@ -60,6 +64,43 @@ def wireguard_status(request): return JsonResponse(output) +@require_http_methods(["GET"]) +def cron_update_peer_latest_handshake(request): + command = "wg show all latest-handshakes | expand | tr -s ' '" + process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) + stdout, stderr = process.communicate() + + if process.returncode != 0: + return JsonResponse({'error': stderr}, status=400) + #debug_information = [] + for line in stdout.strip().split('\n'): + parts = line.split() + if len(parts) < 3: + continue + interface, peer_public_key, latest_handshake = parts[0], parts[1], parts[2] + latest_handshake_timestamp = int(latest_handshake) + + if latest_handshake_timestamp > 0: + last_handshake_time = datetime.datetime.fromtimestamp(latest_handshake_timestamp, tz=pytz.utc) + #debug_information.append(f'Last handshake for {peer_public_key} is {last_handshake_time}') + peer = Peer.objects.filter(public_key=peer_public_key).first() + if peer: + #debug_information.append(f'Peer found: {peer.public_key}') + peer_status, created = PeerStatus.objects.get_or_create( + peer=peer, + defaults={'last_handshake': last_handshake_time} + ) + if not created: + if peer_status.last_handshake != last_handshake_time: + #debug_information.append(f'Updating last_handshake for {peer.public_key} to {last_handshake_time}') + peer_status.last_handshake = last_handshake_time + peer_status.save() + #else: + # debug_information.append(f'No changes for {peer.public_key}') + + return JsonResponse({'status': 'success'}) + + def cron_check_updates(request): webadmin_settings, webadmin_settings_created = WebadminSettings.objects.get_or_create(name='webadmin_settings') diff --git a/cron/cron_tasks b/cron/cron_tasks index 04302cb..4b1b39d 100644 --- a/cron/cron_tasks +++ b/cron/cron_tasks @@ -1 +1,2 @@ * * * * * root /usr/bin/curl -s http://wireguard-webadmin:8000/api/cron_check_updates/ >> /var/log/cron.log 2>&1 +*/10 * * * * root /usr/bin/curl -s http://wireguard-webadmin:8000/api/cron_update_peer_latest_handshake/ >> /var/log/cron.log 2>&1 diff --git a/docker-compose-no-nginx-dev.yml b/docker-compose-no-nginx-dev.yml index 08ba9e1..fcaa306 100644 --- a/docker-compose-no-nginx-dev.yml +++ b/docker-compose-no-nginx-dev.yml @@ -28,6 +28,7 @@ services: command: /bin/bash /app/init.sh wireguard-webadmin-cron: + container_name: wireguard-webadmin-cron build: context: ./cron dockerfile: Dockerfile-cron diff --git a/docker-compose-no-nginx.yml b/docker-compose-no-nginx.yml index 58ebc1c..4a786f9 100644 --- a/docker-compose-no-nginx.yml +++ b/docker-compose-no-nginx.yml @@ -27,6 +27,7 @@ services: command: /bin/bash /app/init.sh wireguard-webadmin-cron: + container_name: wireguard-webadmin-cron build: context: ./cron dockerfile: Dockerfile-cron diff --git a/docker-compose.yml b/docker-compose.yml index 73c392b..0b02cd3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -27,6 +27,7 @@ services: command: /bin/bash /app/init.sh wireguard-webadmin-cron: + container_name: wireguard-webadmin-cron build: context: ./cron dockerfile: Dockerfile-cron diff --git a/templates/wireguard/wireguard_peer_list.html b/templates/wireguard/wireguard_peer_list.html index 5820bc3..19b49d7 100644 --- a/templates/wireguard/wireguard_peer_list.html +++ b/templates/wireguard/wireguard_peer_list.html @@ -36,7 +36,7 @@ {% comment %}This needs to be improved{% endcomment %}

Transfer:
- Latest Handshake:
+ Latest Handshake:
Endpoints:
Allowed IPs: {% for address in peer.peerallowedip_set.all %}{% if address.priority == 0 %} @@ -125,10 +125,31 @@