#!/usr/local/bin/perl -w # NAME # ripebogonroutes use strict; use Socket; unlink ('nro-extended-stats'); system ('wget https://www.nro.net/wp-content/uploads/delegated-stats/nro-extended-stats'); open (IFILE, "nro.ipv4.allocated") || die ("Error opening nro.ipv4.allocated file: $!\n"); while (my $line = ) { my @field = split /\|/, $line; my $resource_type = $field[2]; next unless ($resource_type eq 'ipv4'); my $status = $field[6]; next unless (defined ($status) and ($status eq 'assigned')); my $start_dq = $field[3]; my $len = $field[4]; my $start_nbo = inet_aton ($start_dq); my $start_int = unpack ('N', $start_nbo); my $last_int = ($start_int + $len) - 1; my $last_dq = inet_ntoa (pack ('N', $last_int)); print OFILE ("$start_dq-$last_dq\n"); } close (OFILE) || die ("Error closing nro.ipv4.allocated file: $!\n"); close (IFILE) || die ("Error closing nro-extended-stats file: $!\n"); unlink ('ripe-nonauth.db.gz'); system ('wget ftp://ftp.ripe.net/ripe/dbase/ripe-nonauth.db.gz'); my %bases; open (IFILE, "gzcat ripe-nonauth.db.gz |") || die ("Error opening ripe-nonauth.db.gz file: $!\n"); open (OFILE, ">ripe-nonauth.bases") || die ("Error opening ripe-nonauth.bases file: $!\n"); while (my $line = ) { if ($line =~ m%^route:\s+([\d\.]+)/(\d+)%) { my ($base_dq, $maskbits) = ($1, $2); $bases{$base_dq} = $maskbits; print OFILE ("$base_dq\n"); } } close (OFILE) || die ("Error closing ripe-nonauth.bases file: $!\n"); close (IFILE) || die ("Error closing ripe-nonauth.db.gz file: $!\n"); open (IFILE, "grepcidr -v -f nro.ipv4.allocated ripe-nonauth.bases |") || die ("Error opening grepcidr output stream: $!\n"); while (my $line = ) { chop $line; my $maskbits = $bases{$line}; print "$line/$maskbits\n"; } close (IFILE) || die ("Error closing grepcidr output stream: $!\n");