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