mirror of
https://github.com/eduardogsilva/wireguard_webadmin.git
synced 2025-03-18 18:14:02 +00:00
Latest handshake permanent
This commit is contained in:
parent
8a89af4b55
commit
845fb82b22
43
api/views.py
43
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')
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -36,7 +36,7 @@
|
||||
{% comment %}This needs to be improved{% endcomment %}
|
||||
<p>
|
||||
<b>Transfer:</b> <span id="peer-transfer-{{ peer.public_key }}"></span><br>
|
||||
<b>Latest Handshake:</b> <span id="peer-latest-handshake-{{ peer.public_key }}"></span><br>
|
||||
<b>Latest Handshake:</b> <span id="peer-latest-handshake-{{ peer.public_key }}"></span> <span style="display: none;" id="peer-stored-latest-handshake-{{ peer.public_key }}">{% if peer.peerstatus.last_handshake %}{{ peer.peerstatus.last_handshake|date:"U" }}{% else %}0{% endif %}</span><br>
|
||||
<b>Endpoints:</b> <span id="peer-endpoints-{{ peer.public_key }}"></span><br>
|
||||
<b>Allowed IPs: </b><span id="peer-allowed-ips-{{ peer.public_key }}">
|
||||
{% for address in peer.peerallowedip_set.all %}{% if address.priority == 0 %}
|
||||
@ -125,10 +125,31 @@
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
//const fetchWireguardStatus = async () => {
|
||||
// try {
|
||||
// const response = await fetch('/api/wireguard_status/');
|
||||
// const data = await response.json();
|
||||
// updateUI(data);
|
||||
// } catch (error) {
|
||||
// console.error('Error fetching Wireguard status:', error);
|
||||
// }
|
||||
//};
|
||||
const fetchWireguardStatus = async () => {
|
||||
try {
|
||||
const response = await fetch('/api/wireguard_status/');
|
||||
const data = await response.json();
|
||||
let data = await response.json();
|
||||
|
||||
// if latest-handshakes is 0, use the stored value
|
||||
for (const [interfaceName, peers] of Object.entries(data)) {
|
||||
for (const [peerId, peerInfo] of Object.entries(peers)) {
|
||||
const peerElementId = `peer-stored-latest-handshake-${peerId}`;
|
||||
const storedHandshakeElement = document.getElementById(peerElementId);
|
||||
if (peerInfo['latest-handshakes'] === '0' && storedHandshakeElement) {
|
||||
peerInfo['latest-handshakes'] = storedHandshakeElement.textContent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateUI(data);
|
||||
} catch (error) {
|
||||
console.error('Error fetching Wireguard status:', error);
|
||||
|
@ -1,5 +1,5 @@
|
||||
from django.contrib import admin
|
||||
from .models import WireGuardInstance, Peer, PeerAllowedIP, WebadminSettings
|
||||
from .models import WireGuardInstance, Peer, PeerAllowedIP, PeerStatus, WebadminSettings
|
||||
|
||||
|
||||
class WireGuardInstanceAdmin(admin.ModelAdmin):
|
||||
@ -16,6 +16,13 @@ class PeerAdmin(admin.ModelAdmin):
|
||||
admin.site.register(Peer, PeerAdmin)
|
||||
|
||||
|
||||
class PeerStatusAdmin(admin.ModelAdmin):
|
||||
list_display = ('peer', 'last_handshake', 'created', 'updated', 'uuid')
|
||||
search_fields = ('peer', 'last_handshake', 'created', 'updated', 'uuid')
|
||||
|
||||
admin.site.register(PeerStatus, PeerStatusAdmin)
|
||||
|
||||
|
||||
class PeerAllowedIPAdmin(admin.ModelAdmin):
|
||||
list_display = ('peer', 'priority', 'allowed_ip', 'netmask', 'created', 'updated', 'uuid')
|
||||
search_fields = ('peer', 'priority', 'allowed_ip', 'netmask', 'created', 'updated', 'uuid')
|
||||
|
@ -22,7 +22,7 @@ from console.views import view_console
|
||||
from user_manager.views import view_user_list, view_manage_user
|
||||
from accounts.views import view_create_first_user, view_login, view_logout
|
||||
from wireguard_tools.views import export_wireguard_configs, download_config_or_qrcode, restart_wireguard_interfaces
|
||||
from api.views import wireguard_status, cron_check_updates
|
||||
from api.views import wireguard_status, cron_check_updates, cron_update_peer_latest_handshake
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
@ -44,5 +44,6 @@ urlpatterns = [
|
||||
path('accounts/logout/', view_logout, name='logout'),
|
||||
path('api/wireguard_status/', wireguard_status, name='api_wireguard_status'),
|
||||
path('api/cron_check_updates/', cron_check_updates, name='cron_check_updates'),
|
||||
path('api/cron_update_peer_latest_handshake/', cron_update_peer_latest_handshake, name='cron_update_peer_latest_handshake'),
|
||||
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user