… | |
… | |
6 | use Fcntl; |
6 | use Fcntl; |
7 | |
7 | |
8 | use Coro; |
8 | use Coro; |
9 | use Coro::Event; |
9 | use Coro::Event; |
10 | use Coro::Semaphore; |
10 | use Coro::Semaphore; |
|
|
11 | use Coro::SemaphoreSet; |
11 | use Coro::Socket; |
12 | use Coro::Socket; |
12 | |
13 | |
13 | $Event::DIED = sub { |
14 | $Event::DIED = sub { |
14 | Event::verbose_exception_handler(@_); |
15 | Event::verbose_exception_handler(@_); |
15 | #Event::unloop_all(); |
16 | #Event::unloop_all(); |
… | |
… | |
218 | |
219 | |
219 | $WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; |
220 | $WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; |
220 | $WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; |
221 | $WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; |
221 | $WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; |
222 | $WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; |
222 | |
223 | |
|
|
224 | $whoislock = new Coro::SemaphoreSet; |
|
|
225 | |
223 | sub ip_request { |
226 | sub ip_request { |
224 | my $ip = $_[0]; |
227 | my $ip = $_[0]; |
|
|
228 | |
|
|
229 | my $guard = $whoislock->guard($ip); |
225 | |
230 | |
226 | my $c = $iprange->db_cursor; |
231 | my $c = $iprange->db_cursor; |
227 | my $v; |
232 | my $v; |
228 | |
233 | |
229 | if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) { |
234 | if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) { |
230 | my ($ip0, $ip1, $whois) = split /\x0/, $v; |
235 | my ($ip0, $ip1, $whois) = split /\x0/, $v; |
231 | my $_ip = ip2int $ip; |
236 | my $_ip = ip2int $ip; |
232 | print "looked for $_ip, found $ip0, $ip1 ", length($v),"\n"; |
|
|
233 | if ($ip0 <= $_ip && $_ip <= $ip1) { |
237 | if ($ip0 <= $_ip && $_ip <= $ip1) { |
234 | return $whois; |
238 | return $whois; |
235 | } |
239 | } |
236 | } |
240 | } |
237 | |
241 | |
238 | print "looked for $ip, ONLY found $v->[0], $v->[1]\n"; |
|
|
239 | |
|
|
240 | my ($arin, $ripe, $apnic); |
242 | my ($arin, $ripe, $apnic); |
241 | |
243 | |
242 | $whois = $WHOIS{APNIC}->ip_request($ip) |
244 | $whois = $WHOIS{APNIC}->ip_request($ip) |
243 | || $WHOIS{RIPE} ->ip_request($ip) |
245 | || $WHOIS{RIPE} ->ip_request($ip) |
244 | || $WHOIS{ARIN} ->ip_request($ip); |
246 | || $WHOIS{ARIN} ->ip_request($ip); |
… | |
… | |
256 | $_ip = $_ip & 0xffffff00; |
258 | $_ip = $_ip & 0xffffff00; |
257 | $_ip0 = $_ip if $_ip0 < $_ip; |
259 | $_ip0 = $_ip if $_ip0 < $_ip; |
258 | $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255; |
260 | $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255; |
259 | } |
261 | } |
260 | |
262 | |
261 | print "setting entry ($_ip0, $_ip, $_ip1)\n"; |
|
|
262 | $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois)); |
263 | $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois)); |
263 | (tied %whois)->db_sync; |
264 | (tied %whois)->db_sync; |
264 | $iprange->db_sync; |
265 | $iprange->db_sync; |
265 | |
266 | |
266 | $whois; |
267 | $whois; |