]>
git.ipfire.org Git - people/shoehn/ipfire.org.git/blob - www/pages/torrent/client/iprangeparse.py
1 # Written by John Hoffman
2 # see LICENSE.txt for license information
4 from bisect
import bisect
, insort
11 bool = lambda x
: not not x
17 raise ValueError, "bad address"
27 raise ValueError, "bad address"
28 if ip
== '::': # boundary handling
33 raise ValueError, "bad address"
37 raise ValueError, "bad address"
41 for n
in ip
.split(':'):
42 if n
== '': # double-colon
44 raise ValueError, "bad address"
48 if n
.find('.') >= 0: # IPv4
51 raise ValueError, "bad address"
55 n
= ('0'*(4-len(n
))) + n
56 b
.append(int(n
[:2],16))
57 b
.append(int(n
[2:],16))
61 for i
in xrange(17-len(b
)):
68 ipv4addrmask
= 65535L*256*256*256*256
72 self
.ipv4list
= [] # starts of ranges
73 self
.ipv4dict
= {} # start: end of ranges
74 self
.ipv6list
= [] # "
75 self
.ipv6dict
= {} # "
77 def __nonzero__(self
):
78 return bool(self
.ipv4list
or self
.ipv6list
)
81 def append(self
, ip_beg
, ip_end
= None):
85 assert ip_beg
<= ip_end
86 if ip_beg
.find(':') < 0: # IPv4
87 ip_beg
= to_long_ipv4(ip_beg
)
88 ip_end
= to_long_ipv4(ip_end
)
92 ip_beg
= to_long_ipv6(ip_beg
)
93 ip_end
= to_long_ipv6(ip_end
)
94 bb
= ip_beg
% (256*256*256*256)
95 if bb
== ipv4addrmask
:
104 pos
= bisect(l
,ip_beg
)-1
110 if range_beg
> ip_end
+1:
113 range_end
= d
[range_beg
]
114 if range_end
< ip_beg
-1:
120 # if neither of the above conditions is true, the ranges overlap
121 ip_beg
= min(ip_beg
, range_beg
)
122 ip_end
= max(ip_end
, range_end
)
131 def includes(self
, ip
):
132 if not (self
.ipv4list
or self
.ipv6list
):
134 if ip
.find(':') < 0: # IPv4
135 ip
= to_long_ipv4(ip
)
139 ip
= to_long_ipv6(ip
)
140 bb
= ip
% (256*256*256*256)
141 if bb
== ipv4addrmask
:
148 for ip_beg
in l
[bisect(l
,ip
)-1:]:
152 if ip
> ip_beg
and ip
<= ip_end
:
157 # reads a list from a file in the format 'whatever:whatever:ip-ip'
158 # (not IPv6 compatible at all)
159 def read_rangelist(self
, file):
166 if not line
or line
[0] == '#':
168 line
= line
.split(':')[-1]
170 ip1
,ip2
= line
.split('-')
175 self
.append(ip1
.strip(),ip2
.strip())
177 print '*** WARNING *** could not parse IP range: '+line
181 return ip
.find(':') < 0