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.1 by root, Sat Aug 11 00:37:32 2001 UTC vs.
Revision 1.7 by root, Sat Sep 15 13:58:27 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;
11use Coro::SemaphoreSet;
13use Coro::Socket; 12use Coro::Socket;
13
14use BerkeleyDB;
14 15
15$Event::DIED = sub { 16$Event::DIED = sub {
16 Event::verbose_exception_handler(@_); 17 Event::verbose_exception_handler(@_);
17 #Event::unloop_all(); 18 #Event::unloop_all();
18}; 19};
19 20
20$PApp::SQL::DBH = PApp::SQL::connect_cached __FILE__, "DBI:mysql:netgeo" or die; 21tie %netgeo::whois, BerkeleyDB::Btree,
22 -Env => $db_env,
23 -Filename => "whois",
24 -Flags => DB_CREATE,
25 or die "unable to create/open whois table";
26$netgeo::iprange = new BerkeleyDB::Btree
27 -Env => $db_env,
28 -Filename => "iprange",
29 -Flags => DB_CREATE,
30 or die "unable to create/open iprange table";
21 31
22package Whois; 32package Whois;
23 33
24use PApp::SQL;
25use Coro::Event; 34use Coro::Event;
26 35
27sub new { 36sub new {
28 my $class = shift; 37 my $class = shift;
29 my $name = shift; 38 my $name = shift;
41 $_[1]; 50 $_[1];
42} 51}
43 52
44sub whois_request { 53sub whois_request {
45 my ($self, $query) = @_; 54 my ($self, $query) = @_;
46 my ($id, $whois);
47 55
48 my $st = sql_exec \($id, $whois), 56 my $id = "$self->{name}\x0$query";
49 "select id, whois from whois 57 my $whois = $netgeo::whois{$id};
50 where nic = ? and query = ?",
51 $self->{name}, $query;
52 58
53 Coro::cede; 59 unless (defined $whois) {
60 print "WHOIS($self->{name},$query)\n";
54 61
55 unless ($st->fetch) {
56 my $guard = $self->{maxjobs}->guard; 62 my $guard = $self->{maxjobs}->guard;
57 my $timeout = 5; 63 my $timeout = 5;
58 64
59 while () { 65 while () {
60 my $fh = new Coro::Socket 66 my $fh = new Coro::Socket
80 last; 86 last;
81 } 87 }
82 } 88 }
83 } 89 }
84 90
85 sql_exec "replace into whois values (NULL,?,?,NULL,?,?)", 91 $netgeo::whois{$id} = $whois;
86 $self->{name}, $query, $whois, time;
87
88 my $st = sql_exec \$id,
89 "select id from whois
90 where nic = ? and query = ?",
91 $self->{name}, $query;
92 $st->fetch or die;
93 } 92 }
94 93
95 $whois; 94 $whois;
96} 95}
97 96
98package Whois::ARIN; 97package Whois::ARIN;
99 98
100use Date::Parse; 99use Date::Parse;
101use PApp::SQL;
102 100
103use base Whois; 101use base Whois;
104 102
105sub sanitize { 103sub sanitize {
106 local $_ = $_[1]; 104 local $_ = $_[1];
169 $whois; 167 $whois;
170} 168}
171 169
172package Whois::RIPE; 170package Whois::RIPE;
173 171
174use PApp::SQL;
175
176use base Whois; 172use base Whois;
177 173
178sub sanitize { 174sub sanitize {
179 local $_ = $_[1]; 175 local $_ = $_[1];
180 s/^%.*\n//gm; 176 s/^%.*\n//gm;
206 $whois =~ s/\n+$//; 202 $whois =~ s/\n+$//;
207 203
208 $whois; 204 $whois;
209} 205}
210 206
211package main; 207package netgeo;
208
209use Socket;
212 210
213sub ip2int($) { 211sub ip2int($) {
214 unpack "N", inet_aton $_[0]; 212 unpack "N", inet_aton $_[0];
215} 213}
216 214
222 220
223$WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12; 221$WHOIS{ARIN} = new Whois::ARIN ARIN => "whois.arin.net", maxjobs => 12;
224$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20; 222$WHOIS{RIPE} = new Whois::RIPE RIPE => "whois.ripe.net", maxjobs => 20;
225$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20; 223$WHOIS{APNIC} = new Whois::RIPE APNIC => "whois.apnic.net", maxjobs => 20;
226 224
225$whoislock = new Coro::SemaphoreSet;
226
227sub ip_request { 227sub ip_request {
228 my $ip = $_[0]; 228 my $ip = $_[0];
229 my $_ip = ip2int($ip);
230 229
231 my $st = sql_exec \my($whois, $ip0), 230 my $guard = $whoislock->guard($ip);
232 "select data, ip0 from iprange
233 where ? <= ip1
234 having ip0 <= ?
235 order by ip1
236 limit 1",
237 $_ip, $_ip;
238 231
239 Coro::cede; 232 my $c = $iprange->db_cursor;
240 233 my $v;
241 unless ($st->fetch) {
242 my ($arin, $ripe, $apnic);
243 234
244 $whois = $WHOIS{APNIC}->ip_request($ip) 235 if (!$c->c_get((inet_aton $ip), $v, DB_SET_RANGE)) {
245 || $WHOIS{RIPE} ->ip_request($ip) 236 my ($ip0, $ip1, $whois) = split /\x0/, $v;
246 || $WHOIS{ARIN} ->ip_request($ip);
247
248 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
249 or warn "$whois($ip): no addresses found\n";
250 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
251 or return;
252
253 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
254 or die "$whois($ip): no addresses found\n";
255
256 my ($ip0, $ip1) = ($1, $2);
257
258 my $_ip0 = ip2int($ip0); 237 my $_ip = ip2int $ip;
259 my $_ip1 = ip2int($ip1); 238 if ($ip0 <= $_ip && $_ip <= $ip1) {
260 239 return $whois;
261 if ($_ip0 + 256 < $_ip1) {
262 $_ip = $_ip & 0xffffff00;
263 $_ip0 = $_ip if $_ip0 < $_ip;
264 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255;
265 } 240 }
266
267 sql_exec "replace into iprange values (?, ?, NULL, ?)",
268 $_ip0, $_ip1, $whois;
269
270 #print "$ip ($ip0, $ip1 ($_ip0, $_ip1)\n$whois\n";
271 } 241 }
272 242
273 $whois; 243 my ($arin, $ripe, $apnic);
274}
275 244
245 $whois = $WHOIS{APNIC}->ip_request($ip)
246 || $WHOIS{RIPE} ->ip_request($ip)
247 || $WHOIS{ARIN} ->ip_request($ip);
276 248
249 $whois =~ /^\*in: ([0-9.]+)\s+-\s+([0-9.]+)\s*$/mi
250 or do { warn "$whois($ip): no addresses found\n", last };
277 251
252 my ($ip0, $ip1) = ($1, $2);
253
254 my $_ip = ip2int($ip);
255 my $_ip0 = ip2int($ip0);
256 my $_ip1 = ip2int($ip1);
257
258 if ($_ip0 + 256 < $_ip1) {
259 $_ip = $_ip & 0xffffff00;
260 $_ip0 = $_ip if $_ip0 < $_ip;
261 $_ip1 = $_ip + 255 if $_ip1 > $_ip + 255;
262 }
263
264 $iprange->db_put((pack "N", $_ip1), (join "\x0", $_ip0, $_ip1, $whois));
265 (tied %whois)->db_sync;
266 $iprange->db_sync;
267
268 $whois;
269}
270
271
272

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines