#! /usr/bin/perl # my $ip2cc = 1; my $arg1 = $ARGV[0]; if( $arg1 =~ /^-i/ ){ $ip2cc = 1; } elsif( $arg1 =~ /^-c/ ){ $ip2cc = 0; } else { print STDERR "usage: make_ippaddr_to_cctld.pl -i2c or -c2i < STDIN\n"; exit(1); } my $old_start = -1; my $old_end = -1; my $old_cc = 0; # カントリーコードが同一の連続した IP アドレス範囲を切り出す while(){ my ($start, $end, $cc) = /^(\d+)\s+(\d+)\s+(\S{2})$/; if( ($cc eq $old_cc ) && ($old_end == $start) ){ $old_end = $end; } else{ if( $old_start != -1 ){ continuous_ip_range($old_start,$old_end,$old_cc) ; } $old_cc = $cc ; $old_start = $start ; $old_end = $end; } } continuous_ip_range($old_start,$old_end,$old_cc); exit(0); # カントリーコードが連続した IP アドレス範囲を # 検索しやすいように分割して出力。 # IP アドレス範囲内の中にクラス A、B、C 相当の # 領域がある場合は、順番にそれを切り出す。 sub continuous_ip_range { my ($start,$end,$cc) = @_; # 単に連続している IP アドレスを表示したい時 # print_ip_range($start,$end-1,$cc); # return; my $c1=(($start & 0xff000000) >> 24); my $c2=(($start & 0x00ff0000) >> 16); my $c3=(($start & 0x0000ff00) >> 8); my $c4=(($start & 0x000000ff) >> 0); my $last = $start; if( $c2 == 0 && $c3 == 0 && $c4 == 0 ){ my $t = ($end & 0xff000000) ; if( $start < $t ){ # Class A $last = $t; print_ip_range( $start, $last - 1, $cc ); goto label; } } if( $c3 == 0 && $c4 == 0 ){ my $t = ($end & 0xffff0000) ; if( $start < $t ){ # Class B $last = $t; print_ip_range( $start, $last - 1, $cc ); goto label; } } if( $c4 == 0 ){ my $t = ($end & 0xffffff00) ; if( $start < $t ){ # Class C $last = $t; print_ip_range( $start, $last - 1, $cc ); goto label; } } # Class C 未満 print_ip_range( $start, $end - 1, $cc ); $last = $end ; label: if( $end > $last ){ continuous_ip_range( $last, $end, $cc ); } } sub print_ip_range { my ($start,$end,$cc) = @_; my ($c1, $c2, $c3, $c4); $c1=(($start & 0xff000000) >> 24); $c2=(($start & 0x00ff0000) >> 16); $c3=(($start & 0x0000ff00) >> 8); $c4=(($start & 0x000000ff) >> 0); $c5=(($end & 0xff000000) >> 24); $c6=(($end & 0x00ff0000) >> 16); $c7=(($end & 0x0000ff00) >> 8); $c8=(($end & 0x000000ff) >> 0); $ip1 = sprintf( '%u.%u.%u.%u', $c1, $c2, $c3, $c4 ); $ip2 = sprintf( '%u.%u.%u.%u', $c5, $c6, $c7, $c8 ); if( $ip2cc ){ print $ip1 . "\t" . $ip2 . "\t" . $cc ."\n"; } else { print $cc . "\t" . $ip1 . "\t" . $ip2 . "\n"; } }