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.3 by root, Thu Aug 16 16:40:07 2001 UTC vs.
Revision 1.4 by root, Tue Aug 28 02:30:49 2001 UTC

2 2
3# APNIC refer: KRNIC (for 211.104.0.0) 3# APNIC refer: KRNIC (for 211.104.0.0)
4 4
5use Socket; 5use Socket;
6use Fcntl; 6use Fcntl;
7
8use PApp::SQL;
9 7
10use Coro; 8use Coro;
11use Coro::Event; 9use Coro::Event;
12use Coro::Semaphore; 10use Coro::Semaphore;
13use Coro::Socket; 11use Coro::Socket;
15$Event::DIED = sub { 13$Event::DIED = sub {
16 Event::verbose_exception_handler(@_); 14 Event::verbose_exception_handler(@_);
17 #Event::unloop_all(); 15 #Event::unloop_all();
18}; 16};
19 17
18tie %netgeo::whois, BerkeleyDB::Btree,
19 -Env => $db_env,
20 -Filename => "whois",
21 -Flags => DB_CREATE,
22 or die "unable to create/open whois table";
23$netgeo::iprange = new BerkeleyDB::Btree
24 -Env => $db_env,
25 -Filename => "iprange",
26 -Flags => DB_CREATE,
27 or die "unable to create/open iprange table";
28
20package Whois; 29package Whois;
21 30
22use PApp::SQL;
23use Coro::Event; 31use Coro::Event;
24 32
25sub new { 33sub new {
26 my $class = shift; 34 my $class = shift;
27 my $name = shift; 35 my $name = shift;
39 $_[1]; 47 $_[1];
40} 48}
41 49
42sub whois_request { 50sub whois_request {
43 my ($self, $query) = @_; 51 my ($self, $query) = @_;
44 my ($id, $whois);
45 52
46 my $st = sql_exec \($id, $whois), 53 my $id = "$self->{name}\x0$query";
47 "select id, whois from whois 54 my $whois = $netgeo::whois{$id};
48 where nic = ? and query = ?",
49 $self->{name}, $query;
50 55
51 unless ($st->fetch) { 56 unless (defined $whois) {
57 print "WHOIS($self->{name},$query)\n";
58
52 my $guard = $self->{maxjobs}->guard; 59 my $guard = $self->{maxjobs}->guard;
53 my $timeout = 5; 60 my $timeout = 5;
54 61
55 while () { 62 while () {
56 my $fh = new Coro::Socket 63 my $fh = new Coro::Socket
76 last; 83 last;
77 } 84 }
78 } 85 }
79 } 86 }
80 87
81 sql_exec "replace into whois values (NULL,?,?,NULL,?,?)", 88 $netgeo::whois{$id} = $whois;
82 $self->{name}, $query, $whois, time;
83
84 my $st = sql_exec \$id,
85 "select id from whois
86 where nic = ? and query = ?",
87 $self->{name}, $query;
88 $st->fetch or die;
89 } 89 }
90 90
91 $whois; 91 $whois;
92} 92}
93 93
94package Whois::ARIN; 94package Whois::ARIN;
95 95
96use Date::Parse; 96use Date::Parse;
97use PApp::SQL;
98 97
99use base Whois; 98use base Whois;
100 99
101sub sanitize { 100sub sanitize {
102 local $_ = $_[1]; 101 local $_ = $_[1];
165 $whois; 164 $whois;
166} 165}
167 166
168package Whois::RIPE; 167package Whois::RIPE;
169 168
170use PApp::SQL;
171
172use base Whois; 169use base Whois;
173 170
174sub sanitize { 171sub sanitize {
175 local $_ = $_[1]; 172 local $_ = $_[1];
176 s/^%.*\n//gm; 173 s/^%.*\n//gm;
202 $whois =~ s/\n+$//; 199 $whois =~ s/\n+$//;
203 200
204 $whois; 201 $whois;
205} 202}
206 203
207package main; 204package netgeo;
205
206use BerkeleyDB;
207use Socket;
208 208
209sub ip2int($) { 209sub ip2int($) {
210 unpack "N", inet_aton $_[0]; 210 unpack "N", inet_aton $_[0];
211} 211}
212 212
220$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; 220$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20;
221$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; 221$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20;
222 222
223sub ip_request { 223sub ip_request {
224 my $ip = $_[0]; 224 my $ip = $_[0];
225 my $_ip = ip2int($ip);
226 225
227 my $st = sql_exec \my($whois, $ip0), 226 my $c = $iprange->db_cursor;
228 "select data, ip0 from iprange 227 my $v;
229 where ? <= ip1
230 having ip0 <= ?
231 order by ip1
232 limit 1",
233 $_ip, $_ip;
234 228
235 unless ($st->fetch) { 229 if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) {
236 my ($arin, $ripe, $apnic); 230 my ($ip0, $ip1, $whois) = split /\x0/, $v;
237
238 $whois = $WHOIS{APNIC}->ip_request($ip)
239 || $WHOIS{RIPE} ->ip_request($ip)
240 || $WHOIS{ARIN} ->ip_request($ip);
241
242 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
243 or do { warn "$whois($ip): no addresses found\n", last };
244
245 my ($ip0, $ip1) = ($1, $2);
246
247 my $_ip0 = ip2int($ip0); 231 my $_ip = ip2int $ip;
248 my $_ip1 = ip2int($ip1); 232 print "looked for $_ip, found $ip0, $ip1 ", length($v),"\n";
249 233 if ($ip0 <= $_ip && $_ip <= $ip1) {
250 if ($_ip0 + 256 < $_ip1) { 234 return $whois;
251 $_ip = $_ip & 0xffffff00;
252 $_ip0 = $_ip if $_ip0 < $_ip;
253 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255;
254 } 235 }
236 }
255 237
256 sql_exec "replace into iprange values (?, ?, NULL, ?)", 238 print "looked for $ip, ONLY found $v->[0], $v->[1]\n";
257 $_ip0, $_ip1, $whois;
258
259 #print "$ip ($ip0, $ip1 ($_ip0, $_ip1)\n$whois\n";
260 } 239
240 my ($arin, $ripe, $apnic);
261 241
262 $whois; 242 $whois = $WHOIS{APNIC}->ip_request($ip)
263} 243 || $WHOIS{RIPE} ->ip_request($ip)
244 || $WHOIS{ARIN} ->ip_request($ip);
264 245
246 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
247 or do { warn "$whois($ip): no addresses found\n", last };
265 248
249 my ($ip0, $ip1) = ($1, $2);
266 250
251 my $_ip = ip2int($ip);
252 my $_ip0 = ip2int($ip0);
253 my $_ip1 = ip2int($ip1);
254
255 if ($_ip0 + 256 < $_ip1) {
256 $_ip = $_ip & 0xffffff00;
257 $_ip0 = $_ip if $_ip0 < $_ip;
258 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255;
259 }
260
261 print "setting entry ($_ip0, $_ip, $_ip1)\n";
262 $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois));
263 (tied %whois)->db_sync;
264 $iprange->db_sync;
265
266 $whois;
267}
268
269
270

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines