@ -20,14 +20,17 @@
# You should have received a copy of the GNU General Public License along
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
""" machines.models
The models definitions for the Machines app
"""
from __future__ import unicode_literals
from __future__ import unicode_literals
from datetime import timedelta
from datetime import timedelta
import re
import re
from netaddr import mac_bare , EUI , IPSet , IPRange , IPNetwork , IPAddress
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
from django . db import models
from django . db import models
from django . db . models . signals import post_save , post_delete
from django . db . models . signals import post_save , post_delete
@ -40,7 +43,7 @@ from django.core.validators import MaxValueValidator
from macaddress . fields import MACAddressField
from macaddress . fields import MACAddressField
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 users . models
import preferences . models
import preferences . models
@ -63,23 +66,30 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
class Meta :
class Meta :
permissions = (
permissions = (
( " view_machine " , " Peut voir un objet machine quelquonque " ) ,
( " view_machine " , " Peut voir un objet machine quelquonque " ) ,
( " change_machine_user " , " Peut changer le propriétaire d ' une machine " ) ,
( " change_machine_user " ,
" Peut changer le propriétaire d ' une machine " ) ,
)
)
def get_instance ( machineid , * args , * * kwargs ) :
@classmethod
def get_instance ( cls , machineid , * _args , * * _kwargs ) :
""" Get the Machine instance with machineid.
""" Get the Machine instance with machineid.
: param userid : The id
: param userid : The id
: return : The user
: return : The user
"""
"""
return Machine . objects . get ( pk = machineid )
return cls . objects . get ( pk = machineid )
def linked_objects ( self ) :
def linked_objects ( self ) :
""" Return linked objects : machine and domain.
""" Return linked objects : machine and domain.
Usefull in history display """
Usefull in history display """
return chain ( self . interface_set . all ( ) , Domain . objects . filter ( interface_parent__in = self . interface_set . all ( ) ) )
return chain (
self . interface_set . all ( ) ,
Domain . objects . filter (
interface_parent__in = self . interface_set . all ( )
)
)
@staticmethod
@staticmethod
def can_change_user ( user_request , * args , * * kwargs ) :
def can_change_user ( user_request , * _ args, * * _ kwargs) :
""" Checks if an user is allowed to change the user who owns a
""" Checks if an user is allowed to change the user who owns a
Machine .
Machine .
@ -90,18 +100,22 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
A tuple with a boolean stating if edition is allowed and an
A tuple with a boolean stating if edition is allowed and an
explanation message .
explanation message .
"""
"""
return user_request . has_perm ( ' machines.change_machine_user ' ) , " Vous ne pouvez pas modifier l ' utilisateur de la machine. "
return ( user_request . has_perm ( ' machines.change_machine_user ' ) ,
" Vous ne pouvez pas modifier l ' utilisateur de la machine. " )
def can_view_all ( user_request , * args , * * kwargs ) :
@staticmethod
def can_view_all ( user_request , * _args , * * _kwargs ) :
""" Vérifie qu ' on peut bien afficher l ' ensemble des machines,
""" Vérifie qu ' on peut bien afficher l ' ensemble des machines,
droit particulier correspondant
droit particulier correspondant
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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 , u " Vous ne pouvez pas afficher l ' ensemble des machines sans permission "
return False , ( u " Vous ne pouvez pas afficher l ' ensemble des "
" machines sans permission " )
return True , None
return True , None
def can_create ( user_request , userid , * args , * * kwargs ) :
@staticmethod
def can_create ( user_request , userid , * _args , * * _kwargs ) :
""" Vérifie qu ' un user qui fait la requète peut bien créer la machine
""" Vérifie qu ' un user qui fait la requète peut bien créer la machine
et n ' a pas atteint son quota, et crée bien une machine à lui
et n ' a pas atteint son quota, et crée bien une machine à lui
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
@ -111,17 +125,21 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
user = users . models . User . objects . get ( pk = userid )
user = users . models . User . objects . get ( pk = userid )
except users . models . User . DoesNotExist :
except users . models . User . DoesNotExist :
return False , u " Utilisateur inexistant "
return False , u " Utilisateur inexistant "
max_lambdauser_interfaces = preferences . models . OptionalMachine . get_cached_value ( ' max_lambdauser_interfaces ' )
max_lambdauser_interfaces = ( preferences . models . OptionalMachine
. get_cached_value (
' 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 . get_cached_value ( ' create_machine ' ) :
if not ( preferences . models . OptionalMachine
. get_cached_value ( ' create_machine ' ) ) :
return False , u " Vous ne pouvez pas ajouter une machine "
return False , u " Vous ne pouvez pas ajouter une machine "
if user != user_request :
if user != user_request :
return False , u " Vous ne pouvez pas ajouter une machine à un \
return False , ( u " Vous ne pouvez pas ajouter une machine à un "
autre user que vous sans droit "
" autre user que vous sans droit " )
if user . user_interfaces ( ) . count ( ) > = max_lambdauser_interfaces :
if user . user_interfaces ( ) . count ( ) > = max_lambdauser_interfaces :
return False , u " Vous avez atteint le maximum d ' interfaces \
return False , ( u " Vous avez atteint le maximum d ' interfaces "
autorisées que vous pouvez créer vous même ( % s ) " \
" autorisées que vous pouvez créer vous même "
% max_lambdauser_interfaces
" ( %s ) " % max_lambdauser_interfaces )
return True , None
return True , None
def can_edit ( self , user_request , * args , * * kwargs ) :
def can_edit ( self , user_request , * args , * * kwargs ) :
@ -131,9 +149,15 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: return : True ou False avec la raison le cas échéant """
: return : True ou False avec la raison le cas échéant """
if self . user != user_request :
if self . user != user_request :
if not user_request . has_perm ( ' machines.change_interface ' ) or not self . user . can_edit ( self . user , user_request , * args , * * kwargs ) [ 0 ] :
if ( not user_request . has_perm ( ' machines.change_interface ' ) or
return False , u " Vous ne pouvez pas éditer une machine \
not self . user . can_edit (
d ' un autre user que vous sans droit "
self . user ,
user_request ,
* args ,
* * kwargs
) [ 0 ] ) :
return False , ( u " Vous ne pouvez pas éditer une machine "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_delete ( self , user_request , * args , * * kwargs ) :
def can_delete ( self , user_request , * args , * * kwargs ) :
@ -143,26 +167,33 @@ class Machine(RevMixin, FieldPermissionModelMixin, models.Model):
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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 self . user != user_request :
if self . user != user_request :
if not user_request . has_perm ( ' machines.change_interface ' ) or not self . user . can_edit ( self . user , user_request , * args , * * kwargs ) [ 0 ] :
if ( not user_request . has_perm ( ' machines.change_interface ' ) or
return False , u " Vous ne pouvez pas éditer une machine \
not self . user . can_edit (
d ' un autre user que vous sans droit "
self . user ,
user_request ,
* args ,
* * kwargs
) [ 0 ] ) :
return False , ( u " Vous ne pouvez pas éditer une machine "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_view ( self , user_request , * args , * * kwargs ) :
def can_view ( self , user_request , * _ args, * * _ kwargs) :
""" Vérifie qu ' on peut bien voir cette instance particulière (soit
""" Vérifie qu ' on peut bien voir cette instance particulière (soit
machine de soi , soit droit particulier
machine de soi , soit droit particulier
: param self : instance machine à éditer
: param self : instance machine à éditer
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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 ' ) and self . user != user_request :
if ( not user_request . has_perm ( ' machines.view_machine ' ) and
return False , u " Vous n ' avez pas droit de voir les machines autre \
self . user != user_request ) :
que les vôtres "
return False , ( u " Vous n ' avez pas droit de voir les machines autre "
" que les vôtres " )
return True , None
return True , None
def __init__ ( self , * args , * * kwargs ) :
def __init__ ( self , * args , * * kwargs ) :
super ( Machine , self ) . __init__ ( * args , * * kwargs )
super ( Machine , self ) . __init__ ( * args , * * kwargs )
self . field_permissions = {
self . field_permissions = {
' user ' : self . can_change_user ,
' user ' : self . can_change_user ,
}
}
def __str__ ( self ) :
def __str__ ( self ) :
@ -184,7 +215,8 @@ class MachineType(RevMixin, AclMixin, models.Model):
class Meta :
class Meta :
permissions = (
permissions = (
( " view_machinetype " , " Peut voir un objet machinetype " ) ,
( " view_machinetype " , " Peut voir un objet machinetype " ) ,
( " use_all_machinetype " , " Peut utiliser n ' importe quel type de machine " ) ,
( " use_all_machinetype " ,
" Peut utiliser n ' importe quel type de machine " ) ,
)
)
def all_interfaces ( self ) :
def all_interfaces ( self ) :
@ -192,7 +224,8 @@ class MachineType(RevMixin, AclMixin, models.Model):
machinetype """
machinetype """
return Interface . objects . filter ( type = self )
return Interface . objects . filter ( type = self )
def can_use_all ( user_request , * args , * * kwargs ) :
@staticmethod
def can_use_all ( user_request , * _args , * * _kwargs ) :
""" Check if an user can use every MachineType.
""" Check if an user can use every MachineType.
Args :
Args :
@ -202,7 +235,8 @@ class MachineType(RevMixin, AclMixin, models.Model):
message is acces is not allowed .
message is acces is not allowed .
"""
"""
if not user_request . has_perm ( ' machines.use_all_machinetype ' ) :
if not user_request . has_perm ( ' machines.use_all_machinetype ' ) :
return False , u " Vous n ' avez pas le droit d ' utiliser tout types de machines "
return False , ( u " Vous n ' avez pas le droit d ' utiliser tout types "
" de machines " )
return True , None
return True , None
def __str__ ( self ) :
def __str__ ( self ) :
@ -300,7 +334,11 @@ class IpType(RevMixin, AclMixin, models.Model):
if not self . prefix_v6 :
if not self . prefix_v6 :
return
return
else :
else :
for ipv6 in Ipv6List . objects . filter ( interface__in = Interface . objects . filter ( type__in = MachineType . objects . filter ( ip_type = self ) ) ) :
for ipv6 in Ipv6List . objects . filter (
interface__in = Interface . objects . filter (
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 )
def clean ( self ) :
def clean ( self ) :
@ -329,8 +367,10 @@ class IpType(RevMixin, AclMixin, models.Model):
self . clean ( )
self . clean ( )
super ( IpType , self ) . save ( * args , * * kwargs )
super ( IpType , self ) . save ( * args , * * kwargs )
def can_use_all ( user_request , * args , * * kwargs ) :
@staticmethod
""" Superdroit qui permet d ' utiliser toutes les extensions sans restrictions
def can_use_all ( user_request , * _args , * * _kwargs ) :
""" Superdroit qui permet d ' utiliser toutes les extensions sans
restrictions
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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 " " "
return user_request . has_perm ( ' machines.use_all_iptype ' ) , None
return user_request . has_perm ( ' machines.use_all_iptype ' ) , None
@ -409,17 +449,17 @@ class SOA(RevMixin, AclMixin, models.Model):
help_text = ' Email du contact pour la zone '
help_text = ' Email du contact pour la zone '
)
)
refresh = models . PositiveIntegerField (
refresh = models . PositiveIntegerField (
default = 86400 , # 24 hours
default = 86400 , # 24 hours
help_text = ' Secondes avant que les DNS secondaires doivent demander le \
help_text = ' Secondes avant que les DNS secondaires doivent demander le \
serial du DNS primaire pour détecter une modification '
serial du DNS primaire pour détecter une modification '
)
)
retry = models . PositiveIntegerField (
retry = models . PositiveIntegerField (
default = 7200 , # 2 hours
default = 7200 , # 2 hours
help_text = ' Secondes avant que les DNS secondaires fassent une nouvelle \
help_text = ' Secondes avant que les DNS secondaires fassent une nouvelle \
demande de serial en cas de timeout du DNS primaire '
demande de serial en cas de timeout du DNS primaire '
)
)
expire = models . PositiveIntegerField (
expire = models . PositiveIntegerField (
default = 3600000 , # 1000 hours
default = 3600000 , # 1000 hours
help_text = ' Secondes après lesquelles les DNS secondaires arrêtent de \
help_text = ' Secondes après lesquelles les DNS secondaires arrêtent de \
de répondre aux requêtes en cas de timeout du DNS primaire '
de répondre aux requêtes en cas de timeout du DNS primaire '
)
)
@ -469,8 +509,10 @@ class SOA(RevMixin, AclMixin, models.Model):
extensions .
extensions .
/ ! \ Ne jamais supprimer ou renommer cette fonction car elle est
/ ! \ Ne jamais supprimer ou renommer cette fonction car elle est
utilisée dans les migrations de la BDD . """
utilisée dans les migrations de la BDD . """
return cls . objects . get_or_create ( name = " SOA to edit " , mail = " postmaser@example.com " ) [ 0 ] . pk
return cls . objects . get_or_create (
name = " SOA to edit " ,
mail = " postmaser@example.com "
) [ 0 ] . pk
class Extension ( RevMixin , AclMixin , models . Model ) :
class Extension ( RevMixin , AclMixin , models . Model ) :
@ -521,8 +563,10 @@ class Extension(RevMixin, AclMixin, models.Model):
entry + = " @ IN AAAA " + str ( self . origin_v6 )
entry + = " @ IN AAAA " + str ( self . origin_v6 )
return entry
return entry
def can_use_all ( user_request , * args , * * kwargs ) :
@staticmethod
""" Superdroit qui permet d ' utiliser toutes les extensions sans restrictions
def can_use_all ( user_request , * _args , * * _kwargs ) :
""" Superdroit qui permet d ' utiliser toutes les extensions sans
restrictions
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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 " " "
return user_request . has_perm ( ' machines.use_all_extension ' ) , None
return user_request . has_perm ( ' machines.use_all_extension ' ) , None
@ -555,7 +599,10 @@ class Mx(RevMixin, AclMixin, models.Model):
def dns_entry ( self ) :
def dns_entry ( self ) :
""" Renvoie l ' entrée DNS complète pour un MX à mettre dans les
""" Renvoie l ' entrée DNS complète pour un MX à mettre dans les
fichiers de zones """
fichiers de zones """
return " @ IN MX " + str ( self . priority ) . ljust ( 3 ) + " " + str ( self . name )
return " @ IN MX {prior} {name} " . format (
prior = str ( self . priority ) . ljust ( 3 ) ,
name = str ( self . name )
)
def __str__ ( self ) :
def __str__ ( self ) :
return str ( self . zone ) + ' ' + str ( self . priority ) + ' ' + str ( self . name )
return str ( self . zone ) + ' ' + str ( self . priority ) + ' ' + str ( self . name )
@ -606,12 +653,13 @@ class Txt(RevMixin, AclMixin, models.Model):
class Srv ( RevMixin , AclMixin , models . Model ) :
class Srv ( RevMixin , AclMixin , models . Model ) :
""" A SRV record """
PRETTY_NAME = " Enregistrement Srv "
PRETTY_NAME = " Enregistrement Srv "
TCP = ' TCP '
TCP = ' TCP '
UDP = ' UDP '
UDP = ' UDP '
service = models . CharField ( max_length = 31 )
service = models . CharField ( max_length = 31 )
protocole = models . CharField (
protocole = models . CharField (
max_length = 3 ,
max_length = 3 ,
choices = (
choices = (
@ -628,9 +676,9 @@ class Srv(RevMixin, AclMixin, models.Model):
priority = models . PositiveIntegerField (
priority = models . PositiveIntegerField (
default = 0 ,
default = 0 ,
validators = [ MaxValueValidator ( 65535 ) ] ,
validators = [ MaxValueValidator ( 65535 ) ] ,
help_text = " La priorité du serveur cible (valeur entière non négative, \
help_text = ( " La priorité du serveur cible (valeur entière non "
plus elle est faible , plus ce serveur sera utilisé s ' il est disponible) "
" négative, plus elle est faible, plus ce serveur sera "
" utilisé s ' il est disponible) " )
)
)
weight = models . PositiveIntegerField (
weight = models . PositiveIntegerField (
default = 0 ,
default = 0 ,
@ -667,7 +715,7 @@ class Srv(RevMixin, AclMixin, models.Model):
str ( self . port ) + ' ' + str ( self . target ) + ' . '
str ( self . port ) + ' ' + str ( self . target ) + ' . '
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
typemachine
typemachine
@ -692,7 +740,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
class Meta :
class Meta :
permissions = (
permissions = (
( " view_interface " , " Peut voir un objet interface " ) ,
( " view_interface " , " Peut voir un objet interface " ) ,
( " change_interface_machine " , " Peut changer le propriétaire d ' une interface " ) ,
( " change_interface_machine " ,
" Peut changer le propriétaire d ' une interface " ) ,
)
)
@cached_property
@cached_property
@ -719,7 +768,10 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
prefix_v6 = self . type . ip_type . prefix_v6
prefix_v6 = self . type . ip_type . prefix_v6
if not prefix_v6 :
if not prefix_v6 :
return None
return None
return IPv6Address ( IPv6Address ( prefix_v6 ) . exploded [ : 20 ] + IPv6Address ( self . id ) . exploded [ 20 : ] )
return IPv6Address (
IPv6Address ( prefix_v6 ) . exploded [ : 20 ] +
IPv6Address ( self . id ) . exploded [ 20 : ]
)
def sync_ipv6_dhcpv6 ( self ) :
def sync_ipv6_dhcpv6 ( self ) :
""" Affecte une ipv6 dhcpv6 calculée à partir de l ' id de la machine """
""" Affecte une ipv6 dhcpv6 calculée à partir de l ' id de la machine """
@ -741,7 +793,9 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
ipv6_slaac = self . ipv6_slaac
ipv6_slaac = self . ipv6_slaac
if not ipv6_slaac :
if not ipv6_slaac :
return
return
ipv6_object = Ipv6List . objects . filter ( interface = self , slaac_ip = True ) . first ( )
ipv6_object = ( Ipv6List . objects
. filter ( interface = self , slaac_ip = True )
. first ( ) )
if not ipv6_object :
if not ipv6_object :
ipv6_object = Ipv6List ( interface = self , slaac_ip = True )
ipv6_object = Ipv6List ( interface = self , slaac_ip = True )
if ipv6_object . ipv6 != str ( ipv6_slaac ) :
if ipv6_object . ipv6 != str ( ipv6_slaac ) :
@ -750,19 +804,24 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
def sync_ipv6 ( self ) :
def sync_ipv6 ( self ) :
""" Cree et met à jour l ' ensemble des ipv6 en fonction du mode choisi """
""" Cree et met à jour l ' ensemble des ipv6 en fonction du mode choisi """
if preferences . models . OptionalMachine . get_cached_value ( ' ipv6_mode ' ) == ' SLAAC ' :
if ( preferences . models . OptionalMachine
. get_cached_value ( ' ipv6_mode ' ) == ' SLAAC ' ) :
self . sync_ipv6_slaac ( )
self . sync_ipv6_slaac ( )
elif preferences . models . OptionalMachine . get_cached_value ( ' ipv6_mode ' ) == ' DHCPV6 ' :
elif ( preferences . models . OptionalMachine
. get_cached_value ( ' ipv6_mode ' ) == ' DHCPV6 ' ) :
self . sync_ipv6_dhcpv6 ( )
self . sync_ipv6_dhcpv6 ( )
else :
else :
return
return
def ipv6 ( self ) :
def ipv6 ( self ) :
""" Renvoie le queryset de la liste des ipv6
""" Renvoie le queryset de la liste des ipv6
On renvoie l ' ipv6 slaac que si le mode slaac est activé (et non dhcpv6) " " "
On renvoie l ' ipv6 slaac que si le mode slaac est activé
if preferences . models . OptionalMachine . get_cached_value ( ' ipv6_mode ' ) == ' SLAAC ' :
( et non dhcpv6 ) """
if ( preferences . models . OptionalMachine
. get_cached_value ( ' ipv6_mode ' ) == ' SLAAC ' ) :
return self . ipv6list . all ( )
return self . ipv6list . all ( )
elif preferences . models . OptionalMachine . get_cached_value ( ' ipv6_mode ' ) == ' DHCPV6 ' :
elif ( preferences . models . OptionalMachine
. 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
@ -789,7 +848,7 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
# instance.
# instance.
# But in our case, it's impossible to create a type value so we raise
# But in our case, it's impossible to create a type value so we raise
# the error.
# the error.
if not hasattr ( self , ' type ' ) :
if not hasattr ( self , ' type ' ) :
raise ValidationError ( " Le type d ' ip choisi n ' est pas valide " )
raise ValidationError ( " Le type d ' ip choisi n ' est pas valide " )
self . filter_macaddress ( )
self . filter_macaddress ( )
self . mac_address = str ( EUI ( self . mac_address ) ) or None
self . mac_address = str ( EUI ( self . mac_address ) ) or None
@ -825,7 +884,8 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
correspondent pas " )
correspondent pas " )
super ( Interface , self ) . save ( * args , * * kwargs )
super ( Interface , self ) . save ( * args , * * kwargs )
def can_create ( user_request , machineid , * args , * * kwargs ) :
@staticmethod
def can_create ( user_request , machineid , * _args , * * _kwargs ) :
""" Verifie que l ' user a les bons droits infra pour créer
""" Verifie que l ' user a les bons droits infra pour créer
une interface , ou bien que la machine appartient bien à l ' user
une interface , ou bien que la machine appartient bien à l ' user
: param macineid : Id de la machine parente de l ' interface
: param macineid : Id de la machine parente de l ' interface
@ -836,21 +896,29 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
except Machine . DoesNotExist :
except Machine . DoesNotExist :
return False , u " Machine inexistante "
return False , u " Machine inexistante "
if not user_request . has_perm ( ' machines.add_interface ' ) :
if not user_request . has_perm ( ' machines.add_interface ' ) :
if not preferences . models . OptionalMachine . get_cached_value ( ' create_machine ' ) :
if not ( preferences . models . OptionalMachine
. get_cached_value ( ' create_machine ' ) ) :
return False , u " Vous ne pouvez pas ajouter une machine "
return False , u " Vous ne pouvez pas ajouter une machine "
max_lambdauser_interfaces = preferences . models . OptionalMachine . get_cached_value ( ' max_lambdauser_interfaces ' )
max_lambdauser_interfaces = ( preferences . models . OptionalMachine
. get_cached_value (
' max_lambdauser_interfaces '
) )
if machine . user != user_request :
if machine . user != user_request :
return False , u " Vous ne pouvez pas ajouter une interface à une \
return False , u " Vous ne pouvez pas ajouter une interface à une \
machine d ' un autre user que vous sans droit "
machine d ' un autre user que vous sans droit "
if machine . user . user_interfaces ( ) . count ( ) > = max_lambdauser_interfaces :
if ( machine . user . user_interfaces ( ) . count ( ) > =
max_lambdauser_interfaces ) :
return False , u " Vous avez atteint le maximum d ' interfaces \
return False , u " Vous avez atteint le maximum d ' interfaces \
autorisées que vous pouvez créer vous même ( % s ) " \
autorisées que vous pouvez créer vous même ( % s ) " \
% max_lambdauser_interfaces
% max_lambdauser_interfaces
return True , None
return True , None
@staticmethod
@staticmethod
def can_change_machine ( user_request , * args , * * kwargs ) :
def can_change_machine ( user_request , * _args , * * _kwargs ) :
return user_request . has_perm ( ' machines.change_interface_machine ' ) , " Droit requis pour changer la machine "
""" Check if a user can change the machine associated with an
Interface object """
return ( user_request . has_perm ( ' machines.change_interface_machine ' ) ,
" Droit requis pour changer la machine " )
def can_edit ( self , user_request , * args , * * kwargs ) :
def can_edit ( self , user_request , * args , * * kwargs ) :
""" Verifie que l ' user a les bons droits infra pour editer
""" Verifie que l ' user a les bons droits infra pour editer
@ -859,9 +927,14 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if self . machine . user != user_request :
if self . machine . user != user_request :
if not user_request . has_perm ( ' machines.change_interface ' ) or not self . machine . user . can_edit ( user_request , * args , * * kwargs ) [ 0 ] :
if ( not user_request . has_perm ( ' machines.change_interface ' ) or
return False , u " Vous ne pouvez pas éditer une machine \
not self . machine . user . can_edit (
d ' un autre user que vous sans droit "
user_request ,
* args ,
* * kwargs
) [ 0 ] ) :
return False , ( u " Vous ne pouvez pas éditer une machine "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_delete ( self , user_request , * args , * * kwargs ) :
def can_delete ( self , user_request , * args , * * kwargs ) :
@ -871,26 +944,32 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if self . machine . user != user_request :
if self . machine . user != user_request :
if not user_request . has_perm ( ' machines.change_interface ' ) or not self . machine . user . can_edit ( user_request , * args , * * kwargs ) [ 0 ] :
if ( not user_request . has_perm ( ' machines.change_interface ' ) or
return False , u " Vous ne pouvez pas éditer une machine \
not self . machine . user . can_edit (
d ' un autre user que vous sans droit "
user_request ,
* args ,
* * kwargs
) [ 0 ] ) :
return False , ( u " Vous ne pouvez pas éditer une machine "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_view ( self , user_request , * args , * * kwargs ) :
def can_view ( self , user_request , * _ args, * * _ kwargs) :
""" Vérifie qu ' on peut bien voir cette instance particulière avec
""" Vérifie qu ' on peut bien voir cette instance particulière avec
droit view objet ou qu ' elle appartient à l ' user
droit view objet ou qu ' elle appartient à l ' user
: param self : instance interface à voir
: param self : instance interface à voir
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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_interface ' ) and self . machine . user != user_request :
if ( not user_request . has_perm ( ' machines.view_interface ' ) and
return False , u " Vous n ' avez pas le droit de voir des machines autre \
self . machine . user != user_request ) :
que les vôtres "
return False , ( u " Vous n ' avez pas le droit de voir des machines "
" autre que les vôtres " )
return True , None
return True , None
def __init__ ( self , * args , * * kwargs ) :
def __init__ ( self , * args , * * kwargs ) :
super ( Interface , self ) . __init__ ( * args , * * kwargs )
super ( Interface , self ) . __init__ ( * args , * * kwargs )
self . field_permissions = {
self . field_permissions = {
' machine ' : self . can_change_machine ,
' machine ' : self . can_change_machine ,
}
}
def __str__ ( self ) :
def __str__ ( self ) :
@ -915,22 +994,29 @@ class Interface(RevMixin, AclMixin, FieldPermissionModelMixin,models.Model):
class Ipv6List ( RevMixin , AclMixin , FieldPermissionModelMixin , models . Model ) :
class Ipv6List ( RevMixin , AclMixin , FieldPermissionModelMixin , models . Model ) :
""" A list of IPv6 """
PRETTY_NAME = ' Enregistrements Ipv6 des machines '
PRETTY_NAME = ' Enregistrements Ipv6 des machines '
ipv6 = models . GenericIPAddressField (
ipv6 = models . GenericIPAddressField (
protocol = ' IPv6 ' ,
protocol = ' IPv6 ' ,
unique = True
unique = True
)
)
interface = models . ForeignKey ( ' Interface ' , on_delete = models . CASCADE , related_name = ' ipv6list ' )
interface = models . ForeignKey (
' Interface ' ,
on_delete = models . CASCADE ,
related_name = ' ipv6list '
)
slaac_ip = models . BooleanField ( default = False )
slaac_ip = models . BooleanField ( default = False )
class Meta :
class Meta :
permissions = (
permissions = (
( " view_ipv6list " , " Peut voir un objet ipv6 " ) ,
( " view_ipv6list " , " Peut voir un objet ipv6 " ) ,
( " change_ipv6list_slaac_ip " , " Peut changer la valeur slaac sur une ipv6 " ) ,
( " change_ipv6list_slaac_ip " ,
" Peut changer la valeur slaac sur une ipv6 " ) ,
)
)
def can_create ( user_request , interfaceid , * args , * * kwargs ) :
@staticmethod
def can_create ( user_request , interfaceid , * _args , * * _kwargs ) :
""" Verifie que l ' user a les bons droits infra pour créer
""" Verifie que l ' user a les bons droits infra pour créer
une ipv6 , ou possède l ' interface associée
une ipv6 , ou possède l ' interface associée
: param interfaceid : Id de l ' interface associée à cet objet domain
: param interfaceid : Id de l ' interface associée à cet objet domain
@ -947,8 +1033,10 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
return True , None
return True , None
@staticmethod
@staticmethod
def can_change_slaac_ip ( user_request , * args , * * kwargs ) :
def can_change_slaac_ip ( user_request , * _args , * * _kwargs ) :
return user_request . has_perm ( ' machines.change_ipv6list_slaac_ip ' ) , " Droit requis pour changer la valeur slaac ip "
""" Check if a user can change the slaac value """
return ( user_request . has_perm ( ' machines.change_ipv6list_slaac_ip ' ) ,
" Droit requis pour changer la valeur slaac ip " )
def can_edit ( self , user_request , * args , * * kwargs ) :
def can_edit ( self , user_request , * args , * * kwargs ) :
""" Verifie que l ' user a les bons droits infra pour editer
""" Verifie que l ' user a les bons droits infra pour editer
@ -957,9 +1045,14 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if self . interface . machine . user != user_request :
if self . interface . machine . user != user_request :
if not user_request . has_perm ( ' machines.change_ipv6list ' ) or not self . interface . machine . user . can_edit ( user_request , * args , * * kwargs ) [ 0 ] :
if ( not user_request . has_perm ( ' machines.change_ipv6list ' ) or
return False , u " Vous ne pouvez pas éditer une machine \
not self . interface . machine . user . can_edit (
d ' un autre user que vous sans droit "
user_request ,
* args ,
* * kwargs
) [ 0 ] ) :
return False , ( u " Vous ne pouvez pas éditer une machine "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_delete ( self , user_request , * args , * * kwargs ) :
def can_delete ( self , user_request , * args , * * kwargs ) :
@ -969,26 +1062,32 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if self . interface . machine . user != user_request :
if self . interface . machine . user != user_request :
if not user_request . has_perm ( ' machines.change_ipv6list ' ) or not self . interface . machine . user . can_edit ( user_request , * args , * * kwargs ) [ 0 ] :
if ( not user_request . has_perm ( ' machines.change_ipv6list ' ) or
return False , u " Vous ne pouvez pas éditer une machine \
not self . interface . machine . user . can_edit (
d ' un autre user que vous sans droit "
user_request ,
* args ,
* * kwargs
) [ 0 ] ) :
return False , ( u " Vous ne pouvez pas éditer une machine "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_view ( self , user_request , * args , * * kwargs ) :
def can_view ( self , user_request , * _ args, * * _ kwargs) :
""" Vérifie qu ' on peut bien voir cette instance particulière avec
""" Vérifie qu ' on peut bien voir cette instance particulière avec
droit view objet ou qu ' elle appartient à l ' user
droit view objet ou qu ' elle appartient à l ' user
: param self : instance interface à voir
: param self : instance interface à voir
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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_ipv6list ' ) and self . interface . machine . user != user_request :
if ( not user_request . has_perm ( ' machines.view_ipv6list ' ) and
return False , u " Vous n ' avez pas le droit de voir des machines autre \
self . interface . machine . user != user_request ) :
que les vôtres "
return False , ( u " Vous n ' avez pas le droit de voir des machines "
" autre que les vôtres " )
return True , None
return True , None
def __init__ ( self , * args , * * kwargs ) :
def __init__ ( self , * args , * * kwargs ) :
super ( Ipv6List , self ) . __init__ ( * args , * * kwargs )
super ( Ipv6List , self ) . __init__ ( * args , * * kwargs )
self . field_permissions = {
self . field_permissions = {
' slaac_ip ' : self . can_change_slaac_ip ,
' slaac_ip ' : self . can_change_slaac_ip ,
}
}
def check_and_replace_prefix ( self , prefix = None ) :
def check_and_replace_prefix ( self , prefix = None ) :
@ -996,17 +1095,27 @@ class Ipv6List(RevMixin, AclMixin, FieldPermissionModelMixin, models.Model):
prefix_v6 = prefix or self . interface . type . ip_type . prefix_v6
prefix_v6 = prefix or self . interface . type . ip_type . prefix_v6
if not prefix_v6 :
if not prefix_v6 :
return
return
if IPv6Address ( self . ipv6 ) . exploded [ : 20 ] != IPv6Address ( prefix_v6 ) . exploded [ : 20 ] :
if ( IPv6Address ( self . ipv6 ) . exploded [ : 20 ] !=
self . ipv6 = IPv6Address ( IPv6Address ( prefix_v6 ) . exploded [ : 20 ] + IPv6Address ( self . ipv6 ) . exploded [ 20 : ] )
IPv6Address ( prefix_v6 ) . exploded [ : 20 ] ) :
self . ipv6 = IPv6Address (
IPv6Address ( prefix_v6 ) . exploded [ : 20 ] +
IPv6Address ( self . ipv6 ) . exploded [ 20 : ]
)
self . save ( )
self . save ( )
def clean ( self , * args , * * kwargs ) :
def clean ( self , * args , * * kwargs ) :
if self . slaac_ip and Ipv6List . objects . filter ( interface = self . interface , slaac_ip = True ) . exclude ( id = self . id ) :
if self . slaac_ip and ( Ipv6List . objects
. filter ( interface = self . interface , slaac_ip = True )
. exclude ( id = self . id ) ) :
raise ValidationError ( " Une ip slaac est déjà enregistrée " )
raise ValidationError ( " Une ip slaac est déjà enregistrée " )
prefix_v6 = self . interface . type . ip_type . prefix_v6
prefix_v6 = self . interface . type . ip_type . prefix_v6
if prefix_v6 :
if prefix_v6 :
if IPv6Address ( self . ipv6 ) . exploded [ : 20 ] != IPv6Address ( prefix_v6 ) . exploded [ : 20 ] :
if ( IPv6Address ( self . ipv6 ) . exploded [ : 20 ] !=
raise ValidationError ( " Le prefixv6 est incorrect et ne correspond pas au type associé à la machine " )
IPv6Address ( prefix_v6 ) . exploded [ : 20 ] ) :
raise ValidationError (
" Le prefixv6 est incorrect et ne correspond pas au type "
" associé à la machine "
)
super ( Ipv6List , self ) . clean ( * args , * * kwargs )
super ( Ipv6List , self ) . clean ( * args , * * kwargs )
def save ( self , * args , * * kwargs ) :
def save ( self , * args , * * kwargs ) :
@ -1072,7 +1181,7 @@ class Domain(RevMixin, AclMixin, models.Model):
if self . cname == self :
if self . cname == self :
raise ValidationError ( " On ne peut créer un cname sur lui même " )
raise ValidationError ( " On ne peut créer un cname sur lui même " )
HOSTNAME_LABEL_PATTERN = re . compile (
HOSTNAME_LABEL_PATTERN = re . compile (
" (?!-)[A-Z \ d-]+(?<!-)$ " ,
r " (?!-)[A-Z \ d-]+(?<!-)$ " ,
re . IGNORECASE
re . IGNORECASE
)
)
dns = self . name . lower ( )
dns = self . name . lower ( )
@ -1089,7 +1198,10 @@ class Domain(RevMixin, AclMixin, models.Model):
def dns_entry ( self ) :
def dns_entry ( self ) :
""" Une entrée DNS """
""" Une entrée DNS """
if self . cname :
if self . cname :
return str ( self . name ) . ljust ( 15 ) + " IN CNAME " + str ( self . cname ) + " . "
return " {name} IN CNAME {cname} . " . format (
name = str ( self . name ) . ljust ( 15 ) ,
cname = str ( self . cname )
)
def save ( self , * args , * * kwargs ) :
def save ( self , * args , * * kwargs ) :
""" Empèche le save sans extension valide.
""" Empèche le save sans extension valide.
@ -1111,7 +1223,8 @@ class Domain(RevMixin, AclMixin, models.Model):
else :
else :
return self . cname . get_parent_interface ( )
return self . cname . get_parent_interface ( )
def can_create ( user_request , interfaceid , * args , * * kwargs ) :
@staticmethod
def can_create ( user_request , interfaceid , * _args , * * _kwargs ) :
""" Verifie que l ' user a les bons droits infra pour créer
""" Verifie que l ' user a les bons droits infra pour créer
un domain , ou possède l ' interface associée
un domain , ou possède l ' interface associée
: param interfaceid : Id de l ' interface associée à cet objet domain
: param interfaceid : Id de l ' interface associée à cet objet domain
@ -1122,54 +1235,58 @@ class Domain(RevMixin, AclMixin, models.Model):
except Interface . DoesNotExist :
except Interface . DoesNotExist :
return False , u " Interface inexistante "
return False , u " Interface inexistante "
if not user_request . has_perm ( ' machines.add_domain ' ) :
if not user_request . has_perm ( ' machines.add_domain ' ) :
max_lambdauser_aliases = preferences . models . OptionalMachine . get_cached_value ( ' max_lambdauser_aliases ' )
max_lambdauser_aliases = ( preferences . models . OptionalMachine
. get_cached_value (
' max_lambdauser_aliases '
) )
if interface . machine . user != user_request :
if interface . machine . user != user_request :
return False , u " Vous ne pouvez pas ajouter un alias à une \
return False , ( u " Vous ne pouvez pas ajouter un alias à une "
machine d ' un autre user que vous sans droit "
" machine d ' un autre user que vous sans droit " )
if Domain . objects . filter (
if Domain . objects . filter (
cname__in = Domain . objects . filter (
cname__in = Domain . objects . filter (
interface_parent__in = interface . machine . user . user_interfaces ( )
interface_parent__in = ( interface . machine . user
. user_interfaces ( ) )
)
)
) . count ( ) > = max_lambdauser_aliases :
) . count ( ) > = max_lambdauser_aliases :
return False , u " Vous avez atteint le maximum d ' alias \
return False , ( u " Vous avez atteint le maximum d ' alias "
autorisés que vous pouvez créer vous même ( % s ) " \
" autorisés que vous pouvez créer vous même "
% max_lambdauser_aliases
" ( %s ) " % max_lambdauser_aliases )
return True , None
return True , None
def can_edit ( self , user_request , * args , * * kwargs ) :
def can_edit ( self , user_request , * _ args, * * _ kwargs) :
""" Verifie que l ' user a les bons droits pour editer
""" Verifie que l ' user a les bons droits pour editer
cette instance domain
cette instance domain
: param self : Instance domain à editer
: param self : Instance domain à editer
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if not user_request . has_perm ( ' machines.change_domain ' ) and \
if ( not user_request . has_perm ( ' machines.change_domain ' ) and
self . get_source_interface . machine . user != user_request :
self . get_source_interface . machine . user != user_request ) :
return False , u " Vous ne pouvez pas editer un alias à une machine \
return False , ( u " Vous ne pouvez pas editer un alias à une machine "
d ' un autre user que vous sans droit "
" d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_delete ( self , user_request , * args , * * kwargs ) :
def can_delete ( self , user_request , * _ args, * * _ kwargs) :
""" Verifie que l ' user a les bons droits delete object pour del
""" Verifie que l ' user a les bons droits delete object pour del
cette instance domain , ou qu ' elle lui appartient
cette instance domain , ou qu ' elle lui appartient
: param self : Instance domain à del
: param self : Instance domain à del
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if not user_request . has_perm ( ' machines.delete_domain ' ) and \
if ( not user_request . has_perm ( ' machines.delete_domain ' ) and
self . get_source_interface . machine . user != user_request :
self . get_source_interface . machine . user != user_request ) :
return False , u " Vous ne pouvez pas supprimer un alias à une machine \
return False , ( u " Vous ne pouvez pas supprimer un alias à une "
d ' un autre user que vous sans droit "
" machine d ' un autre user que vous sans droit " )
return True , None
return True , None
def can_view ( self , user_request , * args , * * kwargs ) :
def can_view ( self , user_request , * _ args, * * _ kwargs) :
""" Vérifie qu ' on peut bien voir cette instance particulière avec
""" Vérifie qu ' on peut bien voir cette instance particulière avec
droit view objet ou qu ' elle appartient à l ' user
droit view objet ou qu ' elle appartient à l ' user
: param self : instance domain à voir
: param self : instance domain à voir
: param user_request : instance user qui fait l ' edition
: param user_request : instance user qui fait l ' edition
: 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_domain ' ) and \
if ( not user_request . has_perm ( ' machines.view_domain ' ) and
self . get_source_interface . machine . user != user_request :
self . get_source_interface . machine . user != user_request ) :
return False , u " Vous n ' avez pas le droit de voir des machines autre \
return False , ( u " Vous n ' avez pas le droit de voir des machines "
que les vôtres "
" autre que les vôtres " )
return True , None
return True , None
def __str__ ( self ) :
def __str__ ( self ) :
@ -1177,6 +1294,7 @@ class Domain(RevMixin, AclMixin, models.Model):
class IpList ( RevMixin , AclMixin , models . Model ) :
class IpList ( RevMixin , AclMixin , models . Model ) :
""" A list of IPv4 """
PRETTY_NAME = " Addresses ipv4 "
PRETTY_NAME = " Addresses ipv4 "
ipv4 = models . GenericIPAddressField ( protocol = ' IPv4 ' , unique = True )
ipv4 = models . GenericIPAddressField ( protocol = ' IPv4 ' , unique = True )
@ -1307,15 +1425,15 @@ class OuverturePortList(RevMixin, AclMixin, models.Model):
( " view_ouvertureportlist " , " Peut voir un objet ouvertureport " ) ,
( " view_ouvertureportlist " , " Peut voir un objet ouvertureport " ) ,
)
)
def can_delete ( self , user_request , * args , * * kwargs ) :
def can_delete ( self , user_request , * _ args, * * _ kwargs) :
""" Verifie que l ' user a les bons droits bureau pour delete
""" Verifie que l ' user a les bons droits bureau pour delete
cette instance ouvertureportlist
cette instance ouvertureportlist
: param self : Instance ouvertureportlist à delete
: param self : Instance ouvertureportlist à delete
: param user_request : Utilisateur qui fait la requête
: param user_request : Utilisateur qui fait la requête
: return : soit True , soit False avec la raison de l ' échec " " "
: return : soit True , soit False avec la raison de l ' échec " " "
if not user_request . has_perm ( ' machines.delete_ouvertureportlist ' ) :
if not user_request . has_perm ( ' machines.delete_ouvertureportlist ' ) :
return False , u " Vous n ' avez pas le droit de supprimer une ouverture \
return False , ( u " Vous n ' avez pas le droit de supprimer une "
de port "
" ouverture de port " )
if self . interface_set . all ( ) :
if self . interface_set . all ( ) :
return False , u " Cette liste de ports est utilisée "
return False , u " Cette liste de ports est utilisée "
return True , None
return True , None
@ -1401,7 +1519,7 @@ class OuverturePort(RevMixin, AclMixin, models.Model):
@receiver ( post_save , sender = Machine )
@receiver ( post_save , sender = Machine )
def machine_post_save ( sender , * * kwargs ) :
def machine_post_save ( * * kwargs ) :
""" Synchronisation ldap et régen parefeu/dhcp lors de la modification
""" Synchronisation ldap et régen parefeu/dhcp lors de la modification
d ' une machine " " "
d ' une machine " " "
user = kwargs [ ' instance ' ] . user
user = kwargs [ ' instance ' ] . user
@ -1411,7 +1529,7 @@ def machine_post_save(sender, **kwargs):
@receiver ( post_delete , sender = Machine )
@receiver ( post_delete , sender = Machine )
def machine_post_delete ( sender , * * kwargs ) :
def machine_post_delete ( * * kwargs ) :
""" Synchronisation ldap et régen parefeu/dhcp lors de la suppression
""" Synchronisation ldap et régen parefeu/dhcp lors de la suppression
d ' une machine " " "
d ' une machine " " "
machine = kwargs [ ' instance ' ]
machine = kwargs [ ' instance ' ]
@ -1422,7 +1540,7 @@ def machine_post_delete(sender, **kwargs):
@receiver ( post_save , sender = Interface )
@receiver ( post_save , sender = Interface )
def interface_post_save ( sender , * * kwargs ) :
def interface_post_save ( * * kwargs ) :
""" Synchronisation ldap et régen parefeu/dhcp lors de la modification
""" Synchronisation ldap et régen parefeu/dhcp lors de la modification
d ' une interface " " "
d ' une interface " " "
interface = kwargs [ ' instance ' ]
interface = kwargs [ ' instance ' ]
@ -1435,7 +1553,7 @@ def interface_post_save(sender, **kwargs):
@receiver ( post_delete , sender = Interface )
@receiver ( post_delete , sender = Interface )
def interface_post_delete ( sender , * * kwargs ) :
def interface_post_delete ( * * kwargs ) :
""" Synchronisation ldap et régen parefeu/dhcp lors de la suppression
""" Synchronisation ldap et régen parefeu/dhcp lors de la suppression
d ' une interface " " "
d ' une interface " " "
interface = kwargs [ ' instance ' ]
interface = kwargs [ ' instance ' ]
@ -1444,7 +1562,7 @@ def interface_post_delete(sender, **kwargs):
@receiver ( post_save , sender = IpType )
@receiver ( post_save , sender = IpType )
def iptype_post_save ( sender , * * kwargs ) :
def iptype_post_save ( * * kwargs ) :
""" Generation des objets ip après modification d ' un range ip """
""" Generation des objets ip après modification d ' un range ip """
iptype = kwargs [ ' instance ' ]
iptype = kwargs [ ' instance ' ]
iptype . gen_ip_range ( )
iptype . gen_ip_range ( )
@ -1452,7 +1570,7 @@ def iptype_post_save(sender, **kwargs):
@receiver ( post_save , sender = MachineType )
@receiver ( post_save , sender = MachineType )
def machine_post_save ( sender , * * kwargs ) :
def machinetype _post_save ( * * kwargs ) :
""" Mise à jour des interfaces lorsque changement d ' attribution
""" Mise à jour des interfaces lorsque changement d ' attribution
d ' une machinetype (changement iptype parent) " " "
d ' une machinetype (changement iptype parent) " " "
machinetype = kwargs [ ' instance ' ]
machinetype = kwargs [ ' instance ' ]
@ -1461,85 +1579,84 @@ def machine_post_save(sender, **kwargs):
@receiver ( post_save , sender = Domain )
@receiver ( post_save , sender = Domain )
def domain_post_save ( sender , * * kwargs ) :
def domain_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' un domain object """
""" Regeneration dns après modification d ' un domain object """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = Domain )
@receiver ( post_delete , sender = Domain )
def domain_post_delete ( sender , * * kwargs ) :
def domain_post_delete ( * * _ kwargs) :
""" Regeneration dns après suppression d ' un domain object """
""" Regeneration dns après suppression d ' un domain object """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_save , sender = Extension )
@receiver ( post_save , sender = Extension )
def extension_post_save ( sender , * * kwargs ) :
def extension_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' une extension """
""" Regeneration dns après modification d ' une extension """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = Extension )
@receiver ( post_delete , sender = Extension )
def extension_post_selete ( sender , * * kwargs ) :
def extension_post_selete ( * * _ kwargs) :
""" Regeneration dns après suppression d ' une extension """
""" Regeneration dns après suppression d ' une extension """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_save , sender = SOA )
@receiver ( post_save , sender = SOA )
def soa_post_save ( sender , * * kwargs ) :
def soa_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' un SOA """
""" Regeneration dns après modification d ' un SOA """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = SOA )
@receiver ( post_delete , sender = SOA )
def soa_post_delete ( sender , * * kwargs ) :
def soa_post_delete ( * * _ kwargs) :
""" Regeneration dns après suppresson d ' un SOA """
""" Regeneration dns après suppresson d ' un SOA """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_save , sender = Mx )
@receiver ( post_save , sender = Mx )
def mx_post_save ( sender , * * kwargs ) :
def mx_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' un MX """
""" Regeneration dns après modification d ' un MX """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = Mx )
@receiver ( post_delete , sender = Mx )
def mx_post_delete ( sender , * * kwargs ) :
def mx_post_delete ( * * _ kwargs) :
""" Regeneration dns après suppresson d ' un MX """
""" Regeneration dns après suppresson d ' un MX """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_save , sender = Ns )
@receiver ( post_save , sender = Ns )
def ns_post_save ( sender , * * kwargs ) :
def ns_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' un NS """
""" Regeneration dns après modification d ' un NS """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = Ns )
@receiver ( post_delete , sender = Ns )
def ns_post_delete ( sender , * * kwargs ) :
def ns_post_delete ( * * _ kwargs) :
""" Regeneration dns après modification d ' un NS """
""" Regeneration dns après modification d ' un NS """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_save , sender = Txt )
@receiver ( post_save , sender = Txt )
def text_post_save ( sender , * * kwargs ) :
def text_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' un TXT """
""" Regeneration dns après modification d ' un TXT """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = Txt )
@receiver ( post_delete , sender = Txt )
def text_post_delete ( sender , * * kwargs ) :
def text_post_delete ( * * _ kwargs) :
""" Regeneration dns après modification d ' un TX """
""" Regeneration dns après modification d ' un TX """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_save , sender = Srv )
@receiver ( post_save , sender = Srv )
def srv_post_save ( sender , * * kwargs ) :
def srv_post_save ( * * _ kwargs) :
""" Regeneration dns après modification d ' un SRV """
""" Regeneration dns après modification d ' un SRV """
regen ( ' dns ' )
regen ( ' dns ' )
@receiver ( post_delete , sender = Srv )
@receiver ( post_delete , sender = Srv )
def text _post_delete( sender , * * 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 ' )