Latest posts on Вхождение ip в заданный дипазон ip-адресов topichttp://python.su/forum/topic/826/2007-05-28T09:21:24+03:00Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-28T09:21:24+03:00Igorek5528Все решилось прозаичнее, использовал по совету Андрея IPlib 1.0<br/><a href="http://erlug.linux.it/%7Eda/soft/iplib/">http://erlug.linux.it/~da/soft/iplib/</a><br/>все решается в три строки<br/><br/>import iplib<br/><br/>cidr = iplib.CIDR('10.0.0.0/8')<br/>ip = ‘10.2.0.1’<br/><br/>if cidr.is_valid_ip(ip):<br/> print ip<br/>
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-26T23:47:11+03:00Андрей Светлов5513Да…<br/>Примеров было более чем достаточно. А уметь читать сорцы в Питоне ой как нужно. <br/>Иначе - Ява или Шарп, у них с документацией получше. И все-равно не до конца помогает :)
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-26T15:56:05+03:00pythonwin5507<blockquote>Фигасебекода!<br/>Эм, а перевести в int и просто наложить маску?</blockquote>пример сможешь показать?
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-26T15:41:43+03:00nerezus5506Фигасебекода!<br/>Эм, а перевести в int и просто наложить маску?
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-24T17:36:47+03:00Cyxapeff5470Довольно давно искал решение такой задачи, в результате получилось:<br/><br/><div class="code"><pre> def convert_mask(self, string):<br/> """ Преобразует строку в вид сеть-маска, то есть можно задавать диапозоны как со слешам, так и через дефис """<br/> net,mask=re.split("/", string)<br/> if re.search("\.",mask)==None:<br/> i=1<br/> a=""<br/> while i*8<int(mask):<br/> if i!=1:<br/> a+="."<br/> a+="255"<br/> i+=1<br/> x=0<br/> b=""<br/> i-=1<br/> while x<int(mask)-i*8:<br/> b+="1"<br/> x+=1<br/> while x<8:<br/> b+="0"<br/> x+=1<br/> a+="."+str(int(b,2))<br/> i+=2<br/> while i<=4:<br/> if a[-1:]: a+="."<br/> a+="0"<br/> i+=1<br/> mask=str(a)<br/> #print net+"/"+mask<br/> return (net,mask)<br/><br/>def in_net(ip,net,mask):<br/> ip=map(int,re.split("\.", ip))<br/> net=map(int,re.split("\.", net))<br/> mask=map(int,re.split("\.", mask))<br/> i=0<br/> while i<4:<br/> if ip[i]&mask[i]!=net[i]:<br/> return False<br/> i+=1<br/> return True</pre></div>Вот такая штукенция используется и работает прямо в данный момент. :)
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-24T17:08:53+03:00redixin5469<br/>#!/usr/bin/python<br/><br/># usage in_range(ipaddress, net, mask)<br/><br/>from socket import inet_aton<br/><br/>def apply_mask(addr, mask):<br/> ret = '' <br/> for i in range(0,4):<br/> ret = ret + chr(ord(addr<em>) & ord(mask))<br/> return ret<br/><br/><br/>def in_range (ip, net, mask):<br/> ipnet = apply_mask(inet_aton(ip), inet_aton(mask))<br/> return(ipnet == inet_aton(net))<br/><br/>print in_range('10.10.10.1', ‘10.10.10.0’, ‘255.255.255.0’)<br/></em>
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-24T15:50:06+03:00Андрей Светлов5467Я использовал IPLib пару лет назад.<br/>Выдирал его из какого-то клона BitTorrent<br/>Наверняка есть версия и посвежее<br/><br/>Блин, что-то аттач не цепляется<br/><br/><br/><br/>“”“<br/>Library for working with IP addresses<br/>Mainly - check for internet/intranet networks<br/>”“”<br/>__revision__ = “$Revision: 1.5 $”<br/><br/>__all__ = <br/><br/>from bisect import bisect, insort<br/><br/>hexbinmap = {<br/> ‘0’: ‘0000’,<br/> ‘1’: ‘0001’,<br/> ‘2’: ‘0010’,<br/> ‘3’: ‘0011’,<br/> ‘4’: ‘0100’,<br/> ‘5’: ‘0101’,<br/> ‘6’: ‘0110’,<br/> ‘7’: ‘0111’,<br/> ‘8’: ‘1000’,<br/> ‘9’: ‘1001’,<br/> ‘a’: ‘1010’,<br/> ‘b’: ‘1011’,<br/> ‘c’: ‘1100’,<br/> ‘d’: ‘1101’,<br/> ‘e’: ‘1110’,<br/> ‘f’: ‘1111’,<br/> ‘x’: ‘0000’,<br/>}<br/><br/>chrbinmap = {}<br/>def _make_chrbinmap():<br/> “”“Internal”“”<br/> for j in xrange(256):<br/> res = <br/> k = j<br/> for _ in xrange(8):<br/> if k & 0x80:<br/> res.append('1')<br/> else:<br/> res.append('0')<br/> k <<= 1<br/> chrbinmap = ‘'.join(res)<br/>_make_chrbinmap()<br/><br/>def to_bitfield_ipv4(ipaddr):<br/> “”“convert ipv4 address to bitfield”“”<br/> ipaddr = ipaddr.split(’.')<br/> if len(ipaddr) != 4:<br/> raise ValueError, “bad address”<br/> res = <br/> for i in ipaddr:<br/> res.append(chrbinmap)<br/> return ‘'.join(res)<br/><br/>def to_bitfield_ipv6(ipaddr):<br/> “”“convert ipv6 address to bitfield”“”<br/> res = ’'<br/> doublecolon = False<br/><br/> if ipaddr == ‘':<br/> raise ValueError, “bad address”<br/> if ipaddr == ’::': # boundary handling<br/> ipaddr = ''<br/> elif ipaddr == ‘::’:<br/> ipaddr = ipaddr<br/> elif ipaddr == ‘:’:<br/> raise ValueError, “bad address”<br/> elif ipaddr == ‘::’:<br/> ipaddr = ipaddr<br/> elif ipaddr == ‘:’:<br/> raise ValueError, “bad address”<br/> for part in ipaddr.split(':'):<br/> if part == ‘': # double-colon<br/> if doublecolon:<br/> raise ValueError, “bad address”<br/> doublecolon = True<br/> res += ’:'<br/> continue<br/> if part.find('.') >= 0: # IPv4<br/> part = to_bitfield_ipv4(part)<br/> res += part + ‘0’*(32-len(part))<br/> continue<br/> part = ('x'*(4-len(part))) + part<br/> res += ''.join([hexbinmap<em> for i in part])<br/> if doublecolon:<br/> pos = res.find(':')<br/> res = res+('0'*(129-len(res)))+res<br/> if len(res) != 128: # always check size<br/> raise ValueError, “bad address”<br/> return res<br/><br/>ipv4addrmask = to_bitfield_ipv6('::ffff:0:0')<br/><br/>class IPList(object):<br/> “”“IP list class ”“”<br/> def __init__(self):<br/> “”“Constructor”“”<br/> self.__ipv4list = <br/> self.__ipv6list = <br/><br/> def __nonzero__(self):<br/> “”“test for non zero”“”<br/> return bool(self.__ipv4list or self.__ipv6list)<br/><br/> def append(self, ipaddr, depth = 256):<br/> “”“append address to list”“”<br/> if ipaddr.find(':') < 0: # IPv4<br/> insort(self.__ipv4list, to_bitfield_ipv4(ipaddr))<br/> else:<br/> res = to_bitfield_ipv6(ipaddr)<br/> if res.startswith(ipv4addrmask):<br/> insort(self.__ipv4list, res)<br/> else:<br/> insort(self.__ipv6list, res)<br/><br/> def includes(self, ipaddr):<br/> “”“test for ipaddr in self”“”<br/> if not (self.__ipv4list or self.__ipv6list):<br/> return False<br/> if ipaddr.find(':') < 0: # IPv4<br/> res = to_bitfield_ipv4(ipaddr)<br/> else:<br/> res = to_bitfield_ipv6(ipaddr)<br/> if res.startswith(ipv4addrmask):<br/> res = res<br/> if len(res) > 32:<br/> iplist = self.__ipv6list<br/> else:<br/> iplist = self.__ipv4list<br/> for ipmap in iplist:<br/> if res.startswith(ipmap):<br/> return True<br/> if ipmap > res:<br/> return False<br/> return False<br/><br/> def set_intranet_addresses(self):<br/> “”“appends to self intranet address ranges”“”<br/> self.append('127.0.0.1', 8)<br/> self.append('10.0.0.0', 8)<br/> self.append('172.16.0.0', 12)<br/> self.append('192.168.0.0', 16)<br/> self.append('169.254.0.0', 16)<br/> self.append('::1')<br/> self.append('fe80::', 16)<br/> self.append('fec0::', 16)<br/><br/> def set_ipv4_addresses(self):<br/> “”“appends to self ipv4 range addresses”“”<br/> self.append('::ffff:0:0', 96)<br/><br/>def ipv6_to_ipv4(ipaddr):<br/> “”“convert ipv6 address to ipv4”“”<br/> ipaddr = to_bitfield_ipv6(ipaddr)<br/> if not ipaddr.startswith(ipv4addrmask):<br/> raise ValueError, “not convertible to IPv4”<br/> ipaddr = ipaddr<br/> ret = ''<br/> for i in range(4):<br/> ret += str(int(ipaddr, 2))<br/> if i < 3:<br/> ret += ‘.’<br/> ipaddr = ipaddr<br/> return ret<br/><br/>def to_ipv4(ipaddr):<br/> “”“simular to ipv6_to_ipv4 but checks for ipaddr is valid ipv4”“”<br/> if is_ipv4(ipaddr):<br/> _valid_ipv4(ipaddr)<br/> return ipaddr<br/> return ipv6_to_ipv4(ipaddr)<br/><br/>def is_ipv4(ipaddr):<br/> “”“simple test for ipv4 address”“”<br/> return ipaddr.find(':') < 0<br/><br/>def _valid_ipv4(ipaddr):<br/> “”“Internal”“”<br/> ipaddr = ipaddr.split('.')<br/> if len(ipaddr) != 4:<br/> raise ValueError<br/> for i in ipaddr:<br/> chr(int(i))<br/><br/>def is_valid_ip(ipaddr):<br/> “”“test ipaddr is mailformed”“”<br/> try:<br/> if is_ipv4(ipaddr):<br/> _valid_ipv4(ipaddr)<br/> return True<br/> to_bitfield_ipv6(ipaddr)<br/> return True<br/> except ValueError:<br/> return False<br/><br/>def is_local_ip(ipaddr):<br/> “”“test ipaddr for local range”“”<br/> iplist = IPList()<br/> iplist.set_intranet_addresses()<br/> return iplist.includes(ipaddr)<br/><br/></em>
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-24T14:26:46+03:00tabajara5465<div class="code"><pre><span class="n">allowed_range</span> <span class="o">=</span> <span class="p">((</span><span class="mi">87</span><span class="p">,</span> <span class="mi">87</span><span class="p">),</span> <span class="p">(</span><span class="mi">240</span><span class="p">,</span> <span class="mi">240</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">16</span><span class="p">))</span> <span class="c"># (min , max)</span>
<span class="n">my_ip</span> <span class="o">=</span> <span class="s">'87.240.9.14'</span>
<span class="n">func</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">ip</span><span class="p">,</span> <span class="n">all_range</span><span class="p">:</span> \
<span class="nb">all</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">):</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o"><=</span> <span class="n">b</span> <span class="o"><=</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="p">,</span> \
<span class="nb">zip</span><span class="p">(</span><span class="n">all_range</span><span class="p">,</span> \
<span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">ip</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'.'</span><span class="p">)))))</span>
<span class="k">print</span> <span class="n">func</span><span class="p">(</span><span class="n">my_ip</span><span class="p">,</span> <span class="n">allowed_range</span><span class="p">)</span>
</pre></div>
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-24T12:59:03+03:00bialix5461в простом случае разбить ip-адрес по точкам на список элементов (или сразу задавать диапазон в видед списка элементов) и сравнить каждый элемент на вхождение в определенный диапазон.<br/><br/>т.е.<br/><br/><br/>allowed_range = [, , , range(0,16+1)]<br/>x = ‘87.240.9.193’.split('.')<br/>for i in xrange(4):<br/> allowed = allowed_range<em><br/> element = x<br/> if not element in allowed:<br/> print ‘Not inside range!’<br/> break<br/>else:<br/> print ‘Inside range’<br/><br/><br/>а как вы диапазоны задаете?</em>
Общий :: Python для экспертов :: Вхождение ip в заданный дипазон ip-адресов
2007-05-24T11:23:58+03:00Igorek5460Здравствуйте <br/>Как это сделать вхождение ip в заданные диапазоны ip-адресов подскажите пожалуйста.<br/><br/>необходимо что-то вроде <br/>87.240.0.0/16 - 87.240.9.193 входит<br/>10.0.0.0/24 - 192.168.1.1 не входит<br/>ну и далее