import logging from datetime import timedelta from celery import shared_task from django.conf import settings from django.core.mail import send_mail from django.db import transaction from django.utils import timezone from .models import Server,Configuration,Alarm,Notification,Event,Task,Worker,AccessToken,Audit log=logging.getLogger(__name__) @shared_task def evaluate_alarms(): cfg,_=Configuration.objects.get_or_create(pk=1) now=timezone.now(); cutoff=now-timedelta(seconds=cfg.heartbeat_timeout) for sid in Server.objects.values_list('pk',flat=True): with transaction.atomic(): s=Server.objects.select_for_update().get(pk=sid) desired={} if s.enabled and not s.maintenance: if not s.latest_sample_at or s.latest_sample_at=limit: desired[key]=('warning',f'{key.upper()} über Schwellwert: {s.latest[key]:.1f} %') for service,online in s.latest.get('services',{}).items(): if not online: desired['service:'+service]=('critical',f'Dienst nicht erreichbar: {service}') for w in Worker.objects.filter(server=s): if not w.online or w.last_seen