You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.6 KiB
Perl
90 lines
1.6 KiB
Perl
|
|
# infobot :: Kevin Lenzo (c) 1997
|
|
|
|
# once again, thanks to Patrick Cole
|
|
|
|
#use POSIX;
|
|
use Socket;
|
|
|
|
sub REAPER {
|
|
$SIG{CHLD} = \&REAPER; # loathe sysV
|
|
$waitedpid = wait;
|
|
}
|
|
|
|
$SIG{CHLD} = \&REAPER;
|
|
$DNS_CACHE_EXPIRE_TIME = 7*24*60*60;
|
|
|
|
sub DNS {
|
|
my $in = $_[0];
|
|
my($match, $x, $y, $result);
|
|
|
|
if (($DNS_CACHE{$in}) && ((time()-$DNS_TIME_CACHE{$in}) < $DNS_CACHE_EXPIRE_TIME)) {
|
|
return $DNS_CACHE{$in};
|
|
}
|
|
|
|
if (!defined($pid = fork)) {
|
|
return "no luck, $safeWho";
|
|
} elsif ($pid) {
|
|
# parent
|
|
} else {
|
|
# child
|
|
if ($in =~ /(\d+\.\d+\.\d+\.\d+)/) {
|
|
&status("DNS query by IP address: $in");
|
|
$match = $1;
|
|
$y = pack('C4', split(/\./, $match));
|
|
$x = (gethostbyaddr($y, &AF_INET));
|
|
if ($x !~ /^\s*$/) {
|
|
$result = $match." is ".$x unless ($x =~ /^\s*$/);
|
|
} else {
|
|
$result = "I can't seem to find that address in DNS";
|
|
}
|
|
} else {
|
|
&status("DNS query by name: $in");
|
|
$x = join('.',unpack('C4',(gethostbyname($in))[4]));
|
|
if ($x !~ /^\s*$/) {
|
|
$result = $in." is ".$x;
|
|
} else {
|
|
$result = "I can\'t find that machine name";
|
|
}
|
|
}
|
|
$DNS_TIME_CACHE{$in} = time();
|
|
$DNS_CACHE{$in} = $result;
|
|
|
|
if ($msgType eq 'public') {
|
|
&say($result);
|
|
} else {
|
|
&msg($who, $result);
|
|
}
|
|
exit; # bye child
|
|
}
|
|
}
|
|
|
|
1;
|
|
|
|
__END__
|
|
|
|
=head1 NAME
|
|
|
|
DNS.pl - Look up hosts in DNS
|
|
|
|
=head1 PREREQUISITES
|
|
|
|
None.
|
|
|
|
=head1 PARAMETERS
|
|
|
|
allowDNS
|
|
|
|
=head1 PUBLIC INTERFACE
|
|
|
|
nslookup|DNS [for] <host>
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
Looks up DNS entries for the given host using
|
|
C<gethostbyaddr>/C<gethostbyname> calls.
|
|
|
|
=head1 AUTHORS
|
|
|
|
Kevin Lenzo
|