|
|
@ -1,18 +1,47 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import math |
|
|
from django.db import models |
|
|
from django.db import models |
|
|
|
|
|
from django.utils import timezone |
|
|
|
|
|
|
|
|
from mydefs import MyGenericIPAddressField |
|
|
from mydefs import MyGenericIPAddressField |
|
|
|
|
|
from .fields import UnixDateTimeField |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class StatElem(models.Model): |
|
|
class StatElem(models.Model): |
|
|
src_ip = MyGenericIPAddressField() |
|
|
|
|
|
dst_ip = MyGenericIPAddressField() |
|
|
|
|
|
proto = models.PositiveSmallIntegerField(default=0) |
|
|
|
|
|
src_port = models.PositiveIntegerField(default=0) |
|
|
|
|
|
dst_port = models.PositiveIntegerField(default=0) |
|
|
|
|
|
|
|
|
cur_time = UnixDateTimeField(primary_key=True) |
|
|
|
|
|
ip = MyGenericIPAddressField() |
|
|
octets = models.PositiveIntegerField(default=0) |
|
|
octets = models.PositiveIntegerField(default=0) |
|
|
packets = models.PositiveIntegerField(default=0) |
|
|
packets = models.PositiveIntegerField(default=0) |
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
|
def percentile(N, percent, key=lambda x:x): |
|
|
|
|
|
""" |
|
|
|
|
|
Find the percentile of a list of values. |
|
|
|
|
|
|
|
|
|
|
|
@parameter N - is a list of values. Note N MUST BE already sorted. |
|
|
|
|
|
@parameter percent - a float value from 0.0 to 1.0. |
|
|
|
|
|
@parameter key - optional key function to compute value from each element of N. |
|
|
|
|
|
|
|
|
|
|
|
@return - the percentile of the values |
|
|
|
|
|
""" |
|
|
|
|
|
if not N: |
|
|
|
|
|
return None |
|
|
|
|
|
k = (len(N)-1) * percent |
|
|
|
|
|
f = math.floor(k) |
|
|
|
|
|
c = math.ceil(k) |
|
|
|
|
|
if f == c: |
|
|
|
|
|
return key(N[int(k)]) |
|
|
|
|
|
d0 = key(N[int(f)]) * (c-k) |
|
|
|
|
|
d1 = key(N[int(c)]) * (k-f) |
|
|
|
|
|
return d0+d1 |
|
|
|
|
|
|
|
|
class Meta: |
|
|
class Meta: |
|
|
db_table = 'flowstat' |
|
|
|
|
|
|
|
|
abstract = True |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getModel(): |
|
|
|
|
|
|
|
|
|
|
|
class DynamicStatElem(StatElem): |
|
|
|
|
|
class Meta: |
|
|
|
|
|
db_table = 'flowstat_%s' % timezone.now().strftime("%d%m%Y") |
|
|
|
|
|
abstract = False |
|
|
|
|
|
return DynamicStatElem |