… | |
… | |
127 | } |
127 | } |
128 | $handle or die "$whois ($ip): unparseable multimatch\n"; |
128 | $handle or die "$whois ($ip): unparseable multimatch\n"; |
129 | $whois = $self->whois_request("!$handle"); |
129 | $whois = $self->whois_request("!$handle"); |
130 | } |
130 | } |
131 | |
131 | |
132 | my ($address, $info, $coordinator, undef) = split /\n\n/, $whois; |
132 | return |
|
|
133 | if $whois =~ /^OrgName:\s*RIPE Network Coordination Centre/mi; |
133 | |
134 | |
134 | $info =~ /^\s+Netname: (\S+)$/mi |
135 | $whois =~ /^network:Network-Name:\s*(\S+)$/mi |
|
|
136 | or $whois =~ /^NetName:\s*(\S+)$/mi |
135 | or die "$whois($ip): no netname\n"; |
137 | or die "$whois($ip): no netname\n"; |
136 | my $netname = $1; |
138 | my $netname = $1; |
137 | |
139 | |
138 | $info =~ /^\s+Netblock: ([0-9.]+\s+-\s+[0-9.]+)\s*$/mi |
140 | $whois =~ /^network:IP-Network-Block:\s*([0-9.]+\s*-\s*[0-9.]+)\s*$/mi |
|
|
141 | or $whois =~ /^NetRange:\s*([0-9.]+\s*-\s*[0-9.]+)\s*$/mi |
139 | or die "$whois($ip): no netblock\n"; |
142 | or die "$whois($ip): no netrange\n"; |
140 | my $netblock = $1; |
143 | my $netblock = $1; |
141 | |
144 | |
142 | my $maintainer; |
145 | my $maintainer; |
143 | |
146 | |
144 | if ($info =~ /^\s+Maintainer: (\S+)\s*$/mi) { |
147 | if ($whois =~ /^Maintainer:\s*(\S+)\s*$/mi) { |
145 | $maintainer = "*ma: $1\n"; |
148 | $maintainer = "*ma: $1\n"; |
146 | return if $1 =~ /^(?:AP|RIPE)$/; |
149 | return if $1 =~ /^(?:AP|RIPE)$/; |
147 | } |
150 | } |
148 | |
151 | |
149 | $coordinator =~ s/^\s+Coordinator:\s*//si |
152 | $whois =~ /^Country:\s*(\S+)/mi |
150 | or $coordinator = ""; |
|
|
151 | |
|
|
152 | $address =~ s/\n\s*(\S+)$// |
|
|
153 | or die "$whois($ip): no parseable country ($address)\n"; |
153 | or die "$whois($ip): no parseable country ($whois)\n"; |
154 | my $country = $1; |
154 | my $country = $1; |
155 | |
|
|
156 | $address =~ s/^\s*/*de: /mg; |
|
|
157 | $coordinator =~ s/^\s*/*ad: /mg; |
|
|
158 | |
155 | |
159 | $whois = <<EOF; |
156 | $whois = <<EOF; |
160 | *in: $netblock |
157 | *in: $netblock |
161 | *na: $netname |
158 | *na: $netname |
162 | *cy: $country |
159 | *cy: $country |
163 | $maintainer$address |
160 | |
164 | $coordinator |
161 | $whois |
165 | EOF |
162 | EOF |
166 | $whois =~ s/\n+$//; |
163 | |
167 | $whois; |
164 | $whois |
168 | } |
165 | } |
169 | |
166 | |
170 | package Whois::RIPE; |
167 | package Whois::RIPE; |
171 | |
168 | |
172 | use Socket; |
169 | use Socket; |
… | |
… | |
345 | } |
342 | } |
346 | } |
343 | } |
347 | |
344 | |
348 | my ($arin, $ripe, $apnic); |
345 | my ($arin, $ripe, $apnic); |
349 | |
346 | |
350 | $whois = $WHOIS{RIPE}->ip_request($ip) |
347 | $whois = $WHOIS{RIPE} ->ip_request ($ip) |
351 | || $WHOIS{APNIC} ->ip_request($ip) |
348 | || $WHOIS{APNIC} ->ip_request ($ip) |
352 | || $WHOIS{AFRINIC} ->ip_request($ip) |
349 | || $WHOIS{AFRINIC} ->ip_request ($ip) |
353 | || $WHOIS{LACNIC}->ip_request($ip) |
350 | || $WHOIS{LACNIC} ->ip_request ($ip) |
354 | || $WHOIS{ARIN} ->ip_request($ip) |
351 | || $WHOIS{ARIN} ->ip_request ($ip) |
355 | ; |
352 | ; |
356 | |
353 | |
357 | $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi |
354 | $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi |
|
|
355 | or do { |
358 | or do { warn "$whois($ip): no addresses found\n", last }; |
356 | warn "$whois($ip): no addresses found\n"; |
|
|
357 | return <<EOF; |
|
|
358 | *in: $ip-$ip |
|
|
359 | *na: whois failure |
|
|
360 | *cy: XX |
|
|
361 | EOF |
|
|
362 | }; |
359 | |
363 | |
360 | my ($ip0, $ip1) = ($1, $2); |
364 | my ($ip0, $ip1) = ($1, $2); |
361 | |
365 | |
362 | my $_ip = ip2int($ip); |
366 | my $_ip = ip2int($ip); |
363 | my $_ip0 = ip2int($ip0); |
367 | my $_ip0 = ip2int($ip0); |
… | |
… | |
371 | |
375 | |
372 | $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois)); |
376 | $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois)); |
373 | (tied %whois)->db_sync; |
377 | (tied %whois)->db_sync; |
374 | $iprange->db_sync; |
378 | $iprange->db_sync; |
375 | |
379 | |
376 | $whois; |
380 | $whois |
377 | } |
381 | } |
378 | |
382 | |
379 | sub clear_cache() { |
383 | sub clear_cache() { |
380 | %netgeo::whois = (); |
384 | %netgeo::whois = (); |
381 | $netgeo::iprange->truncate (my $dummy); |
385 | $netgeo::iprange->truncate (my $dummy); |
382 | } |
386 | } |
383 | |
387 | |
384 | if (0) { |
388 | if (1) { |
385 | #print ip_request "68.52.164.8"; # goof |
389 | #print ip_request "68.52.164.8"; # goof |
386 | #print "\n\n"; |
390 | #print "\n\n"; |
387 | #print ip_request "200.202.220.222"; # lacnic |
391 | print ip_request "200.202.220.222"; # lacnic |
388 | #print "\n\n"; |
392 | print "\n\n"; |
389 | #print ip_request "62.116.167.250"; |
393 | #print ip_request "62.116.167.250"; |
390 | #print "\n\n"; |
394 | #print "\n\n"; |
391 | #print ip_request "133.11.128.254"; # jp |
395 | #print ip_request "133.11.128.254"; # jp |
392 | #print "\n\n"; |
396 | #print "\n\n"; |
393 | print ip_request "80.131.153.93"; |
397 | # print ip_request "76.6.7.8"; |
394 | print "\n\n"; |
398 | # print "\n\n"; |
395 | } |
399 | } |
396 | |
400 | |
397 | 1; |
401 | 1; |
398 | |
402 | |
399 | |
403 | |