models.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.db import models
  4. from django.core.exceptions import ValidationError
  5. from django.core.validators import MinValueValidator
  6. from netfields import InetAddressField, NetManager
  7. from netaddr import IPAddress
  8. import ldapdb.models
  9. from ldapdb.models.fields import CharField, IntegerField, ListField
  10. # TODO: validate DNS names with this regex
  11. REGEX = r'(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}|[A-Z0-9-]{2,})\.?$'
  12. class NameServer(models.Model):
  13. # TODO: signal to IPSubnet when we are modified, so that is saves the
  14. # result into LDAP. Actually, better: build a custom M2M relation
  15. # between NameServer and IPSubnet (see Capslock), and save in LDAP
  16. # there.
  17. dns_name = models.CharField(max_length=255,
  18. verbose_name="nom du serveur",
  19. help_text="Exemple : ns1.example.com")
  20. description = models.CharField(max_length=255, blank=True,
  21. verbose_name="description du serveur",
  22. help_text="Exemple : Mon serveur de noms principal")
  23. owner = models.ForeignKey("members.Member", verbose_name="propriétaire")
  24. def __unicode__(self):
  25. return "{} ({})".format(self.description, self.dns_name) if self.description else self.dns_name
  26. class Meta:
  27. verbose_name = 'serveur de noms'
  28. verbose_name_plural = 'serveurs de noms'
  29. class ReverseDNSEntry(models.Model):
  30. ip = InetAddressField(unique=True, verbose_name='adresse IP')
  31. reverse = models.CharField(max_length=255, verbose_name='reverse',
  32. help_text="Nom à associer à l'adresse IP")
  33. ttl = models.IntegerField(default=3600, verbose_name="TTL",
  34. help_text="en secondes",
  35. validators=[MinValueValidator(60)])
  36. ip_subnet = models.ForeignKey('resources.IPSubnet')
  37. objects = NetManager()
  38. def clean(self):
  39. if self.reverse:
  40. # Check that the reverse ends with a "." (add it if necessary)
  41. if not self.reverse.endswith('.'):
  42. self.reverse += '.'
  43. if self.ip:
  44. if not self.ip in self.ip_subnet.inet:
  45. raise ValidationError('IP address must be included in the IP subnet.')
  46. def __unicode__(self):
  47. return "{} → {}".format(self.ip, self.reverse)
  48. class Meta:
  49. verbose_name = 'entrée DNS inverse'
  50. verbose_name_plural = 'entrées DNS inverses'