diff --git a/cron_notify_expired.py b/cron_notify_expired.py old mode 100644 new mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cba2c009ed8c3f931cff34d5b9e9af561dbf1c49 --- a/cron_notify_expired.py +++ b/cron_notify_expired.py @@ -0,0 +1,29 @@ +from django.core.management import setup_environ +import settings +setup_environ(settings) +from django.core.mail import send_mail +from flowspy.flowspec.models import * +from django.template.loader import render_to_string +import datetime + + +def notify_expired(): + routes = Route.objects.all() + for route in routes: + if route.status != 'EXPIRED': + expiration_days = (route.expires - datetime.date.today()).days + if expiration_days < settings.EXPIRATION_NOTIFY_DAYS: + try: + mail_body = render_to_string("rule_expiration.txt", + {"route": route, 'expiration_days':expiration_days}) + send_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s expires in %s days" % + (route.name,expiration_days), + mail_body, settings.SERVER_EMAIL, + [route.applier.email]) + except Exception as e: + print e + pass + +if __name__ == "__main__": + notify_expired() + diff --git a/flowspec/admin.py b/flowspec/admin.py index 7ca2534ea06c30bfa8e19e838ab3b20585f98811..8743f1fa69a1300ef093b82099f107954d877b3a 100644 --- a/flowspec/admin.py +++ b/flowspec/admin.py @@ -13,6 +13,8 @@ class RouteAdmin(admin.ModelAdmin): actions = ['deactivate'] def deactivate(self, request, queryset): + queryset = queryset.filter(status='ACTIVE') + rows = queryset.update(status='PENDING') response = batch_delete.delay(queryset, reason="ADMININACTIVE") self.message_user(request, "Added request %s to job que. Check in a while for result" % response) deactivate.short_description = "Remove selected routes from network" diff --git a/flowspec/models.py b/flowspec/models.py index 9abea820c2f5129dda4a88232cf8ea0cbfa1afea..f0c21bf0cdf1f4def0007af06eb1d7746c30a3c6 100644 --- a/flowspec/models.py +++ b/flowspec/models.py @@ -253,6 +253,8 @@ class Route(models.Model): self.status = "ACTIVE" self.save() found = True + if not found and self.status == "ADMININACTIVE": + found = True return found def get_then(self): diff --git a/flowspec/tasks.py b/flowspec/tasks.py index 3a9559043053ff838813bee6319d1435d89c7bc2..199c4f3659b3d6b6dec820f53c57d5f979af3470 100644 --- a/flowspec/tasks.py +++ b/flowspec/tasks.py @@ -3,7 +3,6 @@ from celery.task import task from celery.task.sets import subtask import logging import json - from celery.task.http import * from flowspy.utils import beanstalkc from django.conf import settings @@ -105,15 +104,16 @@ def check_sync(route_name=None, selected_routes = []): if route_name: routes = routes.filter(name=route_name) for route in routes: - if route.has_expired() and (route.status != 'EXPIRED' or route.status != 'ADMININACTIVE' or route.status != 'INACTIVE'): + if route.has_expired() and (route.status != 'EXPIRED' and route.status != 'ADMININACTIVE' and route.status != 'INACTIVE'): logger.info('Expiring route %s' %route.name) subtask(delete).delay(route, reason="EXPIRED") elif route.has_expired() and (route.status == 'ADMININACTIVE' or route.status == 'INACTIVE'): route.status = 'EXPIRED' route.response = 'Route Expired' route.save() - elif route.status != 'EXPIRED': - route.check_sync() + else: + if route.status != 'EXPIRED': + route.check_sync() #def delete(route): diff --git a/flowspec/views.py b/flowspec/views.py index 4a6076363f275af6ed6694721adb144cdb27bdc6..23cd39336050ae0a4c5fb11ddf8a0b5a509b9b33 100644 --- a/flowspec/views.py +++ b/flowspec/views.py @@ -11,7 +11,7 @@ from django.http import HttpResponseRedirect, HttpResponseForbidden, HttpRespons from django.shortcuts import get_object_or_404, render_to_response from django.core.context_processors import request from django.template.context import RequestContext -from django.template.loader import get_template +from django.template.loader import get_template, render_to_string from django.utils import simplejson from django.core.urlresolvers import reverse from django.contrib import messages @@ -30,6 +30,7 @@ import datetime from django.views.decorators.cache import never_cache from django.conf import settings +from django.core.mail import mail_admins, mail_managers, send_mail def days_offset(): return datetime.date.today() + datetime.timedelta(days = settings.EXPIRATION_DAYS_OFFSET) @@ -80,6 +81,10 @@ def add_route(request): route.save() form.save_m2m() route.commit_add() + mail_body = render_to_string("rule_add_mail.txt", + {"route": route}) + mail_admins("Rule %s creation request submitted by %s" %(route.name, route.applier.username), + mail_body, fail_silently=True) return HttpResponseRedirect(reverse("group-routes")) else: return render_to_response('apply.html', {'form': form, 'applier':applier}, @@ -127,6 +132,10 @@ def edit_route(request, route_slug): messages.add_message(request, messages.WARNING, "Cannot edit the expired rule %s. Contact helpdesk to enable it" %(route_slug)) return HttpResponseRedirect(reverse("group-routes")) + if route_edit.status == "PENDING" : + messages.add_message(request, messages.WARNING, + "Cannot edit a pending rule: %s." %(route_slug)) + return HttpResponseRedirect(reverse("group-routes")) route_original = deepcopy(route_edit) if request.POST: form = RouteForm(request.POST, instance = route_edit) @@ -139,6 +148,10 @@ def edit_route(request, route_slug): route.save() form.save_m2m() route.commit_edit() + mail_body = render_to_string("rule_edit_mail.txt", + {"route": route}) + mail_admins("Rule %s edit request submitted by %s" %(route.name, route.applier.username), + mail_body, fail_silently=True) return HttpResponseRedirect(reverse("group-routes")) else: return render_to_response('apply.html', {'form': form, 'edit':True, 'applier': applier}, @@ -160,6 +173,10 @@ def delete_route(request, route_slug): if applier_peer == requester_peer: route.status = "PENDING" route.commit_delete() + mail_body = render_to_string("rule_delete_mail.txt", + {"route": route}) + mail_admins("Rule %s removal request submitted by %s" %(route.name, route.applier.username), + mail_body, fail_silently=True) html = "<html><body>Done</body></html>" return HttpResponse(html) else: diff --git a/templates/application_rejected_mail.txt b/templates/application_rejected_mail.txt deleted file mode 100644 index c8a679802dc6a9a3338bd085f3670ba1cb86a979..0000000000000000000000000000000000000000 --- a/templates/application_rejected_mail.txt +++ /dev/null @@ -1,6 +0,0 @@ -Η αίτησή σας #{{ application.pk }} για τη δημιουργία εικονικής μηχανής με όνομα -{{ application.hostname }} απορρίφθηκε για τους παρακάτω λόγους: - -{{ application.admin_comments }} - -Για το ΚΕΔ ΕΔΕΤ diff --git a/templates/instance_created_mail.txt b/templates/instance_created_mail.txt deleted file mode 100644 index 56e32f1c93df2b33b2961ebfa44aeb14726eb205..0000000000000000000000000000000000000000 --- a/templates/instance_created_mail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Η εικονική μηχανή με όνομα {{ application.hostname }} δημιουργήθηκε. - -Μπορείτε να τη χειριστείτε και να δείτε τα στοιχεία της στην ακόλουθη -διεύθυνση: - {{instance_url}} - -{% if application.admin_comments %}Σχόλια διαχειριστή: -{{ application.admin_comments }} -{% endif %} -Για το ΚΕΔ ΕΔΕΤ