Source code for jmb.proxy.models

#! coding: utf-8
"""


.. autoclass:: Category

.. autoclass:: Timerule

.. autoclass:: IPGroup

.. autoclass:: ACL

.. autoclass:: ACL_CAtegory
"""

import os
import shutil

from django.conf import settings
from django.db import models
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.conf import settings

from jmb.core.db import models as jumbo_models

##########################
# CATEGORY               #
##########################

[docs]class Category(jumbo_models.DateModel, jumbo_models.UserModel, jumbo_models.StatusModel): ## Campi modello name = models.CharField( max_length = 50, verbose_name = _("Category"), ) domain = models.FilePathField( blank = True, null = True, path = settings.PROXY_PATH_CATEGORY, verbose_name = _("Domain"), ) url = models.FilePathField( blank = True, null = True, path = settings.PROXY_PATH_CATEGORY, verbose_name = _("Url"), ) expression = models.FilePathField( blank = True, null = True, path = settings.PROXY_PATH_CATEGORY, verbose_name = _("Expression"), ) user_domain = models.TextField( blank = True, null = True, verbose_name = _("Domains List"), ) user_url = models.TextField( blank = True, null = True, verbose_name = _("Urls List"), ) user_expression = models.TextField( blank = True, null = True, verbose_name = _("Expressions List"), ) editable = models.BooleanField(default=True, null=False) class Meta: verbose_name = _("Category") verbose_name_plural = _("Categories") unique_together = ("name",) def __unicode__(self): return u"%s" % self.name def save(self): super(Category, self).save() if not settings.PROXY_ONLY_SIMULATE: ACL().crea_file() def delete(self, *args, **kwargs): super(Category, self).delete(*args, **kwargs) if not settings.PROXY_ONLY_SIMULATE: self.delete_folder() ACL().crea_file() def delete_folder(self): base_path = os.path.join('my_blacklists', '%s' % self.name) path = os.path.join(settings.PROXY_PATH_CATEGORY, base_path) shutil.rmtree(path) ########################## # TIME RULE # ##########################
TYPE_CAT = ( ("w", _("Weekly")), ("t", _("Date")), )
[docs]class TimeRule(jumbo_models.DateModel, jumbo_models.UserModel, jumbo_models.StatusModel): ## Campi modello name = models.CharField( max_length = 50, unique = True, verbose_name = _("Description"), ) rule = models.TextField( verbose_name = _("Rule"), ) def save(self): super(TimeRule, self).save() if not settings.PROXY_ONLY_SIMULATE: ACL().crea_file() def delete(self): super(TimeRule, self).delete() if not settings.PROXY_ONLY_SIMULATE: ACL().crea_file() def get_clean_name(self): return self.name.strip().replace(" ", "_").lower() class Meta: verbose_name = _("Time Rule") verbose_name_plural = _("Time Rules") def __unicode__(self): return u"%s" % self.name ########################## # IP GROUP # ##########################
[docs]class IPGroup(jumbo_models.DateModel, jumbo_models.UserModel, jumbo_models.StatusModel, jumbo_models.OrderedModel): ## Campi modello name = models.CharField( max_length = 50, unique = True, verbose_name = _("Group"), ) ip_list = models.TextField( verbose_name = _("Ip List or User list (e.g.: DOMAIN+username"), ) def save(self): super(IPGroup, self).save() if not settings.PROXY_ONLY_SIMULATE: ACL().crea_file() def delete(self): super(IPGroup, self).delete() if not settings.PROXY_ONLY_SIMULATE: ACL().crea_file() def get_clean_name(self): return self.name.strip().replace(" ", "_").lower() class Meta: verbose_name = _("IP Group/ User Group") verbose_name_plural = _("IP Groups/ User groups") def __unicode__(self): return u"%s" % self.name ########################## # ACL # ##########################
DEFAULT_POLICY = ( ("all", _("Access Allowed")), ("none", _("Access Deny")), )
[docs]class ACL(jumbo_models.DateModel, jumbo_models.UserModel, jumbo_models.StatusModel, jumbo_models.OrderedModel): """ È il modello principale che associa un grupp di utenti o users a delle regole temporali ed una politica di default """ ## Foreign key ip_group = models.ForeignKey( IPGroup, verbose_name = _("IP Group/User groups"), related_name = "acls" ) time_rule = models.ForeignKey( TimeRule, verbose_name = _("Time Rule"), related_name = "acls" ) default = models.CharField( max_length = 4, default = "all", choices = DEFAULT_POLICY, verbose_name = _("Default Policy"), ) def save(self): super(ACL, self).save() if not settings.PROXY_ONLY_SIMULATE: self.crea_file() def delete(self): super(ACL, self).delete() if not settings.PROXY_ONLY_SIMULATE: self.crea_file() def crea_file(self): f = open(settings.PROXY_SQUIDGUARD_CONF, 'w') f.write("logdir %s\n" % settings.PROXY_LOG_PATH) f.write("dbhome %s\n\n" % settings.PROXY_PATH_CATEGORY) # TIME RULES for t in TimeRule.objects.filter(status=1): rules = t.rule.replace("\r\n", "\n") f.write("time %s {\n" % t.get_clean_name()) #f.write(" %s\n" % t.rule.replace("\n", "\n ")) f.write(" %s\n" % rules.replace("\n", "\n ")) f.write("}\n\n") # GROUP RULES for g in IPGroup.objects.filter(status=1).order_by('ordering'): iplists = g.ip_list.replace("\r\n", "\n") iplists = iplists.split('\n') f.write("src %s {\n" % g.get_clean_name()) for ip in iplists: if ip: f.write(" %s %s\n" % (settings.PROXY_IP_OR_USER, ip.replace("\n", "\n "))) f.write("}\n\n") # CATEGORY for category in Category.objects.all(): f.write("dest %s {\n" % category.name) if os.path.exists(os.path.join(settings.PROXY_PATH_CATEGORY, category.domain)): f.write(" domainlist %s\n" % category.domain) if category.url and os.path.exists(os.path.join(settings.PROXY_PATH_CATEGORY, category.url)): f.write(" urllist %s\n" % category.url) f.write("}\n\n") # ACL f.write("acl {\n") for acl in ACL.objects.filter(status=1, ip_group__status=1, time_rule__status=1).order_by('ordering'): acl_cat = ACL_Category.objects.filter(acl=acl.id, ordering__isnull=False).order_by('ordering') str_perm = "" f.write(" %s within %s {\n" % (acl.ip_group.get_clean_name(), acl.time_rule.get_clean_name())) for cat in ACL_Category.objects.filter(acl=acl.id, ordering__isnull=False).order_by('ordering'): if cat.perms == 1: str_perm += "%s " % cat.category.name if cat.perms == 2: str_perm += "!%s " % cat.category.name str_perm += "%s" % acl.default f.write(" pass %s\n" % str_perm) f.write(" redirect %s\n" % REDIRECT) f.write(" }\n\n") # Politica di default f.write(" default {\n") f.write(" pass %s\n" % settings.PROXY_DEFAULT_POLICY) f.write(" redirect %s\n" % REDIRECT) f.write(" }\n\n") f.write("}") f.close() def get_string_perms(self): acl_cat = ACL_Category.objects.filter(acl=self.id).order_by('ordering') n = "" for c in acl_cat: if c.perms == 0: continue if c.perms == 1: n += "<span style='color:green'>%s</span> " % c.category.name if c.perms == 2: n += "<span style='color:red'>!%s</span> " % c.category.name return n string_perms = property(get_string_perms) get_string_perms.short_description = _("Categories") get_string_perms.allow_tags = True class Meta: verbose_name = "ACL" verbose_name_plural = "ACL" unique_together = (("ip_group"), ("time_rule")) def __unicode__(self): return u"%s %s" % (self.ip_group, self.time_rule)
PERMS = ( (0, _('Not Managed')), (1, _('Allow')), (2, _('Deny')) )
[docs]class ACL_Category(jumbo_models.DateModel, jumbo_models.UserModel, jumbo_models.StatusModel, jumbo_models.OrderedModel): acl = models.ForeignKey(ACL) category = models.ForeignKey(Category) perms = models.IntegerField( max_length = 1, choices = PERMS ) class Meta: verbose_name = _("ACL Category") verbose_name_plural = _("ACL Categories") def __unicode__(self): return u"%s %s" % (self.category.name, self.get_perms_display()) ############################### # ACCESS LOG # ###############################
class Access_Log(models.Model): timestamp = models.DateTimeField( verbose_name = _("Date"), ) elapsed = models.PositiveIntegerField( verbose_name = _("Duration in Milliseconds"), ) client = models.IPAddressField( verbose_name = _("IP Client"), ) action = models.CharField( max_length = 50, verbose_name = _("Answer"), ) code = models.PositiveIntegerField( verbose_name = _("Answer Code"), ) size = models.PositiveIntegerField( verbose_name = _("Dimension in byte"), ) method = models.CharField( max_length = 20, verbose_name = _("Requested Method"), ) domain_dest = models.CharField( max_length = 255, verbose_name = _("Requested Domain"), ) ident = models.CharField( max_length = 30, ) hierarchy = models.CharField( max_length = 255, ) content = models.CharField( max_length = 255, )