Commit 845da577 authored by Peter Müller's avatar Peter Müller Committed by Michael Tremer

Process LACNIC geofeed as well

This improves country code accurarcy for suballocations within IP space
managed by LACNIC, as the delegated-extended-latest file only provides
country code information at the top level of an allocated network.

Sadly, lacnic.db.gz does not contain descriptions or names of Autonomous
Systems within the space maintained by LACNIC.
Signed-off-by: default avatarPeter Müller <peter.mueller@ipfire.org>
Signed-off-by: default avatarMichael Tremer <michael.tremer@ipfire.org>
parent 148f68bf
......@@ -53,7 +53,9 @@ WHOIS_SOURCES = {
],
# Latin America and Caribbean Network Information Centre
# XXX ???
"LACNIC": [
"https://ftp.lacnic.net/lacnic/dbase/lacnic.db.gz"
],
# Réseaux IP Européens
"RIPE": [
......
......@@ -681,13 +681,42 @@ class CLI(object):
# Strip any excess space
start_address, end_address = start_address.rstrip(), end_address.strip()
# Convert to IP address
try:
start_address = ipaddress.ip_address(start_address)
end_address = ipaddress.ip_address(end_address)
except ValueError:
log.warning("Could not parse line: %s" % line)
return
# Handle "inetnum" formatting in LACNIC DB (e.g. "24.152.8/22" instead of "24.152.8.0/22")
if start_address and not (delim or end_address):
try:
start_address = ipaddress.ip_network(start_address, strict=False)
except ValueError:
start_address = start_address.split("/")
ldigits = len(start_address[0].split("."))
# How many octets do we need to add?
# (LACNIC does not seem to have a /8 or greater assigned, so the following should suffice.)
if ldigits == 2:
start_address = start_address[0] + ".0.0/" + start_address[1]
elif ldigits == 3:
start_address = start_address[0] + ".0/" + start_address[1]
else:
log.warning("Could not recover IPv4 address from line in LACNIC DB format: %s" % line)
return
try:
start_address = ipaddress.ip_network(start_address, strict=False)
except ValueError:
log.warning("Could not parse line in LACNIC DB format: %s" % line)
return
# Enumerate first and last IP address of this network
end_address = start_address[-1]
start_address = start_address[0]
else:
# Convert to IP address
try:
start_address = ipaddress.ip_address(start_address)
end_address = ipaddress.ip_address(end_address)
except ValueError:
log.warning("Could not parse line: %s" % line)
return
inetnum["inetnum"] = list(ipaddress.summarize_address_range(start_address, end_address))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment