#! /usr/local/bin/perl use Time::Local; use strict; # This parses the list of IPv6 global unicast assignments made to the RIRs # by IANA on http://www.iana.org/assignments/ipv6-unicast-address-assignments my %month = BuildMonth(); my $data; my @events; Parse(); #AddRfc(); PrintEvents(); sub Parse { while (<>) { last if /^Global Unicast Prefix Assignment/; } while (<>) { next if /^-/; next if /^\s*$/; last if /^Notes/; s/RIPE NCC/RIPE/; my ($block, $org, $day, $month, $year, @rest) = split /\s+/; my $time = GetTime($year, $month, $day); my $name = $org; my $type = "allocated"; if ($block eq "2001:0000::/23") { $name = "IANA experimental"; $type = "special-use"; } elsif ($block eq "2001:0C00::/23") { # $org = "IANA"; $name = "critical infrastructure, experimental allocations, and non-routable documentation (2001:0DB8::/32)"; $type = "special-use"; } elsif ($org eq "6to4") { $org = "IANA"; $type = "special-use"; } elsif ($org eq "6BONE") { $org = "IANA"; $type = "special-use"; } elsif ($org eq "RESERVED" && $block eq "2001:3C00::/22") { $org = "IANA"; $name = "reserved for RIPE"; $type = "reserved"; } AddEvent($block, $time, $type, $org, $name); } } sub AddEvent { my ($block, $date, $type, $org, $name) = @_; push @events, { "block" => $block, "date" => $date, "type" => $type, "org" => $org, "name" => $name }; } sub PrintEvents { foreach my $event ( sort { if ($a->{date} == $b->{date}) { return $a->{block}<=>$b->{block} } $a->{date}<=>$b->{date} } @events) { my ($block, $date, $type, $org, $name) = ( $event->{"block"},$event->{"date"}, $event->{"type"}, $event->{"org"}, $event->{"name"}); printf "%-19s| %-9s| %-10s| %-10s| %s\n", $block, $date, $type, $org, $name; } } sub BuildMonth { my %month; my $index = 1; foreach my $mon (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)) { $month{$mon} = $index++; } return %month; } sub GetTime { my ($year, $month, $day) = @_; if ($year < 50) { $year += 2000; } else { $year += 1900; } return sprintf("%04d%02d%02d", $year, $month{$month}, $day); }