diff --git a/flowspec/admin.py b/flowspec/admin.py index a9c502bbe3916df9c85343f40d8ef4299d577bb6..f6131d33766e4d8695080cd088d772f415acde7c 100644 --- a/flowspec/admin.py +++ b/flowspec/admin.py @@ -2,31 +2,36 @@ from django.contrib import admin from flowspy.flowspec.models import * from flowspy.accounts.models import * from utils import proxy as PR +from flowspec.tasks import * +from django.contrib.auth.models import User +from django.contrib.auth.admin import UserAdmin +from accounts.models import UserProfile -#class RouteAdmin(admin.ModelAdmin): -# -# actions = ['deactivate'] -# -# def deactivate(self, request, queryset): -# applier = PR.Applier(route_objects=queryset) -# commit, response = applier.apply(configuration=applier.delete_routes()) -# if commit: -# rows = queryset.update(is_online=False, is_active=False) -# queryset.update(response="Successfully removed route from network") -# self.message_user(request, "Successfully removed %s routes from network" % rows) -# else: -# self.message_user(request, "Could not remove routes from network") -# deactivate.short_description = "Deactivate selected routes from network" -# -# list_display = ('name', 'is_online', 'applier', 'get_match', 'get_then', 'response') -# fieldsets = [ -# (None, {'fields': ['name','applier']}), -# ("Match", {'fields': ['source', 'sourceport', 'destination', 'destinationport', 'port']}), -# ('Advanced Match Statements', {'fields': ['dscp', 'fragmenttype', 'icmpcode', 'icmptype', 'packetlength', 'protocol', 'tcpflag'], 'classes': ['collapse']}), -# ("Then", {'fields': ['then' ]}), -# (None, {'fields': ['comments',]}), -# -# ] + +class RouteAdmin(admin.ModelAdmin): + + actions = ['deactivate'] + + def deactivate(self, request, queryset): + 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" + + list_display = ('name', 'status', 'applier' , 'applier_peer', 'get_match', 'get_then', 'response') + fieldsets = [ + (None, {'fields': ['name','applier']}), + ("Match", {'fields': ['source', 'sourceport', 'destination', 'destinationport', 'port']}), + ('Advanced Match Statements', {'fields': ['dscp', 'fragmenttype', 'icmpcode', 'icmptype', 'packetlength', 'protocol', 'tcpflag'], 'classes': ['collapse']}), + ("Then", {'fields': ['then' ]}), + (None, {'fields': ['comments',]}), + + ] + +class UserProfileInline(admin.StackedInline): + model = UserProfile + +class UserProfileAdmin(UserAdmin): + inlines = [UserProfileInline] # fields = ('name', 'applier', 'expires') #def formfield_for_dbfield(self, db_field, **kwargs): @@ -35,6 +40,7 @@ from utils import proxy as PR # return db_field.formfield(**kwargs) #admin.site.register(MatchAddress) +admin.site.unregister(User) admin.site.register(MatchPort) admin.site.register(MatchDscp) admin.site.register(UserProfile) @@ -47,8 +53,8 @@ admin.site.register(UserProfile) admin.site.register(ThenAction) #admin.site.register(ThenStatement) #admin.site.register(MatchStatement) -admin.site.register(Route) - +admin.site.register(Route, RouteAdmin) +admin.site.register(User, UserProfileAdmin) admin.site.disable_action('delete_selected') diff --git a/flowspec/models.py b/flowspec/models.py index 5092cc4bdce06281c90e095fe0f807b6a2ced80c..b1f5ac5e45c082f41610ca34fc7d0311aa59d93b 100644 --- a/flowspec/models.py +++ b/flowspec/models.py @@ -45,7 +45,8 @@ ROUTE_STATES = ( ("EXPIRED", "EXPIRED"), ("PENDING", "PENDING"), ("OUTOFSYNC", "OUTOFSYNC"), - ("INACTIVE", "INACTIVE"), + ("INACTIVE", "INACTIVE"), + ("ADMININACTIVE", "ADMININACTIVE"), ) @@ -299,6 +300,14 @@ class Route(models.Model): get_match.short_description = 'Match statement' get_match.allow_tags = True + + @property + def applier_peer(self): + try: + applier_peer = self.applier.get_profile().peer + except: + applier_peer = None + return applier_peer def send_message(msg, user): # username = user.username diff --git a/flowspec/tasks.py b/flowspec/tasks.py index 856920edb66d6dc948850fd71426829c8562679d..3a9559043053ff838813bee6319d1435d89c7bc2 100644 --- a/flowspec/tasks.py +++ b/flowspec/tasks.py @@ -71,6 +71,9 @@ def batch_delete(routes, **kwargs): if "reason" in kwargs and kwargs['reason']=='EXPIRED': status = 'EXPIRED' reason_text = " Reason: %s " %status + elif "reason" in kwargs and kwargs['reason']!='EXPIRED': + status = kwargs['reason'] + reason_text = " Reason: %s " %status else: status = "ERROR" for route in routes: @@ -102,9 +105,13 @@ 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': + if route.has_expired() and (route.status != 'EXPIRED' or route.status != 'ADMININACTIVE' or 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() diff --git a/flowspec/views.py b/flowspec/views.py index d249306a5001d1c8902dafb21f1620216ff696e5..4a6076363f275af6ed6694721adb144cdb27bdc6 100644 --- a/flowspec/views.py +++ b/flowspec/views.py @@ -119,6 +119,14 @@ def edit_route(request, route_slug): messages.add_message(request, messages.WARNING, "Insufficient rights to edit rule %s" %(route_slug)) return HttpResponseRedirect(reverse("group-routes")) + if route_edit.status == "ADMININACTIVE" : + messages.add_message(request, messages.WARNING, + "Administrator has disabled editing of rule %s" %(route_slug)) + return HttpResponseRedirect(reverse("group-routes")) + if route_edit.status == "EXPIRED" : + messages.add_message(request, messages.WARNING, + "Cannot edit the expired rule %s. Contact helpdesk to enable it" %(route_slug)) + return HttpResponseRedirect(reverse("group-routes")) route_original = deepcopy(route_edit) if request.POST: form = RouteForm(request.POST, instance = route_edit) diff --git a/poller/application.py b/poller/application.py index cb485320315369d908c5dd839f8ca08a3e846f6a..8be4eee135076e463e0889880d06a3505d28a7d4 100644 --- a/poller/application.py +++ b/poller/application.py @@ -12,7 +12,6 @@ def exception_printer(sender, **kwargs): traceback.print_exc() got_request_exception.connect(exception_printer) - call_command('syncdb') application = WSGIHandler()