diff --git a/bin/netdisco-rancid-export b/bin/netdisco-rancid-export index 3eef962a..ef907f83 100755 --- a/bin/netdisco-rancid-export +++ b/bin/netdisco-rancid-export @@ -46,7 +46,7 @@ use App::Netdisco::Util::Permission ':all'; exit(0) unless setting('use_legacy_rancidexport'); my $settings = setting( 'rancid' ); -my $domain_suffix = setting( 'domain_suffix' ) || ''; +my $domain_suffix = setting( 'domain_suffix' ); my $delimiter = $settings->{ 'delimiter' } || ':'; my $down_age = $settings->{ 'down_age' } || '1 day'; my $rancidhome = $settings->{ 'rancid_home' } || '/var/lib/rancid'; @@ -110,7 +110,7 @@ foreach my $group (keys %$list) { $name = ($dev->dns || $dev->name); } if ($by_hostname->{$group}) { - $name =~ s/$domain_suffix$//; + $name =~ s/$domain_suffix//; } printf ROUTER "%s$delimiter%s$delimiter%s\n", $name, $vendor, $dev->get_column( 'old' ) ? "down" : "up"; diff --git a/lib/App/Netdisco/Configuration.pm b/lib/App/Netdisco/Configuration.pm index db626698..064e43c4 100644 --- a/lib/App/Netdisco/Configuration.pm +++ b/lib/App/Netdisco/Configuration.pm @@ -135,6 +135,21 @@ if ($ENV{NETDISCO_DOMAIN}) { } } +# convert domain_suffix from scalar or list to regexp + +config->{'domain_suffix'} = [setting('domain_suffix')] + if ref [] ne ref setting('domain_suffix'); + +if (scalar @{ setting('domain_suffix') }) { + my @suffixes = map { (ref qr// eq ref $_) ? $_ : quotemeta } + @{ setting('domain_suffix') }; + my $buildref = '(?:'. (join '|', @suffixes) .')$'; + config->{'domain_suffix'} = qr/$buildref/; +} +else { + config->{'domain_suffix'} = qr//; +} + # support unordered dictionary as if it were a single item list if (ref {} eq ref setting('device_identity')) { config->{'device_identity'} = [ setting('device_identity') ]; diff --git a/lib/App/Netdisco/DB/Result/Virtual/DeviceDnsMismatch.pm b/lib/App/Netdisco/DB/Result/Virtual/DeviceDnsMismatch.pm index bde7b768..ffd62dcb 100644 --- a/lib/App/Netdisco/DB/Result/Virtual/DeviceDnsMismatch.pm +++ b/lib/App/Netdisco/DB/Result/Virtual/DeviceDnsMismatch.pm @@ -17,8 +17,8 @@ SELECT * FROM device WHERE dns IS NULL OR name IS NULL - OR regexp_replace(lower(dns), ? || '$', '') - != regexp_replace(lower(name), ? || '$', '') + OR regexp_replace(lower(dns), ?, '') + != regexp_replace(lower(name), ?, '') ENDSQL 1; diff --git a/lib/App/Netdisco/DB/ResultSet/NodeIp.pm b/lib/App/Netdisco/DB/ResultSet/NodeIp.pm index e639d57b..52c8d232 100644 --- a/lib/App/Netdisco/DB/ResultSet/NodeIp.pm +++ b/lib/App/Netdisco/DB/ResultSet/NodeIp.pm @@ -97,9 +97,13 @@ sub search_by_ip { ->search($cond, $attrs); } -=head1 search_by_name( \%cond, \%attrs? ) +=head1 search_by_dns( \%cond, \%attrs? ) - my $set = $rs->search_by_name({dns => 'foo.example.com', active => 1}); + my $set = $rs->search_by_dns({ + dns => 'foo.example.com', + suffix => qr/(?:\.example\..com|\.local)$/, + active => 1 + }); Like C, this returns a ResultSet of matching rows from the NodeIp table. @@ -118,6 +122,11 @@ to search for. The value may optionally include SQL wildcard characters. =item * +The C parameter may optionally have a C parameter which is a +regular expression of domain names - one of which must match the results. + +=item * + Results are ordered by time last seen. =item * @@ -141,7 +150,13 @@ sub search_by_dns { die "dns field required for search_by_dns\n" if ref {} ne ref $cond or !exists $cond->{dns}; - $cond->{dns} = { '-ilike' => delete $cond->{dns} }; + (my $suffix = (delete $cond->{suffix} || '')) + =~ s|\Q(?^\Eu?|(?|g; + + $cond->{dns} = [ -and => + { '-ilike' => delete $cond->{dns} }, + { '~*' => "***:$suffix" }, + ]; return $rs ->search_rs({}, $search_attr) diff --git a/lib/App/Netdisco/Util/Graph.pm b/lib/App/Netdisco/Util/Graph.pm index f8e8124a..7c06cd8b 100644 --- a/lib/App/Netdisco/Util/Graph.pm +++ b/lib/App/Netdisco/Util/Graph.pm @@ -298,8 +298,8 @@ sub graph_addnode { $devloc = $GRAPH{$ip}->{location}; $label = "($ip)" unless defined $label; - my $domain_suffix = setting('domain_suffix') || ''; - $label =~ s/$domain_suffix$//; + my $domain_suffix = setting('domain_suffix'); + $label =~ s/$domain_suffix//; $node{label} = $label; # Dereferencing the scalar by name below diff --git a/lib/App/Netdisco/Util/NodeMonitor.pm b/lib/App/Netdisco/Util/NodeMonitor.pm index ac695f6c..84c26160 100644 --- a/lib/App/Netdisco/Util/NodeMonitor.pm +++ b/lib/App/Netdisco/Util/NodeMonitor.pm @@ -5,6 +5,7 @@ use App::Netdisco; use Dancer qw/:syntax :script/; use Dancer::Plugin::DBIC 'schema'; +use Net::Domain 'hostfqdn'; use App::Netdisco::Util::DNS qw/hostname_from_ip ipv4_from_hostname/; use base 'Exporter'; @@ -16,8 +17,7 @@ our %EXPORT_TAGS = (all => \@EXPORT_OK); sub _email { my ($to, $subject, $body) = @_; return unless $to; - my $domain = setting('domain_suffix') || 'localhost'; - $domain =~ s/^\.//; + $domain =~ (hostfqdn || 'fqdn-undefined'); my $SENDMAIL = '/usr/sbin/sendmail'; open (SENDMAIL, "| $SENDMAIL -t") or die "Can't open sendmail at $SENDMAIL.\n"; diff --git a/lib/App/Netdisco/Web/Plugin/Device/Neighbors.pm b/lib/App/Netdisco/Web/Plugin/Device/Neighbors.pm index 23ee0faf..31303052 100644 --- a/lib/App/Netdisco/Web/Plugin/Device/Neighbors.pm +++ b/lib/App/Netdisco/Web/Plugin/Device/Neighbors.pm @@ -121,9 +121,9 @@ sub make_node_infostring { sub make_link_infostring { my $link = shift or return ''; - my $domain = quotemeta( setting('domain_suffix') || '' ); - (my $left_name = lc($link->{left_dns} || $link->{left_name} || $link->{left_ip})) =~ s/$domain$//; - (my $right_name = lc($link->{right_dns} || $link->{right_name} || $link->{right_ip})) =~ s/$domain$//; + my $domains = setting('domain_suffix'); + (my $left_name = lc($link->{left_dns} || $link->{left_name} || $link->{left_ip})) =~ s/$domains//; + (my $right_name = lc($link->{right_dns} || $link->{right_name} || $link->{right_ip})) =~ s/$domains//; my @zipped = List::MoreUtils::zip6 @{$link->{left_port}}, @{$link->{left_descr}}, @@ -163,7 +163,7 @@ ajax '/ajax/data/device/netmap' => require_login sub { my %logvals = (); my %metadata = (); my %data = ( nodes => [], links => [] ); - my $domain = quotemeta( setting('domain_suffix') || '' ); + my $domains = setting('domain_suffix'); # LINKS @@ -236,7 +236,7 @@ ajax '/ajax/data/device/netmap' => require_login sub { keys %{ setting('host_group_displaynames') || {} }; ++$logvals{ $device->get_column('log') || 1 }; - (my $name = lc($device->dns || $device->name || $device->ip)) =~ s/$domain$//; + (my $name = lc($device->dns || $device->name || $device->ip)) =~ s/$domains//; my %color_lkp = ( speed => (($device->get_column('log') || 1) * 1000), diff --git a/lib/App/Netdisco/Web/Plugin/Report/DeviceDnsMismatch.pm b/lib/App/Netdisco/Web/Plugin/Report/DeviceDnsMismatch.pm index 8b4eb63a..a3d23fc9 100644 --- a/lib/App/Netdisco/Web/Plugin/Report/DeviceDnsMismatch.pm +++ b/lib/App/Netdisco/Web/Plugin/Report/DeviceDnsMismatch.pm @@ -16,7 +16,7 @@ register_report( get '/ajax/content/report/devicednsmismatch' => require_login sub { - my $suffix = setting('domain_suffix') || ''; + my $suffix = setting('domain_suffix'); my @results = schema('netdisco')->resultset('Virtual::DeviceDnsMismatch') diff --git a/lib/App/Netdisco/Web/Plugin/Search/Node.pm b/lib/App/Netdisco/Web/Plugin/Search/Node.pm index 965b511e..0df12490 100644 --- a/lib/App/Netdisco/Web/Plugin/Search/Node.pm +++ b/lib/App/Netdisco/Web/Plugin/Search/Node.pm @@ -171,11 +171,14 @@ ajax '/ajax/content/search/node' => require_login sub { ->search_by_ip({ip => $ip, @active, @times}); } else { - $likeval .= setting('domain_suffix') - if index($node, setting('domain_suffix')) == -1; - $set = schema('netdisco')->resultset('NodeIp') - ->search_by_dns({dns => $likeval, @active, @times}); + ->search_by_dns({ + ($using_wildcards ? (dns => $likeval) : + (dns => "${likeval}.\%", + suffix => setting('domain_suffix'))), + @active, + @times, + }); # if the user selects Vendor search opt, then # we'll try the OUI company name as a fallback diff --git a/lib/App/Netdisco/Worker/Plugin/MakeRancidConf.pm b/lib/App/Netdisco/Worker/Plugin/MakeRancidConf.pm index a43ac553..4a4df71d 100644 --- a/lib/App/Netdisco/Worker/Plugin/MakeRancidConf.pm +++ b/lib/App/Netdisco/Worker/Plugin/MakeRancidConf.pm @@ -18,7 +18,7 @@ register_worker({ phase => 'main' }, sub { my ($job, $workerconf) = @_; my $config = setting('rancid') || {}; - my $domain_suffix = setting('domain_suffix') || ''; + my $domain_suffix = setting('domain_suffix'); my $delimiter = $config->{delimiter} || ';'; my $down_age = $config->{down_age} || '1 day'; my $default_group = $config->{default_group} || 'default'; @@ -65,7 +65,7 @@ register_worker({ phase => 'main' }, sub { } my $name = check_acl_no($d, $config->{by_ip}) ? $d->ip : ($d->dns || $d->name); - $name =~ s/$domain_suffix$// if check_acl_no($d, $config->{by_hostname}); + $name =~ s/$domain_suffix// if check_acl_no($d, $config->{by_hostname}); my ($group) = (pairkeys pairfirst { check_acl_no($d, $b) } %{ $config->{groups} }) || $default_group; diff --git a/share/config.yml b/share/config.yml index 48a1fc6c..136645ac 100644 --- a/share/config.yml +++ b/share/config.yml @@ -22,7 +22,7 @@ external_databases: [] # WEB FRONTEND # ------------ -domain_suffix: "" +domain_suffix: [] no_auth: false suggest_guest: false navbar_autocomplete: true diff --git a/share/environments/deployment.yml b/share/environments/deployment.yml index fcde8244..5a8c81f9 100644 --- a/share/environments/deployment.yml +++ b/share/environments/deployment.yml @@ -36,7 +36,7 @@ device_auth: # will be stripped from fqdn when displayed in the web UI # also, do not forget the leading dot. # ``````````````````````````````````````````````````````` -#domain_suffix: '.example.com' +#domain_suffix: ['.example.com'] # ¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸.·´¯`·.¸¸