From 2a77e13e100a4d8681409cb9ad3f3350703af7a0 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Thu, 17 Jul 2014 13:43:04 +0100 Subject: [PATCH] Use /etc/hosts for all forward/reverse DNS --- Netdisco/Changes | 1 + Netdisco/lib/App/Netdisco/Util/DNS.pm | 35 ++++++++++++++++++--------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Netdisco/Changes b/Netdisco/Changes index 0b9ffd65..87208d09 100644 --- a/Netdisco/Changes +++ b/Netdisco/Changes @@ -4,6 +4,7 @@ * Custom path handling for DataTables ajax calls * [#116] Log true client IP when running through a proxy + * Use /etc/hosts for all forward/reverse DNS 2.028004 - 2014-07-16 diff --git a/Netdisco/lib/App/Netdisco/Util/DNS.pm b/Netdisco/lib/App/Netdisco/Util/DNS.pm index 04f538c3..77b64ba9 100644 --- a/Netdisco/lib/App/Netdisco/Util/DNS.pm +++ b/Netdisco/lib/App/Netdisco/Util/DNS.pm @@ -8,6 +8,13 @@ use Net::DNS; use AnyEvent::DNS; use NetAddr::IP::Lite ':lower'; +use base 'Exporter'; +our @EXPORT = (); +our @EXPORT_OK = qw/ + hostname_from_ip hostnames_resolve_async ipv4_from_hostname +/; +our %EXPORT_TAGS = (all => \@EXPORT_OK); + # AE::DNS::EtcHosts only works for A/AAAA/SRV, but we want PTR. # this loads+parses /etc/hosts file using AE. dirty hack. use AnyEvent::Socket 'format_address'; @@ -15,12 +22,10 @@ use AnyEvent::DNS::EtcHosts; AnyEvent::DNS::EtcHosts::_load_hosts_unless(sub{},AE::cv); no AnyEvent::DNS::EtcHosts; # unimport -use base 'Exporter'; -our @EXPORT = (); -our @EXPORT_OK = qw/ - hostname_from_ip hostnames_resolve_async ipv4_from_hostname -/; -our %EXPORT_TAGS = (all => \@EXPORT_OK); +our %HOSTS = (); +$HOSTS{$_} = [ map { [ $_ ? (format_address $_->[0]) : '' ] } + @{$AnyEvent::DNS::EtcHosts::HOSTS{$_}} ] + for keys %AnyEvent::DNS::EtcHosts::HOSTS; =head1 NAME @@ -47,6 +52,13 @@ sub hostname_from_ip { my $ip = shift; return unless $ip; + # check /etc/hosts file and short-circuit if found + foreach my $name (reverse sort keys %HOSTS) { + if ($HOSTS{$name}->[0]->[0] eq $ip) { + return $name; + } + } + my $res = Net::DNS::Resolver->new; my $query = $res->search($ip); @@ -72,6 +84,12 @@ sub ipv4_from_hostname { my $name = shift; return unless $name; + # check /etc/hosts file and short-circuit if found + if (exists $HOSTS{$name}) { + my $ip = NetAddr::IP::Lite->new($HOSTS{$name}->[0]->[0]); + return $ip->addr if $ip and $ip->bits == 32; + } + my $res = Net::DNS::Resolver->new; my $query = $res->search($name); @@ -104,11 +122,6 @@ addresses which resolved. sub hostnames_resolve_async { my $ips = shift; - my %HOSTS = (); - $HOSTS{$_} = [ map { [ $_ ? (format_address $_->[0]) : '' ] } - @{$AnyEvent::DNS::EtcHosts::HOSTS{$_}} ] - for keys %AnyEvent::DNS::EtcHosts::HOSTS; - # Set up the condvar my $done = AE::cv; $done->begin( sub { shift->send } );