]> git.ipfire.org Git - people/ms/libloc.git/blobdiff - src/python/location-importer.in
Process LACNIC geofeed as well
[people/ms/libloc.git] / src / python / location-importer.in
index b3e36582055c1d510dd94f7adb38665c49f13337..eff925326469891b244e72b6dd339355defdcfb3 100644 (file)
@@ -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))