diff --git a/netmon_core/__init__.py b/netmon_core/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e1d05d401f0f8ae172c3d9de8aed81504784bd09 100644 --- a/netmon_core/__init__.py +++ b/netmon_core/__init__.py @@ -0,0 +1,3 @@ +from .tasks import app as celery_app + +__all__ = ('celery_app',) diff --git a/netmon_core/tasks.py b/netmon_core/tasks.py new file mode 100644 index 0000000000000000000000000000000000000000..4d6a43658b84d451e5f0b0c004b727648d2312d8 --- /dev/null +++ b/netmon_core/tasks.py @@ -0,0 +1,56 @@ +from celery import Celery +from django.core.mail import send_mail +from django.conf import settings +from datetime import timedelta +from django.utils import timezone +from django.db.models import Q +from django.template.loader import render_to_string +from crawler.models import Monitor, Node +from crawler.models import UserProfile + +app = Celery('netmon_core') + +def send_offline_notification(monitor): + #get Usersettings to corrisponding nodes + user_profile = UserProfile.objects.get(user=monitor.user_id) + + # Continiure only if the maximum amount of notification mails is not reach + if user_profile.max_notification_interval > monitor.notify_count and monitor.notify: + days_since_last_notified = timezone.now().date() - monitor.last_notified + if days_since_last_notified >= timedelta(days=user_profile.days_between_notification * monitor.notify_count): + monitor.notify_count += 1 + monitor.last_notified = timezone.now().date() + monitor.save() + + subject = f'(Offline) Knoten {monitor.node_id.node_name} ist seit dem {monitor.node_id.last_seen} außer Betrieb' + message = render_to_string('offline_notification_email.html', {'monitor': monitor}) + from_email = settings.DEFAULT_FROM_EMAIL + to_email = [monitor.user_id.email] + + send_mail(subject, message, from_email, to_email) + + +def send_online_notification(monitor): + monitor.notify_count = 0 + monitor.last_notified = timezone.now().date() + monitor.save() + + subject = f'(Online) Knoten {monitor.node_id.node_name} ist seit dem {monitor.node_id.last_seen} wieder erreichbar' + message = render_to_string('online_notification_email.html', {'monitor': monitor}) + from_email = settings.DEFAULT_FROM_EMAIL + to_email = [monitor.user_id.email] + + send_mail(subject, message, from_email, to_email) + + +@app.task +def check_and_notify(): + # Get nodes that meet the conditions for notification + nodes_to_notify = Node.objects.filter(is_online=False) + monitored_nodes_to_notify = Monitor.objects.filter(Q(notify=True) & Q(node_id__in=nodes_to_notify) | Q(notify_count__gt=0)) + + for monitor in monitored_nodes_to_notify: + if not monitor.node_id.is_online: + send_offline_notification(monitor) + else: + send_online_notification(monitor)