#! 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,
)