diff --git a/cluster/cluster_api.py b/cluster/cluster_api.py index 53fe325..6aec64a 100644 --- a/cluster/cluster_api.py +++ b/cluster/cluster_api.py @@ -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) diff --git a/cluster/migrations/0015_alter_workerstatus_wireguard_status.py b/cluster/migrations/0015_alter_workerstatus_wireguard_status.py new file mode 100644 index 0000000..90e8b09 --- /dev/null +++ b/cluster/migrations/0015_alter_workerstatus_wireguard_status.py @@ -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(), + ), + ] diff --git a/cluster/models.py b/cluster/models.py index 1959c39..8b6d3df 100644 --- a/cluster/models.py +++ b/cluster/models.py @@ -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) diff --git a/wireguard_webadmin/urls.py b/wireguard_webadmin/urls.py index a02da79..f747569 100644 --- a/wireguard_webadmin/urls.py +++ b/wireguard_webadmin/urls.py @@ -22,7 +22,7 @@ from api.views import api_instance_info, api_peer_invite, api_peer_list, cron_ch cron_update_peer_latest_handshake, peer_info, routerfleet_authenticate_session, routerfleet_get_user_token, \ wireguard_status, cron_refresh_wireguard_status_cache from cluster.cluster_api import api_cluster_status, api_get_worker_config_files, api_get_worker_dnsmasq_config, \ - api_worker_ping + api_worker_ping, api_submit_worker_wireguard_stats from cluster.views import cluster_main, cluster_settings, worker_manage from console.views import view_console from dns.views import view_apply_dns_config, view_manage_dns_settings, view_manage_filter_list, view_manage_static_host, \ @@ -82,6 +82,7 @@ urlpatterns = [ path('api/cluster/worker/get_config_files/', api_get_worker_config_files, name='api_get_worker_config_files'), path('api/cluster/worker/get_dnsmasq_config/', api_get_worker_dnsmasq_config, name='api_get_worker_dnsmasq_config'), path('api/cluster/worker/ping/', api_worker_ping, name='api_worker_ping'), + path('api/cluster/worker/submit_wireguard_stats/', api_submit_worker_wireguard_stats, name='api_submit_worker_wireguard_stats'), path('firewall/port_forward/', view_redirect_rule_list, name='redirect_rule_list'), path('firewall/manage_port_forward_rule/', manage_redirect_rule, name='manage_redirect_rule'), path('firewall/rule_list/', view_firewall_rule_list, name='firewall_rule_list'),