8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-09-12 01:03:09 +00:00

Autoformat code

This commit is contained in:
Alexandre Iooss 2018-09-24 19:31:23 +02:00 committed by Hugo LEVY-FALK
parent 1e9a4b3d32
commit 48d5ab108c
7 changed files with 169 additions and 154 deletions

View file

@ -41,4 +41,3 @@ def can_view(user):
can = user.has_module_perms('machines') can = user.has_module_perms('machines')
return can, None if can else _("You don't have the right to view this" return can, None if can else _("You don't have the right to view this"
" application.") " application.")

View file

@ -29,7 +29,6 @@ from __future__ import unicode_literals
from django.contrib import admin from django.contrib import admin
from reversion.admin import VersionAdmin from reversion.admin import VersionAdmin
from .models import IpType, Machine, MachineType, Domain, IpList, Interface
from .models import ( from .models import (
Extension, Extension,
SOA, SOA,
@ -47,6 +46,7 @@ from .models import (
Ipv6List, Ipv6List,
OuverturePortList, OuverturePortList,
) )
from .models import IpType, Machine, MachineType, Domain, IpList, Interface
class MachineAdmin(VersionAdmin): class MachineAdmin(VersionAdmin):
@ -98,6 +98,7 @@ class TxtAdmin(VersionAdmin):
""" Admin view of a TXT object """ """ Admin view of a TXT object """
pass pass
class DNameAdmin(VersionAdmin): class DNameAdmin(VersionAdmin):
""" Admin view of a DName object """ """ Admin view of a DName object """
pass pass
@ -147,12 +148,12 @@ class ServiceAdmin(VersionAdmin):
""" Admin view of a ServiceAdmin object """ """ Admin view of a ServiceAdmin object """
list_display = ('service_type', 'min_time_regen', 'regular_time_regen') list_display = ('service_type', 'min_time_regen', 'regular_time_regen')
class RoleAdmin(VersionAdmin): class RoleAdmin(VersionAdmin):
""" Admin view of a RoleAdmin object """ """ Admin view of a RoleAdmin object """
pass pass
admin.site.register(Machine, MachineAdmin) admin.site.register(Machine, MachineAdmin)
admin.site.register(MachineType, MachineTypeAdmin) admin.site.register(MachineType, MachineTypeAdmin)
admin.site.register(IpType, IpTypeAdmin) admin.site.register(IpType, IpTypeAdmin)

View file

@ -35,13 +35,12 @@ Formulaires d'ajout, edition et suppressions de :
from __future__ import unicode_literals from __future__ import unicode_literals
from django.forms import ModelForm, Form
from django import forms from django import forms
from django.forms import ModelForm, Form
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from re2o.field_permissions import FieldPermissionFormMixin from re2o.field_permissions import FieldPermissionFormMixin
from re2o.mixins import FormRevMixin from re2o.mixins import FormRevMixin
from .models import ( from .models import (
Domain, Domain,
Machine, Machine,
@ -68,6 +67,7 @@ from .models import (
class EditMachineForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): class EditMachineForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
"""Formulaire d'édition d'une machine""" """Formulaire d'édition d'une machine"""
class Meta: class Meta:
model = Machine model = Machine
fields = '__all__' fields = '__all__'
@ -80,12 +80,14 @@ class EditMachineForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
class NewMachineForm(EditMachineForm): class NewMachineForm(EditMachineForm):
"""Creation d'une machine, ne renseigne que le nom""" """Creation d'une machine, ne renseigne que le nom"""
class Meta(EditMachineForm.Meta): class Meta(EditMachineForm.Meta):
fields = ['name'] fields = ['name']
class EditInterfaceForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): class EditInterfaceForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
"""Edition d'une interface. Edition complète""" """Edition d'une interface. Edition complète"""
class Meta: class Meta:
model = Interface model = Interface
fields = ['machine', 'type', 'ipv4', 'mac_address', 'details'] fields = ['machine', 'type', 'ipv4', 'mac_address', 'details']
@ -116,7 +118,7 @@ class EditInterfaceForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
interface=self.instance interface=self.instance
) )
if "machine" in self.fields: if "machine" in self.fields:
self.fields['machine'].queryset = Machine.objects.all()\ self.fields['machine'].queryset = Machine.objects.all() \
.select_related('user') .select_related('user')
can_use_all_machinetype, _reason = MachineType.can_use_all(user) can_use_all_machinetype, _reason = MachineType.can_use_all(user)
if not can_use_all_machinetype: if not can_use_all_machinetype:
@ -128,12 +130,14 @@ class EditInterfaceForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
class AddInterfaceForm(EditInterfaceForm): class AddInterfaceForm(EditInterfaceForm):
"""Ajout d'une interface à une machine. En fonction des droits, """Ajout d'une interface à une machine. En fonction des droits,
affiche ou non l'ensemble des ip disponibles""" affiche ou non l'ensemble des ip disponibles"""
class Meta(EditInterfaceForm.Meta): class Meta(EditInterfaceForm.Meta):
fields = ['type', 'ipv4', 'mac_address', 'details'] fields = ['type', 'ipv4', 'mac_address', 'details']
class AliasForm(FormRevMixin, ModelForm): class AliasForm(FormRevMixin, ModelForm):
"""Ajout d'un alias (et edition), CNAME, contenant nom et extension""" """Ajout d'un alias (et edition), CNAME, contenant nom et extension"""
class Meta: class Meta:
model = Domain model = Domain
fields = ['name', 'extension'] fields = ['name', 'extension']
@ -151,6 +155,7 @@ class AliasForm(FormRevMixin, ModelForm):
class DomainForm(FormRevMixin, ModelForm): class DomainForm(FormRevMixin, ModelForm):
"""Ajout et edition d'un enregistrement de nom, relié à interface""" """Ajout et edition d'un enregistrement de nom, relié à interface"""
class Meta: class Meta:
model = Domain model = Domain
fields = ['name'] fields = ['name']
@ -183,6 +188,7 @@ class DelAliasForm(FormRevMixin, Form):
class MachineTypeForm(FormRevMixin, ModelForm): class MachineTypeForm(FormRevMixin, ModelForm):
"""Ajout et edition d'un machinetype, relié à un iptype""" """Ajout et edition d'un machinetype, relié à un iptype"""
class Meta: class Meta:
model = MachineType model = MachineType
fields = ['type', 'ip_type'] fields = ['type', 'ip_type']
@ -214,6 +220,7 @@ class DelMachineTypeForm(FormRevMixin, Form):
class IpTypeForm(FormRevMixin, ModelForm): class IpTypeForm(FormRevMixin, ModelForm):
"""Formulaire d'ajout d'un iptype. Pas d'edition de l'ip de start et de """Formulaire d'ajout d'un iptype. Pas d'edition de l'ip de start et de
stop après creation""" stop après creation"""
class Meta: class Meta:
model = IpType model = IpType
fields = '__all__' fields = '__all__'
@ -227,6 +234,7 @@ class IpTypeForm(FormRevMixin, ModelForm):
class EditIpTypeForm(IpTypeForm): class EditIpTypeForm(IpTypeForm):
"""Edition d'un iptype. Pas d'edition du rangev4 possible, car il faudrait """Edition d'un iptype. Pas d'edition du rangev4 possible, car il faudrait
synchroniser les objets iplist""" synchroniser les objets iplist"""
class Meta(IpTypeForm.Meta): class Meta(IpTypeForm.Meta):
fields = ['extension', 'type', 'need_infra', 'domaine_ip_network', 'domaine_ip_netmask', fields = ['extension', 'type', 'need_infra', 'domaine_ip_network', 'domaine_ip_netmask',
'prefix_v6', 'prefix_v6_length', 'prefix_v6', 'prefix_v6_length',
@ -253,6 +261,7 @@ class DelIpTypeForm(FormRevMixin, Form):
class ExtensionForm(FormRevMixin, ModelForm): class ExtensionForm(FormRevMixin, ModelForm):
"""Formulaire d'ajout et edition d'une extension""" """Formulaire d'ajout et edition d'une extension"""
class Meta: class Meta:
model = Extension model = Extension
fields = '__all__' fields = '__all__'
@ -285,6 +294,7 @@ class DelExtensionForm(FormRevMixin, Form):
class Ipv6ListForm(FormRevMixin, FieldPermissionFormMixin, ModelForm): class Ipv6ListForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
"""Gestion des ipv6 d'une machine""" """Gestion des ipv6 d'une machine"""
class Meta: class Meta:
model = Ipv6List model = Ipv6List
fields = ['ipv6', 'slaac_ip'] fields = ['ipv6', 'slaac_ip']
@ -296,6 +306,7 @@ class Ipv6ListForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
class SOAForm(FormRevMixin, ModelForm): class SOAForm(FormRevMixin, ModelForm):
"""Ajout et edition d'un SOA""" """Ajout et edition d'un SOA"""
class Meta: class Meta:
model = SOA model = SOA
fields = '__all__' fields = '__all__'
@ -324,6 +335,7 @@ class DelSOAForm(FormRevMixin, Form):
class MxForm(FormRevMixin, ModelForm): class MxForm(FormRevMixin, ModelForm):
"""Ajout et edition d'un MX""" """Ajout et edition d'un MX"""
class Meta: class Meta:
model = Mx model = Mx
fields = ['zone', 'priority', 'name'] fields = ['zone', 'priority', 'name']
@ -357,6 +369,7 @@ class NsForm(FormRevMixin, ModelForm):
"""Ajout d'un NS pour une zone """Ajout d'un NS pour une zone
On exclue les CNAME dans les objets domain (interdit par la rfc) On exclue les CNAME dans les objets domain (interdit par la rfc)
donc on prend uniquemet """ donc on prend uniquemet """
class Meta: class Meta:
model = Ns model = Ns
fields = ['zone', 'ns'] fields = ['zone', 'ns']
@ -388,6 +401,7 @@ class DelNsForm(FormRevMixin, Form):
class TxtForm(FormRevMixin, ModelForm): class TxtForm(FormRevMixin, ModelForm):
"""Ajout d'un txt pour une zone""" """Ajout d'un txt pour une zone"""
class Meta: class Meta:
model = Txt model = Txt
fields = '__all__' fields = '__all__'
@ -416,6 +430,7 @@ class DelTxtForm(FormRevMixin, Form):
class DNameForm(FormRevMixin, ModelForm): class DNameForm(FormRevMixin, ModelForm):
"""Add a DNAME entry for a zone""" """Add a DNAME entry for a zone"""
class Meta: class Meta:
model = DName model = DName
fields = '__all__' fields = '__all__'
@ -444,6 +459,7 @@ class DelDNameForm(FormRevMixin, Form):
class SrvForm(FormRevMixin, ModelForm): class SrvForm(FormRevMixin, ModelForm):
"""Ajout d'un srv pour une zone""" """Ajout d'un srv pour une zone"""
class Meta: class Meta:
model = Srv model = Srv
fields = '__all__' fields = '__all__'
@ -473,6 +489,7 @@ class DelSrvForm(FormRevMixin, Form):
class NasForm(FormRevMixin, ModelForm): class NasForm(FormRevMixin, ModelForm):
"""Ajout d'un type de nas (machine d'authentification, """Ajout d'un type de nas (machine d'authentification,
swicths, bornes...)""" swicths, bornes...)"""
class Meta: class Meta:
model = Nas model = Nas
fields = '__all__' fields = '__all__'
@ -501,6 +518,7 @@ class DelNasForm(FormRevMixin, Form):
class RoleForm(FormRevMixin, ModelForm): class RoleForm(FormRevMixin, ModelForm):
"""Add and edit role.""" """Add and edit role."""
class Meta: class Meta:
model = Role model = Role
fields = '__all__' fields = '__all__'
@ -509,9 +527,9 @@ class RoleForm(FormRevMixin, ModelForm):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(RoleForm, self).__init__(*args, prefix=prefix, **kwargs) super(RoleForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['servers'].queryset = (Interface.objects.all() self.fields['servers'].queryset = (Interface.objects.all()
.select_related( .select_related(
'domain__extension' 'domain__extension'
)) ))
class DelRoleForm(FormRevMixin, Form): class DelRoleForm(FormRevMixin, Form):
@ -533,6 +551,7 @@ class DelRoleForm(FormRevMixin, Form):
class ServiceForm(FormRevMixin, ModelForm): class ServiceForm(FormRevMixin, ModelForm):
"""Ajout et edition d'une classe de service : dns, dhcp, etc""" """Ajout et edition d'une classe de service : dns, dhcp, etc"""
class Meta: class Meta:
model = Service model = Service
fields = '__all__' fields = '__all__'
@ -541,9 +560,9 @@ class ServiceForm(FormRevMixin, ModelForm):
prefix = kwargs.pop('prefix', self.Meta.model.__name__) prefix = kwargs.pop('prefix', self.Meta.model.__name__)
super(ServiceForm, self).__init__(*args, prefix=prefix, **kwargs) super(ServiceForm, self).__init__(*args, prefix=prefix, **kwargs)
self.fields['servers'].queryset = (Interface.objects.all() self.fields['servers'].queryset = (Interface.objects.all()
.select_related( .select_related(
'domain__extension' 'domain__extension'
)) ))
def save(self, commit=True): def save(self, commit=True):
# TODO : None of the parents of ServiceForm use the commit # TODO : None of the parents of ServiceForm use the commit
@ -574,6 +593,7 @@ class DelServiceForm(FormRevMixin, Form):
class VlanForm(FormRevMixin, ModelForm): class VlanForm(FormRevMixin, ModelForm):
"""Ajout d'un vlan : id, nom""" """Ajout d'un vlan : id, nom"""
class Meta: class Meta:
model = Vlan model = Vlan
fields = ['vlan_id', 'name', 'comment'] fields = ['vlan_id', 'name', 'comment']
@ -614,6 +634,7 @@ class DelVlanForm(FormRevMixin, Form):
class EditOuverturePortConfigForm(FormRevMixin, ModelForm): class EditOuverturePortConfigForm(FormRevMixin, ModelForm):
"""Edition de la liste des profils d'ouverture de ports """Edition de la liste des profils d'ouverture de ports
pour l'interface""" pour l'interface"""
class Meta: class Meta:
model = Interface model = Interface
fields = ['port_lists'] fields = ['port_lists']
@ -630,6 +651,7 @@ class EditOuverturePortConfigForm(FormRevMixin, ModelForm):
class EditOuverturePortListForm(FormRevMixin, ModelForm): class EditOuverturePortListForm(FormRevMixin, ModelForm):
"""Edition de la liste des ports et profils d'ouverture """Edition de la liste des ports et profils d'ouverture
des ports""" des ports"""
class Meta: class Meta:
model = OuverturePortList model = OuverturePortList
fields = '__all__' fields = '__all__'
@ -642,9 +664,10 @@ class EditOuverturePortListForm(FormRevMixin, ModelForm):
**kwargs **kwargs
) )
class SshFpForm(FormRevMixin, ModelForm): class SshFpForm(FormRevMixin, ModelForm):
"""Edits a SSHFP record.""" """Edits a SSHFP record."""
class Meta: class Meta:
model = SshFp model = SshFp
exclude = ('machine',) exclude = ('machine',)
@ -656,4 +679,3 @@ class SshFpForm(FormRevMixin, ModelForm):
prefix=prefix, prefix=prefix,
**kwargs **kwargs
) )

View file

@ -27,32 +27,30 @@ The models definitions for the Machines app
from __future__ import unicode_literals from __future__ import unicode_literals
from datetime import timedelta import base64
import hashlib
import re import re
from datetime import timedelta
from ipaddress import IPv6Address from ipaddress import IPv6Address
from itertools import chain from itertools import chain
from netaddr import mac_bare, EUI, IPSet, IPRange, IPNetwork, IPAddress
import hashlib
import base64
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.db.models.signals import post_save, post_delete from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver from django.dispatch import receiver
from django.forms import ValidationError from django.forms import ValidationError
from django.utils.functional import cached_property
from django.utils import timezone from django.utils import timezone
from django.core.validators import MaxValueValidator, MinValueValidator from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from macaddress.fields import MACAddressField from macaddress.fields import MACAddressField
from netaddr import mac_bare, EUI, IPSet, IPRange, IPNetwork, IPAddress
import preferences.models
import users.models
from re2o.field_permissions import FieldPermissionModelMixin from re2o.field_permissions import FieldPermissionModelMixin
from re2o.mixins import AclMixin, RevMixin from re2o.mixins import AclMixin, RevMixin
import users.models
import preferences.models
class Machine(RevMixin, FieldPermissionModelMixin, models.Model): class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
""" Class définissant une machine, object parent user, objets fils """ Class définissant une machine, object parent user, objets fils
@ -116,7 +114,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
:return: True ou False avec la raison de l'échec le cas échéant""" :return: True ou False avec la raison de l'échec le cas échéant"""
if not user_request.has_perm('machines.view_machine'): if not user_request.has_perm('machines.view_machine'):
return False, _("You don't have the right to view all the" return False, _("You don't have the right to view all the"
" machines.") " machines.")
return True, None return True, None
@staticmethod @staticmethod
@ -131,9 +129,9 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
except users.models.User.DoesNotExist: except users.models.User.DoesNotExist:
return False, _("Nonexistent user.") return False, _("Nonexistent user.")
max_lambdauser_interfaces = (preferences.models.OptionalMachine max_lambdauser_interfaces = (preferences.models.OptionalMachine
.get_cached_value( .get_cached_value(
'max_lambdauser_interfaces' 'max_lambdauser_interfaces'
)) ))
if not user_request.has_perm('machines.add_machine'): if not user_request.has_perm('machines.add_machine'):
if not (preferences.models.OptionalMachine if not (preferences.models.OptionalMachine
.get_cached_value('create_machine')): .get_cached_value('create_machine')):
@ -180,7 +178,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
**kwargs **kwargs
)[0]): )[0]):
return False, _("You don't have the right to delete a machine" return False, _("You don't have the right to delete a machine"
" of another user.") " of another user.")
return True, None return True, None
def can_view(self, user_request, *_args, **_kwargs): def can_view(self, user_request, *_args, **_kwargs):
@ -192,7 +190,7 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
if (not user_request.has_perm('machines.view_machine') and if (not user_request.has_perm('machines.view_machine') and
self.user != user_request): self.user != user_request):
return False, _("You don't have the right to view other machines" return False, _("You don't have the right to view other machines"
" than yours.") " than yours.")
return True, None return True, None
@cached_property @cached_property
@ -213,14 +211,14 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
machine""" machine"""
return Domain.objects.filter( return Domain.objects.filter(
interface_parent__machine=self interface_parent__machine=self
).values_list('name', flat=True).distinct() ).values_list('name', flat=True).distinct()
@cached_property @cached_property
def all_complete_names(self): def all_complete_names(self):
"""Renvoie tous les tls complets de la machine""" """Renvoie tous les tls complets de la machine"""
return [str(domain) for domain in Domain.objects.filter( return [str(domain) for domain in Domain.objects.filter(
Q(cname__interface_parent__machine=self) | Q(interface_parent__machine=self) Q(cname__interface_parent__machine=self) | Q(interface_parent__machine=self)
)] )]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(Machine, self).__init__(*args, **kwargs) super(Machine, self).__init__(*args, **kwargs)
@ -296,8 +294,8 @@ class IpType(RevMixin, AclMixin, models.Model):
help_text=_("Netmask for the domain's IPv4 range") help_text=_("Netmask for the domain's IPv4 range")
) )
reverse_v4 = models.BooleanField( reverse_v4 = models.BooleanField(
default=False, default=False,
help_text=_("Enable reverse DNS for IPv4"), help_text=_("Enable reverse DNS for IPv4"),
) )
prefix_v6 = models.GenericIPAddressField( prefix_v6 = models.GenericIPAddressField(
protocol='IPv6', protocol='IPv6',
@ -310,10 +308,10 @@ class IpType(RevMixin, AclMixin, models.Model):
MaxValueValidator(128), MaxValueValidator(128),
MinValueValidator(0) MinValueValidator(0)
] ]
) )
reverse_v6 = models.BooleanField( reverse_v6 = models.BooleanField(
default=False, default=False,
help_text=_("Enable reverse DNS for IPv6"), help_text=_("Enable reverse DNS for IPv6"),
) )
vlan = models.ForeignKey( vlan = models.ForeignKey(
'Vlan', 'Vlan',
@ -333,7 +331,7 @@ class IpType(RevMixin, AclMixin, models.Model):
("use_all_iptype", _("Can use all IP types")), ("use_all_iptype", _("Can use all IP types")),
) )
verbose_name = _("IP type") verbose_name = _("IP type")
verbose_name_plural = ("IP types") verbose_name_plural = "IP types"
@cached_property @cached_property
def ip_range(self): def ip_range(self):
@ -373,9 +371,9 @@ class IpType(RevMixin, AclMixin, models.Model):
def ip6_set_full_info(self): def ip6_set_full_info(self):
if self.prefix_v6: if self.prefix_v6:
return { return {
'network' : str(self.prefix_v6), 'network': str(self.prefix_v6),
'netmask' : 'ffff:ffff:ffff:ffff::', 'netmask': 'ffff:ffff:ffff:ffff::',
'netmask_cidr' : str(self.prefix_v6_length), 'netmask_cidr': str(self.prefix_v6_length),
'vlan': str(self.vlan), 'vlan': str(self.vlan),
'vlan_id': self.vlan.vlan_id 'vlan_id': self.vlan.vlan_id
} }
@ -394,10 +392,10 @@ class IpType(RevMixin, AclMixin, models.Model):
def ip_net_full_info(self): def ip_net_full_info(self):
"""Renvoie les infos du network contenant du range""" """Renvoie les infos du network contenant du range"""
return { return {
'network' : str(self.ip_network.network), 'network': str(self.ip_network.network),
'netmask' : str(self.ip_network.netmask), 'netmask': str(self.ip_network.netmask),
'broadcast' : str(self.ip_network.broadcast), 'broadcast': str(self.ip_network.broadcast),
'netmask_cidr' : str(self.ip_network.prefixlen), 'netmask_cidr': str(self.ip_network.prefixlen),
} }
@cached_property @cached_property
@ -448,9 +446,9 @@ class IpType(RevMixin, AclMixin, models.Model):
return return
else: else:
for ipv6 in Ipv6List.objects.filter( for ipv6 in Ipv6List.objects.filter(
interface__in=Interface.objects.filter( interface__in=Interface.objects.filter(
type__in=MachineType.objects.filter(ip_type=self) type__in=MachineType.objects.filter(ip_type=self)
) )
): ):
ipv6.check_and_replace_prefix(prefix=self.prefix_v6) ipv6.check_and_replace_prefix(prefix=self.prefix_v6)
@ -814,8 +812,8 @@ class Txt(RevMixin, AclMixin, models.Model):
verbose_name_plural = _("TXT records") verbose_name_plural = _("TXT records")
def __str__(self): def __str__(self):
return str(self.zone) + " : " + str(self.field1) + " " +\ return str(self.zone) + " : " + str(self.field1) + " " + \
str(self.field2) str(self.field2)
@cached_property @cached_property
def dns_entry(self): def dns_entry(self):
@ -874,7 +872,7 @@ class Srv(RevMixin, AclMixin, models.Model):
default=0, default=0,
validators=[MaxValueValidator(65535)], validators=[MaxValueValidator(65535)],
help_text=_("Relative weight for records with the same priority" help_text=_("Relative weight for records with the same priority"
" (integer value between 0 and 65535)") " (integer value between 0 and 65535)")
) )
port = models.PositiveIntegerField( port = models.PositiveIntegerField(
validators=[MaxValueValidator(65535)], validators=[MaxValueValidator(65535)],
@ -894,17 +892,17 @@ class Srv(RevMixin, AclMixin, models.Model):
verbose_name_plural = _("SRV records") verbose_name_plural = _("SRV records")
def __str__(self): def __str__(self):
return str(self.service) + ' ' + str(self.protocole) + ' ' +\ return str(self.service) + ' ' + str(self.protocole) + ' ' + \
str(self.extension) + ' ' + str(self.priority) +\ str(self.extension) + ' ' + str(self.priority) + \
' ' + str(self.weight) + str(self.port) + str(self.target) ' ' + str(self.weight) + str(self.port) + str(self.target)
@cached_property @cached_property
def dns_entry(self): def dns_entry(self):
"""Renvoie l'enregistrement SRV complet pour le fichier de zone""" """Renvoie l'enregistrement SRV complet pour le fichier de zone"""
return str(self.service) + '._' + str(self.protocole).lower() +\ return str(self.service) + '._' + str(self.protocole).lower() + \
str(self.extension) + '. ' + str(self.ttl) + ' IN SRV ' +\ str(self.extension) + '. ' + str(self.ttl) + ' IN SRV ' + \
str(self.priority) + ' ' + str(self.weight) + ' ' +\ str(self.priority) + ' ' + str(self.weight) + ' ' + \
str(self.port) + ' ' + str(self.target) + '.' str(self.port) + ' ' + str(self.target) + '.'
class SshFp(RevMixin, AclMixin, models.Model): class SshFp(RevMixin, AclMixin, models.Model):
@ -949,8 +947,8 @@ class SshFp(RevMixin, AclMixin, models.Model):
"""Return the hashess for the pub key with correct id """Return the hashess for the pub key with correct id
cf RFC, 1 is sha1 , 2 sha256""" cf RFC, 1 is sha1 , 2 sha256"""
return { return {
"1" : hashlib.sha1(base64.b64decode(self.pub_key_entry)).hexdigest(), "1": hashlib.sha1(base64.b64decode(self.pub_key_entry)).hexdigest(),
"2" : hashlib.sha256(base64.b64decode(self.pub_key_entry)).hexdigest(), "2": hashlib.sha256(base64.b64decode(self.pub_key_entry)).hexdigest(),
} }
class Meta: class Meta:
@ -973,7 +971,6 @@ class SshFp(RevMixin, AclMixin, models.Model):
return str(self.algo) + ' ' + str(self.comment) return str(self.algo) + ' ' + str(self.comment)
class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model): class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
""" Une interface. Objet clef de l'application machine : """ Une interface. Objet clef de l'application machine :
- une address mac unique. Possibilité de la rendre unique avec le - une address mac unique. Possibilité de la rendre unique avec le
@ -1067,7 +1064,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
.get_cached_value('ipv6_mode') == 'SLAAC'): .get_cached_value('ipv6_mode') == 'SLAAC'):
self.sync_ipv6_slaac() self.sync_ipv6_slaac()
elif (preferences.models.OptionalMachine elif (preferences.models.OptionalMachine
.get_cached_value('ipv6_mode') == 'DHCPV6'): .get_cached_value('ipv6_mode') == 'DHCPV6'):
self.sync_ipv6_dhcpv6() self.sync_ipv6_dhcpv6()
else: else:
return return
@ -1080,7 +1077,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
.get_cached_value('ipv6_mode') == 'SLAAC'): .get_cached_value('ipv6_mode') == 'SLAAC'):
return self.ipv6list.all() return self.ipv6list.all()
elif (preferences.models.OptionalMachine elif (preferences.models.OptionalMachine
.get_cached_value('ipv6_mode') == 'DHCPV6'): .get_cached_value('ipv6_mode') == 'DHCPV6'):
return self.ipv6list.filter(slaac_ip=False) return self.ipv6list.filter(slaac_ip=False)
else: else:
return None return None
@ -1159,9 +1156,9 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
.get_cached_value('create_machine')): .get_cached_value('create_machine')):
return False, _("You can't add a machine.") return False, _("You can't add a machine.")
max_lambdauser_interfaces = (preferences.models.OptionalMachine max_lambdauser_interfaces = (preferences.models.OptionalMachine
.get_cached_value( .get_cached_value(
'max_lambdauser_interfaces' 'max_lambdauser_interfaces'
)) ))
if machine.user != user_request: if machine.user != user_request:
return False, _("You don't have the right to add an interface" return False, _("You don't have the right to add an interface"
" to a machine of another user.") " to a machine of another user.")
@ -1365,8 +1362,8 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
def clean(self, *args, **kwargs): def clean(self, *args, **kwargs):
if self.slaac_ip and (Ipv6List.objects if self.slaac_ip and (Ipv6List.objects
.filter(interface=self.interface, slaac_ip=True) .filter(interface=self.interface, slaac_ip=True)
.exclude(id=self.id)): .exclude(id=self.id)):
raise ValidationError(_("A SLAAC IP address is already registered.")) raise ValidationError(_("A SLAAC IP address is already registered."))
prefix_v6 = self.interface.type.ip_type.prefix_v6.encode().decode('utf-8') prefix_v6 = self.interface.type.ip_type.prefix_v6.encode().decode('utf-8')
if prefix_v6: if prefix_v6:
@ -1498,18 +1495,18 @@ class Domain(RevMixin, AclMixin, models.Model):
return False, _("Nonexistent interface.") return False, _("Nonexistent interface.")
if not user_request.has_perm('machines.add_domain'): if not user_request.has_perm('machines.add_domain'):
max_lambdauser_aliases = (preferences.models.OptionalMachine max_lambdauser_aliases = (preferences.models.OptionalMachine
.get_cached_value( .get_cached_value(
'max_lambdauser_aliases' 'max_lambdauser_aliases'
)) ))
if interface.machine.user != user_request: if interface.machine.user != user_request:
return False, _("You don't have the right to add an alias to a" return False, _("You don't have the right to add an alias to a"
" machine of another user.") " machine of another user.")
if Domain.objects.filter( if Domain.objects.filter(
cname__in=Domain.objects.filter( cname__in=Domain.objects.filter(
interface_parent__in=(interface.machine.user interface_parent__in=(interface.machine.user
.user_interfaces()) .user_interfaces())
) )
).count() >= max_lambdauser_aliases: ).count() >= max_lambdauser_aliases:
return False, _("You reached the maximum number of alias that" return False, _("You reached the maximum number of alias that"
" you are allowed to create yourself (%s). " " you are allowed to create yourself (%s). "
% max_lambdauser_aliases) % max_lambdauser_aliases)
@ -1695,7 +1692,7 @@ class Service(RevMixin, AclMixin, models.Model):
def ask_regen(self): def ask_regen(self):
""" Marque à True la demande de régénération pour un service x """ """ Marque à True la demande de régénération pour un service x """
Service_link.objects.filter(service=self).exclude(asked_regen=True)\ Service_link.objects.filter(service=self).exclude(asked_regen=True) \
.update(asked_regen=True) .update(asked_regen=True)
return return
@ -1703,11 +1700,11 @@ class Service(RevMixin, AclMixin, models.Model):
""" Django ne peut créer lui meme les relations manytomany avec table """ Django ne peut créer lui meme les relations manytomany avec table
intermediaire explicite""" intermediaire explicite"""
for serv in servers.exclude( for serv in servers.exclude(
pk__in=Interface.objects.filter(service=self) pk__in=Interface.objects.filter(service=self)
): ):
link = Service_link(service=self, server=serv) link = Service_link(service=self, server=serv)
link.save() link.save()
Service_link.objects.filter(service=self).exclude(server__in=servers)\ Service_link.objects.filter(service=self).exclude(server__in=servers) \
.delete() .delete()
return return
@ -1754,10 +1751,10 @@ class Service_link(RevMixin, AclMixin, models.Model):
régénération de service""" régénération de service"""
return bool( return bool(
(self.asked_regen and ( (self.asked_regen and (
self.last_regen + self.service.min_time_regen self.last_regen + self.service.min_time_regen
) < timezone.now() ) < timezone.now()
) or ( ) or (
self.last_regen + self.service.regular_time_regen self.last_regen + self.service.regular_time_regen
) < timezone.now() ) < timezone.now()
) )
@ -1875,9 +1872,8 @@ class OuverturePort(RevMixin, AclMixin, models.Model):
), ),
default=OUT, default=OUT,
) )
class Meta: class Meta:
verbose_name = _("ports opening")
verbose_name = _("ports openings") verbose_name = _("ports openings")
def __str__(self): def __str__(self):
@ -2044,4 +2040,3 @@ def srv_post_save(**_kwargs):
def srv_post_delete(**_kwargs): def srv_post_delete(**_kwargs):
"""Regeneration dns après modification d'un SRV""" """Regeneration dns après modification d'un SRV"""
regen('dns') regen('dns')

View file

@ -26,8 +26,8 @@
Serializers for the Machines app Serializers for the Machines app
""" """
from rest_framework import serializers from rest_framework import serializers
from machines.models import ( from machines.models import (
Interface, Interface,
IpType, IpType,
@ -148,13 +148,13 @@ class TypeSerializer(serializers.ModelSerializer):
get ForeignKey values. Infos about the general port policy is added """ get ForeignKey values. Infos about the general port policy is added """
extension = ExtensionNameField(read_only=True) extension = ExtensionNameField(read_only=True)
ouverture_ports_tcp_in = serializers\ ouverture_ports_tcp_in = serializers \
.SerializerMethodField('get_port_policy_input_tcp') .SerializerMethodField('get_port_policy_input_tcp')
ouverture_ports_tcp_out = serializers\ ouverture_ports_tcp_out = serializers \
.SerializerMethodField('get_port_policy_output_tcp') .SerializerMethodField('get_port_policy_output_tcp')
ouverture_ports_udp_in = serializers\ ouverture_ports_udp_in = serializers \
.SerializerMethodField('get_port_policy_input_udp') .SerializerMethodField('get_port_policy_input_udp')
ouverture_ports_udp_out = serializers\ ouverture_ports_udp_out = serializers \
.SerializerMethodField('get_port_policy_output_udp') .SerializerMethodField('get_port_policy_output_udp')
class Meta: class Meta:
@ -400,7 +400,7 @@ class OuverturePortsSerializer(serializers.Serializer):
return { return {
i.ipv4.ipv4: { i.ipv4.ipv4: {
"tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()],
"tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], "tcp_out": [j.tcp_ports_out() for j in i.port_lists.all()],
"udp_in": [j.udp_ports_in() for j in i.port_lists.all()], "udp_in": [j.udp_ports_in() for j in i.port_lists.all()],
"udp_out": [j.udp_ports_out() for j in i.port_lists.all()], "udp_out": [j.udp_ports_out() for j in i.port_lists.all()],
} }
@ -413,7 +413,7 @@ class OuverturePortsSerializer(serializers.Serializer):
return { return {
i.ipv6: { i.ipv6: {
"tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()], "tcp_in": [j.tcp_ports_in() for j in i.port_lists.all()],
"tcp_out": [j.tcp_ports_out()for j in i.port_lists.all()], "tcp_out": [j.tcp_ports_out() for j in i.port_lists.all()],
"udp_in": [j.udp_ports_in() for j in i.port_lists.all()], "udp_in": [j.udp_ports_in() for j in i.port_lists.all()],
"udp_out": [j.udp_ports_out() for j in i.port_lists.all()], "udp_out": [j.udp_ports_out() for j in i.port_lists.all()],
} }

View file

@ -27,6 +27,7 @@ The defined URLs for the Machines app
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf.urls import url from django.conf.urls import url
from . import views from . import views
urlpatterns = [ urlpatterns = [

View file

@ -32,26 +32,18 @@ The views for the Machines app
from __future__ import unicode_literals from __future__ import unicode_literals
from django.urls import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, redirect
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.db.models import ProtectedError, F from django.db.models import ProtectedError, F
from django.forms import modelformset_factory from django.forms import modelformset_factory
from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer from rest_framework.renderers import JSONRenderer
from users.models import User
from preferences.models import GeneralOption from preferences.models import GeneralOption
from re2o.utils import (
all_active_assigned_interfaces,
filter_active_interfaces,
SortTable,
re2o_paginator,
)
from re2o.acl import ( from re2o.acl import (
can_create, can_create,
can_edit, can_edit,
@ -60,21 +52,14 @@ from re2o.acl import (
can_view_all, can_view_all,
can_delete_set, can_delete_set,
) )
from re2o.views import form from re2o.utils import (
all_active_assigned_interfaces,
from .serializers import ( filter_active_interfaces,
FullInterfaceSerializer, SortTable,
InterfaceSerializer, re2o_paginator,
TypeSerializer,
DomainSerializer,
TxtSerializer,
SrvSerializer,
MxSerializer,
ExtensionSerializer,
ServiceServersSerializer,
NsSerializer,
) )
from re2o.views import form
from users.models import User
from .forms import ( from .forms import (
NewMachineForm, NewMachineForm,
EditMachineForm, EditMachineForm,
@ -139,6 +124,18 @@ from .models import (
OuverturePort, OuverturePort,
Ipv6List, Ipv6List,
) )
from .serializers import (
FullInterfaceSerializer,
InterfaceSerializer,
TypeSerializer,
DomainSerializer,
TxtSerializer,
SrvSerializer,
MxSerializer,
ExtensionSerializer,
ServiceServersSerializer,
NsSerializer,
)
def f_type_id(is_type_tt): def f_type_id(is_type_tt):
@ -153,12 +150,12 @@ def generate_ipv4_choices(form_obj):
""" """
f_ipv4 = form_obj.fields['ipv4'] f_ipv4 = form_obj.fields['ipv4']
used_mtype_id = [] used_mtype_id = []
choices = '{"":[{key:"",value:"'+_("Select a machine type first.") + '"}' choices = '{"":[{key:"",value:"' + _("Select a machine type first.") + '"}'
mtype_id = -1 mtype_id = -1
for ip in (f_ipv4.queryset for ip in (f_ipv4.queryset
.annotate(mtype_id=F('ip_type__machinetype__id')) .annotate(mtype_id=F('ip_type__machinetype__id'))
.order_by('mtype_id', 'id')): .order_by('mtype_id', 'id')):
if mtype_id != ip.mtype_id: if mtype_id != ip.mtype_id:
mtype_id = ip.mtype_id mtype_id = ip.mtype_id
used_mtype_id.append(mtype_id) used_mtype_id.append(mtype_id)
@ -172,7 +169,7 @@ def generate_ipv4_choices(form_obj):
) )
for t in form_obj.fields['type'].queryset.exclude(id__in=used_mtype_id): for t in form_obj.fields['type'].queryset.exclude(id__in=used_mtype_id):
choices += '], "'+str(t.id)+'": [' choices += '], "' + str(t.id) + '": ['
choices += '{key: "", value: "' + str(f_ipv4.empty_label) + '"},' choices += '{key: "", value: "' + str(f_ipv4.empty_label) + '"},'
choices += ']}' choices += ']}'
return choices return choices
@ -889,6 +886,7 @@ def del_ns(request, instances):
request request
) )
@login_required @login_required
@can_create(DName) @can_create(DName)
def add_dname(request): def add_dname(request):
@ -935,9 +933,9 @@ def del_dname(request, instances):
messages.success(request, _("The DNAME record was deleted.")) messages.success(request, _("The DNAME record was deleted."))
except ProtectedError: except ProtectedError:
messages.error( messages.error(
request, request,
_("Error: the DNAME record %s can't be deleted.") _("Error: the DNAME record %s can't be deleted.")
% dname_del % dname_del
) )
return redirect(reverse('machines:index-extension')) return redirect(reverse('machines:index-extension'))
return form( return form(
@ -1252,16 +1250,16 @@ def del_service(request, instances):
request request
) )
@login_required @login_required
@can_edit(Service) @can_edit(Service)
def regen_service(request,service, **_kwargs): def regen_service(request, service, **_kwargs):
"""Ask for a regen of the service""" """Ask for a regen of the service"""
regen(service) regen(service)
return index_service(request) return index_service(request)
@login_required @login_required
@can_create(Vlan) @can_create(Vlan)
def add_vlan(request): def add_vlan(request):
@ -1388,10 +1386,10 @@ def index(request):
.prefetch_related('interface_set__domain__extension') .prefetch_related('interface_set__domain__extension')
.prefetch_related('interface_set__ipv4__ip_type') .prefetch_related('interface_set__ipv4__ip_type')
.prefetch_related( .prefetch_related(
'interface_set__type__ip_type__extension' 'interface_set__type__ip_type__extension'
).prefetch_related( ).prefetch_related(
'interface_set__domain__related_domain__extension' 'interface_set__domain__related_domain__extension'
).prefetch_related('interface_set__ipv6list')) ).prefetch_related('interface_set__ipv6list'))
machines_list = SortTable.sort( machines_list = SortTable.sort(
machines_list, machines_list,
request.GET.get('col'), request.GET.get('col'),
@ -1548,8 +1546,8 @@ def index_role(request):
""" View used to display the list of existing roles """ """ View used to display the list of existing roles """
role_list = (Role.objects role_list = (Role.objects
.prefetch_related( .prefetch_related(
'servers__domain__extension' 'servers__domain__extension'
).all()) ).all())
return render( return render(
request, request,
'machines/index_role.html', 'machines/index_role.html',
@ -1563,8 +1561,8 @@ def index_service(request):
""" View used to display the list of existing services """ """ View used to display the list of existing services """
service_list = (Service.objects service_list = (Service.objects
.prefetch_related( .prefetch_related(
'service_link_set__server__domain__extension' 'service_link_set__server__domain__extension'
).all()) ).all())
servers_list = (Service_link.objects servers_list = (Service_link.objects
.select_related('server__domain__extension') .select_related('server__domain__extension')
.select_related('service') .select_related('service')
@ -1740,10 +1738,10 @@ def alias(_request):
alias = (Domain.objects alias = (Domain.objects
.filter(interface_parent=None) .filter(interface_parent=None)
.filter( .filter(
cname__in=Domain.objects.filter( cname__in=Domain.objects.filter(
interface_parent__in=Interface.objects.exclude(ipv4=None) interface_parent__in=Interface.objects.exclude(ipv4=None)
) )
).select_related('extension') ).select_related('extension')
.select_related('cname__extension')) .select_related('cname__extension'))
seria = DomainSerializer(alias, many=True) seria = DomainSerializer(alias, many=True)
return JSONResponse(seria.data) return JSONResponse(seria.data)
@ -1801,10 +1799,10 @@ def ns(_request):
""" API view to list the NS records """ """ API view to list the NS records """
ns = (Ns.objects ns = (Ns.objects
.exclude( .exclude(
ns__in=Domain.objects.filter( ns__in=Domain.objects.filter(
interface_parent__in=Interface.objects.filter(ipv4=None) interface_parent__in=Interface.objects.filter(ipv4=None)
) )
).select_related('zone') ).select_related('zone')
.select_related('ns__extension')) .select_related('ns__extension'))
seria = NsSerializer(ns, many=True) seria = NsSerializer(ns, many=True)
return JSONResponse(seria.data) return JSONResponse(seria.data)
@ -1859,9 +1857,9 @@ def ouverture_ports(_request):
""" API view to list the port policies for each IP """ """ API view to list the port policies for each IP """
r = {'ipv4': {}, 'ipv6': {}} r = {'ipv4': {}, 'ipv6': {}}
for o in (OuverturePortList.objects for o in (OuverturePortList.objects
.all() .all()
.prefetch_related('ouvertureport_set') .prefetch_related('ouvertureport_set')
.prefetch_related('interface_set', 'interface_set__ipv4')): .prefetch_related('interface_set', 'interface_set__ipv4')):
pl = { pl = {
"tcp_in": set(map( "tcp_in": set(map(
str, str,
@ -1926,17 +1924,16 @@ def regen_achieved(request):
""" API view to list the regen status for each (Service link, Server) """ API view to list the regen status for each (Service link, Server)
couple """ couple """
obj = (Service_link.objects obj = (Service_link.objects
.filter( .filter(
service__in=Service.objects.filter( service__in=Service.objects.filter(
service_type=request.POST['service'] service_type=request.POST['service']
), ),
server__in=Interface.objects.filter( server__in=Interface.objects.filter(
domain__in=Domain.objects.filter( domain__in=Domain.objects.filter(
name=request.POST['server'] name=request.POST['server']
) )
) )
)) ))
if obj: if obj:
obj.first().done_regen() obj.first().done_regen()
return HttpResponse("Ok") return HttpResponse("Ok")