From 3a8b27c27c86cb9b9881c93c3ba3ace08ddfefc4 Mon Sep 17 00:00:00 2001 From: Jan-Tarek Butt <tarek@ring0.de> Date: Wed, 13 Dec 2023 22:31:40 +0100 Subject: [PATCH] netmon_core: add mail notification task Signed-off-by: Jan-Tarek Butt <tarek@ring0.de> --- netmon_core/__init__.py | 3 +++ netmon_core/tasks.py | 56 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 netmon_core/tasks.py diff --git a/netmon_core/__init__.py b/netmon_core/__init__.py index e69de29..e1d05d4 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 0000000..4d6a436 --- /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) -- GitLab