#!/usr/bin/perl # # (C) Erik Heinz # Version 2004-05-04 # Niels Dettenbach use CGI; use DB_File; use Encode; require whois; $LOG_FILE = "/var/log/whois-cgi.log"; $CLIENT_DB = '/var/lib/whois/clients.db'; ########## Subroutinen sub print_head { print $query->start_html( -title=>'Skyway.net extended WHOIS', -style=>{'src'=>'http://sky3.skyway.net/whois/style.css'}, ); open HTML, "whois.pre"; print while (); close HTML; } sub print_foot { open HTML, "whois.post"; print while (); close HTML; print $query->end_html; } sub print_form { print $query->header; print_head(); print "

Skyway.net extended WHOIS

", "", "This extended Whois service simplifies the lookup of ", "", "plus other data from the different WHOIS databases.
", "
"; print $query->startform, "Search for
", $query->textfield('search', '', 32, 128), "  ", $query->submit(-name=>'submit', -value=>'search'); if ($charset) { print $query->hidden('charset', $charset); } print $query->endform; print "\n", "", "
", "\"Skyway.net\"
", "[ Skyway.net Home ]
"; print_foot(); } sub do_job { $ENV{'HOME'} = '/var/www/localhost/htdocs/whois'; if ($search =~ /@([^@>]+)/) { $search = $1; } elsif ($search =~ m|http://([^/]+)|) { $search = $1; } if ($search =~ /^www\.(.+\..+)$/) { my $dom = $1; my $ns = `host -t NS $search`; if ($ns !~ / name server /) { $search = $dom; } } ($result, $host) = whois::whois($search, $host, 86400, 0); $result =~ s/&/&/g; $result =~ s/url; $result =~ s|\(([A-Z][A-Z\d-]{4,})\)|($1)|mg || $result =~ s/([A-Z0-9-]+-(?:ARIN|FRNIC|NICAT|NORID|RIPE|RIPN|SA|UANIC|VRIO))/$1<\/A>/mg; } sub print_result { if ($deny) { print $query->header; print_head(); print "", "Query limit exhausted. Access is temporarily disabled.", "\n"; } else { if ($result =~ /[\240-\377]/) { if (whois::check_utf8($result)) { if ($charset) { Encode::from_to($result, 'utf-8', $charset); } else { $query->charset('utf-8'); if (! whois::check_utf8($search)) { Encode::from_to($search, 'iso-8859-1', 'utf-8'); } } } } print $query->header; print_head(); print "

Skyway.net extended WHOIS

", "Search for: $search
", "Address: $host

", "Results:

$result
", "\n"; print "\n", "", "
", "\"Skyway.net\"
", "[ Skyway.net Home ]
"; } print_foot(); } sub write_log { local $date = `date +"%b %d %X"`; chomp $date; open (LOG, ">>$LOG_FILE"); if ($deny) { print LOG "$date Query from $remote DENIED\n"; } else { print LOG "$date Query from $remote for \"$search\"\n"; } close LOG; } sub check_client { $rhost = $ENV{'REMOTE_HOST'}; $raddr = $ENV{'REMOTE_ADDR'}; if ($rhost) { $remote = "$rhost ($raddr)"; } else { $remote = "$raddr"; } if (exists $CLI{$raddr}) { if ((time() - $CLI{"LAST:$raddr"}) > 1800) { $CLI{$raddr} = 0; } } $CLI{$raddr} ++; $CLI{"LAST:$raddr"} = time(); if ($CLI{$raddr} > 20) { $deny = 1; } } ########## Hauptprogramm tie (%CLI, DB_File, $CLIENT_DB, O_RDWR|O_CREAT, 0755, $DB_HASH) || die "$CLIENT_DB: $!\n"; $query = new CGI(); $query->autoEscape(undef); $search = $query->param('search'); $host = $query->param('host'); $charset = $query->param('charset'); if ($charset) { $query->charset($charset); } else { $query->charset('iso-8859-1'); } if (!$search) { print_form(); exit; } check_client(); write_log(); do_job() unless ($deny); print_result(); untie %CLI; ########## Ende