ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/netgeo.pl
(Generate patch)

Comparing Coro/myhttpd/netgeo.pl (file contents):
Revision 1.4 by root, Tue Aug 28 02:30:49 2001 UTC vs.
Revision 1.9 by root, Sun May 19 21:00:48 2002 UTC

6use Fcntl; 6use Fcntl;
7 7
8use Coro; 8use Coro;
9use Coro::Event; 9use Coro::Event;
10use Coro::Semaphore; 10use Coro::Semaphore;
11use Coro::SemaphoreSet;
11use Coro::Socket; 12use Coro::Socket;
13
14use BerkeleyDB;
12 15
13$Event::DIED = sub { 16$Event::DIED = sub {
14 Event::verbose_exception_handler(@_); 17 Event::verbose_exception_handler(@_);
15 #Event::unloop_all(); 18 #Event::unloop_all();
16}; 19};
201 $whois; 204 $whois;
202} 205}
203 206
204package netgeo; 207package netgeo;
205 208
209use Socket;
206use BerkeleyDB; 210use BerkeleyDB;
207use Socket;
208 211
209sub ip2int($) { 212sub ip2int($) {
210 unpack "N", inet_aton $_[0]; 213 unpack "N", inet_aton $_[0];
211} 214}
212 215
218 221
219$WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; 222$WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12;
220$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; 223$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20;
221$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; 224$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20;
222 225
226$whoislock = new Coro::SemaphoreSet;
227
223sub ip_request { 228sub ip_request {
224 my $ip = $_[0]; 229 my $ip = $_[0];
230
231 my $guard = $whoislock->guard($ip);
225 232
226 my $c = $iprange->db_cursor; 233 my $c = $iprange->db_cursor;
227 my $v; 234 my $v;
228 235
229 if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) { 236 if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) {
230 my ($ip0, $ip1, $whois) = split /\x0/, $v; 237 my ($ip0, $ip1, $whois) = split /\x0/, $v;
231 my $_ip = ip2int $ip; 238 my $_ip = ip2int $ip;
232 print "looked for $_ip, found $ip0, $ip1 ", length($v),"\n";
233 if ($ip0 <= $_ip && $_ip <= $ip1) { 239 if ($ip0 <= $_ip && $_ip <= $ip1) {
234 return $whois; 240 return $whois;
235 } 241 }
236 } 242 }
237 243
238 print "looked for $ip, ONLY found $v->[0], $v->[1]\n";
239
240 my ($arin, $ripe, $apnic); 244 my ($arin, $ripe, $apnic);
241 245
242 $whois = $WHOIS{APNIC}->ip_request($ip) 246 $whois = $WHOIS{RIPE}->ip_request($ip)
243 || $WHOIS{RIPE} ->ip_request($ip)
244 || $WHOIS{ARIN} ->ip_request($ip); 247 || $WHOIS{ARIN} ->ip_request($ip)
248 || $WHOIS{APNIC} ->ip_request($ip);
245 249
246 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi 250 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
247 or do { warn "$whois($ip): no addresses found\n", last }; 251 or do { warn "$whois($ip): no addresses found\n", last };
248 252
249 my ($ip0, $ip1) = ($1, $2); 253 my ($ip0, $ip1) = ($1, $2);
256 $_ip = $_ip & 0xffffff00; 260 $_ip = $_ip & 0xffffff00;
257 $_ip0 = $_ip if $_ip0 < $_ip; 261 $_ip0 = $_ip if $_ip0 < $_ip;
258 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255; 262 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255;
259 } 263 }
260 264
261 print "setting entry ($_ip0, $_ip, $_ip1)\n";
262 $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois)); 265 $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois));
263 (tied %whois)->db_sync; 266 (tied %whois)->db_sync;
264 $iprange->db_sync; 267 $iprange->db_sync;
265 268
266 $whois; 269 $whois;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines