def clean(self): """Checks the CIDR to determine if it maps to a valid IPv4 network.""" if self.cidr: try: netaddr.cidr_to_glob(self.cidr) except (TypeError, netaddr.AddrFormatError) as err: raise me.ValidationError(err)
def interpreter_ip_to_section_ip(ips_list): """ 提供一个功能,将CIDR表示的IP转换成 IP段的表示方法如,不连续的段会以#分隔开,注意以CIDR表示的IP,必须表示的是 一段或多段连续的IP,不可是一段连续的ip,一段独立的ip的形式: ['10.33.0.15/32','10.33.0.16/29','10.33.0.24/32']转换为"10.33.0.15-10.33.0.24" :param ips_list: list,以CIDR表示的ip :return:string 以ip网段表示的一个ip段 """ ip_net = [] ip_string = "" int_to_ip = lambda x: '.'.join( [str(x / (256**i) % 256) for i in range(3, -1, -1)]) for ips in ips_list: ip_net.append(netaddr.glob_to_iprange(netaddr.cidr_to_glob(ips))) ip_start = ip_net[0].key()[1] ip_end = ip_net[0].key()[2] for index in xrange(len(ip_net)): if ip_net[index].key()[1] - 1 <= ip_end: ip_end = ip_net[index].key()[2] if index == len(ip_net) - 1: ip_end = ip_net[index].key()[2] ip_string += "%s-%s#" % (int_to_ip(ip_start), int_to_ip(ip_end)) else: if index == len(ip_net) - 1: ip_string += "%s-%s#" % (int_to_ip(ip_start), int_to_ip(ip_end)) ip_string += "%s-%s#" % (int_to_ip(ip_start), int_to_ip(ip_end)) ip_start = ip_net[index].key()[1] ip_end = ip_net[index].key()[2] ip_string = ip_string[:-1] return ip_string
def getIPv4LocalAddressList(self): """Returns currently configured local IPv4 addresses which are in ipv4_local_network""" if not socket.AF_INET in netifaces.ifaddresses(self.name): return [] return [dict(addr=q['addr'], netmask=q['netmask']) for q in netifaces.ifaddresses(self.name)[socket.AF_INET] if netaddr.IPAddress( q['addr'], 4) in netaddr.glob_to_iprange( netaddr.cidr_to_glob(self.ipv4_local_network))]
def _generateRandomIPv4Address(self, netmask): # no addresses found, generate new one # Try 10 times to add address, raise in case if not possible try_num = 10 while try_num > 0: addr = random.choice([q for q in netaddr.glob_to_iprange( netaddr.cidr_to_glob(self.ipv4_local_network))]).format() if dict(addr=addr, netmask=netmask) not in self.getIPv4LocalAddressList(): # Checking the validity of the IPv6 address if self._addSystemAddress(addr, netmask, False): return dict(addr=addr, netmask=netmask) try_num -= 1 raise AddressGenerationError(addr)
def clean_ip_networks(self): ip_networks = self.cleaned_data["ip_networks"] ip_networks = ip_networks.replace(" ", "").replace("\r\n","") ip_networks_as_list = [cidr for cidr in ip_networks.split("," )] cleaned_networks_list = [] for cidr in ip_networks_as_list: if cidr: if cidr != ",": try: cidr_as_glob = cidr_to_glob("%s" % cidr) if valid_glob(cidr_as_glob): cleaned_networks_list.append(cidr) else: raise forms.ValidationError(_("%s is not a valid ip range." % cidr)) except: raise forms.ValidationError(_("%s is not a valid ip range." % cidr)) else: pass return ','.join(cleaned_networks_list)
def clean_ip_networks(self): ip_networks = self.cleaned_data["ip_networks"] ip_networks = ip_networks.replace(" ", "").replace("\r\n", "") ip_networks_as_list = [cidr for cidr in ip_networks.split(",")] cleaned_networks_list = [] for cidr in ip_networks_as_list: if cidr: if cidr != ",": try: cidr_as_glob = cidr_to_glob("%s" % cidr) if valid_glob(cidr_as_glob): cleaned_networks_list.append(cidr) else: raise forms.ValidationError( _("%s is not a valid ip range." % cidr)) except: raise forms.ValidationError( _("%s is not a valid ip range." % cidr)) else: pass return ','.join(cleaned_networks_list)
def test_cidr_to_glob(): assert cidr_to_glob('10.0.0.1/32') == '10.0.0.1' assert cidr_to_glob('192.0.2.0/24') == '192.0.2.*' assert cidr_to_glob('172.16.0.0/12') == '172.16-31.*.*' assert cidr_to_glob('0.0.0.0/0') == '*.*.*.*'