8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-29 16:12:26 +00:00

Attribut ipv6 sur les interfaces

This commit is contained in:
Gabriel Detraz 2017-10-03 02:36:39 +02:00 committed by root
parent 6d398f0a75
commit 2111cb63dd
9 changed files with 71 additions and 7 deletions

View file

@ -142,7 +142,7 @@ class DelMachineTypeForm(Form):
class IpTypeForm(ModelForm): class IpTypeForm(ModelForm):
class Meta: class Meta:
model = IpType model = IpType
fields = ['type','extension','need_infra','domaine_ip_start','domaine_ip_stop', 'vlan'] fields = ['type','extension','need_infra','domaine_ip_start','domaine_ip_stop', 'prefix_v6', 'vlan']
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -151,7 +151,7 @@ class IpTypeForm(ModelForm):
class EditIpTypeForm(IpTypeForm): class EditIpTypeForm(IpTypeForm):
class Meta(IpTypeForm.Meta): class Meta(IpTypeForm.Meta):
fields = ['extension','type','need_infra', 'vlan'] fields = ['extension','type','need_infra', 'prefix_v6', 'vlan']
class DelIpTypeForm(Form): class DelIpTypeForm(Form):
iptypes = forms.ModelMultipleChoiceField(queryset=IpType.objects.all(), label="Types d'ip actuelles", widget=forms.CheckboxSelectMultiple) iptypes = forms.ModelMultipleChoiceField(queryset=IpType.objects.all(), label="Types d'ip actuelles", widget=forms.CheckboxSelectMultiple)

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-10-02 16:33
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('machines', '0058_auto_20171002_0350'),
]
operations = [
migrations.AddField(
model_name='iptype',
name='prefix_v6',
field=models.GenericIPAddressField(blank=True, null=True, protocol='IPv6'),
),
]

View file

@ -70,6 +70,7 @@ class IpType(models.Model):
need_infra = models.BooleanField(default=False) need_infra = models.BooleanField(default=False)
domaine_ip_start = models.GenericIPAddressField(protocol='IPv4') domaine_ip_start = models.GenericIPAddressField(protocol='IPv4')
domaine_ip_stop = models.GenericIPAddressField(protocol='IPv4') domaine_ip_stop = models.GenericIPAddressField(protocol='IPv4')
prefix_v6 = models.GenericIPAddressField(protocol='IPv6', null=True, blank=True)
vlan = models.ForeignKey('Vlan', on_delete=models.PROTECT, blank=True, null=True) vlan = models.ForeignKey('Vlan', on_delete=models.PROTECT, blank=True, null=True)
@cached_property @cached_property
@ -122,6 +123,9 @@ class IpType(models.Model):
for element in IpType.objects.all().exclude(pk=self.pk): for element in IpType.objects.all().exclude(pk=self.pk):
if not self.ip_set.isdisjoint(element.ip_set): if not self.ip_set.isdisjoint(element.ip_set):
raise ValidationError("Le range indiqué n'est pas disjoint des ranges existants") raise ValidationError("Le range indiqué n'est pas disjoint des ranges existants")
# On formate le prefix v6
if self.prefix_v6:
self.prefix_v6 = str(IPNetwork(self.prefix_v6 + '/64').network)
return return
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -218,7 +222,6 @@ class Interface(models.Model):
PRETTY_NAME = "Interface" PRETTY_NAME = "Interface"
ipv4 = models.OneToOneField('IpList', on_delete=models.PROTECT, blank=True, null=True) ipv4 = models.OneToOneField('IpList', on_delete=models.PROTECT, blank=True, null=True)
#ipv6 = models.GenericIPAddressField(protocol='IPv6', null=True)
mac_address = MACAddressField(integer=False, unique=True) mac_address = MACAddressField(integer=False, unique=True)
machine = models.ForeignKey('Machine', on_delete=models.CASCADE) machine = models.ForeignKey('Machine', on_delete=models.CASCADE)
type = models.ForeignKey('MachineType', on_delete=models.PROTECT) type = models.ForeignKey('MachineType', on_delete=models.PROTECT)
@ -232,6 +235,18 @@ class Interface(models.Model):
user = self.machine.user user = self.machine.user
return machine.active and user.has_access() return machine.active and user.has_access()
@cached_property
def ipv6_object(self):
if self.type.ip_type.prefix_v6:
return EUI(self.mac_address).ipv6(IPNetwork(self.type.ip_type.prefix_v6).network)
else:
return None
@cached_property
def ipv6(self):
return str(self.ipv6_object)
def mac_bare(self): def mac_bare(self):
return str(EUI(self.mac_address, dialect=mac_bare)).lower() return str(EUI(self.mac_address, dialect=mac_bare)).lower()

View file

@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<th>Nécessite l'autorisation infra</th> <th>Nécessite l'autorisation infra</th>
<th>Début</th> <th>Début</th>
<th>Fin</th> <th>Fin</th>
<th>Préfixe v6</th>
<th>Sur vlan</th> <th>Sur vlan</th>
<th></th> <th></th>
<th></th> <th></th>
@ -42,6 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<td>{{ type.need_infra }}</td> <td>{{ type.need_infra }}</td>
<td>{{ type.domaine_ip_start }}</td> <td>{{ type.domaine_ip_start }}</td>
<td>{{ type.domaine_ip_stop }}</td> <td>{{ type.domaine_ip_stop }}</td>
<td>{{ type.prefix_v6 }}</td>
<td>{{ type.vlan }}</td> <td>{{ type.vlan }}</td>
<td class="text-right"> <td class="text-right">
{% if is_infra %} {% if is_infra %}

View file

@ -34,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<th>Nom dns</th> <th>Nom dns</th>
<th>Type</th> <th>Type</th>
<th>Mac</th> <th>Mac</th>
<th>Ipv4</th> <th>IP</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
@ -74,7 +74,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
</td> </td>
<td>{{ interface.type }}</td> <td>{{ interface.type }}</td>
<td>{{ interface.mac_address }}</td> <td>{{ interface.mac_address }}</td>
<td>{{ interface.ipv4 }}</td> <td>{{ interface.ipv4 }}
{{ interface.ipv6 }}
</td>
<td> <td>
<div class="dropdown"> <div class="dropdown">
<button class="btn btn-default dropdown-toggle" type="button" id="editioninterface" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true"> <button class="btn btn-default dropdown-toggle" type="button" id="editioninterface" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.7 on 2017-10-02 16:14
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('preferences', '0019_remove_optionaltopologie_mac_autocapture'),
]
operations = [
migrations.AddField(
model_name='optionalmachine',
name='ipv6',
field=models.BooleanField(default=False),
),
]

View file

@ -45,6 +45,7 @@ class OptionalMachine(models.Model):
password_machine = models.BooleanField(default=False) password_machine = models.BooleanField(default=False)
max_lambdauser_interfaces = models.IntegerField(default=10) max_lambdauser_interfaces = models.IntegerField(default=10)
max_lambdauser_aliases = models.IntegerField(default=10) max_lambdauser_aliases = models.IntegerField(default=10)
ipv6 = models.BooleanField(default=False)
class OptionalTopologie(models.Model): class OptionalTopologie(models.Model):
PRETTY_NAME = "Options topologie" PRETTY_NAME = "Options topologie"

View file

@ -72,7 +72,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
<tr> <tr>
<th>Alias dns autorisé par utilisateur</th> <th>Alias dns autorisé par utilisateur</th>
<td>{{ machineoptions.max_lambdauser_aliases }}</td> <td>{{ machineoptions.max_lambdauser_aliases }}</td>
</tr> <th>Support de l'ipv6</th>
<td>{{ machineoptions.ipv6 }}</td>
</tr>
</table> </table>
<h4>Préférences topologie</h4> <h4>Préférences topologie</h4>
{% if is_bureau %} {% if is_bureau %}

View file

@ -23,10 +23,11 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from machines.models import Interface, Machine from machines.models import Interface, Machine
from preferences.models import GeneralOption from preferences.models import GeneralOption, OptionalMachine
def context_user(request): def context_user(request):
general_options, created = GeneralOption.objects.get_or_create() general_options, created = GeneralOption.objects.get_or_create()
machine_options, created = OptionalMachine.objects.get_or_create()
user = request.user user = request.user
if user.is_authenticated(): if user.is_authenticated():
interfaces = user.user_interfaces() interfaces = user.user_interfaces()
@ -54,4 +55,5 @@ def context_user(request):
'is_admin' : is_admin, 'is_admin' : is_admin,
'interfaces': interfaces, 'interfaces': interfaces,
'site_name': general_options.site_name, 'site_name': general_options.site_name,
'ipv6_enabled' : machine_options.ipv6,
} }