diff --git a/djing/lib/tln/tln.py b/djing/lib/tln/tln.py index 7b025f4..1449498 100755 --- a/djing/lib/tln/tln.py +++ b/djing/lib/tln/tln.py @@ -29,21 +29,23 @@ class ValidationError(ValueError): MAC_ADDR_REGEX = b'^([0-9A-Fa-f]{1,2}[:-]){5}([0-9A-Fa-f]{1,2})$' -IP_ADDR_REGEX = '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' \ - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' +IP_ADDR_REGEX = ( + '^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' + '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' +) ONU_SN_REGEX = b'^ZTEG[A-F\d]{8}$' class TelnetApi(Telnet): - config_level = [] def __init__(self, *args, **kwargs): timeout = kwargs.get('timeout') if timeout: self._timeout = timeout self._prompt_string = b'ZTE-C320-PKP#' + self.config_level = [] super().__init__(*args, **kwargs) def write(self, buffer: bytes) -> None: diff --git a/ip_pool/forms.py b/ip_pool/forms.py index a926412..8bd35fc 100644 --- a/ip_pool/forms.py +++ b/ip_pool/forms.py @@ -1,4 +1,4 @@ -from netaddr import IPNetwork, AddrFormatError, IPAddress +from netaddr import IPNetwork, AddrFormatError from django import forms from django.core.exceptions import ValidationError @@ -6,21 +6,29 @@ from ip_pool import models class NetworkForm(forms.ModelForm): - mask = forms.CharField(max_length=39, min_length=7, widget=forms.TextInput()) - def clean_mask(self): + def clean_network(self): + netw = self.data.get('network') + mask = self.data.get('mask') + if netw is None: + return try: - network = IPAddress(self.data.get('network')) - mask = self.data.get('mask') - net = IPNetwork('%s/%s' % (network, mask)) - ip, new_mask = str(net.cidr).split('/') - return new_mask + if mask: + net = IPNetwork('%s/%s' % (netw, mask)) + else: + net = IPNetwork(netw) + return str(net.ip) except AddrFormatError as e: raise ValidationError(e, code='invalid') class Meta: model = models.NetworkModel fields = '__all__' + widgets = { + 'mask': forms.TextInput(attrs={ + 'pattern': '^\d{1,3}$' + }) + } class EmployedIpForm(forms.ModelForm): diff --git a/ip_pool/models.py b/ip_pool/models.py index d66d1d2..de0d828 100644 --- a/ip_pool/models.py +++ b/ip_pool/models.py @@ -7,28 +7,18 @@ from django.db import models from django.utils.translation import gettext_lazy as _ -IP_SUBNET_RE = ( - '^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.' - '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/' - '(3[0-2]|2\d|1\d|\d))|(\/(3[0-2]|2\d|1\d|\d))$' -) - - class NetworkModel(models.Model): _netw_cache = None network = models.GenericIPAddressField( verbose_name=_('IP network'), - help_text=_('Dot separated ip address of network. For example: 192.168.1.0'), + help_text=_('Ip address of network. For example: 192.168.1.0 or fde8:6789:1234:1::'), unique=True ) mask = models.PositiveSmallIntegerField( _('Mask'), - help_text=_('For example: 24, if network is 192.168.1.0/24'), + help_text=_('Net mask bits length for ipv4 or prefix length for ipv6'), default=24, - validators=() ) work_range_start_ip = models.GenericIPAddressField( verbose_name=_('Work range start ip'), @@ -55,7 +45,9 @@ class NetworkModel(models.Model): def get_network(self) -> IPNetwork: if self._netw_cache is None: - self._netw_cache = IPNetwork("%s/%s" % (self.network, self.mask or 32)) + self._netw_cache = IPNetwork(self.network) + if self.mask: + self._netw_cache.prefixlen = self.mask return self._netw_cache def get_absolute_url(self): diff --git a/ip_pool/templates/ip_pool/net_add.html b/ip_pool/templates/ip_pool/net_add.html index 6fb8450..0c64940 100644 --- a/ip_pool/templates/ip_pool/net_add.html +++ b/ip_pool/templates/ip_pool/net_add.html @@ -3,6 +3,10 @@ {% load bootstrap3 %} {% load globaltags %} +{% block additional_link %} + +{% endblock %} + {% block breadcrumb %}