diff --git a/Vagrantfile b/Vagrantfile index 32c3ce579aaf8af7c0ed8a4de29307620e07b0ce..1e90a99e7ab84cacdccde0cee4cf8b96e9de499a 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -52,9 +52,9 @@ Vagrant.configure(2) do |config| # end # config.vm.provision "shell", inline: <<-SHELL - yum install -y python-virtualenv vim git gcc libevent-devel libxml2-devel libxslt-devel mariadb-server mysql-devel patch rpm -Uh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm - yum install -y beanstalkd + yum -q -y install python36 python36-setuptools python36-virtualenv vim git gcc libevent-devel libxml2-devel libxslt-devel mariadb-server mysql-devel patch + yum -q -y install beanstalkd systemctl enable beanstalkd.service service beanstalkd start systemctl enable mariadb.service @@ -63,7 +63,7 @@ Vagrant.configure(2) do |config| create database fod; SCRIPT mkdir -p /var/log/fod /srv - virtualenv /srv/venv + virtualenv-3 /srv/venv ( source /srv/venv/bin/activate cp -r /vagrant/ /srv/flowspy @@ -75,8 +75,6 @@ SCRIPT ) pip install -r requirements.txt - ./patch-dependencies.sh - touch flowspy/settings_local.py ./manage.py syncdb --noinput diff --git a/_version.py b/_version.py index ef517bccb0d01cf8b42ca2d552b1fef08b1a6117..f99707043ac53a59914e7086095a68e980afa71c 100644 --- a/_version.py +++ b/_version.py @@ -2,4 +2,4 @@ VERSION = '1.5' if __name__ == "__main__": - print VERSION + print(VERSION) diff --git a/accounts/admin.py b/accounts/admin.py index 453be75ffcb61963c1f50db5c1f4cd66239f4adc..7ef1ef3363d517b32991effd86686095b2725f59 100644 --- a/accounts/admin.py +++ b/accounts/admin.py @@ -19,7 +19,7 @@ from django.contrib import admin from django import forms -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.flatpages.admin import FlatPageAdmin from django.contrib.flatpages.models import FlatPage diff --git a/accounts/migrations.backup/0001_initial.py b/accounts/migrations.backup/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..b67885be8bc49563d13807c5650635cbd5f13564 --- /dev/null +++ b/accounts/migrations.backup/0001_initial.py @@ -0,0 +1,91 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'UserProfile' + db.create_table('accounts_userprofile', ( + ('peer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'])), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), + )) + db.send_create_signal('accounts', ['UserProfile']) + + + def backwards(self, orm): + + # Deleting model 'UserProfile' + db.delete_table('accounts_userprofile') + + + models = { + 'accounts.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']"}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) + }, + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'peers.peer': { + 'Meta': {'object_name': 'Peer', 'db_table': "u'peer'"}, + 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), + 'peer_as': ('django.db.models.fields.IntegerField', [], {}), + 'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), + 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) + }, + 'peers.peerrange': { + 'Meta': {'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'peers.techcemail': { + 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['accounts'] diff --git a/accounts/migrations/0002_add_overview.py b/accounts/migrations.backup/0002_add_overview.py similarity index 100% rename from accounts/migrations/0002_add_overview.py rename to accounts/migrations.backup/0002_add_overview.py diff --git a/accounts/migrations/0003_auto.py b/accounts/migrations.backup/0003_auto.py similarity index 100% rename from accounts/migrations/0003_auto.py rename to accounts/migrations.backup/0003_auto.py diff --git a/accounts/migrations/0004_peers.py b/accounts/migrations.backup/0004_peers.py similarity index 100% rename from accounts/migrations/0004_peers.py rename to accounts/migrations.backup/0004_peers.py diff --git a/accounts/migrations/0005_auto__chg_field_userprofile_peer.py b/accounts/migrations.backup/0005_auto__chg_field_userprofile_peer.py similarity index 100% rename from accounts/migrations/0005_auto__chg_field_userprofile_peer.py rename to accounts/migrations.backup/0005_auto__chg_field_userprofile_peer.py diff --git a/accounts/migrations/0006_auto__del_field_userprofile_peer.py b/accounts/migrations.backup/0006_auto__del_field_userprofile_peer.py similarity index 100% rename from accounts/migrations/0006_auto__del_field_userprofile_peer.py rename to accounts/migrations.backup/0006_auto__del_field_userprofile_peer.py diff --git a/longerusername/migrations/__init__.py b/accounts/migrations.backup/__init__.py similarity index 100% rename from longerusername/migrations/__init__.py rename to accounts/migrations.backup/__init__.py diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py index b67885be8bc49563d13807c5650635cbd5f13564..ae0f8fd14eadb79b99a710153fa72b37f083fa9e 100644 --- a/accounts/migrations/0001_initial.py +++ b/accounts/migrations/0001_initial.py @@ -1,91 +1,29 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +# Generated by Django 2.1 on 2019-07-25 08:12 -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'UserProfile' - db.create_table('accounts_userprofile', ( - ('peer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['peers.Peer'])), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), - )) - db.send_create_signal('accounts', ['UserProfile']) - - - def backwards(self, orm): - - # Deleting model 'UserProfile' - db.delete_table('accounts_userprofile') - - - models = { - 'accounts.userprofile': { - 'Meta': {'object_name': 'UserProfile'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'peer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['peers.Peer']"}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'}) - }, - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'peers.peer': { - 'Meta': {'object_name': 'Peer', 'db_table': "u'peer'"}, - 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), - 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), - 'peer_as': ('django.db.models.fields.IntegerField', [], {}), - 'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) - }, - 'peers.peerrange': { - 'Meta': {'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) - }, - 'peers.techcemail': { - 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, - 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } - - complete_apps = ['accounts'] +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('peers', '__first__'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('peers', models.ManyToManyField(related_name='user_profile', to='peers.Peer')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': (('overview', 'Can see registered users and rules'),), + }, + ), + ] diff --git a/accounts/models.py b/accounts/models.py index 5b9a7f7ca3881245f4aef7abee1542b45382c1ef..e906953f88fe9bb3d6c2db6597d350a9c54b5e36 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -23,7 +23,7 @@ from peers.models import Peer class UserProfile(models.Model): - user = models.OneToOneField(User) + user = models.OneToOneField(User, on_delete=models.CASCADE) peers = models.ManyToManyField(Peer, related_name='user_profile') class Meta: diff --git a/accounts/views.py b/accounts/views.py index ada4eb7c0c8f92ebb86e78706eb7851abf37531d..8a93d0f6aec4a25b5191be9450bbb8ff87d65de3 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -30,7 +30,7 @@ from rest_framework.authtoken.models import Token from accounts.models import UserProfile from peers.models import Peer from flowspec.forms import UserProfileForm -from registration.models import RegistrationProfile +# TODO from registration.models import RegistrationProfile def generate_token(request): @@ -45,98 +45,99 @@ def generate_token(request): @never_cache def activate(request, activation_key): account = None - if request.method == "GET": - activation_key = activation_key.lower() # Normalize before trying anything with it. - try: - rp = RegistrationProfile.objects.get(activation_key=activation_key) + # TODO + #if request.method == "GET": + # activation_key = activation_key.lower() # Normalize before trying anything with it. + # try: + # rp = RegistrationProfile.objects.get(activation_key=activation_key) - except RegistrationProfile.DoesNotExist: - return render( - request, - 'registration/activate.html', - { - 'account': account, - 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS - } - ) - try: - userProfile = rp.user.get_profile() - except UserProfile.DoesNotExist: - return render( - request, - 'registration/activate.html', - { - 'account': account, - 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS - } - ) + # except RegistrationProfile.DoesNotExist: + # return render( + # request, + # 'registration/activate.html', + # { + # 'account': account, + # 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS + # } + # ) + # try: + # userProfile = rp.user.get_profile() + # except UserProfile.DoesNotExist: + # return render( + # request, + # 'registration/activate.html', + # { + # 'account': account, + # 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS + # } + # ) - form = UserProfileForm(instance=userProfile) + # form = UserProfileForm(instance=userProfile) - return render( - request, - 'registration/activate_edit.html', - { - 'account': account, - 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS, - 'form': form - }, - ) + # return render( + # request, + # 'registration/activate_edit.html', + # { + # 'account': account, + # 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS, + # 'form': form + # }, + # ) - if request.method == "POST": - request_data = request.POST.copy() - try: - user = User.objects.get(pk=request_data['user']) - up = user.get_profile() + #if request.method == "POST": + # request_data = request.POST.copy() + # try: + # user = User.objects.get(pk=request_data['user']) + # up = user.get_profile() - # use getlist to get the list of peers (might be multiple) - profile_peers = request.POST.getlist('peers') + # # use getlist to get the list of peers (might be multiple) + # profile_peers = request.POST.getlist('peers') - # remove already assigned peers, as these are selected by - # the user, no admin has yet verified those. They will be - # replaced by the admin's selection. - up.peers.clear() + # # remove already assigned peers, as these are selected by + # # the user, no admin has yet verified those. They will be + # # replaced by the admin's selection. + # up.peers.clear() - for peer in profile_peers: - up.peers.add(Peer.objects.get(pk=peer)) - up.save() + # for peer in profile_peers: + # up.peers.add(Peer.objects.get(pk=peer)) + # up.save() - except: - return render( - request, - 'registration/activate_edit.html', - { - 'account': account, - 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS - }, - ) - activation_key = activation_key.lower() # Normalize before trying anything with it. - try: - rp = RegistrationProfile.objects.get(activation_key=activation_key) - account = RegistrationProfile.objects.activate_user(activation_key) - except Exception: - pass + # except: + # return render( + # request, + # 'registration/activate_edit.html', + # { + # 'account': account, + # 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS + # }, + # ) + # activation_key = activation_key.lower() # Normalize before trying anything with it. + # try: + # rp = RegistrationProfile.objects.get(activation_key=activation_key) + # account = RegistrationProfile.objects.activate_user(activation_key) + # except Exception: + # pass - if account: - # A user has been activated - email = render_to_string( - 'registration/activation_complete.txt', - { - 'site': Site.objects.get_current(), - 'user': account - } - ) - send_mail( - _("%sUser account activated") % settings.EMAIL_SUBJECT_PREFIX, - email, - settings.SERVER_EMAIL, - [account.email] - ) - return render( - request, - 'registration/activate.html', - { - 'account': account, - 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS - }, - ) + # if account: + # # A user has been activated + # email = render_to_string( + # 'registration/activation_complete.txt', + # { + # 'site': Site.objects.get_current(), + # 'user': account + # } + # ) + # send_mail( + # _("%sUser account activated") % settings.EMAIL_SUBJECT_PREFIX, + # email, + # settings.SERVER_EMAIL, + # [account.email] + # ) + # return render( + # request, + # 'registration/activate.html', + # { + # 'account': account, + # 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS + # }, + # ) diff --git a/beanstalkc.py b/beanstalkc.py index 5128a9c3f2e618eddefc466d1cbb702b466b704e..63661fdf6a55b32f6e222142d0692cbd325edc66 100755 --- a/beanstalkc.py +++ b/beanstalkc.py @@ -39,7 +39,7 @@ class SocketError(BeanstalkcException): def wrap(wrapped_function, *args, **kwargs): try: return wrapped_function(*args, **kwargs) - except socket.error, err: + except socket.error as err: raise SocketError(err) @@ -122,7 +122,7 @@ class Connection(object): def _interact_peek(self, command): try: return self._interact_job(command, ['FOUND'], ['NOT_FOUND'], False) - except CommandFailed, (_, _status, _results): + except CommandFailed: return None # -- public interface -- @@ -147,7 +147,7 @@ class Connection(object): return self._interact_job(command, ['RESERVED'], ['DEADLINE_SOON', 'TIMED_OUT']) - except CommandFailed, (_, status, results): + except CommandFailed: if status == 'TIMED_OUT': return None elif status == 'DEADLINE_SOON': diff --git a/flowspec/admin.py b/flowspec/admin.py index 18c9a5193d5f009b288a46388832d3ac5d02a394..e3f61e6eb1d1b3c4932f8eb26dd82ff8e560a43f 100644 --- a/flowspec/admin.py +++ b/flowspec/admin.py @@ -19,13 +19,13 @@ from django.contrib import admin from flowspec.models import MatchPort, MatchDscp, MatchProtocol, FragmentType, ThenAction, Route +from flowspec.tasks import * +from flowspec.forms import * from accounts.models import UserProfile from utils import proxy as PR -from tasks import * from django.contrib.auth.models import User from django.contrib.auth.admin import UserAdmin from peers.models import * -from flowspec.forms import * from longerusername.forms import UserCreationForm, UserChangeForm diff --git a/flowspec/forms.py b/flowspec/forms.py index afb99cc1d4907cafdba32766e40c62fc971bf535..d2cbc48cce4fa8325dcea830f600b715977b3b56 100644 --- a/flowspec/forms.py +++ b/flowspec/forms.py @@ -25,14 +25,13 @@ from django.template.defaultfilters import filesizeformat from flowspec.models import * from peers.models import * from accounts.models import * -from ipaddr import * from flowspec.validators import ( clean_source, clean_destination, clean_expires, clean_route_form ) -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib.auth.models import User from django.conf import settings import datetime @@ -84,6 +83,7 @@ class UserProfileForm(forms.ModelForm): class Meta: model = UserProfile + fields = "__all__" class RouteForm(forms.ModelForm): @@ -92,6 +92,7 @@ class RouteForm(forms.ModelForm): port = PortRangeForm() class Meta: model = Route + fields = "__all__" def clean_applier(self): applier = self.cleaned_data['applier'] @@ -155,7 +156,7 @@ class RouteForm(forms.ModelForm): user = self.cleaned_data.get('applier', None) if source: - source = IPNetwork(source).compressed + source = ip_network(source).compressed existing_routes = existing_routes.filter(source=source) else: existing_routes = existing_routes.filter(source=None) @@ -191,7 +192,7 @@ class RouteForm(forms.ModelForm): for route in existing_routes: if name != route.name: existing_url = reverse('edit-route', args=[route.name]) - if IPNetwork(destination) in IPNetwork(route.destination) or IPNetwork(route.destination) in IPNetwork(destination): + if ip_network(destination) in ip_network(route.destination) or ip_network(route.destination) in ip_network(destination): raise forms.ValidationError('Found an exact %s rule, %s with destination prefix %s<br>To avoid overlapping try editing rule <a href=\'%s\'>%s</a>' % (route.status, route.name, route.destination, existing_url, route.name)) return self.cleaned_data @@ -200,6 +201,7 @@ class ThenPlainForm(forms.ModelForm): # action = forms.CharField(initial='rate-limit') class Meta: model = ThenAction + fields = "__all__" def clean_action_value(self): action_value = self.cleaned_data['action_value'] @@ -226,6 +228,7 @@ class PortPlainForm(forms.ModelForm): # action = forms.CharField(initial='rate-limit') class Meta: model = MatchPort + fields = "__all__" def clean_port(self): port = self.cleaned_data['port'] diff --git a/flowspec/helpers.py b/flowspec/helpers.py index 20c90183c59dd732c4e2c83b68df3a42ab4d1e0a..f2e4898727ea1e5dc2fb87ba5a23f77e7b2a1203 100644 --- a/flowspec/helpers.py +++ b/flowspec/helpers.py @@ -13,7 +13,7 @@ def send_new_mail(subject, message, from_email, recipient_list, bcc_list): try: logger.info("helpers::send_new_mail(): send mail: from_email="+str(from_email)+", recipient_list="+str(recipient_list)+", bcc_list="+str(bcc_list)) return EmailMessage(subject, message, from_email, recipient_list, bcc_list).send() - except Exception, e: + except Exception as e: #os.write(3, "send_new_mail() failed: exc="+str(e)+"\n") logger.error("helpers::send_new_mail() failed: exc="+str(e)) diff --git a/flowspec/migrations.backup/0001_initial.py b/flowspec/migrations.backup/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..28c51363bbe1147faa053398984bf50c5f59abf9 --- /dev/null +++ b/flowspec/migrations.backup/0001_initial.py @@ -0,0 +1,212 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'MatchPort' + db.create_table(u'match_port', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('port', self.gf('django.db.models.fields.CharField')(unique=True, max_length=24)), + )) + db.send_create_signal('flowspec', ['MatchPort']) + + # Adding model 'MatchDscp' + db.create_table(u'match_dscp', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('dscp', self.gf('django.db.models.fields.CharField')(max_length=24)), + )) + db.send_create_signal('flowspec', ['MatchDscp']) + + # Adding model 'ThenAction' + db.create_table(u'then_action', ( + ('action', self.gf('django.db.models.fields.CharField')(max_length=60)), + ('action_value', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('flowspec', ['ThenAction']) + + # Adding unique constraint on 'ThenAction', fields ['action', 'action_value'] + db.create_unique(u'then_action', ['action', 'action_value']) + + # Adding model 'Route' + db.create_table(u'route', ( + ('packetlength', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), + ('status', self.gf('django.db.models.fields.CharField')(default='PENDING', max_length=20, null=True, blank=True)), + ('last_updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), + ('expires', self.gf('django.db.models.fields.DateField')(default=datetime.date(2012, 2, 22))), + ('protocol', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), + ('name', self.gf('django.db.models.fields.SlugField')(max_length=128, db_index=True)), + ('destination', self.gf('django.db.models.fields.CharField')(max_length=32)), + ('comments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), + ('icmptype', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), + ('source', self.gf('django.db.models.fields.CharField')(max_length=32)), + ('fragmenttype', self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True)), + ('applier', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)), + ('filed', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('tcpflag', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)), + ('response', self.gf('django.db.models.fields.CharField')(max_length=512, null=True, blank=True)), + ('icmpcode', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('flowspec', ['Route']) + + # Adding M2M table for field sourceport on 'Route' + db.create_table(u'route_sourceport', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('route', models.ForeignKey(orm['flowspec.route'], null=False)), + ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False)) + )) + db.create_unique(u'route_sourceport', ['route_id', 'matchport_id']) + + # Adding M2M table for field then on 'Route' + db.create_table(u'route_then', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('route', models.ForeignKey(orm['flowspec.route'], null=False)), + ('thenaction', models.ForeignKey(orm['flowspec.thenaction'], null=False)) + )) + db.create_unique(u'route_then', ['route_id', 'thenaction_id']) + + # Adding M2M table for field dscp on 'Route' + db.create_table(u'route_dscp', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('route', models.ForeignKey(orm['flowspec.route'], null=False)), + ('matchdscp', models.ForeignKey(orm['flowspec.matchdscp'], null=False)) + )) + db.create_unique(u'route_dscp', ['route_id', 'matchdscp_id']) + + # Adding M2M table for field port on 'Route' + db.create_table(u'route_port', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('route', models.ForeignKey(orm['flowspec.route'], null=False)), + ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False)) + )) + db.create_unique(u'route_port', ['route_id', 'matchport_id']) + + # Adding M2M table for field destinationport on 'Route' + db.create_table(u'route_destinationport', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('route', models.ForeignKey(orm['flowspec.route'], null=False)), + ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False)) + )) + db.create_unique(u'route_destinationport', ['route_id', 'matchport_id']) + + + def backwards(self, orm): + + # Deleting model 'MatchPort' + db.delete_table(u'match_port') + + # Deleting model 'MatchDscp' + db.delete_table(u'match_dscp') + + # Deleting model 'ThenAction' + db.delete_table(u'then_action') + + # Removing unique constraint on 'ThenAction', fields ['action', 'action_value'] + db.delete_unique(u'then_action', ['action', 'action_value']) + + # Deleting model 'Route' + db.delete_table(u'route') + + # Removing M2M table for field sourceport on 'Route' + db.delete_table('route_sourceport') + + # Removing M2M table for field then on 'Route' + db.delete_table('route_then') + + # Removing M2M table for field dscp on 'Route' + db.delete_table('route_dscp') + + # Removing M2M table for field port on 'Route' + db.delete_table('route_port') + + # Removing M2M table for field destinationport on 'Route' + db.delete_table('route_destinationport') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'flowspec.matchdscp': { + 'Meta': {'object_name': 'MatchDscp', 'db_table': "u'match_dscp'"}, + 'dscp': ('django.db.models.fields.CharField', [], {'max_length': '24'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + 'flowspec.matchport': { + 'Meta': {'object_name': 'MatchPort', 'db_table': "u'match_port'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'port': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '24'}) + }, + 'flowspec.route': { + 'Meta': {'object_name': 'Route', 'db_table': "u'route'"}, + 'applier': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), + 'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'destination': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'destinationport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchDestinationPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}), + 'dscp': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['flowspec.MatchDscp']", 'null': 'True', 'blank': 'True'}), + 'expires': ('django.db.models.fields.DateField', [], {'default': 'datetime.date(2012, 2, 22)'}), + 'filed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'fragmenttype': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'icmpcode': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'icmptype': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'last_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'name': ('django.db.models.fields.SlugField', [], {'max_length': '128', 'db_index': 'True'}), + 'packetlength': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), + 'port': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}), + 'protocol': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), + 'response': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), + 'source': ('django.db.models.fields.CharField', [], {'max_length': '32'}), + 'sourceport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchSourcePort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}), + 'status': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '20', 'null': 'True', 'blank': 'True'}), + 'tcpflag': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'then': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['flowspec.ThenAction']", 'symmetrical': 'False'}) + }, + 'flowspec.thenaction': { + 'Meta': {'unique_together': "(('action', 'action_value'),)", 'object_name': 'ThenAction', 'db_table': "u'then_action'"}, + 'action': ('django.db.models.fields.CharField', [], {'max_length': '60'}), + 'action_value': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['flowspec'] diff --git a/flowspec/migrations/0002_auto__add_matchprotocol__del_field_route_protocol.py b/flowspec/migrations.backup/0002_auto__add_matchprotocol__del_field_route_protocol.py similarity index 100% rename from flowspec/migrations/0002_auto__add_matchprotocol__del_field_route_protocol.py rename to flowspec/migrations.backup/0002_auto__add_matchprotocol__del_field_route_protocol.py diff --git a/flowspec/migrations/0003_auto__add_fragmenttype.py b/flowspec/migrations.backup/0003_auto__add_fragmenttype.py similarity index 100% rename from flowspec/migrations/0003_auto__add_fragmenttype.py rename to flowspec/migrations.backup/0003_auto__add_fragmenttype.py diff --git a/flowspec/migrations/0004_auto__chg_field_fragmenttype_fragmenttype.py b/flowspec/migrations.backup/0004_auto__chg_field_fragmenttype_fragmenttype.py similarity index 100% rename from flowspec/migrations/0004_auto__chg_field_fragmenttype_fragmenttype.py rename to flowspec/migrations.backup/0004_auto__chg_field_fragmenttype_fragmenttype.py diff --git a/flowspec/migrations/0005_auto__del_field_route_fragmenttype.py b/flowspec/migrations.backup/0005_auto__del_field_route_fragmenttype.py similarity index 100% rename from flowspec/migrations/0005_auto__del_field_route_fragmenttype.py rename to flowspec/migrations.backup/0005_auto__del_field_route_fragmenttype.py diff --git a/flowspec/migrations/0006_auto__add_field_route_requesters_address.py b/flowspec/migrations.backup/0006_auto__add_field_route_requesters_address.py similarity index 100% rename from flowspec/migrations/0006_auto__add_field_route_requesters_address.py rename to flowspec/migrations.backup/0006_auto__add_field_route_requesters_address.py diff --git a/flowspec/migrations/0007_replace_matchport.py b/flowspec/migrations.backup/0007_replace_matchport.py similarity index 100% rename from flowspec/migrations/0007_replace_matchport.py rename to flowspec/migrations.backup/0007_replace_matchport.py diff --git a/flowspec/migrations.backup/__init__.py b/flowspec/migrations.backup/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/flowspec/migrations/0001_initial.py b/flowspec/migrations/0001_initial.py index 28c51363bbe1147faa053398984bf50c5f59abf9..09627ca00f3ccacd7accbf5124888950db7fa549 100644 --- a/flowspec/migrations/0001_initial.py +++ b/flowspec/migrations/0001_initial.py @@ -1,212 +1,108 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding model 'MatchPort' - db.create_table(u'match_port', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('port', self.gf('django.db.models.fields.CharField')(unique=True, max_length=24)), - )) - db.send_create_signal('flowspec', ['MatchPort']) - - # Adding model 'MatchDscp' - db.create_table(u'match_dscp', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('dscp', self.gf('django.db.models.fields.CharField')(max_length=24)), - )) - db.send_create_signal('flowspec', ['MatchDscp']) - - # Adding model 'ThenAction' - db.create_table(u'then_action', ( - ('action', self.gf('django.db.models.fields.CharField')(max_length=60)), - ('action_value', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - )) - db.send_create_signal('flowspec', ['ThenAction']) - - # Adding unique constraint on 'ThenAction', fields ['action', 'action_value'] - db.create_unique(u'then_action', ['action', 'action_value']) - - # Adding model 'Route' - db.create_table(u'route', ( - ('packetlength', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('status', self.gf('django.db.models.fields.CharField')(default='PENDING', max_length=20, null=True, blank=True)), - ('last_updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), - ('expires', self.gf('django.db.models.fields.DateField')(default=datetime.date(2012, 2, 22))), - ('protocol', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), - ('name', self.gf('django.db.models.fields.SlugField')(max_length=128, db_index=True)), - ('destination', self.gf('django.db.models.fields.CharField')(max_length=32)), - ('comments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), - ('icmptype', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), - ('source', self.gf('django.db.models.fields.CharField')(max_length=32)), - ('fragmenttype', self.gf('django.db.models.fields.CharField')(max_length=20, null=True, blank=True)), - ('applier', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)), - ('filed', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('tcpflag', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)), - ('response', self.gf('django.db.models.fields.CharField')(max_length=512, null=True, blank=True)), - ('icmpcode', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - )) - db.send_create_signal('flowspec', ['Route']) - - # Adding M2M table for field sourceport on 'Route' - db.create_table(u'route_sourceport', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('route', models.ForeignKey(orm['flowspec.route'], null=False)), - ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False)) - )) - db.create_unique(u'route_sourceport', ['route_id', 'matchport_id']) - - # Adding M2M table for field then on 'Route' - db.create_table(u'route_then', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('route', models.ForeignKey(orm['flowspec.route'], null=False)), - ('thenaction', models.ForeignKey(orm['flowspec.thenaction'], null=False)) - )) - db.create_unique(u'route_then', ['route_id', 'thenaction_id']) - - # Adding M2M table for field dscp on 'Route' - db.create_table(u'route_dscp', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('route', models.ForeignKey(orm['flowspec.route'], null=False)), - ('matchdscp', models.ForeignKey(orm['flowspec.matchdscp'], null=False)) - )) - db.create_unique(u'route_dscp', ['route_id', 'matchdscp_id']) - - # Adding M2M table for field port on 'Route' - db.create_table(u'route_port', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('route', models.ForeignKey(orm['flowspec.route'], null=False)), - ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False)) - )) - db.create_unique(u'route_port', ['route_id', 'matchport_id']) - - # Adding M2M table for field destinationport on 'Route' - db.create_table(u'route_destinationport', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('route', models.ForeignKey(orm['flowspec.route'], null=False)), - ('matchport', models.ForeignKey(orm['flowspec.matchport'], null=False)) - )) - db.create_unique(u'route_destinationport', ['route_id', 'matchport_id']) - - - def backwards(self, orm): - - # Deleting model 'MatchPort' - db.delete_table(u'match_port') - - # Deleting model 'MatchDscp' - db.delete_table(u'match_dscp') - - # Deleting model 'ThenAction' - db.delete_table(u'then_action') - - # Removing unique constraint on 'ThenAction', fields ['action', 'action_value'] - db.delete_unique(u'then_action', ['action', 'action_value']) - - # Deleting model 'Route' - db.delete_table(u'route') - - # Removing M2M table for field sourceport on 'Route' - db.delete_table('route_sourceport') - - # Removing M2M table for field then on 'Route' - db.delete_table('route_then') - - # Removing M2M table for field dscp on 'Route' - db.delete_table('route_dscp') - - # Removing M2M table for field port on 'Route' - db.delete_table('route_port') - - # Removing M2M table for field destinationport on 'Route' - db.delete_table('route_destinationport') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'flowspec.matchdscp': { - 'Meta': {'object_name': 'MatchDscp', 'db_table': "u'match_dscp'"}, - 'dscp': ('django.db.models.fields.CharField', [], {'max_length': '24'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - }, - 'flowspec.matchport': { - 'Meta': {'object_name': 'MatchPort', 'db_table': "u'match_port'"}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'port': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '24'}) - }, - 'flowspec.route': { - 'Meta': {'object_name': 'Route', 'db_table': "u'route'"}, - 'applier': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), - 'comments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'destination': ('django.db.models.fields.CharField', [], {'max_length': '32'}), - 'destinationport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchDestinationPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}), - 'dscp': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['flowspec.MatchDscp']", 'null': 'True', 'blank': 'True'}), - 'expires': ('django.db.models.fields.DateField', [], {'default': 'datetime.date(2012, 2, 22)'}), - 'filed': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'fragmenttype': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'icmpcode': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'icmptype': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'last_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.SlugField', [], {'max_length': '128', 'db_index': 'True'}), - 'packetlength': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'port': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchPort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}), - 'protocol': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}), - 'response': ('django.db.models.fields.CharField', [], {'max_length': '512', 'null': 'True', 'blank': 'True'}), - 'source': ('django.db.models.fields.CharField', [], {'max_length': '32'}), - 'sourceport': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'matchSourcePort'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['flowspec.MatchPort']"}), - 'status': ('django.db.models.fields.CharField', [], {'default': "'PENDING'", 'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'tcpflag': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), - 'then': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['flowspec.ThenAction']", 'symmetrical': 'False'}) - }, - 'flowspec.thenaction': { - 'Meta': {'unique_together': "(('action', 'action_value'),)", 'object_name': 'ThenAction', 'db_table': "u'then_action'"}, - 'action': ('django.db.models.fields.CharField', [], {'max_length': '60'}), - 'action_value': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } - - complete_apps = ['flowspec'] +# Generated by Django 2.1 on 2019-07-25 08:11 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import flowspec.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='FragmentType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fragmenttype', models.CharField(choices=[('dont-fragment', "Don't fragment"), ('first-fragment', 'First fragment'), ('is-fragment', 'Is fragment'), ('last-fragment', 'Last fragment'), ('not-a-fragment', 'Not a fragment')], max_length=20, verbose_name='Fragment Type')), + ], + ), + migrations.CreateModel( + name='MatchDscp', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dscp', models.CharField(max_length=24)), + ], + options={ + 'db_table': 'match_dscp', + }, + ), + migrations.CreateModel( + name='MatchPort', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('port', models.CharField(max_length=24, unique=True)), + ], + options={ + 'db_table': 'match_port', + }, + ), + migrations.CreateModel( + name='MatchProtocol', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('protocol', models.CharField(max_length=24, unique=True)), + ], + options={ + 'db_table': 'match_protocol', + }, + ), + migrations.CreateModel( + name='Route', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.SlugField(max_length=128, verbose_name='Name')), + ('source', models.CharField(help_text='Network address. Use address/CIDR notation', max_length=32, verbose_name='Source Address')), + ('sourceport', models.CharField(blank=True, max_length=65535, null=True, verbose_name='Source Port')), + ('destination', models.CharField(help_text='Network address. Use address/CIDR notation', max_length=32, verbose_name='Destination Address')), + ('destinationport', models.CharField(blank=True, max_length=65535, null=True, verbose_name='Destination Port')), + ('port', models.CharField(blank=True, max_length=65535, null=True, verbose_name='Port')), + ('icmpcode', models.CharField(blank=True, max_length=32, null=True, verbose_name='ICMP Code')), + ('icmptype', models.CharField(blank=True, max_length=32, null=True, verbose_name='ICMP Type')), + ('packetlength', models.IntegerField(blank=True, null=True, verbose_name='Packet Length')), + ('tcpflag', models.CharField(blank=True, max_length=128, null=True, verbose_name='TCP flag')), + ('filed', models.DateTimeField(auto_now_add=True)), + ('last_updated', models.DateTimeField(auto_now=True)), + ('status', models.CharField(blank=True, choices=[('ACTIVE', 'ACTIVE'), ('ERROR', 'ERROR'), ('EXPIRED', 'EXPIRED'), ('PENDING', 'PENDING'), ('OUTOFSYNC', 'OUTOFSYNC'), ('INACTIVE', 'INACTIVE'), ('ADMININACTIVE', 'ADMININACTIVE')], default='PENDING', max_length=20, null=True, verbose_name='Status')), + ('expires', models.DateField(default=flowspec.models.days_offset, verbose_name='Expires')), + ('response', models.CharField(blank=True, max_length=512, null=True, verbose_name='Response')), + ('comments', models.TextField(blank=True, null=True, verbose_name='Comments')), + ('requesters_address', models.CharField(blank=True, max_length=255, null=True)), + ('applier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('dscp', models.ManyToManyField(blank=True, to='flowspec.MatchDscp', verbose_name='DSCP')), + ('fragmenttype', models.ManyToManyField(blank=True, to='flowspec.FragmentType', verbose_name='Fragment Type')), + ('protocol', models.ManyToManyField(blank=True, to='flowspec.MatchProtocol', verbose_name='Protocol')), + ], + options={ + 'verbose_name': 'Rule', + 'verbose_name_plural': 'Rules', + 'db_table': 'route', + }, + ), + migrations.CreateModel( + name='ThenAction', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('action', models.CharField(choices=[('accept', 'Accept'), ('discard', 'Discard'), ('community', 'Community'), ('next-term', 'Next term'), ('routing-instance', 'Routing Instance'), ('rate-limit', 'Rate limit'), ('sample', 'Sample')], max_length=60, verbose_name='Action')), + ('action_value', models.CharField(blank=True, max_length=255, null=True, verbose_name='Action Value')), + ], + options={ + 'db_table': 'then_action', + 'ordering': ['action', 'action_value'], + }, + ), + migrations.AlterUniqueTogether( + name='thenaction', + unique_together={('action', 'action_value')}, + ), + migrations.AddField( + model_name='route', + name='then', + field=models.ManyToManyField(to='flowspec.ThenAction', verbose_name='Then'), + ), + ] diff --git a/flowspec/models.py b/flowspec/models.py index e65791adb28ec497773bf89216ffe977c03a1568..e2666d3eb077a4679c080b8261a2d4c5e7ab2cf4 100644 --- a/flowspec/models.py +++ b/flowspec/models.py @@ -22,21 +22,21 @@ from django.conf import settings from django.contrib.auth.models import User from django.contrib.sites.models import Site from django.utils.translation import ugettext_lazy as _ -from django.core.urlresolvers import reverse +from django.urls import reverse from flowspec.helpers import send_new_mail, get_peer_techc_mails from utils import proxy as PR -from ipaddr import * +from ipaddress import * import datetime import logging -from junos import create_junos_name +from flowspec.junos import create_junos_name import beanstalkc from utils.randomizer import id_generator as id_gen -from tasks import * +from flowspec.tasks import * FORMAT = '%(asctime)s %(levelname)s: %(message)s' @@ -138,18 +138,18 @@ class ThenAction(models.Model): class Route(models.Model): name = models.SlugField(max_length=128, verbose_name=_("Name")) - applier = models.ForeignKey(User, blank=True, null=True) + applier = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) source = models.CharField(max_length=32, help_text=_("Network address. Use address/CIDR notation"), verbose_name=_("Source Address")) sourceport = models.CharField(max_length=65535, blank=True, null=True, verbose_name=_("Source Port")) destination = models.CharField(max_length=32, help_text=_("Network address. Use address/CIDR notation"), verbose_name=_("Destination Address")) destinationport = models.CharField(max_length=65535, blank=True, null=True, verbose_name=_("Destination Port")) port = models.CharField(max_length=65535, blank=True, null=True, verbose_name=_("Port")) - dscp = models.ManyToManyField(MatchDscp, blank=True, null=True, verbose_name="DSCP") - fragmenttype = models.ManyToManyField(FragmentType, blank=True, null=True, verbose_name="Fragment Type") + dscp = models.ManyToManyField(MatchDscp, blank=True, verbose_name="DSCP") + fragmenttype = models.ManyToManyField(FragmentType, blank=True, verbose_name="Fragment Type") icmpcode = models.CharField(max_length=32, blank=True, null=True, verbose_name="ICMP Code") icmptype = models.CharField(max_length=32, blank=True, null=True, verbose_name="ICMP Type") packetlength = models.IntegerField(blank=True, null=True, verbose_name="Packet Length") - protocol = models.ManyToManyField(MatchProtocol, blank=True, null=True, verbose_name=_("Protocol")) + protocol = models.ManyToManyField(MatchProtocol, blank=True, verbose_name=_("Protocol")) tcpflag = models.CharField(max_length=128, blank=True, null=True, verbose_name="TCP flag") then = models.ManyToManyField(ThenAction, verbose_name=_("Then")) filed = models.DateTimeField(auto_now_add=True) @@ -203,7 +203,7 @@ class Route(models.Model): from django.core.exceptions import ValidationError if self.destination: try: - address = IPNetwork(self.destination) + address = ipaddress.ip_network(self.destination) self.destination = address.exploded except Exception: raise ValidationError(_('Invalid network address format at Destination Field')) @@ -642,3 +642,4 @@ def send_message(msg, user): tube_message = json.dumps({'message': str(msg), 'username': peer}) b.put(tube_message) b.close() + diff --git a/flowspec/tasks.py b/flowspec/tasks.py index 69d0b99995748dcf91fb2a18f3da5cd8f631b98b..00a7d41d562294b744e1d0fffd1e261e9c98d7f5 100644 --- a/flowspec/tasks.py +++ b/flowspec/tasks.py @@ -1,368 +1,368 @@ -# -*- coding: utf-8 -*- vim:fileencoding=utf-8: -# vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab - -# Copyright (C) 2010-2014 GRNET S.A. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# - -from utils import proxy as PR -from celery.task import task -from celery.task.sets import subtask -import logging -import json -from celery.task.http import * -import beanstalkc -from django.conf import settings -import datetime -from django.core.mail import send_mail -from django.template.loader import render_to_string -import os -from celery.exceptions import TimeLimitExceeded, SoftTimeLimitExceeded -from ipaddr import * -from os import fork,_exit -from sys import exit -import time - -LOG_FILENAME = os.path.join(settings.LOG_FILE_LOCATION, 'celery_jobs.log') - - -# FORMAT = '%(asctime)s %(levelname)s: %(message)s' -# logging.basicConfig(format=FORMAT) -formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') - -logger = logging.getLogger(__name__) -logger.setLevel(logging.DEBUG) -handler = logging.FileHandler(LOG_FILENAME) -handler.setFormatter(formatter) -logger.addHandler(handler) - - -@task(ignore_result=True) -def add(route, callback=None): - try: - applier = PR.Applier(route_object=route) - commit, response = applier.apply() - if commit: - status = "ACTIVE" - else: - status = "ERROR" - route.status = status - route.response = response - route.save() - announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route) - except TimeLimitExceeded: - route.status = "ERROR" - route.response = "Task timeout" - route.save() - announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - except SoftTimeLimitExceeded: - route.status = "ERROR" - route.response = "Task timeout" - route.save() - announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - except Exception: - route.status = "ERROR" - route.response = "Error" - route.save() - announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - - -@task(ignore_result=True) -def edit(route, callback=None): - try: - applier = PR.Applier(route_object=route) - commit, response = applier.apply(operation="replace") - if commit: - status = "ACTIVE" - try: - snmp_add_initial_zero_value.delay(str(route.id), True) - except Exception as e: - logger.error("edit(): route="+str(route)+", ACTIVE, add_initial_zero_value failed: "+str(e)) - else: - status = "ERROR" - route.status = status - route.response = response - route.save() - announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route) - except TimeLimitExceeded: - route.status = "ERROR" - route.response = "Task timeout" - route.save() - announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - except SoftTimeLimitExceeded: - route.status = "ERROR" - route.response = "Task timeout" - route.save() - announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - except Exception: - route.status = "ERROR" - route.response = "Error" - route.save() - announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - - -@task(ignore_result=True) -def delete(route, **kwargs): - try: - applier = PR.Applier(route_object=route) - commit, response = applier.apply(operation="delete") - reason_text = '' - if commit: - status = "INACTIVE" - if "reason" in kwargs and kwargs['reason'] == 'EXPIRED': - status = 'EXPIRED' - reason_text = " Reason: %s " % status - try: - snmp_add_initial_zero_value.delay(str(route.id), False) - except Exception as e: - logger.error("edit(): route="+str(route)+", INACTIVE, add_null_value failed: "+str(e)) - else: - status = "ERROR" - route.status = status - route.response = response - route.save() - announce("[%s] Suspending rule : %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route) - except TimeLimitExceeded: - route.status = "ERROR" - route.response = "Task timeout" - route.save() - announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - except SoftTimeLimitExceeded: - route.status = "ERROR" - route.response = "Task timeout" - route.save() - announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - except Exception: - route.status = "ERROR" - route.response = "Error" - route.save() - announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) - - -# May not work in the first place... proxy is not aware of Route models -@task -def batch_delete(routes, **kwargs): - if routes: - for route in routes: - route.status = 'PENDING';route.save() - applier = PR.Applier(route_objects=routes) - conf = applier.delete_routes() - commit, response = applier.apply(configuration=conf) - reason_text = '' - if commit: - status = "INACTIVE" - 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: - route.status = status - route.response = response - route.expires = datetime.date.today() - route.save() - announce("[%s] Rule removal: %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route) - else: - return False - - +## -*- coding: utf-8 -*- vim:fileencoding=utf-8: +## vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab +# +## Copyright (C) 2010-2014 GRNET S.A. +## +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see <http://www.gnu.org/licenses/>. +## +# +#from utils import proxy as PR +#from celery.task import task +##from celery.task.sets import subtask +#import logging +#import json +##from celery.task.http import * +#import beanstalkc +#from django.conf import settings +#import datetime +#from django.core.mail import send_mail +#from django.template.loader import render_to_string +#import os +#from celery.exceptions import TimeLimitExceeded, SoftTimeLimitExceeded +#from ipaddress import * +#from os import fork,_exit +#from sys import exit +#import time +# +#LOG_FILENAME = os.path.join(settings.LOG_FILE_LOCATION, 'celery_jobs.log') +# +# +## FORMAT = '%(asctime)s %(levelname)s: %(message)s' +## logging.basicConfig(format=FORMAT) +#formatter = logging.Formatter('%(asctime)s %(levelname)s: %(message)s') +# +#logger = logging.getLogger(__name__) +#logger.setLevel(logging.DEBUG) +#handler = logging.FileHandler(LOG_FILENAME) +#handler.setFormatter(formatter) +#logger.addHandler(handler) +# +# +#@task(ignore_result=True) +#def add(route, callback=None): +# try: +# applier = PR.Applier(route_object=route) +# commit, response = applier.apply() +# if commit: +# status = "ACTIVE" +# else: +# status = "ERROR" +# route.status = status +# route.response = response +# route.save() +# announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route) +# except TimeLimitExceeded: +# route.status = "ERROR" +# route.response = "Task timeout" +# route.save() +# announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# except SoftTimeLimitExceeded: +# route.status = "ERROR" +# route.response = "Task timeout" +# route.save() +# announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# except Exception: +# route.status = "ERROR" +# route.response = "Error" +# route.save() +# announce("[%s] Rule add: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# +# +#@task(ignore_result=True) +#def edit(route, callback=None): +# try: +# applier = PR.Applier(route_object=route) +# commit, response = applier.apply(operation="replace") +# if commit: +# status = "ACTIVE" +# try: +# snmp_add_initial_zero_value.delay(str(route.id), True) +# except Exception as e: +# logger.error("edit(): route="+str(route)+", ACTIVE, add_initial_zero_value failed: "+str(e)) +# else: +# status = "ERROR" +# route.status = status +# route.response = response +# route.save() +# announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, response), route.applier, route) +# except TimeLimitExceeded: +# route.status = "ERROR" +# route.response = "Task timeout" +# route.save() +# announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# except SoftTimeLimitExceeded: +# route.status = "ERROR" +# route.response = "Task timeout" +# route.save() +# announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# except Exception: +# route.status = "ERROR" +# route.response = "Error" +# route.save() +# announce("[%s] Rule edit: %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# +# +#@task(ignore_result=True) +#def delete(route, **kwargs): +# try: +# applier = PR.Applier(route_object=route) +# commit, response = applier.apply(operation="delete") +# reason_text = '' +# if commit: +# status = "INACTIVE" +# if "reason" in kwargs and kwargs['reason'] == 'EXPIRED': +# status = 'EXPIRED' +# reason_text = " Reason: %s " % status +# try: +# snmp_add_initial_zero_value.delay(str(route.id), False) +# except Exception as e: +# logger.error("edit(): route="+str(route)+", INACTIVE, add_null_value failed: "+str(e)) +# else: +# status = "ERROR" +# route.status = status +# route.response = response +# route.save() +# announce("[%s] Suspending rule : %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route) +# except TimeLimitExceeded: +# route.status = "ERROR" +# route.response = "Task timeout" +# route.save() +# announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# except SoftTimeLimitExceeded: +# route.status = "ERROR" +# route.response = "Task timeout" +# route.save() +# announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# except Exception: +# route.status = "ERROR" +# route.response = "Error" +# route.save() +# announce("[%s] Suspending rule : %s - Result: %s" % (route.applier_username_nice, route.name, route.response), route.applier, route) +# +# +## May not work in the first place... proxy is not aware of Route models +#@task +#def batch_delete(routes, **kwargs): +# if routes: +# for route in routes: +# route.status = 'PENDING';route.save() +# applier = PR.Applier(route_objects=routes) +# conf = applier.delete_routes() +# commit, response = applier.apply(configuration=conf) +# reason_text = '' +# if commit: +# status = "INACTIVE" +# 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: +# route.status = status +# route.response = response +# route.expires = datetime.date.today() +# route.save() +# announce("[%s] Rule removal: %s%s- Result %s" % (route.applier_username_nice, route.name, reason_text, response), route.applier, route) +# else: +# return False +# +# +##@task(ignore_result=True) +#def announce(messg, user, route): +# peers = user.get_profile().peers.all() +# username = None +# for peer in peers: +# if username: +# break +# for network in peer.networks.all(): +# net = IPNetwork(network) +# if IPNetwork(route.destination) in net: +# username = peer.peer_tag +# break +# messg = str(messg) +# b = beanstalkc.Connection() +# b.use(settings.POLLS_TUBE) +# tube_message = json.dumps({'message': messg, 'username': username}) +# b.put(tube_message) +# b.close() +# +# +#@task +#def check_sync(route_name=None, selected_routes=[]): +# from flowspec.models import Route, MatchPort, MatchDscp, ThenAction +# if not selected_routes: +# routes = Route.objects.all() +# else: +# routes = selected_routes +# if route_name: +# routes = routes.filter(name=route_name) +# for route in routes: +# if route.has_expired() and (route.status != 'EXPIRED' and route.status != 'ADMININACTIVE' and route.status != 'INACTIVE'): +# if route.status != 'ERROR': +# logger.info('Expiring %s route %s' %(route.status, route.name)) +# subtask(delete).delay(route, reason="EXPIRED") +# else: +# if route.status != 'EXPIRED': +# route.check_sync() +# +# #@task(ignore_result=True) -def announce(messg, user, route): - peers = user.get_profile().peers.all() - username = None - for peer in peers: - if username: - break - for network in peer.networks.all(): - net = IPNetwork(network) - if IPNetwork(route.destination) in net: - username = peer.peer_tag - break - messg = str(messg) - b = beanstalkc.Connection() - b.use(settings.POLLS_TUBE) - tube_message = json.dumps({'message': messg, 'username': username}) - b.put(tube_message) - b.close() - - -@task -def check_sync(route_name=None, selected_routes=[]): - from flowspec.models import Route, MatchPort, MatchDscp, ThenAction - if not selected_routes: - routes = Route.objects.all() - else: - routes = selected_routes - if route_name: - routes = routes.filter(name=route_name) - for route in routes: - if route.has_expired() and (route.status != 'EXPIRED' and route.status != 'ADMININACTIVE' and route.status != 'INACTIVE'): - if route.status != 'ERROR': - logger.info('Expiring %s route %s' %(route.status, route.name)) - subtask(delete).delay(route, reason="EXPIRED") - else: - if route.status != 'EXPIRED': - route.check_sync() - - -@task(ignore_result=True) -def notify_expired(): - from flowspec.models import * - from django.contrib.sites.models import Site - logger.info('Initializing expiration notification') - routes = Route.objects.all() - for route in routes: - if route.status not in ['EXPIRED', 'ADMININACTIVE', 'INACTIVE', 'ERROR']: - expiration_days = (route.expires - datetime.date.today()).days - if expiration_days < settings.EXPIRATION_NOTIFY_DAYS: - try: - fqdn = Site.objects.get_current().domain - admin_url = "https://%s%s" % \ - (fqdn, - "/edit/%s"%route.name) - mail_body = render_to_string("rule_action.txt", - {"route": route, 'expiration_days':expiration_days, 'action':'expires', 'url':admin_url}) - days_num = ' days' - expiration_days_text = "%s %s" %('in',expiration_days) - if expiration_days == 0: - days_num = ' today' - expiration_days_text = '' - if expiration_days == 1: - days_num = ' day' - logger.info('Route %s expires %s%s. Notifying %s (%s)' %(route.name, expiration_days_text, days_num, route.applier.username, route.applier.email)) - send_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s expires %s%s" % - (route.name,expiration_days_text, days_num), - mail_body, settings.SERVER_EMAIL, - [route.applier.email]) - except Exception as e: - logger.info("Exception: %s"%e) - pass - logger.info('Expiration notification process finished') - -############################################################################## -############################################################################## -# snmp task handling (including helper functions) - -import os -import signal - -def handleSIGCHLD(signal, frame): - logger.info("handleSIGCHLD(): reaping childs") - os.waitpid(-1, os.WNOHANG) - -def snmp_lock_create(wait=0): - first=1 - success=0 - while first or wait: - first=0 - try: - os.mkdir(settings.SNMP_POLL_LOCK) - logger.error("snmp_lock_create(): creating lock dir succeeded") - success=1 - return success - except OSError, e: - logger.error("snmp_lock_create(): creating lock dir failed: OSError: "+str(e)) - success=0 - except Exception as e: - logger.error("snmp_lock_create(): Lock already exists") - logger.error("snmp_lock_create(): creating lock dir failed: "+str(e)) - success=0 - if not success and wait: - time.sleep(1) - return success; - -def snmp_lock_remove(): - try: - os.rmdir(settings.SNMP_POLL_LOCK) - except Exception as e: - logger.info("snmp_lock_remove(): failed "+str(e)) - -def exit_process(): - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")") - exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit") - sys.exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit") - os._exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit") - -#@task(ignore_result=True, time_limit=580, soft_time_limit=550) -@task(ignore_result=True, max_retries=0) -def poll_snmp_statistics(): - from flowspec import snmpstats - - if not snmp_lock_create(0): - return - - signal.signal(signal.SIGCHLD, handleSIGCHLD) - - pid = os.getpid() - logger.info("poll_snmp_statistics(): before fork (pid="+str(pid)+")") - npid = os.fork() - if npid == -1: - pass - elif npid > 0: - logger.info("poll_snmp_statistics(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")") - else: - logger.info("poll_snmp_statistics(): in child process (pid="+str(pid)+", npid="+str(npid)+")") - try: - snmpstats.poll_snmp_statistics() - except e: - logger.error("poll_snmp_statistics(): exception occured in snmp poll (pid="+str(pid)+", npid="+str(npid)+"): "+str(e)) - snmp_lock_remove() - #exit_process() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")") - exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit") - sys.exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit") - os._exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit") - -@task(ignore_result=True, max_retries=0) -def snmp_add_initial_zero_value(rule_id, zero_or_null=True): - from flowspec import snmpstats - - signal.signal(signal.SIGCHLD, handleSIGCHLD) - - pid = os.getpid() - logger.info("snmp_add_initial_zero_value(): before fork (pid="+str(pid)+")") - npid = os.fork() - if npid == -1: - pass - elif npid > 0: - logger.info("snmp_add_initial_zero_value(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")") - else: - logger.info("snmp_add_initial_zero_value(): in child process (pid="+str(pid)+", npid="+str(npid)+")") - - try: - snmpstats.add_initial_zero_value(rule_id, zero_or_null) - logger.info("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" sucesss") - except Exception as e: - logger.error("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" failed: "+str(e)) - - #exit_process() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")") - exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit") - sys.exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit") - os._exit() - logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit") - - +#def notify_expired(): +# from flowspec.models import * +# from django.contrib.sites.models import Site +# logger.info('Initializing expiration notification') +# routes = Route.objects.all() +# for route in routes: +# if route.status not in ['EXPIRED', 'ADMININACTIVE', 'INACTIVE', 'ERROR']: +# expiration_days = (route.expires - datetime.date.today()).days +# if expiration_days < settings.EXPIRATION_NOTIFY_DAYS: +# try: +# fqdn = Site.objects.get_current().domain +# admin_url = "https://%s%s" % \ +# (fqdn, +# "/edit/%s"%route.name) +# mail_body = render_to_string("rule_action.txt", +# {"route": route, 'expiration_days':expiration_days, 'action':'expires', 'url':admin_url}) +# days_num = ' days' +# expiration_days_text = "%s %s" %('in',expiration_days) +# if expiration_days == 0: +# days_num = ' today' +# expiration_days_text = '' +# if expiration_days == 1: +# days_num = ' day' +# logger.info('Route %s expires %s%s. Notifying %s (%s)' %(route.name, expiration_days_text, days_num, route.applier.username, route.applier.email)) +# send_mail(settings.EMAIL_SUBJECT_PREFIX + "Rule %s expires %s%s" % +# (route.name,expiration_days_text, days_num), +# mail_body, settings.SERVER_EMAIL, +# [route.applier.email]) +# except Exception as e: +# logger.info("Exception: %s"%e) +# pass +# logger.info('Expiration notification process finished') +# +############################################################################### +############################################################################### +## snmp task handling (including helper functions) +# +#import os +#import signal +# +#def handleSIGCHLD(signal, frame): +# logger.info("handleSIGCHLD(): reaping childs") +# os.waitpid(-1, os.WNOHANG) +# +#def snmp_lock_create(wait=0): +# first=1 +# success=0 +# while first or wait: +# first=0 +# try: +# os.mkdir(settings.SNMP_POLL_LOCK) +# logger.error("snmp_lock_create(): creating lock dir succeeded") +# success=1 +# return success +# except OSError as e: +# logger.error("snmp_lock_create(): creating lock dir failed: OSError: "+str(e)) +# success=0 +# except Exception as e: +# logger.error("snmp_lock_create(): Lock already exists") +# logger.error("snmp_lock_create(): creating lock dir failed: "+str(e)) +# success=0 +# if not success and wait: +# time.sleep(1) +# return success; +# +#def snmp_lock_remove(): +# try: +# os.rmdir(settings.SNMP_POLL_LOCK) +# except Exception as e: +# logger.info("snmp_lock_remove(): failed "+str(e)) +# +#def exit_process(): +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")") +# exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit") +# sys.exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit") +# os._exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit") +# +##@task(ignore_result=True, time_limit=580, soft_time_limit=550) +#@task(ignore_result=True, max_retries=0) +#def poll_snmp_statistics(): +# from flowspec import snmpstats +# +# if not snmp_lock_create(0): +# return +# +# signal.signal(signal.SIGCHLD, handleSIGCHLD) +# +# pid = os.getpid() +# logger.info("poll_snmp_statistics(): before fork (pid="+str(pid)+")") +# npid = os.fork() +# if npid == -1: +# pass +# elif npid > 0: +# logger.info("poll_snmp_statistics(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")") +# else: +# logger.info("poll_snmp_statistics(): in child process (pid="+str(pid)+", npid="+str(npid)+")") +# try: +# snmpstats.poll_snmp_statistics() +# except e: +# logger.error("poll_snmp_statistics(): exception occured in snmp poll (pid="+str(pid)+", npid="+str(npid)+"): "+str(e)) +# snmp_lock_remove() +# #exit_process() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")") +# exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit") +# sys.exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit") +# os._exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit") +# +#@task(ignore_result=True, max_retries=0) +#def snmp_add_initial_zero_value(rule_id, zero_or_null=True): +# from flowspec import snmpstats +# +# signal.signal(signal.SIGCHLD, handleSIGCHLD) +# +# pid = os.getpid() +# logger.info("snmp_add_initial_zero_value(): before fork (pid="+str(pid)+")") +# npid = os.fork() +# if npid == -1: +# pass +# elif npid > 0: +# logger.info("snmp_add_initial_zero_value(): returning in parent process (pid="+str(pid)+", npid="+str(npid)+")") +# else: +# logger.info("snmp_add_initial_zero_value(): in child process (pid="+str(pid)+", npid="+str(npid)+")") +# +# try: +# snmpstats.add_initial_zero_value(rule_id, zero_or_null) +# logger.info("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" sucesss") +# except Exception as e: +# logger.error("snmp_add_initial_zero_value(): rule_id="+str(rule_id)+" failed: "+str(e)) +# +# #exit_process() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+")") +# exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after exit") +# sys.exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after sys.exit") +# os._exit() +# logger.info("exit_process(): before exit in child process (pid="+str(pid)+", npid="+str(npid)+"), after os._exit") +# +# diff --git a/flowspec/templatetags/unescape.py b/flowspec/templatetags/unescape.py index 9194e4dca80c59066bd2dd76244d82a00cb6a936..0cf4ce16b4a46137cd65820f1253479c8a9e7851 100644 --- a/flowspec/templatetags/unescape.py +++ b/flowspec/templatetags/unescape.py @@ -1,9 +1,9 @@ from django import template from django.utils.safestring import mark_safe -from django.utils.encoding import force_unicode +from django.utils.encoding import force_text register = template.Library() @register.filter def unescape(value): - return mark_safe(force_unicode(value).replace('<', '<').replace('>', '>').replace('"', '"').replace(''', "'").replace('&', '&')) + return mark_safe(force_text(value).replace('<', '<').replace('>', '>').replace('"', '"').replace(''', "'").replace('&', '&')) diff --git a/flowspec/validators.py b/flowspec/validators.py index efa55b2ae827870a0029ebb90bdc80b9b9c83413..a9929bb1bbfbc20e93db57bf1ee2dc9a006633cd 100644 --- a/flowspec/validators.py +++ b/flowspec/validators.py @@ -1,16 +1,16 @@ -from ipaddr import IPNetwork +from ipaddress import ip_network import datetime from django.conf import settings from django.core.mail import send_mail from django.utils.translation import ugettext as _ from peers.models import PeerRange, Peer from flowspec.models import Route -from django.core.urlresolvers import reverse +from django.urls import reverse def get_network(ip): try: - address = IPNetwork(ip) + address = ip_network(ip) except Exception: return (False, _('Invalid network address format')) else: @@ -54,7 +54,7 @@ def clean_source(user, source): if not success: return address for net in settings.PROTECTED_SUBNETS: - if address in IPNetwork(net): + if address in ip_network(net): mail_body = "User %s %s attempted to set %s as the source address in a firewall rule" % (user.username, user.email, source) send_mail( settings.EMAIL_SUBJECT_PREFIX + "Caught an attempt to set a protected IP/network as a source address", @@ -72,7 +72,7 @@ def clean_destination(user, destination): if not success: return address for net in settings.PROTECTED_SUBNETS: - if address in IPNetwork(net): + if address in ip_network(net): mail_body = "User %s %s attempted to set %s as the destination address in a firewall rule" % (user.username, user.email, destination) send_mail( settings.EMAIL_SUBJECT_PREFIX + "Caught an attempt to set a protected IP/network as the destination address", @@ -98,8 +98,8 @@ def clean_destination(user, destination): networks = PeerRange.objects.filter(peer__in=Peer.objects.all()).distinct() network_is_mine = False for network in networks: - net = IPNetwork(network.network) - if IPNetwork(destination) in net: + net = ip_network(network.network) + if ip_network(destination) in net: network_is_mine = True if not network_is_mine: return (_('Destination address/network should belong to your administrative address space. Check My Profile to review your networks')) @@ -185,7 +185,7 @@ def check_if_rule_exists(fields, queryset): routes = queryset.filter( source=fields.get('source'), - destination=IPNetwork(fields.get('destination')).compressed, + destination=ip_network(fields.get('destination')).compressed, ) if routes: ids = [str(item[0]) for item in routes.values_list('pk')] @@ -195,7 +195,7 @@ def check_if_rule_exists(fields, queryset): routes = Route.objects.filter( source=fields.get('source'), - destination=IPNetwork(fields.get('destination')).compressed, + destination=ip_network(fields.get('destination')).compressed, ) for route in routes: return ( diff --git a/flowspec/views.py b/flowspec/views.py index b95855336ae5bbecb2c32c7105b345d9588e9188..dcdd994bd74a6ccf65a959defb2ff8e2d3f2dfca 100644 --- a/flowspec/views.py +++ b/flowspec/views.py @@ -24,14 +24,14 @@ from django.contrib.auth import logout from django.contrib.sites.models import Site from django.contrib.auth.models import User from django.http import HttpResponseRedirect, HttpResponse -from django.shortcuts import get_object_or_404, render_to_response, render +from django.shortcuts import get_object_or_404, render from django.template.context import RequestContext from django.template.loader import render_to_string from django.utils.translation import ugettext as _ -from django.core.urlresolvers import reverse +from django.urls import reverse from django.contrib import messages from accounts.models import * -from ipaddr import * +from ipaddress import * from django.db.models import Q from django.contrib.auth import authenticate, login @@ -41,7 +41,8 @@ from flowspec.forms import * from flowspec.models import * from peers.models import * -from registration.models import RegistrationProfile +#TODO re-enable +#from django_registration.models import RegistrationProfile from copy import deepcopy @@ -82,7 +83,6 @@ def welcome(request): return render( request, 'welcome.html', - {} ) @@ -93,7 +93,7 @@ def dashboard(request): message = '' #message = eee.aa try: - peers = request.user.get_profile().peers.select_related('user_profile') + peers = request.user.userprofile.peers.select_related() except UserProfile.DoesNotExist: error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username return render( @@ -142,7 +142,7 @@ def dashboard(request): @never_cache def group_routes(request): try: - request.user.get_profile().peers.all() + request.user.userprofile.peers.select_related() except UserProfile.DoesNotExist: error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username return render( @@ -164,7 +164,7 @@ def group_routes(request): def group_routes_ajax(request): all_group_routes = [] try: - peers = request.user.get_profile().peers.prefetch_related('networks') + peers = request.user.userprofile.peers.prefetch_related('networks') except UserProfile.DoesNotExist: error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username return render( @@ -182,7 +182,7 @@ def group_routes_ajax(request): jresp = {} routes = build_routes_json(all_group_routes, request.user.is_superuser) jresp['aaData'] = routes - return HttpResponse(json.dumps(jresp), mimetype='application/json') + return HttpResponse(json.dumps(jresp), content_type='application/json') @login_required @@ -190,10 +190,11 @@ def group_routes_ajax(request): def overview_routes_ajax(request): all_group_routes = [] try: - peers = request.user.get_profile().peers.all().select_related() + # TODO all()? + peers = request.user.userprofile.peers.all().select_related() except UserProfile.DoesNotExist: error = "User <strong>%s</strong> does not belong to any peer or organization. It is not possible to create new firewall rules.<br>Please contact Helpdesk to resolve this issue" % request.user.username - return render_to_response('error.html', {'error': error}, context_instance=RequestContext(request)) + return render(request, 'error.html', {'error': error}) query = Q() for peer in peers: query |= Q(applier__userprofile__in=peer.user_profile.all()) @@ -203,7 +204,7 @@ def overview_routes_ajax(request): jresp = {} routes = build_routes_json(all_group_routes, request.user.is_superuser) jresp['aaData'] = routes - return HttpResponse(json.dumps(jresp), mimetype='application/json') + return HttpResponse(json.dumps(jresp), content_type='application/json') def build_routes_json(groutes, is_superuser): @@ -242,14 +243,14 @@ def build_routes_json(groutes, is_superuser): rd['applier'] = 'unknown' rd['peer'] = '' else: - peers = r.applier.get_profile().peers.select_related('networks') + peers = r.applier.userprofile.peers.select_related('networks') username = None for peer in peers: if username: break for network in peer.networks.all(): - net = IPNetwork(network) - if IPNetwork(r.destination) in net: + net = ip_network(network) + if ip_network(r.destination) in net: username = peer.peer_name break try: @@ -271,7 +272,8 @@ def add_route(request): if request.user.is_superuser: applier_peer_networks = PeerRange.objects.all() else: - user_peers = request.user.get_profile().peers.all() + # TODO all()? + user_peers = request.user.userprofile.peers.all() for peer in user_peers: applier_peer_networks.extend(peer.networks.all()) if not applier_peer_networks: @@ -286,10 +288,9 @@ def add_route(request): if not request.user.is_superuser: form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True) form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False) - return render_to_response('apply.html', {'form': form, + return render(request, 'apply.html', {'form': form, 'applier': applier, - 'maxexpires': settings.MAX_RULE_EXPIRE_DAYS }, - context_instance=RequestContext(request)) + 'maxexpires': settings.MAX_RULE_EXPIRE_DAYS }) else: request_data = request.POST.copy() @@ -308,8 +309,8 @@ def add_route(request): route.applier = request.user route.status = "PENDING" route.response = "Applying" - route.source = IPNetwork('%s/%s' % (IPNetwork(route.source).network.compressed, IPNetwork(route.source).prefixlen)).compressed - route.destination = IPNetwork('%s/%s' % (IPNetwork(route.destination).network.compressed, IPNetwork(route.destination).prefixlen)).compressed + route.source = ip_network('%s/%s' % (ip_network(route.source).network.compressed, ip_network(route.source).prefixlen)).compressed + route.destination = ip_network('%s/%s' % (ip_network(route.destination).network.compressed, ip_network(route.destination).prefixlen)).compressed try: route.requesters_address = request.META['HTTP_X_FORWARDED_FOR'] except: @@ -346,7 +347,7 @@ def edit_route(request, route_slug): if request.user.is_superuser: applier_peer_networks = PeerRange.objects.all() else: - user_peers = request.user.get_profile().peers.all() + user_peers = request.user.userprofile.peers.all() for peer in user_peers: applier_peer_networks.extend(peer.networks.all()) if not applier_peer_networks: @@ -390,8 +391,8 @@ def edit_route(request, route_slug): if bool(set(changed_data) & set(critical_changed_values)) or (not route_original.status == 'ACTIVE'): route.status = "PENDING" route.response = "Applying" - route.source = IPNetwork('%s/%s' % (IPNetwork(route.source).network.compressed, IPNetwork(route.source).prefixlen)).compressed - route.destination = IPNetwork('%s/%s' % (IPNetwork(route.destination).network.compressed, IPNetwork(route.destination).prefixlen)).compressed + route.source = ip_network('%s/%s' % (ip_network(route.source).network.compressed, ip_network(route.source).prefixlen)).compressed + route.destination = ip_network('%s/%s' % (ip_network(route.destination).network.compressed, ip_network(route.destination).prefixlen)).compressed try: route.requesters_address = request.META['HTTP_X_FORWARDED_FOR'] except: @@ -407,16 +408,13 @@ def edit_route(request, route_slug): if not request.user.is_superuser: form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True) form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False) - return render_to_response( - 'apply.html', + return render(request, 'apply.html', { 'form': form, 'edit': True, 'applier': applier, 'maxexpires': settings.MAX_RULE_EXPIRE_DAYS - }, - context_instance=RequestContext(request) - ) + }) else: if (not route_original.status == 'ACTIVE'): route_edit.expires = datetime.date.today() + datetime.timedelta(days=settings.EXPIRATION_DAYS_OFFSET-1) @@ -432,16 +430,13 @@ def edit_route(request, route_slug): if not request.user.is_superuser: form.fields['then'] = forms.ModelMultipleChoiceField(queryset=ThenAction.objects.filter(action__in=settings.UI_USER_THEN_ACTIONS).order_by('action'), required=True) form.fields['protocol'] = forms.ModelMultipleChoiceField(queryset=MatchProtocol.objects.filter(protocol__in=settings.UI_USER_PROTOCOLS).order_by('protocol'), required=False) - return render_to_response( - 'apply.html', + return render(request, 'apply.html', { 'form': form, 'edit': True, 'applier': applier, 'maxexpires': settings.MAX_RULE_EXPIRE_DAYS - }, - context_instance=RequestContext(request) - ) + }) @login_required @@ -449,25 +444,25 @@ def edit_route(request, route_slug): def delete_route(request, route_slug): if request.is_ajax(): route = get_object_or_404(Route, name=route_slug) - peers = route.applier.get_profile().peers.all() + peers = route.applier.userprofile.peers.all() username = None for peer in peers: if username: break for network in peer.networks.all(): - net = IPNetwork(network) - if IPNetwork(route.destination) in net: + net = ip_network(network) + if ip_network(route.destination) in net: username = peer break applier_peer = username - peers = request.user.get_profile().peers.all() + peers = request.user.userprofile.peers.all() username = None for peer in peers: if username: break for network in peer.networks.all(): - net = IPNetwork(network) - if IPNetwork(route.destination) in net: + net = ip_network(network) + if ip_network(route.destination) in net: username = peer break requester_peer = username @@ -495,7 +490,7 @@ def delete_route(request, route_slug): def user_profile(request): user = request.user try: - peers = request.user.get_profile().peers.all() + peers = request.user.userprofile.peers.all() if user.is_superuser: peers = Peer.objects.all() except UserProfile.DoesNotExist: @@ -617,12 +612,12 @@ def user_login(request): if user is not None: try: - user.get_profile().peers.all() + user.userprofile.peers.all() except: form = UserProfileForm() form.fields['user'] = forms.ModelChoiceField(queryset=User.objects.filter(pk=user.pk), empty_label=None) form.fields['peer'] = forms.ModelChoiceField(queryset=Peer.objects.all(), empty_label=None) - return render_to_response('registration/select_institution.html', {'form': form}, context_instance=RequestContext(request)) + return render(request, 'registration/select_institution.html', {'form': form}) if not user_exists: user_activation_notify(user) if user.is_active: @@ -659,7 +654,7 @@ def user_login(request): def user_activation_notify(user): if not settings.DISABLE_EMAIL_NOTIFICATION: current_site = Site.objects.get_current() - peers = user.get_profile().peers.all() + peers = user.userprofile.peers.all() # Email subject *must not* contain newlines # TechCs will be notified about new users. @@ -671,11 +666,12 @@ def user_activation_notify(user): } ) subject = ''.join(subject.splitlines()) - registration_profile = RegistrationProfile.objects.create_profile(user) + #TODO registration_profile = RegistrationProfile.objects.create_profile(user) + registration_profile="TODO - key" message = render_to_string( 'registration/activation_email.txt', { - 'activation_key': registration_profile.activation_key, + 'activation_key': registration_profile, #TODO registration_profile.activation_key, 'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS, 'site': current_site, 'user': user @@ -742,7 +738,7 @@ def add_rate_limit(request): response_data['value'] = "%s:%s" % (then.action, then.action_value) return HttpResponse( json.dumps(response_data), - mimetype='application/json' + content_type='application/json' ) else: return render( @@ -775,7 +771,7 @@ def add_port(request): response_data['text'] = "%s" % port.port return HttpResponse( json.dumps(response_data), - mimetype='application/json' + content_type='application/json' ) else: return render( @@ -832,7 +828,7 @@ def selectinst(request): @never_cache def overview(request): user = request.user - if user.is_authenticated(): + if user.is_authenticated: if user.has_perm('accounts.overview'): users = User.objects.all() return render( @@ -865,7 +861,7 @@ def user_logout(request): @never_cache def load_jscript(request, file): long_polling_timeout = int(settings.POLL_SESSION_UPDATE) * 1000 + 10000 - return render_to_response('%s.js' % file, {'timeout': long_polling_timeout}, context_instance=RequestContext(request), mimetype="text/javascript") + return render(request, '%s.js' % file, {'timeout': long_polling_timeout}, content_type="text/javascript") def lookupShibAttr(attrmap, requestMeta): @@ -907,18 +903,18 @@ def routestats(request, route_slug): raise Exception("No data stored in the existing file.") if settings.STATISTICS_PER_RULE==False: if routename in res: - return HttpResponse(json.dumps({"name": routename, "data": res[routename]}), mimetype="application/json") + return HttpResponse(json.dumps({"name": routename, "data": res[routename]}), content_type="application/json") else: - return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(routename)}), mimetype="application/json", status=404) + return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(routename)}), content_type="application/json", status=404) else: if route_id in res['_per_rule']: - return HttpResponse(json.dumps({"name": routename, "data": res['_per_rule'][route_id]}), mimetype="application/json") + return HttpResponse(json.dumps({"name": routename, "data": res['_per_rule'][route_id]}), content_type="application/json") else: - return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(route_id)}), mimetype="application/json", status=404) + return HttpResponse(json.dumps({"error": "Route '{}' was not found in statistics.".format(route_id)}), content_type="application/json", status=404) except Exception as e: logger.error('routestats failed: %s' % e) - return HttpResponse(json.dumps({"error": "No data available. %s" % e}), mimetype="application/json", status=404) + return HttpResponse(json.dumps({"error": "No data available. %s" % e}), content_type="application/json", status=404) def setup(request): if User.objects.count() == 0: diff --git a/flowspy/__init__.py b/flowspy/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c7cbc1bd0f8c1c440255ef24488e213d3e2141e5 100644 --- a/flowspy/__init__.py +++ b/flowspy/__init__.py @@ -0,0 +1,8 @@ +#from __future__ import absolute_import, unicode_literals + +# This will make sure the app is always imported when +# Django starts so that shared_task will use this app. +from .celery import app as celery_app + +__all__ = ('celery_app',) + diff --git a/flowspy/celery.py b/flowspy/celery.py new file mode 100644 index 0000000000000000000000000000000000000000..6e4f3cdfd60d301d5d3854e9ff529cf1afef5bfb --- /dev/null +++ b/flowspy/celery.py @@ -0,0 +1,22 @@ +from __future__ import absolute_import, unicode_literals +import os +from celery import Celery + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'flowspy.settings') + +app = Celery('flowspy') + +# Using a string here means the worker doesn't have to serialize +# the configuration object to child processes. +# - namespace='CELERY' means all celery-related configuration keys +# should have a `CELERY_` prefix. +app.config_from_object('django.conf:settings', namespace='CELERY') + +# Load task modules from all registered Django app configs. +app.autodiscover_tasks() + + +@app.task(bind=True) +def debug_task(self): + print('Request: {0!r}'.format(self.request)) diff --git a/flowspy/settings.py.dist b/flowspy/settings.py.dist index be062610e22ac9c4e635bb4043c87167697a042b..594b18a938a4a73b07bf15f6ca2188c2f144cbe3 100644 --- a/flowspy/settings.py.dist +++ b/flowspy/settings.py.dist @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- vim:fileencoding=utf-8: # vim: tabstop=4:shiftwidth=4:softtabstop=4:expandtab # Django settings for flowspy project. -# Copyright © 2011-2015 Greek Research and Technology Network (GRNET S.A.) -# Copyright © 2011-2014 Leonidas Poulopoulos (@leopoul) -# Copyright © 2014-2015 Stavros Kroustouris (@kroustou) +# Copyright © 2011-2015 Greek Research and Technology Network (GRNET S.A.) +# Copyright © 2011-2014 Leonidas Poulopoulos (@leopoul) +# Copyright © 2014-2015 Stavros Kroustouris (@kroustou) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,8 +28,6 @@ except ImportError: _uuid_generate_random = None import os -import djcelery -djcelery.setup_loader() from celery.schedules import crontab DEBUG = False @@ -97,7 +95,9 @@ USE_L10N = True # If you set this to False, Django will not use timezone-aware datetimes. USE_TZ = True -STATIC_ROOT = os.path.join(BASE_DIR, 'static') +PROJECT_PATH = os.path.abspath(os.path.dirname(__file__)) +STATIC_ROOT = os.path.join(BASE_DIR) +STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] STATIC_URL = '/static/' STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', @@ -105,8 +105,25 @@ STATICFILES_FINDERS = ( ) # Templates + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + os.path.join(BASE_DIR, 'templates'), + os.path.join('/srv/venv/django/contrib/admin/templates/'), + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + "django.contrib.auth.context_processors.auth", + 'django_settings_export.settings_export', + ] + }, + }, +] TEMPLATE_DIRS = ( - os.path.join(BASE_DIR, 'templates'), + ) TEMPLATE_LOADERS = ( @@ -124,14 +141,16 @@ TEMPLATE_CONTEXT_PROCESSORS = ( "context.global_vars.settings_vars", ) -MIDDLEWARE_CLASSES = ( - 'django.middleware.cache.UpdateCacheMiddleware', - 'django.middleware.common.CommonMiddleware', +MIDDLEWARE = ( + 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.locale.LocaleMiddleware', + 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'django.middleware.cache.UpdateCacheMiddleware', + 'django.middleware.locale.LocaleMiddleware', 'django.middleware.cache.FetchFromCacheMiddleware', 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', ) @@ -155,11 +174,9 @@ INSTALLED_APPS = ( 'django.contrib.staticfiles', 'flowspec', 'poller', - 'south', 'django.contrib.admin', - 'djcelery', 'peers', - 'registration', + #'registration', 'accounts', 'tinymce', 'widget_tweaks', @@ -258,12 +275,12 @@ POLL_SESSION_UPDATE = 60.0 CELERYBEAT_SCHEDULE = { "every-day-sync": { "task": "flowspec.tasks.check_sync", - "schedule": crontab(minute=01, hour=01), + "schedule": crontab(minute="01", hour="01"), "args": (), }, "notify-expired": { "task": "flowspec.tasks.notify_expired", - "schedule": crontab(minute=01, hour=02), + "schedule": crontab(minute="01", hour="02"), "args": (), }, "snmp-stats-poll": { @@ -469,3 +486,7 @@ STATISTICS_PER_RULE__ADD_INITIAL_ZERO = True ############################################################################## ############################################################################## +SETTINGS_EXPORT = [ + 'BRANDING', +] + diff --git a/flowspy/urls.py b/flowspy/urls.py index 71c80a72d11a5344ba2dc1d63a7319489bfa8cc9..7681a7c14ab2fa5afb5b43a31c4dfa74d268b8d1 100644 --- a/flowspy/urls.py +++ b/flowspy/urls.py @@ -1,8 +1,12 @@ -from django.conf.urls import patterns, include, url -from django.views.generic.simple import direct_to_template +from django.conf.urls import include, url +from django.urls import path +from django.views.generic import TemplateView from django.conf import settings from django.contrib import admin +from django.contrib.auth.views import LoginView from rest_framework import routers +from flowspec import views as flowspec_views +from accounts import views as accounts_views from flowspec.viewsets import ( RouteViewSet, PortViewSet, @@ -24,51 +28,40 @@ router.register(r'matchprotocol', MatchProtocolViewSet) router.register(r'matchdscp', MatchDscpViewSet) -urlpatterns = patterns( - '', - (r'^poll/', include('poller.urls')), - url(r'^/?$', 'flowspec.views.group_routes', name="group-routes"), - url(r'^routes_ajax/?$', 'flowspec.views.group_routes_ajax', name="group-routes-ajax"), - url(r'^overview_ajax/?$', 'flowspec.views.overview_routes_ajax', name="overview-ajax"), - url(r'^dashboard/$', 'flowspec.views.dashboard', name="dashboard"), - url(r'^profile/?$', 'flowspec.views.user_profile', name="user-profile"), - url(r'^profile/token/$', 'accounts.views.generate_token', name="user-profile-token"), - url(r'^add/?$', 'flowspec.views.add_route', name="add-route"), - url(r'^addport/?$', 'flowspec.views.add_port', name="add-port"), - url(r'^edit/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.edit_route', name="edit-route"), - url(r'^delete/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.delete_route', name="delete-route"), - url(r'^login/?', 'flowspec.views.user_login', name="login"), - url(r'^welcome/?', 'flowspec.views.welcome', name="welcome"), - url(r'^logout/?', 'flowspec.views.user_logout', name="logout"), - (r'^setlang/?$', 'django.views.i18n.set_language'), - url(r'^selectinst/?$', 'flowspec.views.selectinst', name="selectinst"), - url(r'^accounts/activate/(?P<activation_key>\w+)/$', 'accounts.views.activate', name='activate_account'), - url(r'^load_js/(?P<file>[\w\s\d_-]+)/$', 'flowspec.views.load_jscript', name="load-js"), - url( - r'^activate/complete/$', - direct_to_template, - {'template': 'registration/activation_complete.html'}, - name='registration_activation_complete' - ), - (r'^admin/', include(admin.site.urls)), - (r'^tinymce/', include('tinymce.urls')), - url( - r'^altlogin/?', - 'django.contrib.auth.views.login', - {'template_name': 'overview/login.html'}, name="altlogin" - ), - url(r'^overview/?$', 'flowspec.views.overview', name="overview"), +urlpatterns = [ + path('poll/', include('poller.urls')), + path('', flowspec_views.group_routes, name="group-routes"), + url(r'^routes_ajax/?$', flowspec_views.group_routes_ajax, name="group-routes-ajax"), + url(r'^overview_ajax/?$', flowspec_views.overview_routes_ajax, name="overview-ajax"), + path('dashboard/', flowspec_views.dashboard, name="dashboard"), + url(r'^profile/?$', flowspec_views.user_profile, name="user-profile"), + url(r'^add/?$', flowspec_views.add_route, name="add-route"), + url(r'^addport/?$', flowspec_views.add_port, name="add-port"), + url(r'^edit/(?P<route_slug>[\w\-]+)/$', flowspec_views.edit_route, name="edit-route"), + url(r'^delete/(?P<route_slug>[\w\-]+)/$', flowspec_views.delete_route, name="delete-route"), + url(r'^login/?', flowspec_views.user_login, name="login"), + path('welcome/', flowspec_views.welcome, name="welcome"), + url(r'^logout/?', flowspec_views.user_logout, name="logout"), + # TODO (r'^setlang/?$', django.views.i18n.set_language), + path('/', include('django.conf.urls.i18n')), + url(r'^selectinst/?$', flowspec_views.selectinst, name="selectinst"), + url(r'^profile/token/$', accounts_views.generate_token, name="user-profile-token"), + url(r'^accounts/activate/(?P<activation_key>\w+)/$', accounts_views.activate, name='activate_account'), + url(r'^load_js/(?P<file>[\w\s\d_-]+)/$', flowspec_views.load_jscript, name="load-js"), + url(r'^activate/complete/$', TemplateView.as_view(template_name='templates/registration/activation_complete.html'), name='registration_activation_complete'), + path('altlogin/', LoginView.as_view(template_name='overview/login.html'), name="altlogin"), + path('admin/', admin.site.urls), + path('tinymce/', include('tinymce.urls')), + url(r'^overview/?$', flowspec_views.overview, name="overview"), url(r'^api/', include(router.urls)), - url(r'^details/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.routedetails', name="route-details"), - url(r'^routestats/(?P<route_slug>[\w\-]+)/$', 'flowspec.views.routestats', name="routestats"), - url(r'^admin/', include(admin.site.urls)), - url(r'^setup/', 'flowspec.views.setup', name='setup'), -) + url(r'^details/(?P<route_slug>[\w\-]+)/$', flowspec_views.routedetails, name="route-details"), + url(r'^routestats/(?P<route_slug>[\w\-]+)/$', flowspec_views.routestats, name="routestats"), + url(r'^setup/', flowspec_views.setup, name='setup'), +] if 'graphs' in settings.INSTALLED_APPS: from graphs import urls as graphs_urls - urlpatterns += ( - '', url(r'^graphs/', include(graphs_urls)),) + urlpatterns += ('', url(r'^graphs/', include('graphs.urls')),) try: diff --git a/longerusername/migrations/0001_initial.py b/longerusername/migrations.backup/0001_initial.py similarity index 100% rename from longerusername/migrations/0001_initial.py rename to longerusername/migrations.backup/0001_initial.py diff --git a/longerusername/migrations.backup/__init__.py b/longerusername/migrations.backup/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/peers/admin.py b/peers/admin.py index 1f85466e824d8547789565341174df197df725e6..49a3795af96182fa6a8dc5cd250da2bfba2a1378 100644 --- a/peers/admin.py +++ b/peers/admin.py @@ -40,6 +40,7 @@ class PeerAdminForm(ModelForm): class Meta: model = Peer + fields = "__all__" class PeerAdmin(admin.ModelAdmin): diff --git a/peers/migrations.backup/0001_initial.py b/peers/migrations.backup/0001_initial.py new file mode 100644 index 0000000000000000000000000000000000000000..f5c7d8007016084f850d6227a2c4cd89f0513259 --- /dev/null +++ b/peers/migrations.backup/0001_initial.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models +from django.conf import settings + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'PeerRange' + if settings.PEER_RANGE_MANAGED_TABLE: + db.create_table(u'peer_range', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('network', self.gf('django.db.models.fields.CharField')(max_length=128)), + )) + db.send_create_signal('peers', ['PeerRange']) + + # Adding model 'TechcEmail' + if settings.PEER_TECHC_MANAGED_TABLE: + db.create_table('techc_email', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('email', self.gf('django.db.models.fields.CharField')(max_length=352, db_column='email')), + )) + db.send_create_signal('peers', ['TechcEmail']) + + # Adding model 'Peer' + if settings.PEER_MANAGED_TABLE: + db.create_table(u'peer', ( + ('peer_id', self.gf('django.db.models.fields.IntegerField')(primary_key=True)), + ('peer_name', self.gf('django.db.models.fields.CharField')(max_length=128)), + ('peer_as', self.gf('django.db.models.fields.IntegerField')()), + ('peer_tag', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('domain_name', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)), + )) + db.send_create_signal('peers', ['Peer']) + + # Adding M2M table for field networks on 'Peer' + if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE: + db.create_table(u'peer_networks', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('peer', models.ForeignKey(orm['peers.peer'], null=False)), + ('peerrange', models.ForeignKey(orm['peers.peerrange'], null=False)) + )) + db.create_unique(u'peer_networks', ['peer_id', 'peerrange_id']) + + # Adding M2M table for field techc_emails on 'Peer' + if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE: + db.create_table(u'peer_techc_emails', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('peer', models.ForeignKey(orm['peers.peer'], null=False)), + ('techcemail', models.ForeignKey(orm['peers.techcemail'], null=False)) + )) + db.create_unique(u'peer_techc_emails', ['peer_id', 'techcemail_id']) + + def backwards(self, orm): + # Deleting model 'PeerRange' + if settings.PEER_RANGE_MANAGED_TABLE: + db.delete_table(u'peer_range') + + # Deleting model 'TechcEmail' + if settings.PEER_TECHC_MANAGED_TABLE: + db.delete_table('techc_email') + + # Deleting model 'Peer' + if settings.PEER_MANAGED_TABLE: + db.delete_table(u'peer') + + # Removing M2M table for field networks on 'Peer' + if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE: + db.delete_table('peer_networks') + + # Removing M2M table for field techc_emails on 'Peer' + if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE: + db.delete_table('peer_techc_emails') + + models = { + 'peers.peer': { + 'Meta': {'ordering': "['peer_name']", 'object_name': 'Peer', 'db_table': "u'peer'"}, + 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), + 'peer_as': ('django.db.models.fields.IntegerField', [], {}), + 'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), + 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) + }, + 'peers.peerrange': { + 'Meta': {'ordering': "['network']", 'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) + }, + 'peers.techcemail': { + 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, + 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['peers'] diff --git a/peers/migrations/0002_auto__chg_field_peer_peer_id.py b/peers/migrations.backup/0002_auto__chg_field_peer_peer_id.py similarity index 100% rename from peers/migrations/0002_auto__chg_field_peer_peer_id.py rename to peers/migrations.backup/0002_auto__chg_field_peer_peer_id.py diff --git a/peers/migrations/0003_auto__add_peernotify__chg_field_peer_peer_as.py b/peers/migrations.backup/0003_auto__add_peernotify__chg_field_peer_peer_as.py similarity index 100% rename from peers/migrations/0003_auto__add_peernotify__chg_field_peer_peer_as.py rename to peers/migrations.backup/0003_auto__add_peernotify__chg_field_peer_peer_as.py diff --git a/peers/migrations/0004_fill_peernotify_table.py b/peers/migrations.backup/0004_fill_peernotify_table.py similarity index 100% rename from peers/migrations/0004_fill_peernotify_table.py rename to peers/migrations.backup/0004_fill_peernotify_table.py diff --git a/peers/migrations.backup/__init__.py b/peers/migrations.backup/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/peers/migrations/0001_initial.py b/peers/migrations/0001_initial.py index f5c7d8007016084f850d6227a2c4cd89f0513259..0b7662f76641a81063a90df789d8994f5455b45a 100644 --- a/peers/migrations/0001_initial.py +++ b/peers/migrations/0001_initial.py @@ -1,101 +1,74 @@ -# -*- coding: utf-8 -*- -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models -from django.conf import settings - - -class Migration(SchemaMigration): - - def forwards(self, orm): - # Adding model 'PeerRange' - if settings.PEER_RANGE_MANAGED_TABLE: - db.create_table(u'peer_range', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('network', self.gf('django.db.models.fields.CharField')(max_length=128)), - )) - db.send_create_signal('peers', ['PeerRange']) - - # Adding model 'TechcEmail' - if settings.PEER_TECHC_MANAGED_TABLE: - db.create_table('techc_email', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('email', self.gf('django.db.models.fields.CharField')(max_length=352, db_column='email')), - )) - db.send_create_signal('peers', ['TechcEmail']) +# Generated by Django 2.1 on 2019-07-25 08:12 - # Adding model 'Peer' - if settings.PEER_MANAGED_TABLE: - db.create_table(u'peer', ( - ('peer_id', self.gf('django.db.models.fields.IntegerField')(primary_key=True)), - ('peer_name', self.gf('django.db.models.fields.CharField')(max_length=128)), - ('peer_as', self.gf('django.db.models.fields.IntegerField')()), - ('peer_tag', self.gf('django.db.models.fields.CharField')(max_length=64)), - ('domain_name', self.gf('django.db.models.fields.CharField')(max_length=128, null=True, blank=True)), - )) - db.send_create_signal('peers', ['Peer']) - - # Adding M2M table for field networks on 'Peer' - if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE: - db.create_table(u'peer_networks', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('peer', models.ForeignKey(orm['peers.peer'], null=False)), - ('peerrange', models.ForeignKey(orm['peers.peerrange'], null=False)) - )) - db.create_unique(u'peer_networks', ['peer_id', 'peerrange_id']) - - # Adding M2M table for field techc_emails on 'Peer' - if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE: - db.create_table(u'peer_techc_emails', ( - ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), - ('peer', models.ForeignKey(orm['peers.peer'], null=False)), - ('techcemail', models.ForeignKey(orm['peers.techcemail'], null=False)) - )) - db.create_unique(u'peer_techc_emails', ['peer_id', 'techcemail_id']) - - def backwards(self, orm): - # Deleting model 'PeerRange' - if settings.PEER_RANGE_MANAGED_TABLE: - db.delete_table(u'peer_range') - - # Deleting model 'TechcEmail' - if settings.PEER_TECHC_MANAGED_TABLE: - db.delete_table('techc_email') +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion - # Deleting model 'Peer' - if settings.PEER_MANAGED_TABLE: - db.delete_table(u'peer') - # Removing M2M table for field networks on 'Peer' - if settings.PEER_MANAGED_TABLE and settings.PEER_RANGE_MANAGED_TABLE: - db.delete_table('peer_networks') +class Migration(migrations.Migration): - # Removing M2M table for field techc_emails on 'Peer' - if settings.PEER_MANAGED_TABLE and settings.PEER_TECHC_MANAGED_TABLE: - db.delete_table('peer_techc_emails') + initial = True - models = { - 'peers.peer': { - 'Meta': {'ordering': "['peer_name']", 'object_name': 'Peer', 'db_table': "u'peer'"}, - 'domain_name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True', 'blank': 'True'}), - 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.PeerRange']", 'null': 'True', 'blank': 'True'}), - 'peer_as': ('django.db.models.fields.IntegerField', [], {}), - 'peer_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}), - 'peer_name': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'peer_tag': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'techc_emails': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['peers.TechcEmail']", 'null': 'True', 'blank': 'True'}) - }, - 'peers.peerrange': { - 'Meta': {'ordering': "['network']", 'object_name': 'PeerRange', 'db_table': "u'peer_range'"}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'network': ('django.db.models.fields.CharField', [], {'max_length': '128'}) - }, - 'peers.techcemail': { - 'Meta': {'object_name': 'TechcEmail', 'db_table': "'techc_email'"}, - 'email': ('django.db.models.fields.CharField', [], {'max_length': '352', 'db_column': "'email'"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] - complete_apps = ['peers'] + operations = [ + migrations.CreateModel( + name='Peer', + fields=[ + ('peer_id', models.AutoField(primary_key=True, serialize=False)), + ('peer_name', models.CharField(max_length=128)), + ('peer_as', models.IntegerField(blank=True, null=True)), + ('peer_tag', models.CharField(max_length=64)), + ('domain_name', models.CharField(blank=True, max_length=128, null=True)), + ], + options={ + 'db_table': 'peer', + 'ordering': ['peer_name'], + 'managed': True, + }, + ), + migrations.CreateModel( + name='PeerNotify', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('peer_activation_notified', models.BooleanField(default=True)), + ('peer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='peers.Peer')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='PeerRange', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('network', models.CharField(max_length=128)), + ], + options={ + 'db_table': 'peer_range', + 'ordering': ['network'], + 'managed': True, + }, + ), + migrations.CreateModel( + name='TechcEmail', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('email', models.CharField(db_column='email', max_length=352)), + ], + options={ + 'db_table': 'techc_email', + 'managed': True, + }, + ), + migrations.AddField( + model_name='peer', + name='networks', + field=models.ManyToManyField(blank=True, to='peers.PeerRange'), + ), + migrations.AddField( + model_name='peer', + name='techc_emails', + field=models.ManyToManyField(blank=True, to='peers.TechcEmail'), + ), + ] diff --git a/peers/models.py b/peers/models.py index b46a4d3e01c4cb30cd5b5ea36078f6baba53ed75..256404b0ef27b11c54526caca3c0b668c8713af9 100644 --- a/peers/models.py +++ b/peers/models.py @@ -53,8 +53,8 @@ class Peer(models.Model): # This needs to be converted to slug and an info message needs to be added. peer_tag = models.CharField(max_length=64) domain_name = models.CharField(max_length=128, null=True, blank=True) - networks = models.ManyToManyField(PeerRange, null=True, blank=True) - techc_emails = models.ManyToManyField(TechcEmail, null=True, blank=True) + networks = models.ManyToManyField(PeerRange, blank=True) + techc_emails = models.ManyToManyField(TechcEmail, blank=True) def __unicode__(self): return self.peer_name @@ -78,6 +78,7 @@ class Peer(models.Model): class PeerNotify(models.Model): - peer = models.ForeignKey(Peer) - user = models.ForeignKey(User) + peer = models.ForeignKey(Peer, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) peer_activation_notified = models.BooleanField(default=True) + diff --git a/poller/urls.py b/poller/urls.py index e5ef6a078c23e05f7a5f85bee280e3da99080062..34554b096f30554adf0fed0a79b2d3675095eede 100644 --- a/poller/urls.py +++ b/poller/urls.py @@ -16,19 +16,12 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # -from django.conf.urls.defaults import patterns, url +from django.conf.urls import url -urlpatterns = patterns( - 'poller.views', - ('^$', 'main'), - url( - '^message/existing/(?P<peer_id>[\w\-]+)/$', - 'message_existing', - name='fetch-existing' - ), - url( - '^message/updates/(?P<peer_id>[\w\-]+)/$', - 'message_updates', - name='fetch-updates' - ) -) +from poller import views +urlpatterns = [ + #'poller.views', + url('^$', views.main), + url('^message/existing/(?P<peer_id>[\w\-]+)/$', views.message_existing, name='fetch-existing'), + url('^message/updates/(?P<peer_id>[\w\-]+)/$', views.message_updates, name='fetch-updates') +] diff --git a/poller/views.py b/poller/views.py index 97402a0eededcdc3166861ed5b04fb0cd24f4558..5230a4bf5b480062ee787dba30edf641da43cbd9 100644 --- a/poller/views.py +++ b/poller/views.py @@ -22,13 +22,13 @@ import json import uuid import datetime -from django.shortcuts import render_to_response +from django.shortcuts import render from django.template.loader import render_to_string from django.http import HttpResponse from gevent.event import Event from django.conf import settings from django.http import HttpResponseRedirect -from django.core.urlresolvers import reverse +from django.urls import reverse from peers.models import Peer import beanstalkc @@ -78,7 +78,7 @@ class Msgs(object): def main(self, request): if self.user_cache: request.session['cursor'] = self.user_cache[-1]['id'] - return render_to_response('poll.html', {'messages': self.user_cache}) + return render(request, 'poll.html', {'messages': self.user_cache}) def message_existing(self, request, peer_id): if request.is_ajax(): @@ -137,7 +137,7 @@ class Msgs(object): try: cursor[user] = self.user_cursor[user] except: - return HttpResponse(content='', mimetype=None, status=400) + return HttpResponse(content='', content_type=None, status=400) try: if not isinstance(self.user_cache[user], list): diff --git a/requirements.txt b/requirements.txt index 5c47517c8e1ec9eb2757d69bc5b3b5607d447f8c..6a5f18293ea18925d16ef6fb190aa6a82760f6e6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,32 +1,30 @@ -amqplib==1.0.2 -argparse==1.2.1 -celery==2.5.3 -cl==0.0.3 -django-celery==2.5.5 -django-admin==1.0.2 -django-picklefield==0.2.1 -django-registration==0.8 -djangorestframework==2.3.14 -django-tinymce==2.6.0 -Django==1.4.5 -gevent==0.13.6 -greenlet==0.3.1 -gunicorn==0.14.5 -ipaddr==2.1.10 -kombu==2.1.8 -lxml==3.4.2 -mailer==0.7 -MySQL-python==1.2.3 -ncclient==0.4.3 -paramiko==1.7.7.1 -pycrypto==2.6 -pyparsing -python-dateutil==1.5 -python-memcached==1.48 -PyYAML==3.10 -South==0.7.5 -wsgiref==0.1.2 +amqplib +argparse +cl +celery +django-admin +django-picklefield +django-registration +djangorestframework +django-tinymce django-form-utils +django-settings-export +Django==2.1 +gevent +greenlet +gunicorn +kombu +lxml +mailer +mysqlclient +ncclient +paramiko +pycrypto +pyparsing +python-dateutil +python-memcached +PyYAML +#wsgiref six requests pysnmp diff --git a/templates/add_port.html b/templates/add_port.html index 223bfdbfa1565399eb06cfe8cc3a1581d0a5f379..886807d96c0a142c0d5ca8ccc1b28a960cdbd0d6 100644 --- a/templates/add_port.html +++ b/templates/add_port.html @@ -21,7 +21,7 @@ $(document).ready( function(){ $('#addportbtn').click(function(){ $.ajax({ - url:"{% url add-port %}", + url:"{% url 'add-port' %}", data:$("#add_port_form").serialize(), type: "POST", cache: false, diff --git a/templates/apply.html b/templates/apply.html index 3a5647d6a182c79cb4d68e59bc9cb9919cf76279..9a6aa29a54ca40b3b7ee4e29dc24a7a10392ec96 100644 --- a/templates/apply.html +++ b/templates/apply.html @@ -1,4 +1,5 @@ {% extends "base.html" %} +{% load staticfiles %} {% load widget_tweaks %} {% load i18n %} @@ -20,9 +21,9 @@ </li> {% endblock %} {% block extrahead %} - <link href="{{STATIC_URL}}css/plugins/morris/morris-0.4.3.min.css" rel="stylesheet"> - <link href="{{STATIC_URL}}css/plugins/timeline/timeline.css" rel="stylesheet"> - <link href="{{STATIC_URL}}datepicker/css/datepicker.css" rel="stylesheet"> + <link href="{% static 'b3theme/css/plugins/morris/morris-0.4.3.min.css' %}" rel="stylesheet"> + <link href="{% static 'b3theme/css/plugins/timeline/timeline.css' %}" rel="stylesheet"> + <link href="{% static 'datepicker/css/datepicker.css' %}" rel="stylesheet"> {% endblock %} @@ -75,13 +76,13 @@ } </style> - <link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet"> - <link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet"> + <link href="{% static 'js/select2/select2.css' %}" rel="stylesheet"> + <link href="{% static 'js/select2/select2-bootstrap.css' %}" rel="stylesheet"> {% endblock %} {% block pagejsbottom %} -<script type="text/javascript" src="{{STATIC_URL}}datepicker/js/bootstrap-datepicker.js"></script> -<script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script> +<script type="text/javascript" src="{% static 'datepicker/js/bootstrap-datepicker.js' %}"></script> +<script type="text/javascript" src="{% static 'js/select2/select2.js' %}"></script> <script> $(document).ready( function(){ $('#id_then').removeAttr("multiple"); @@ -115,7 +116,7 @@ buttons: { '{% trans "Add" %}': function() { $.ajax({ - url:"{% url add-rate-limit %}", + url:"{% url 'add-rate-limit' %}", data:$("#add_rl_form").serialize(), type: "POST", cache: false, @@ -147,7 +148,7 @@ }) .click(function(){ $.ajax({ - url: "{% url add-rate-limit %}", + url: "{% url 'add-rate-limit' %}", cache: false, success: function(data){ $("#then_diag").html(data); @@ -232,7 +233,7 @@ {% endif %} </div> <div class="col-md-2"> - <img src="{{STATIC_URL}}threat_source.png" style="height: 30px;"/> <button type="button" class="btn btn-md btn-info btn-outline" id="setFromAll">Any</button> + <img src="{% static 'threat_source.png' %}" style="height: 30px;"/> <button type="button" class="btn btn-md btn-info btn-outline" id="setFromAll">Any</button> </div> </div> @@ -244,7 +245,7 @@ {% endif %} </div> <div class="col-md-2"> - <img src="{{STATIC_URL}}secure_destination.png" style="height: 30px;"/> + <img src="{% static 'secure_destination.png' %}" style="height: 30px;"/> </div> </div> diff --git a/templates/base.html b/templates/base.html index fe0358fd4b619992594a78d261cc1a7762a347ce..552c6a565ecac5f78e442e9f71c91f4c447ff189 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,14 +1,15 @@ {% load i18n %} -{% load staticfiles %} +{% load static %} + <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>{{ BRANDING.name }} FoD :: {% block title %}{% endblock %}</title> + <title>{{ settings.BRANDING.name }} FoD :: {% block title %}{% endblock %}</title> <META HTTP-EQUIV="Pragma" CONTENT="no-cache"> <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"> - <link REL="SHORTCUT ICON" HREF="{% static BRANDING.favicon %}"> + <link REL="SHORTCUT ICON" HREF="{% get_static_prefix %}/{{ settings.BRANDING.favicon }}"> <!-- Core CSS - Include with every page --> <link href="{% static 'b3theme/css/bootstrap.min.css' %}" rel="stylesheet"> <link href="{% static 'b3theme/font-awesome/css/font-awesome.css' %}" rel="stylesheet"> @@ -16,7 +17,7 @@ {% block extrahead %}{% endblock %} <!-- SB Admin CSS - Include with every page --> - <link href="{{STATIC_URL}}b3theme/css/sb-admin.css" rel="stylesheet"> + <link href="{% static 'b3theme/css/sb-admin.css' %}" rel="stylesheet"> {% block extraheadbottom %}{% endblock %} </head> @@ -31,7 +32,7 @@ <span class="icon-bar"></span> <span class="icon-bar"></span> </button> - <a class="navbar-brand" href="{% url dashboard %}"><img src="{% static BRANDING.logo %}"> </a> + <a class="navbar-brand" href="{% url 'dashboard' %}"><img src="{% get_static_prefix %}/{{ settings.BRANDING.logo }}"> </a> </div> <!-- /.navbar-header --> @@ -39,7 +40,7 @@ <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans "Language" %}: {% for lang in LANGUAGES %}{% ifequal LANGUAGE_CODE lang.0 %}{% trans lang.1 %}{% endifequal %}{% endfor %}<b class="caret"></b></a> <ul class="dropdown-menu"> - <form action="{% url django.views.i18n.set_language %}" method="post" style="display:inline;" id="langform"> + <form action="{% url 'set_language' %}" method="post" style="display:inline;" id="langform"> {% csrf_token %} <input name="next" type="hidden" value="{{ next }}" /> <input id="langsel" name="language" type="hidden" value="" /> @@ -64,23 +65,23 @@ <li class="divider"></li> {% if user.get_profile.peers.all %} <li> - <a href="{% url user-profile %}"><i class="fa fa-user fa-fw"></i>{% trans "My profile" %}</a> + <a href="{% url 'user-profile' %}"><i class="fa fa-user fa-fw"></i>{% trans "My profile" %}</a> </li> {% endif %} {% if user.is_superuser %} <li class="divider"></li> - <li><a href="{% url admin:index %}"><i class="fa fa-cogs"></i> {% trans "Admin" %}</a> + <li><a href="{% url 'admin:index' %}"><i class="fa fa-cogs"></i> {% trans "Admin" %}</a> </li> {% endif %} <li class="divider"></li> - <li><a href="{% url logout %}"><i class="fa fa-sign-out fa-fw"></i> {% trans "Logout" %}</a> + <li><a href="{% url 'logout' %}"><i class="fa fa-sign-out fa-fw"></i> {% trans "Logout" %}</a> </li> </ul> <!-- /.dropdown-user --> </li> {% else %} - <li><a href="{% url login %}">{% trans "Shibboleth Login" %}</a></li> + <li><a href="{% url 'login' %}">{% trans "Shibboleth Login" %}</a></li> {% endif %} <!-- /.dropdown --> </ul> @@ -94,24 +95,24 @@ <div class="sidebar-collapse"> <ul class="nav" id="side-menu"> <li> - <a href="{% url dashboard %}"><i class="fa fa-dashboard fa-fw"></i> {% trans "Dashboard" %}</a> + <a href="{% url 'dashboard' %}"><i class="fa fa-dashboard fa-fw"></i> {% trans "Dashboard" %}</a> </li> <li> - <a href="{% url group-routes %}"><i class="fa fa-shield fa-fw"></i> {% trans "Rules" %}</a> + <a href="{% url 'group-routes' %}"><i class="fa fa-shield fa-fw"></i> {% trans "Rules" %}</a> </li> <li> - <a href="{% url add-route %}"><i class="fa fa-plus-circle fa-fw"></i> {% trans "Add Rule" %}</a> + <a href="{% url 'add-route' %}"><i class="fa fa-plus-circle fa-fw"></i> {% trans "Add Rule" %}</a> </li> {% if perms.accounts.overview %}<li> - <a href="{% url overview %}"><i class="fa fa-desktop fa-fw"></i> {% trans "Overview" %}</a> + <a href="{% url 'overview' %}"><i class="fa fa-desktop fa-fw"></i> {% trans "Overview" %}</a> </li>{% endif %} {% if user.is_superuser %} - <li><a href="{% url admin:index %}"><i class="fa fa-cogs fa-fw"></i> {% trans "Admin" %}</a> + <li><a href="{% url 'admin:index' %}"><i class="fa fa-cogs fa-fw"></i> {% trans "Admin" %}</a> </li> {% endif %} {% if user.get_profile.peers.all %} <li> - <a href="{% url user-profile %}"><i class="fa fa-user fa-fw"></i> {% trans "My profile" %}</a> + <a href="{% url 'user-profile' %}"><i class="fa fa-user fa-fw"></i> {% trans "My profile" %}</a> </li> {% endif %} </ul> @@ -149,16 +150,16 @@ {% include "footer.html" %} {% endblock %} <!-- Core Scripts - Include with every page --> - <script src="{{STATIC_URL}}b3theme/js/jquery-1.10.2.js"></script> - <script src="{{STATIC_URL}}js/jquery_csrf_protect.js" type="text/javascript"></script> - <script src="{{STATIC_URL}}b3theme/js/bootstrap.min.js"></script> - <script src="{{STATIC_URL}}b3theme/js/plugins/metisMenu/jquery.metisMenu.js"></script> - <script type="text/javascript" src="{{STATIC_URL}}js/jquery.cookie.js"></script> + <script src="{% static 'b3theme/js/jquery-1.10.2.js' %}"></script> + <script src="{% static 'js/jquery_csrf_protect.js' %}" type="text/javascript"></script> + <script src="{% static 'b3theme/js/bootstrap.min.js' %}"></script> + <script src="{% static 'b3theme/js/plugins/metisMenu/jquery.metisMenu.js' %}"></script> + <script type="text/javascript" src="{% static 'js/jquery.cookie.js' %}"></script> {% block pagejs %}{% endblock %} <!-- SB Admin Scripts - Include with every page --> - <script src="{{STATIC_URL}}b3theme/js/sb-admin.js"></script> + <script src="{% static 'b3theme/js/sb-admin.js' %}"></script> <!-- Page-Level Scripts - Use for reference --> {% block pagejsbottom %}{% endblock %} <script type="text/javascript"> diff --git a/templates/dashboard.html b/templates/dashboard.html index cc0ac6e560669a33e9a05c8ed3cd58af8b3b6059..1e50c2810f695a1eb0c347338f0f291b66af355e 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -107,17 +107,17 @@ </small> <div> {% ifequal route.status 'ACTIVE' %} - <a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Edit" %}</a> + <a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Edit" %}</a> <button class="del_buttonpre btn-outline btn btn-xs btn-warning" id="{{route.name}}" data-routename="{{route.name}}">{% trans "Deactivate" %}</button> {% else %} {% if route.status == 'EXPIRED' or route.status == 'ADMININACTIVE' or route.status == 'INACTIVE' %} - <a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}" type="button">{% trans "Reactivate" %}</a> + <a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}" type="button">{% trans "Reactivate" %}</a> {% else %} {% ifequal route.status 'OUTOFSYNC' %} - <a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "ReSync" %}</a> + <a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "ReSync" %}</a> {% else %} {% ifequal route.status 'ERROR' %} - <a href="{% url edit-route route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Fix it!" %}</a> + <a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-xs btn-outline" id="edit_button_{{route.pk}}">{% trans "Fix it!" %}</a> {% else %} - {% endifequal %} @@ -143,9 +143,9 @@ </div> <!-- /.panel-heading --> <div class="panel-body"> - <a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> - <a class="btn btn-sm btn-outline btn-primary" href="{% url group-routes %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a> - <a class="btn btn-sm btn-outline btn-info" href="{% url user-profile %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a> + <a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url 'add-route' %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> + <a class="btn btn-sm btn-outline btn-primary" href="{% url 'group-routes' %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a> + <a class="btn btn-sm btn-outline btn-info" href="{% url 'user-profile' %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a> </div> <!-- /.panel-body --> </div> @@ -171,14 +171,14 @@ {% endblock %} {% block pagejsbottom %} {% if user.is_authenticated %} -<script type="text/javascript" src="{% url load-js 'pollerdash' %}"></script> +<script type="text/javascript" src="{% url 'load-js' 'pollerdash' %}"></script> {% endif %} -<script type="text/javascript" src="{{STATIC_URL}}js/jquery.dataTables.js"></script> -<script type="text/javascript" src="{{STATIC_URL}}js/datatables_bootstrap.js"></script> +<script type="text/javascript" src="{% static 'js/jquery.dataTables.js' %}"></script> +<script type="text/javascript" src="{% static 'js/datatables_bootstrap.js' %}"></script> <script> var oldhtml; var last_element = false; -var refreshUrl = "{% url group-routes-ajax %}"; +var refreshUrl = "{% url 'group-routes-ajax' %}"; $(document).ready( function(){ $('body').on('click', ".del_buttonpre", function(){ var my = $(this); @@ -199,7 +199,7 @@ var refreshUrl = "{% url group-routes-ajax %}"; var my = $(this); my.html('Deactivating...') var routename = $(this).data("routename"); - var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString()); + var delurl = "{% url 'delete-route' 'route_placeholder'%}".replace('route_placeholder', routename.toString()); $.ajax({ type: 'POST', url: delurl, diff --git a/templates/flowspy/route_details.html b/templates/flowspy/route_details.html index 076f497f86da6996b90e41e3c71e2f6dafccd507..4272355fa423f94bba8d00686438d5c00fa83677 100644 --- a/templates/flowspy/route_details.html +++ b/templates/flowspy/route_details.html @@ -68,7 +68,7 @@ function myreloadPage() { {% endif %} {% if route.status != 'PENDING' %} - <a href="{% url edit-route route.name %}" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a> + <a href="{% url 'edit-route' route.name %}" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a> {% if route.status = 'ACTIVE' %} <button class="del_button btn-warning btn btn-sm btn-outline" id="{{ route.name }}" data-routename="{{ route.name }}">{% trans "Deactivate" %}</button> {% endif %} @@ -97,7 +97,7 @@ function myreloadPage() { <h3>Number of bytes (relative)</h3> <div><canvas id="traffic-plot-bytes-rel" width=200 height=200></canvas></div> </div> - <div><a href="{% url routestats route.name %}">Download raw data in JSON</a></div> + <div><a href="{% url 'routestats' route.name %}">Download raw data in JSON</a></div> </div> {% comment %}check if graphs plugin in installed apps{% endcomment %} {% if 'graphs' in INSTALLED_APPS %} @@ -111,7 +111,7 @@ function myreloadPage() { <span></span> <b class="caret"></b> </div> </div> - <div class="graphs col-md-12" data-url="{% url graphs route.name %}" > + <div class="graphs col-md-12" data-url="{% url 'graphs' route.name %}" > loading... </div> </div> @@ -127,12 +127,12 @@ function myreloadPage() { {% block pagejsbottom %} -<script src="{{STATIC_URL}}js/Chart.min.js" type="text/javascript"></script> +<script src="{% static 'js/Chart.min.js' %}" type="text/javascript"></script> -<script src="{{STATIC_URL}}js/moment.min.js"></script> -<!--<script src="{{STATIC_URL}}js/hammer.min.js"></script>--> -<script src="{{STATIC_URL}}js/chartjs-plugin-zoom.min.js"></script> +<script src="{% static 'js/moment.min.js' %}"></script> +<!--<script src="{% static 'js/hammer.min.js' %}"></script>--> +<script src="{% static 'js/chartjs-plugin-zoom.min.js' %}"></script> <script type="text/javascript"> function plotGraph(data) @@ -293,7 +293,7 @@ function plotGraph(data) } $(document).ready(function() { - var statsurl = "{% url routestats route.name %}"; + var statsurl = "{% url 'routestats' route.name %}"; $.get(statsurl).done(function(data) { if (data["error"]) { $("#traffic-plot-loading").text("No data, try later"); @@ -358,7 +358,7 @@ $(document).ready(function() { var my = $(this); my.html('Deactivating...') var routename = $(this).data("routename"); - var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString()); + var delurl = "{% url 'delete-route' 'route_placeholder'%}".replace('route_placeholder', routename.toString()); $.ajax({ type: 'POST', url: delurl, diff --git a/templates/flowspy/setup.html b/templates/flowspy/setup.html index 7bed56838beb617d8dd54926ffc4d4872cb08950..63ecf9ac60b32dbd1a7df40ce5b46640c76992a5 100644 --- a/templates/flowspy/setup.html +++ b/templates/flowspy/setup.html @@ -4,7 +4,7 @@ {% block contentplaceholder %} <div> Set the password of admin user: - <form action="{% url setup %}" method="post"> + <form action="{% url 'setup' %}" method="post"> {% csrf_token %} <table> {{ form }} diff --git a/templates/overview/index.html b/templates/overview/index.html index 97f2eabac260cbb3fbff00d5774ec42fa2c24b36..fb592966af8efa9a64865d1ca2a8ba8841458134 100644 --- a/templates/overview/index.html +++ b/templates/overview/index.html @@ -1,8 +1,9 @@ {% extends "base.html" %} {% load i18n %} +{% load static %} {% block extrahead %} -<link href="{{STATIC_URL}}css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet"> +<link href="{% static 'css/plugins/dataTables/dataTables.bootstrap.css' %}" rel="stylesheet"> <style type="text/css"> @@ -21,8 +22,8 @@ th{ {% endblock %} {% block pagejsbottom %} - <script src="{{STATIC_URL}}js/dataTableslatest/jquery.dataTables.min.js"></script> - <script src="{{STATIC_URL}}js/dataTableslatest/dataTables.bootstrap.js"></script> + <script src="{% static 'js/dataTableslatest/jquery.dataTables.min.js' %}"></script> + <script src="{% static 'js/dataTableslatest/dataTables.bootstrap.js' %}"></script> <script type="text/javascript"> $(document).ready(function(){ @@ -156,7 +157,7 @@ var start; var end; var oldhtml; var last_element = false; -var refreshUrl = "{% url overview-ajax %}"; +var refreshUrl = "{% url 'overview-ajax' %}"; @@ -261,7 +262,7 @@ var refreshUrl = "{% url overview-ajax %}"; return toolt+" title=\""+title+"\">"+"<small>{% trans 'Rule expired' %}</small>"+"</a>"; } if (status == "PENDING"){ - return '<img src="{{STATIC_URL}}dots.gif">'; + return '<img src="{% static 'dots.gif' %}">'; } return "<small>"+full.response+"</small>"; diff --git a/templates/overview/login.html b/templates/overview/login.html index 3c83fc13a25088b4c4d950d924144a3ef203a927..09617b005afeb9bc12f0d329f45eb603371e0f36 100644 --- a/templates/overview/login.html +++ b/templates/overview/login.html @@ -40,7 +40,7 @@ </div> <!-- /.panel-heading --> <div class="panel-body"> - <form class="form-horizontal" method="post" action="{% url altlogin %}" role="form"> + <form class="form-horizontal" method="post" action="{% url 'altlogin' %}" role="form"> {% csrf_token %} {% load unescape %} @@ -72,7 +72,7 @@ <button type="submit" id="applybutton" value="{% trans 'Login' %}" class="btn btn-md btn-primary">Login</button> </div> </div> - <input name="next" id="next" type="hidden" value="{% url group-routes %}"> + <input name="next" id="next" type="hidden" value="{% url 'group-routes' %}"> </form> </div> </div> diff --git a/templates/poller.js b/templates/poller.js index d4be131bc1c92f7600b85577e917afd3b7a615fe..2672b8b5d64d172c45f8b0b5a3b6187a6dacb9bb 100644 --- a/templates/poller.js +++ b/templates/poller.js @@ -56,7 +56,7 @@ var updater = { var date = new Date(); var timestamp = date.getTime(); {% for peer in user.userprofile.peers.all %} - $.ajax({url: "{% url fetch-existing peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false, + $.ajax({url: "{% url 'fetch-existing' peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false, success: updater.onFetchExisting, error: updater.onError}); {% endfor %} @@ -70,7 +70,7 @@ var updater = { var date = new Date(); var timestamp = date.getTime(); {% for peer in user.userprofile.peers.all %} - $.ajax({url: "{% url fetch-updates peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false, + $.ajax({url: "{% url 'fetch-updates' peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache:false, success: updater.onSuccess, timeout: timeout, error: updater.onError}); diff --git a/templates/pollerdash.js b/templates/pollerdash.js index 241b8d966a5fc6381dcf994bce632a56547e6d1d..aa7508d6240f1bd34e6ab779e4d73d7a9ace5258 100644 --- a/templates/pollerdash.js +++ b/templates/pollerdash.js @@ -58,7 +58,7 @@ var updater = { var date = new Date(); var timestamp = date.getTime(); {% for peer in user.userprofile.peers.all %} - $.ajax({url: "{% url fetch-existing peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false, + $.ajax({url: "{% url 'fetch-existing' peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false, success: updater.onFetchExisting, error: updater.onError}); {% endfor %} @@ -75,7 +75,7 @@ var updater = { {% for peer in user.userprofile.peers.all %} - $.ajax({url: "{% url fetch-updates peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false, + $.ajax({url: "{% url 'fetch-updates' peer.pk %}?="+timestamp, type: "POST", dataType: "json", cache: false, success: updater.onSuccess, timeout: timeout, error: updater.onError}); diff --git a/templates/profile.html b/templates/profile.html index 8d2adf2769a01ac52f6c84dde7df7fa2462b6ea3..1ac5a7dcdd71f9884c5c32a391a0a7d717bf3540 100644 --- a/templates/profile.html +++ b/templates/profile.html @@ -48,9 +48,9 @@ </div> <!-- /.panel-heading --> <div class="panel-body"> - <a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> - <a class="btn btn-sm btn-outline btn-primary" href="{% url group-routes %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a> - <a class="btn btn-sm btn-outline btn-info" href="{% url dashboard %}"><i class="fa fa-dashboard"></i> {% trans "Dashboard" %}</a> + <a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url 'add-route' %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> + <a class="btn btn-sm btn-outline btn-primary" href="{% url 'group-routes' %}"><i class="fa fa-shield fa-fw"></i> {% trans "My Rules" %}</a> + <a class="btn btn-sm btn-outline btn-info" href="{% url 'dashboard' %}"><i class="fa fa-dashboard"></i> {% trans "Dashboard" %}</a> </div> <!-- /.panel-body --> </div> @@ -78,7 +78,7 @@ {% if user.auth_token %} {{ user.auth_token }} {% else %} - <a id="generate_token" href="{% url user-profile-token %}">{% trans "Generate One" %}</a> + <a id="generate_token" href="{% url 'user-profile-token' %}">{% trans "Generate One" %}</a> {% endif %} </dd> </dl> diff --git a/templates/registration/activate_edit.html b/templates/registration/activate_edit.html index 7b342013e8649df74b60351b961304d03ba4a263..e8b820fb478c8b6fbdcc2bec33f2ce5a625af166 100644 --- a/templates/registration/activate_edit.html +++ b/templates/registration/activate_edit.html @@ -12,8 +12,8 @@ } } </style> -<link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet"> -<link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet"> +<link href="{% static 'js/select2/select2.css' %}" rel="stylesheet"> +<link href="{% static 'js/select2/select2-bootstrap.css' %}" rel="stylesheet"> {% endblock %} {% block contentplaceholder %} @@ -70,7 +70,7 @@ {% endblock %} {% block pagejsbottom %} - <script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script> + <script type="text/javascript" src="{% static 'js/select2/select2.js' %}"></script> <script> $(document).ready( function(){ $('#id_peers').select2(); diff --git a/templates/registration/activation_complete.txt b/templates/registration/activation_complete.txt index dfc168819c0b70d90bfb3c6a32367509cec6d166..daa361eb7b5f524f65689be4fc1a3fecc57eb076 100644 --- a/templates/registration/activation_complete.txt +++ b/templates/registration/activation_complete.txt @@ -2,4 +2,4 @@ Your account with username {{ user.username }} has been activated. You may login to FoD using the following URL: -http://{{ site.domain }}{% url login %} +http://{{ site.domain }}{% url 'login' %} diff --git a/templates/registration/activation_email.txt b/templates/registration/activation_email.txt index 57a2c5b07b13f44d873a33fb90c4e665457b1825..e4e49a8f136c57c217ed67202ba4296eb2b1524e 100644 --- a/templates/registration/activation_email.txt +++ b/templates/registration/activation_email.txt @@ -6,6 +6,6 @@ E-mail: {{user.email}} To activate the user's account and allow them to access the service, click on the following link: -http://{{ site.domain }}{% url activate_account activation_key %} +http://{{ site.domain }}{% url 'activate_account' activation_key %} The user will be notified via mail about the account activation diff --git a/templates/registration/select_institution.html b/templates/registration/select_institution.html index bc1e292aa39f0b92ba90c76e81f8512cf9f3f74a..17b764b9828a69c7bb1c0c64409434e5163cde30 100644 --- a/templates/registration/select_institution.html +++ b/templates/registration/select_institution.html @@ -12,8 +12,8 @@ } } </style> -<link href="{{STATIC_URL}}js/select2/select2.css" rel="stylesheet"> -<link href="{{STATIC_URL}}js/select2/select2-bootstrap.css" rel="stylesheet"> +<link href="{% static 'js/select2/select2.css' %}" rel="stylesheet"> +<link href="{% static 'js/select2/select2-bootstrap.css' %}" rel="stylesheet"> {% endblock %} {% block contentplaceholder %} @@ -35,7 +35,7 @@ <div class="panel-body"> <div class="alert alert-info">Excellent! You are a step away from joining the service. Select your institution from the dropdown list.</div> - <form method="POST" class="form-horizontal" action="{% url selectinst %}"> + <form method="POST" class="form-horizontal" action="{% url 'selectinst' %}"> {% csrf_token %} {% if form.non_field_errors %} <p class="error">{{ form.non_field_errors}}</p> {% endif %} @@ -68,7 +68,7 @@ {% block pagejsbottom %} - <script type="text/javascript" src="{{STATIC_URL}}js/select2/select2.js"></script> + <script type="text/javascript" src="{% static 'js/select2/select2.js' %}"></script> <script> $(document).ready( function(){ $('#id_peers').select2(); diff --git a/templates/user_routes.html b/templates/user_routes.html index 5f66fb2a3b43fad4ab58271b8062302fdea0d7d1..fb25001d198eb28df2e951db718a7b5627c497ca 100644 --- a/templates/user_routes.html +++ b/templates/user_routes.html @@ -1,12 +1,13 @@ {% extends "base.html" %} +{% load staticfiles %} {% load i18n %} {% block extrahead %} -<link href="{{STATIC_URL}}b3theme/css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet"> +<link href="{% static 'b3theme/css/plugins/dataTables/dataTables.bootstrap.css' %}" rel="stylesheet"> {% endblock %} {% block pagejsbodttom %} -<script type="text/javascript" src="{{STATIC_URL}}js/jquery.dataTables.js"></script> -<script type="text/javascript" src="{{STATIC_URL}}js/datatables_bootstrap.js"></script> +<script type="text/javascript" src="{% static 'js/jquery.dataTables.js' %}"></script> +<script type="text/javascript" src="{% static 'js/datatables_bootstrap.js' %}"></script> {% endblock %} @@ -60,8 +61,8 @@ </div> <!-- /.panel-heading --> <div class="panel-body"> - <a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> - <a class="btn btn-sm btn-outline btn-info" href="{% url user-profile %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a> + <a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url 'add-route' %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> + <a class="btn btn-sm btn-outline btn-info" href="{% url 'user-profile' %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a> </div> <!-- /.panel-body --> </div> @@ -85,10 +86,10 @@ {% endblock %} {% block pagejsbottom %} - <script src="{{STATIC_URL}}js/dataTableslatest/jquery.dataTables.min.js"></script> - <script src="{{STATIC_URL}}js/dataTableslatest/dataTables.bootstrap.js"></script> + <script src="{% static 'js/dataTableslatest/jquery.dataTables.min.js' %}"></script> + <script src="{% static 'js/dataTableslatest/dataTables.bootstrap.js' %}"></script> {% if user.is_authenticated %} -<script type="text/javascript" src="{% url load-js 'poller' %}"></script> +<script type="text/javascript" src="{% url 'load-js' 'poller' %}"></script> {% endif %} <script type="text/javascript"> @@ -172,7 +173,7 @@ var start; var end; var oldhtml; var last_element = false; -var refreshUrl = "{% url group-routes-ajax %}"; +var refreshUrl = "{% url 'group-routes-ajax' %}"; $(document).ready( function(){ @@ -219,7 +220,7 @@ $(document).ready( function(){ var my = $(this); my.html('Deactivating...') var routename = $(this).data("routename"); - var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString()); + var delurl = "{% url 'delete-route' 'route_placeholder'%}".replace('route_placeholder', routename.toString()); $.ajax({ type: 'POST', url: delurl, @@ -316,7 +317,7 @@ $(document).ready( function(){ return toolt+" title=\""+title+"\">"+"<small>{% trans 'Rule expired' %}</small>"+"</a>"; } if (status == "PENDING"){ - return '<img src="{{STATIC_URL}}dots.gif">'; + return '<img src="{% static 'dots.gif' %}">'; } return "<small>"+full.response+"</small>"; @@ -326,7 +327,7 @@ $(document).ready( function(){ "mRender": function (data, type, full) { status = full.status; btn = ''; - editurl = "{% url edit-route 'routename' %}".replace('routename', full.name.toString()); + editurl = "{% url 'edit-route' 'routename' %}".replace('routename', full.name.toString()); if (status == "ACTIVE" ){ btn = '<a href="'+editurl+'" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a>'; btn = btn + ' <button class="del_buttonpre btn-warning btn btn-sm btn-outline" id="'+full.name+'" data-routename="'+full.name+'">{% trans "Deactivate" %}</button>'; diff --git a/templates/welcome.html b/templates/welcome.html index a1399b84807d556fe8c426da6874350f59c928cf..cfe461f1e62c6c25005c4a9d2619fdb5151ef1e8 100644 --- a/templates/welcome.html +++ b/templates/welcome.html @@ -34,7 +34,7 @@ <h2>{{ BRANDING.name }} - Firewall on Demand</h2> <h4>Protect your network, protect the network</h4> <p> - <a href="{% url login %}" type="button" class="btn btn-lg btn-outline btn-primary">{% trans "Join Now" %}</a> + <a href="{% url 'login' %}" type="button" class="btn btn-lg btn-outline btn-primary">{% trans "Join Now" %}</a> </p> </div> </div> @@ -78,7 +78,7 @@ <img src="{% static 'shib_login.png' %}" style="border:none;"> </p> <p> - <a href="{% url login %}" type="button" class="btn btn-outline btn-primary">{% trans "Shibboleth Login" %}</a> + <a href="{% url 'login' %}" type="button" class="btn btn-outline btn-primary">{% trans "Shibboleth Login" %}</a> </p> </div> </div> diff --git a/utils/decorators.py b/utils/decorators.py index 8bc6d1eb0b37d8104f8f819a0b0f9fc2d85470fc..3a0ae2095ddbf483d3cffe16dc967bbe5a7f4aa9 100644 --- a/utils/decorators.py +++ b/utils/decorators.py @@ -18,7 +18,7 @@ # from django.http import HttpResponseRedirect -from django.core.urlresolvers import reverse +from django.urls import reverse def shib_required(f): diff --git a/utils/proxy.py b/utils/proxy.py index c16d2c89ddf7d34d8163a4609223d3ceb0cb729a..92b52af0597f58a79be5a5162a52a093cb95e537 100644 --- a/utils/proxy.py +++ b/utils/proxy.py @@ -17,7 +17,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # -import jncdevice as np +from . import jncdevice as np from ncclient import manager from ncclient.transport.errors import AuthenticationError, SSHError from lxml import etree as ET @@ -26,7 +26,7 @@ import logging from django.core.cache import cache import os from celery.exceptions import TimeLimitExceeded, SoftTimeLimitExceeded -from portrange import parse_portrange +from .portrange import parse_portrange cwd = os.getcwd() diff --git a/utils/whois.py b/utils/whois.py index 55e42e467c2e6e85543fd59488b3a6a303c80dee..97245cbe0324bc3a95912ab7ba3fe305db9f3f67 100644 --- a/utils/whois.py +++ b/utils/whois.py @@ -18,7 +18,7 @@ # import socket -from ipaddr import * +from ipaddress import * import re from django.conf import settings @@ -43,15 +43,16 @@ def query(query, hostname, flags): for line in query: m = re.match(r"(^route6?\:\s+)(?P<subnets>\S+)", line) if m: - if IPNetwork(m.group('subnets')).version == 4: - routes4.append(IPNetwork(m.group('subnets'))) - if IPNetwork(m.group('subnets')).version == 6: - routes6.append(IPNetwork(m.group('subnets'))) + i = ipaddress.ip_interface(m.group('subnets')) + if i.version == 4: + routes4.append(i.network) + elif i.version == 6: + routes6.append(i.network) final_routes = [] if len(routes4): - final_routes4 = collapse_address_list(routes4) + final_routes4 = collapse_address(routes4) if len(routes6): - final_routes6 = collapse_address_list(routes6) + final_routes6 = collapse_address(routes6) final_routes = final_routes4 + final_routes6 return final_routes