diff options
Diffstat (limited to 'rpkid/portal-gui/scripts/rpkigui-import-routes.py')
-rw-r--r-- | rpkid/portal-gui/scripts/rpkigui-import-routes.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/rpkid/portal-gui/scripts/rpkigui-import-routes.py b/rpkid/portal-gui/scripts/rpkigui-import-routes.py new file mode 100644 index 00000000..dab4f4b6 --- /dev/null +++ b/rpkid/portal-gui/scripts/rpkigui-import-routes.py @@ -0,0 +1,62 @@ +import sys, itertools, re + +from django.db import transaction + +from rpki.gui.routeview import models +from rpki.resource_set import resource_range_ipv4, resource_range_ipv6 + +f = open(sys.argv[1]) + +prefixes = {} + +ip_re = re.compile(r'^[0-9a-fA-F:.]+/\d{1,3}$') + +class InvalidPrefix(Exception): + pass + +for row in itertools.islice(f, 5, None): + try: + cols = row.split() + + prefix = cols[1] + + # validate the prefix since the "sh ip bgp" output is sometimes corrupt + # by no space between the prefix and the next hop IP address. + if not ip_re.match(prefix): + raise InvalidPrefix(prefix) + + # index -1 is i/e/? for igp/egp + origin_as = cols[-2] + + # skip AS_SETs + if origin_as[0] == '{': + continue + + asns = prefixes.get(prefix) + if not asns: + asns = set() + prefixes[prefix] = asns + asns.add(int(origin_as)) + + #print 'prefix=%s asns=%s' % (prefix, asns) + except InvalidPrefix, e: + print >>sys.stderr, 'skipping bad entry: ' + row, + print >>sys.stderr, e + +f.close() + +@transaction.commit_on_success +def commit(): + print 'Deleting rows from table...' + models.RouteOrigin.objects.all().delete() + + for prefix, asns in prefixes.iteritems(): + family = 6 if ':' in prefix else 4 + cls = resource_range_ipv6 if family == 6 else resource_range_ipv4 + rng = cls.parse_str(prefix) + + for asn in asns: + print 'Creating row for prefix=%s asn=%d' % (prefix, asn) + models.RouteOrigin.objects.create(prefix_min=rng.min, prefix_max=rng.max, family=family, asn=asn) + +commit() |