#!/usr/bin/perl -wT # ckdns.perl # confirm dynamic DNS update # ToDo: # reverse lookup (just for kicks) # CGI form for non-default lookup use Net::DNS; use Time::localtime; use strict; use vars qw( $default $name $time $pid @ppp $pppip @mx $line $nameserver @ARGV $nameresolution $res $query $rr $queryNS $resNS $resMX ); my $default = 'myddnshost.dom'; my $ns1 = 'dns.some.dom'; my $ns2 = 'dns.someother.dom'; my $ns3 = 'dns.yetanother.dom'; my $ns4 = 'dns.andanother.dom'; # using nameservers' address instead of name # might be a bit better, but hostname # provides more informative output. select ((select(STDOUT), $|=1) [0]); # hot STDOUT fixes sequence problem - TPJ #11 $ENV { 'PATH' } = ''; # unTaint backticks by clearing path ## REPORT HEADER ## my $tm = localtime; printf "\n%02d-%02d-%04d ", $tm->mon+1, $tm->mday, $tm->year+1900; printf "%02d:%02d:%02d\n", $tm->hour, $tm->min, $tm->sec; print "$^X $] ", "\Net::DNS ", Net::DNS->version, "\n"; ## PPP0 ADDRESS ## my $pid = `/bin/cat /var/run/ppp0.pid` or die "ppp0 down, abort"; # abort script if ppp0 down @ppp = `/sbin/ifconfig ppp0`; foreach $line (@ppp) { if($line =~ /inet addr/) { $line =~ s/\s+inet addr:(\S+)\s+.*/$1/; $pppip = $line; } } print "\n\nlocal ppp0\n"; print "================\n"; print "$pppip\n"; # print "$name : ", "$pppip\n"; ## FORWARD LOOKUPS ## @ARGV = ("$default" ) unless @ARGV; my $name = "@ARGV"; print "\n$name forward lookup\n"; print "=============================\n"; my @nameservers=( $ns1, $ns2, $ns3, $ns4 ); my $nameserver; foreach $nameserver(@nameservers) { print "Nameserver : $nameserver\n"; my $res = new Net::DNS::Resolver; $res->nameservers($nameserver); my $query = $res->search("$name"); if ($query) { my $rr; foreach $rr ($query->answer) { next unless $rr->type eq "A"; print "$name : ", $rr->address, "\n\n"; } } else { print "query failed: ", $res->errorstring, "\n\n"; } } ## AUTHORITATIVE NAMESERVERS ## print "\n$name authoritative nameservers\n"; print "========================================\n"; my $resNS = new Net::DNS::Resolver; my $queryNS = $resNS->query("$name", "NS"); if ($queryNS) { foreach $rr ($queryNS->answer) { next unless $rr->type eq "NS"; printf "%s\n", $rr->nsdname; } } else { print "\Nameserver query failed: ", $resNS->errorstring, "\n"; } ## MX RECORDS ## print "\n\n$name MX records\n"; print "==============================\n"; my $resMX = new Net::DNS::Resolver; @mx = mx($resMX, $name); if (@mx) { foreach $rr (@mx) { print $resMX->answerfrom," says : ", $rr->preference, " ", $rr->exchange, "\n"; } } else { print "MX record query failed: ", $resMX->errorstring, "\n"; } # END