add API endpoint to submit WireGuard stats

This commit is contained in:
Eduardo Silva
2026-01-08 11:37:51 -03:00
parent 1593141932
commit 511eb62860
4 changed files with 53 additions and 36 deletions

View File

@@ -1,6 +1,7 @@
import glob
import os
from django.conf import settings
from django.http import JsonResponse, FileResponse
from django.utils import timezone
@@ -16,6 +17,19 @@ def get_ip_address(request):
return ip_address
def get_cluster_settings():
cluster_settings, created = ClusterSettings.objects.get_or_create(name='cluster_settings')
return {
'enabled': cluster_settings.enabled,
'primary_enable_wireguard': cluster_settings.primary_enable_wireguard,
'stats_sync_interval': settings.WIREGUARD_STATUS_CACHE_REFRESH_INTERVAL,
'cluster_mode': cluster_settings.cluster_mode,
'restart_mode': cluster_settings.restart_mode,
'config_version': cluster_settings.config_version,
'dns_version': cluster_settings.dns_version,
}
def get_worker(request):
min_worker_version = 1
success = True
@@ -118,6 +132,20 @@ def api_get_worker_dnsmasq_config(request):
return response
def api_submit_worker_wireguard_stats(request):
worker, success = get_worker(request)
if worker:
if worker.error_status or not success:
data = {'status': 'error', 'message': worker.error_status}
return JsonResponse(data, status=400)
else:
data = {'status': 'error', 'message': 'Worker not found'}
return JsonResponse(data, status=403)
worker_status = worker.workerstatus
data = {'status': 'success', 'message': 'Stats received'}
return JsonResponse(data, status=200)
def api_get_worker_config_files(request):
worker, success = get_worker(request)
if worker:
@@ -139,24 +167,9 @@ def api_get_worker_config_files(request):
filename = os.path.basename(path)
with open(path, 'r') as f:
files[filename] = f.read()
cluster_settings, created = ClusterSettings.objects.get_or_create(name='cluster_settings')
return JsonResponse(
{
'status': 'success',
'files': files,
'cluster_settings': {
'enabled': cluster_settings.enabled,
'primary_enable_wireguard': cluster_settings.primary_enable_wireguard,
'stats_sync_interval': cluster_settings.stats_sync_interval,
'stats_cache_interval': cluster_settings.stats_cache_interval,
'cluster_mode': cluster_settings.cluster_mode,
'restart_mode': cluster_settings.restart_mode,
'config_version': cluster_settings.config_version,
'dns_version': cluster_settings.dns_version,
},
},
status=200
)
data = {'status': 'success', 'files': files, 'cluster_settings': get_cluster_settings()}
return JsonResponse(data, status=200)
def api_worker_ping(request):
@@ -186,20 +199,5 @@ def api_cluster_status(request):
else:
data = {'status': 'error', 'message': 'Worker not found'}
return JsonResponse(data, status=403)
cluster_settings, created = ClusterSettings.objects.get_or_create(name='cluster_settings')
data = {
'status': 'success',
'worker_error_status': worker.error_status,
'cluster_settings': {
'enabled': cluster_settings.enabled,
'primary_enable_wireguard': cluster_settings.primary_enable_wireguard,
'stats_sync_interval': cluster_settings.stats_sync_interval,
'stats_cache_interval': cluster_settings.stats_cache_interval,
'cluster_mode': cluster_settings.cluster_mode,
'restart_mode': cluster_settings.restart_mode,
'config_version': cluster_settings.config_version,
'dns_version': cluster_settings.dns_version,
},
}
data = {'status': 'success', 'worker_error_status': worker.error_status, 'cluster_settings': get_cluster_settings()}
return JsonResponse(data, status=200)

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2.9 on 2026-01-08 14:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('cluster', '0014_remove_clustersettings_stats_cache_interval_and_more'),
]
operations = [
migrations.AlterField(
model_name='workerstatus',
name='wireguard_status',
field=models.JSONField(),
),
]

View File

@@ -64,7 +64,7 @@ class WorkerStatus(models.Model):
config_version = models.PositiveIntegerField(default=0)
worker_version = models.PositiveIntegerField(default=0)
active_peers = models.PositiveIntegerField(default=0)
wireguard_status = models.JSONField(default=dict)
wireguard_status = models.JSONField()
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)