Added handling for IPs too big
This commit is contained in:
parent
9f343ed296
commit
0e7479e23e
23
database.py
23
database.py
|
@ -288,11 +288,16 @@ class Database(Profiler):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def pack_ip4address(address: str) -> Ip4Path:
|
def pack_ip4address_low(address: str) -> int:
|
||||||
addr = 0
|
addr = 0
|
||||||
for split in address.split('.'):
|
for split in address.split('.'):
|
||||||
addr = (addr << 8) + int(split)
|
octet = int(split)
|
||||||
return Ip4Path(addr, 32)
|
addr = (addr << 8) + octet
|
||||||
|
return addr
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pack_ip4address(address: str) -> Ip4Path:
|
||||||
|
return Ip4Path(Database.pack_ip4address_low(address), 32)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def unpack_ip4address(address: Ip4Path) -> str:
|
def unpack_ip4address(address: Ip4Path) -> str:
|
||||||
|
@ -627,17 +632,17 @@ class Database(Profiler):
|
||||||
|
|
||||||
def get_ip4(self, ip4_str: str) -> typing.Iterable[Path]:
|
def get_ip4(self, ip4_str: str) -> typing.Iterable[Path]:
|
||||||
self.enter_step('get_ip4_pack')
|
self.enter_step('get_ip4_pack')
|
||||||
ip4 = self.pack_ip4address(ip4_str)
|
ip4val = self.pack_ip4address_low(ip4_str)
|
||||||
self.enter_step('get_ip4_cache')
|
self.enter_step('get_ip4_cache')
|
||||||
if not self.ip4cache[ip4.value >> self.ip4cache_shift]:
|
if not self.ip4cache[ip4val >> self.ip4cache_shift]:
|
||||||
return
|
return
|
||||||
self.enter_step('get_ip4_brws')
|
self.enter_step('get_ip4_brws')
|
||||||
dic = self.ip4tree
|
dic = self.ip4tree
|
||||||
for i in range(31, 31-ip4.prefixlen, -1):
|
for i in range(31, -1, -1):
|
||||||
bit = (ip4.value >> i) & 0b1
|
bit = (ip4val >> i) & 0b1
|
||||||
if dic.active():
|
if dic.active():
|
||||||
self.enter_step('get_ip4_yield')
|
self.enter_step('get_ip4_yield')
|
||||||
yield Ip4Path(ip4.value >> (i+1) << (i+1), 31-i)
|
yield Ip4Path(ip4val >> (i+1) << (i+1), 31-i)
|
||||||
self.enter_step('get_ip4_brws')
|
self.enter_step('get_ip4_brws')
|
||||||
next_dic = dic.one if bit else dic.zero
|
next_dic = dic.one if bit else dic.zero
|
||||||
if next_dic is None:
|
if next_dic is None:
|
||||||
|
@ -645,7 +650,7 @@ class Database(Profiler):
|
||||||
dic = next_dic
|
dic = next_dic
|
||||||
if dic.active():
|
if dic.active():
|
||||||
self.enter_step('get_ip4_yield')
|
self.enter_step('get_ip4_yield')
|
||||||
yield ip4
|
yield Ip4Path(ip4val, 32)
|
||||||
|
|
||||||
def _unset_match(self,
|
def _unset_match(self,
|
||||||
match: Match,
|
match: Match,
|
||||||
|
|
|
@ -61,7 +61,9 @@ class Writer(multiprocessing.Process):
|
||||||
try:
|
try:
|
||||||
for source in select(self.db, value):
|
for source in select(self.db, value):
|
||||||
write(self.db, name, updated, source=source)
|
write(self.db, name, updated, source=source)
|
||||||
except ValueError:
|
except (ValueError, IndexError):
|
||||||
|
# ValueError: non-number in IP
|
||||||
|
# IndexError: IP too big
|
||||||
self.log.exception("Cannot execute: %s", record)
|
self.log.exception("Cannot execute: %s", record)
|
||||||
|
|
||||||
if next_save > 0 and time.time() > next_save:
|
if next_save > 0 and time.time() > next_save:
|
||||||
|
|
Loading…
Reference in a new issue