Revision b436bd51 flowspec/models.py

b/flowspec/models.py
20 20
from django.db import models
21 21
from django.conf import settings
22 22
from django.contrib.auth.models import User
23
from django.contrib.sites.models import Site
24
from django.db.models.signals import post_save
23 25
from django.utils.translation import ugettext_lazy as _
26
from django.core.urlresolvers import reverse
27

  
28
from flowspec.helpers import send_new_mail, get_peer_techc_mails
24 29
from utils import proxy as PR
25 30
from ipaddr import *
26 31
import datetime
27 32
import logging
28 33
from time import sleep
29
from junos import create_junos_name, policer_name
34
from junos import create_junos_name
30 35

  
31 36
import beanstalkc
32 37
from utils.randomizer import id_generator as id_gen
......
167 172
    expires = models.DateField(default=days_offset, verbose_name=_("Expires"))
168 173
    response = models.CharField(max_length=512, blank=True, null=True, verbose_name=_("Response"))
169 174
    comments = models.TextField(null=True, blank=True, verbose_name=_("Comments"))
170

  
175
    requesters_address = models.CharField(max_length=255, blank=True, null=True)
171 176

  
172 177
    def __unicode__(self):
173 178
        return self.name
......
183 188
            self.name = "%s_%s" %(self.name, hash)
184 189
        super(Route, self).save(*args, **kwargs) # Call the "real" save() method.
185 190

  
186

  
187 191
    def clean(self, *args, **kwargs):
188 192
        from django.core.exceptions import ValidationError
189 193
        if self.destination:
......
201 205

  
202 206
    def commit_add(self, *args, **kwargs):
203 207
        peer = self.applier.get_profile().peer.peer_tag
204
        send_message("[%s] Adding rule %s. Please wait..." %(self.applier.username, self.name), peer)
208
        send_message("[%s] Adding rule %s. Please wait..." % (self.applier.username, self.name), peer)
205 209
        response = add.delay(self)
206
        logger.info("Got add job id: %s" %response)
210
        logger.info('Got add job id: %s' % response)
211
        fqdn = Site.objects.get_current().domain
212
        admin_url = 'https://%s%s' % (
213
            fqdn,
214
            reverse('edit-route', kwargs={'route_slug': self.name})
215
        )
216
        mail_body = render_to_string(
217
            'rule_action.txt',
218
            {
219
                'route': self,
220
                'address': self.requesters_address,
221
                'action': 'creation',
222
                'url': admin_url
223
            }
224
        )
225
        user_mail = '%s' % self.applier.email
226
        user_mail = user_mail.split(';')
227
        send_new_mail(
228
            settings.EMAIL_SUBJECT_PREFIX + 'Rule %s creation request submitted by %s' % (self.name, self.applier.username),
229
            mail_body,
230
            settings.SERVER_EMAIL, user_mail,
231
            get_peer_techc_mails(self.applier)
232
        )
233
        d = {
234
            'clientip': '%s' % self.requesters_address,
235
            'user': self.applier.username
236
        }
237
        logger.info(mail_body, extra=d)
207 238

  
208 239
    def commit_edit(self, *args, **kwargs):
209 240
        peer = self.applier.get_profile().peer.peer_tag
210
        send_message("[%s] Editing rule %s. Please wait..." %(self.applier.username, self.name), peer)
241
        send_message(
242
            '[%s] Editing rule %s. Please wait...' %
243
            (
244
                self.applier.username,
245
                self.name
246
            ), peer
247
        )
211 248
        response = edit.delay(self)
212
        logger.info("Got edit job id: %s" %response)
249
        logger.info('Got edit job id: %s' % response)
250
        fqdn = Site.objects.get_current().domain
251
        admin_url = 'https://%s%s' % (
252
            fqdn,
253
            reverse(
254
                'edit-route',
255
                kwargs={'route_slug': self.name}
256
            )
257
        )
258
        mail_body = render_to_string(
259
            'rule_action.txt',
260
            {
261
                'route': self,
262
                'address': self.requesters_address,
263
                'action': 'edit',
264
                'url': admin_url
265
            }
266
        )
267
        user_mail = '%s' % self.applier.email
268
        user_mail = user_mail.split(';')
269
        send_new_mail(
270
            settings.EMAIL_SUBJECT_PREFIX + 'Rule %s edit request submitted by %s' % (self.name, self.applier.username),
271
            mail_body, settings.SERVER_EMAIL, user_mail,
272
            get_peer_techc_mails(self.applier)
273
        )
274
        d = {
275
            'clientip': self.requesters_address,
276
            'user': self.applier.username
277
        }
278
        logger.info(mail_body, extra=d)
213 279

  
214 280
    def commit_delete(self, *args, **kwargs):
215 281
        reason_text = ''
216 282
        reason = ''
217 283
        if "reason" in kwargs:
218 284
            reason = kwargs['reason']
219
            reason_text = "Reason: %s. " %reason
285
            reason_text = 'Reason: %s.' % reason
220 286
        peer = self.applier.get_profile().peer.peer_tag
221
        send_message("[%s] Suspending rule %s. %sPlease wait..." %(self.applier.username, self.name, reason_text), peer)
287
        send_message(
288
            '[%s] Suspending rule %s. %sPlease wait...' % (
289
                self.applier.username,
290
                self.name,
291
                reason_text
292
            ), peer
293
        )
222 294
        response = delete.delay(self, reason=reason)
223
        logger.info("Got delete job id: %s" %response)
295
        logger.info('Got delete job id: %s' % response)
296
        fqdn = Site.objects.get_current().domain
297
        admin_url = 'https://%s%s' % (
298
            fqdn,
299
            reverse(
300
                'edit-route',
301
                kwargs={'route_slug': self.name}
302
            )
303
        )
304
        mail_body = render_to_string(
305
            'rule_action.txt',
306
            {
307
                'route': self,
308
                'address': self.requesters_address,
309
                'action': 'removal',
310
                'url': admin_url
311
            }
312
        )
313
        user_mail = '%' % self.applier.email
314
        user_mail = user_mail.split(';')
315
        send_new_mail(
316
            settings.EMAIL_SUBJECT_PREFIX + 'Rule %s removal request submitted by %s' % (self.name, self.applier.username),
317
            mail_body,
318
            settings.SERVER_EMAIL,
319
            user_mail,
320
            get_peer_techc_mails(self.applier)
321
        )
322
        d = {
323
            'clientip': self.requesters_address,
324
            'user': self.applier.username
325
        }
326
        logger.info(mail_body, extra=d)
224 327

  
225 328
    def has_expired(self):
226 329
        today = datetime.date.today()
......
242 345
        except Exception as e:
243 346
            self.status = "EXPIRED"
244 347
            self.save()
245
            logger.error("No routing options on device. Exception: %s" %e)
348
            logger.error('No routing options on device. Exception: %s' % e)
246 349
            return True
247 350
        for route in routes:
248 351
            if route.name == self.name:
......
478 581
    tube_message = json.dumps({'message': str(msg), 'username':peer})
479 582
    b.put(tube_message)
480 583
    b.close()
584

  
585

  
586
def notify_user(sender, instance, created, **kwargs):
587
    if created:
588
        instance.commit_add()
589
    else:
590
        if instance.has_expired():
591
            instance.commit_delete()
592
        else:
593
            instance.commit_edit()
594

  
595

  
596
post_save.connect(notify_user, sender=Route)

Also available in: Unified diff