mirror of
https://github.com/eduardogsilva/wireguard_webadmin.git
synced 2026-02-19 19:26:17 +00:00
Add cron endpoints for calculating peer schedules and updating next scheduled times
This commit is contained in:
72
api/views.py
72
api/views.py
@@ -23,7 +23,7 @@ from django.views.decorators.http import require_http_methods
|
|||||||
|
|
||||||
from api.models import WireguardStatusCache
|
from api.models import WireguardStatusCache
|
||||||
from cluster.models import ClusterSettings, WorkerStatus
|
from cluster.models import ClusterSettings, WorkerStatus
|
||||||
from scheduler.models import PeerScheduling
|
from scheduler.models import PeerScheduling, ScheduleProfile
|
||||||
from user_manager.models import AuthenticationToken, UserAcl
|
from user_manager.models import AuthenticationToken, UserAcl
|
||||||
from vpn_invite.models import InviteSettings, PeerInvite
|
from vpn_invite.models import InviteSettings, PeerInvite
|
||||||
from wgwadmlibrary.tools import create_peer_invite, get_peer_invite_data, send_email, user_allowed_peers, \
|
from wgwadmlibrary.tools import create_peer_invite, get_peer_invite_data, send_email, user_allowed_peers, \
|
||||||
@@ -413,6 +413,76 @@ def cron_refresh_wireguard_status_cache(request):
|
|||||||
return JsonResponse(data)
|
return JsonResponse(data)
|
||||||
|
|
||||||
|
|
||||||
|
def cron_calculate_peer_schedules(request):
|
||||||
|
data = {
|
||||||
|
'status': 'success',
|
||||||
|
'updated_records': 0,
|
||||||
|
'skipped_records': 0,
|
||||||
|
}
|
||||||
|
|
||||||
|
peer_scheduling_queryset = (
|
||||||
|
PeerScheduling.objects
|
||||||
|
.select_related('peer', 'profile')
|
||||||
|
.filter(
|
||||||
|
profile__active=True,
|
||||||
|
peer__suspended=False,
|
||||||
|
)
|
||||||
|
.filter(
|
||||||
|
Q(next_scheduled_enable_at__isnull=True) |
|
||||||
|
Q(next_scheduled_disable_at__isnull=True)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not peer_scheduling_queryset.exists():
|
||||||
|
return JsonResponse(data)
|
||||||
|
|
||||||
|
distinct_profile_ids = list(
|
||||||
|
peer_scheduling_queryset.values_list('profile_id', flat=True).distinct()
|
||||||
|
)
|
||||||
|
|
||||||
|
schedule_profiles = (
|
||||||
|
ScheduleProfile.objects
|
||||||
|
.filter(id__in=distinct_profile_ids, active=True)
|
||||||
|
.prefetch_related('time_interval')
|
||||||
|
)
|
||||||
|
|
||||||
|
profile_next_dates_cache = {}
|
||||||
|
|
||||||
|
for schedule_profile in schedule_profiles:
|
||||||
|
next_dates = schedule_profile.next_dates
|
||||||
|
profile_next_dates_cache[schedule_profile.id] = (
|
||||||
|
next_dates.get('enable'),
|
||||||
|
next_dates.get('disable'),
|
||||||
|
)
|
||||||
|
|
||||||
|
peer_schedulings_to_update = []
|
||||||
|
|
||||||
|
for peer_scheduling in peer_scheduling_queryset.iterator(chunk_size=500):
|
||||||
|
next_enable_at, next_disable_at = profile_next_dates_cache.get(
|
||||||
|
peer_scheduling.profile_id,
|
||||||
|
(None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not next_enable_at or not next_disable_at:
|
||||||
|
data['skipped_records'] += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
peer_scheduling.next_scheduled_enable_at = next_enable_at
|
||||||
|
peer_scheduling.next_scheduled_disable_at = next_disable_at
|
||||||
|
|
||||||
|
peer_schedulings_to_update.append(peer_scheduling)
|
||||||
|
|
||||||
|
if peer_schedulings_to_update:
|
||||||
|
PeerScheduling.objects.bulk_update(
|
||||||
|
peer_schedulings_to_update,
|
||||||
|
['next_scheduled_enable_at', 'next_scheduled_disable_at'],
|
||||||
|
batch_size=500
|
||||||
|
)
|
||||||
|
data['updated_records'] = len(peer_schedulings_to_update)
|
||||||
|
|
||||||
|
return JsonResponse(data)
|
||||||
|
|
||||||
|
|
||||||
def cron_peer_scheduler(request):
|
def cron_peer_scheduler(request):
|
||||||
now = timezone.now()
|
now = timezone.now()
|
||||||
data = {
|
data = {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ from django.urls import path
|
|||||||
from accounts.views import view_create_first_user, view_login, view_logout
|
from accounts.views import view_create_first_user, view_login, view_logout
|
||||||
from api.views import api_instance_info, api_peer_invite, api_peer_list, cron_check_updates, \
|
from api.views import api_instance_info, api_peer_invite, api_peer_list, cron_check_updates, \
|
||||||
cron_update_peer_latest_handshake, peer_info, routerfleet_authenticate_session, routerfleet_get_user_token, \
|
cron_update_peer_latest_handshake, peer_info, routerfleet_authenticate_session, routerfleet_get_user_token, \
|
||||||
wireguard_status, cron_refresh_wireguard_status_cache
|
wireguard_status, cron_refresh_wireguard_status_cache, cron_calculate_peer_schedules, cron_peer_scheduler
|
||||||
from cluster.cluster_api import api_cluster_status, api_get_worker_config_files, api_get_worker_dnsmasq_config, \
|
from cluster.cluster_api import api_cluster_status, api_get_worker_config_files, api_get_worker_dnsmasq_config, \
|
||||||
api_worker_ping, api_submit_worker_wireguard_stats
|
api_worker_ping, api_submit_worker_wireguard_stats
|
||||||
from cluster.views import cluster_main, cluster_settings, worker_manage
|
from cluster.views import cluster_main, cluster_settings, worker_manage
|
||||||
@@ -87,6 +87,8 @@ urlpatterns = [
|
|||||||
path('api/instance_info/', api_instance_info, name='api_instance_info'),
|
path('api/instance_info/', api_instance_info, name='api_instance_info'),
|
||||||
path('api/peer_info/', peer_info, name='api_peer_info'),
|
path('api/peer_info/', peer_info, name='api_peer_info'),
|
||||||
path('api/peer_invite/', api_peer_invite, name='api_peer_invite'),
|
path('api/peer_invite/', api_peer_invite, name='api_peer_invite'),
|
||||||
|
path('api/cron_peer_scheduler/', cron_peer_scheduler, name='cron_peer_scheduler'),
|
||||||
|
path('api/cron_calculate_peer_schedules/', cron_calculate_peer_schedules, name='cron_calculate_peer_schedules'),
|
||||||
path('api/cron_refresh_wireguard_status_cache/', cron_refresh_wireguard_status_cache, name='cron_refresh_wireguard_status_cache'),
|
path('api/cron_refresh_wireguard_status_cache/', cron_refresh_wireguard_status_cache, name='cron_refresh_wireguard_status_cache'),
|
||||||
path('api/cron_check_updates/', cron_check_updates, name='cron_check_updates'),
|
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'),
|
path('api/cron_update_peer_latest_handshake/', cron_update_peer_latest_handshake, name='cron_update_peer_latest_handshake'),
|
||||||
|
|||||||
Reference in New Issue
Block a user