Squashed commit of the following: commit3fe8f383a7Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 11 17:07:42 2019 +0000 add debug lines and tested commit3249739e42Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 11 16:54:11 2019 +0000 change config name to get_credentials commite78558397aAuthor: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 11 16:51:11 2019 +0000 separate out generic device auth to DeviceAuth module commit249f05165fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Wed Mar 6 18:43:31 2019 +0000 release 2.040007 commite3af64df77Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Mar 6 18:42:47 2019 +0000 #521-redux fix wifi date search commit48857ae300Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 4 12:03:31 2019 +0000 release 2.040006 commite09dab5362Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 4 11:39:12 2019 +0000 #527 update List::MoreUtils version requirement commit6e7de3fff3Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Mar 4 09:59:41 2019 +0000 release 2.040005 commit0c98318a45Author: Oliver Gorwits <oliver@spike.local> Date: Mon Mar 4 09:57:18 2019 +0000 #526 fix discover syntax bug commite9efc45182Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 14:56:48 2019 +0000 release 2.040004 commit6cdfd80d10Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 14:34:00 2019 +0000 allow undiscovered neighbors report to use discover_{waps,phones} setting commitac381e0802Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 14:13:20 2019 +0000 #506 was a red herring commitb83e614c85Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 13:00:36 2019 +0000 make discover_{phones,waps} work with LLDP capabilities as well commit189d234b55Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:47:38 2019 +0000 check discover_no_type and friends earlier on in neighbors list build commit9c956466f3Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:32:07 2019 +0000 also update default config for new discover_phones and discover_waps settings commit09d29954d2Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:26:50 2019 +0000 #512 fix regression in phone/wap discovery exclusion commit2bae91f1b6Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 12:01:34 2019 +0000 rename match_devicetype() to match_to_setting() commit57cb6ddb70Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Mar 3 09:19:39 2019 +0000 fix for over-eager fix to #506 commitef560fb59aAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 22:41:40 2019 +0000 #506 relax device renumber so it works for an alias commit7a8bcb094eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 22:23:39 2019 +0000 #521 Search Node Date Range not working commita643820a62Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 21:54:27 2019 +0000 #428 Port-Channels not showing in netmap commit5ba5bcd295Merge:e7aacddba1f95028Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 20:04:11 2019 +0000 Merge branch 'master' of github.com:netdisco/netdisco commite7aacddbc6Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 20:01:05 2019 +0000 #498 Map with VLAN filter omits unconnected devices commita1f95028caAuthor: nick n <39005454+inphobia@users.noreply.github.com> Date: Sat Mar 2 19:54:22 2019 +0100 catch up with changes noticed that rc-sshcollector-core received updates to changes, add them here as well. didn't mention #499 & #522 commitce1b847ceaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 18:47:44 2019 +0000 fix bug showing no nodes when only one matches in netmap commit78e30a7926Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 16:28:15 2019 +0000 #500 filtering in device/ports on native vlan duplicates entries commit9952f0c6c7Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 15:02:12 2019 +0000 #499 netdisco-do renumber reports wrong ip (inphobia) commitca3fd8f466Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 15:00:18 2019 +0000 #505 device renumber should update device port properties and device skips commit1265bc8470Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 14:52:21 2019 +0000 #520 catch slave ports defined without a master commitd4c7579c10Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 14:47:49 2019 +0000 #522 TypeAhead.pm can reference empty data (inphobia) commit77decc23b7Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Mar 2 14:45:37 2019 +0000 #514 inconsistent results in ip inventory (inphobia) commit3f211650b8Author: nick n <39005454+inphobia@users.noreply.github.com> Date: Fri Mar 1 12:34:42 2019 +0100 last pieces for db schema upgrade last piece of #510
		
			
				
	
	
		
			199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
package App::Netdisco::Web::Plugin::Search::Node;
 | 
						|
 | 
						|
use Dancer ':syntax';
 | 
						|
use Dancer::Plugin::Ajax;
 | 
						|
use Dancer::Plugin::DBIC;
 | 
						|
use Dancer::Plugin::Auth::Extensible;
 | 
						|
 | 
						|
use NetAddr::IP::Lite ':lower';
 | 
						|
use NetAddr::MAC ();
 | 
						|
 | 
						|
use App::Netdisco::Web::Plugin;
 | 
						|
use App::Netdisco::Util::Web 'sql_match';
 | 
						|
 | 
						|
register_search_tab({ tag => 'node', label => 'Node' });
 | 
						|
 | 
						|
# nodes matching the param as an IP or DNS hostname or MAC
 | 
						|
ajax '/ajax/content/search/node' => require_login sub {
 | 
						|
    my $node = param('q');
 | 
						|
    send_error('Missing node', 400) unless $node;
 | 
						|
    content_type('text/html');
 | 
						|
 | 
						|
    my $agenot = param('age_invert') || '0';
 | 
						|
    my ( $start, $end ) = param('daterange') =~ m/(\d+-\d+-\d+)/gmx;
 | 
						|
 | 
						|
    my $mac = NetAddr::MAC->new(mac => $node);
 | 
						|
    undef $mac if ($mac and $mac->as_ieee and ($mac->as_ieee eq '00:00:00:00'));
 | 
						|
    my @active = (param('archived') ? () : (-bool => 'active'));
 | 
						|
 | 
						|
    my (@times, @wifitimes, @porttimes);
 | 
						|
    if ( $start and $end ) {
 | 
						|
        $start = $start . ' 00:00:00';
 | 
						|
        $end   = $end   . ' 23:59:59';
 | 
						|
 | 
						|
        if ($agenot) {
 | 
						|
            @times = (-or => [
 | 
						|
              time_first => [ undef ],
 | 
						|
              time_last => [ { '<', $start }, { '>', $end } ]
 | 
						|
            ]);
 | 
						|
            @wifitimes = (-or => [
 | 
						|
              time_last => [ undef ],
 | 
						|
              time_last => [ { '<', $start }, { '>', $end } ],
 | 
						|
            ]);
 | 
						|
            @porttimes = (-or => [
 | 
						|
              creation => [ undef ],
 | 
						|
              creation => [ { '<', $start }, { '>', $end } ]
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            @times = (-or => [
 | 
						|
              -and => [
 | 
						|
                  time_first => undef,
 | 
						|
                  time_last  => undef,
 | 
						|
              ],
 | 
						|
              -and => [
 | 
						|
                  time_last => { '>=', $start },
 | 
						|
                  time_last => { '<=', $end },
 | 
						|
              ],
 | 
						|
            ]);
 | 
						|
            @wifitimes = (-or => [
 | 
						|
              time_last  => undef,
 | 
						|
              -and => [
 | 
						|
                  time_last => { '>=', $start },
 | 
						|
                  time_last => { '<=', $end },
 | 
						|
              ],
 | 
						|
            ]);
 | 
						|
            @porttimes = (-or => [
 | 
						|
              creation => undef,
 | 
						|
              -and => [
 | 
						|
                  creation => { '>=', $start },
 | 
						|
                  creation => { '<=', $end },
 | 
						|
              ],
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    my ($likeval, $likeclause) = sql_match($node, not param('partial'));
 | 
						|
    my $using_wildcards = (($likeval ne $node) ? 1 : 0);
 | 
						|
 | 
						|
    my @where_mac =
 | 
						|
      ($using_wildcards ? \['me.mac::text ILIKE ?', $likeval]
 | 
						|
                        : ((!defined $mac or $mac->errstr) ? \'0=1' : ('me.mac' => $mac->as_ieee)) );
 | 
						|
 | 
						|
    my $sightings = schema('netdisco')->resultset('Node')
 | 
						|
      ->search({-and => [@where_mac, @active, @times]}, {
 | 
						|
          order_by => {'-desc' => 'time_last'},
 | 
						|
          '+columns' => [
 | 
						|
            'device.dns',
 | 
						|
            { time_first_stamp => \"to_char(time_first, 'YYYY-MM-DD HH24:MI')" },
 | 
						|
            { time_last_stamp =>  \"to_char(time_last, 'YYYY-MM-DD HH24:MI')" },
 | 
						|
          ],
 | 
						|
          join => 'device',
 | 
						|
      });
 | 
						|
 | 
						|
    my $ips = schema('netdisco')->resultset('NodeIp')
 | 
						|
      ->search({-and => [@where_mac, @active, @times]}, {
 | 
						|
          order_by => {'-desc' => 'time_last'},
 | 
						|
          '+columns' => [
 | 
						|
            'oui.company',
 | 
						|
            'oui.abbrev',
 | 
						|
            { time_first_stamp => \"to_char(time_first, 'YYYY-MM-DD HH24:MI')" },
 | 
						|
            { time_last_stamp =>  \"to_char(time_last, 'YYYY-MM-DD HH24:MI')" },
 | 
						|
          ],
 | 
						|
          join => 'oui'
 | 
						|
      });
 | 
						|
 | 
						|
    my $netbios = schema('netdisco')->resultset('NodeNbt')
 | 
						|
      ->search({-and => [@where_mac, @active, @times]}, {
 | 
						|
          order_by => {'-desc' => 'time_last'},
 | 
						|
          '+columns' => [
 | 
						|
            'oui.company',
 | 
						|
            'oui.abbrev',
 | 
						|
            { time_first_stamp => \"to_char(time_first, 'YYYY-MM-DD HH24:MI')" },
 | 
						|
            { time_last_stamp =>  \"to_char(time_last, 'YYYY-MM-DD HH24:MI')" },
 | 
						|
          ],
 | 
						|
          join => 'oui'
 | 
						|
      });
 | 
						|
 | 
						|
    my $wireless = schema('netdisco')->resultset('NodeWireless')->search(
 | 
						|
        { -and => [@where_mac, @wifitimes] },
 | 
						|
        { order_by   => { '-desc' => 'time_last' },
 | 
						|
          '+columns' => [
 | 
						|
            'oui.company',
 | 
						|
            'oui.abbrev',
 | 
						|
            {
 | 
						|
              time_last_stamp => \"to_char(time_last, 'YYYY-MM-DD HH24:MI')"
 | 
						|
            }],
 | 
						|
          join => 'oui'
 | 
						|
        }
 | 
						|
    );
 | 
						|
 | 
						|
    my $rs_dp = schema('netdisco')->resultset('DevicePort');
 | 
						|
    if ($sightings->has_rows or $ips->has_rows or $netbios->has_rows) {
 | 
						|
        my $ports = param('deviceports')
 | 
						|
          ? $rs_dp->search({ -and => [@where_mac] }) : undef;
 | 
						|
 | 
						|
        return template 'ajax/search/node_by_mac.tt', {
 | 
						|
          ips       => $ips,
 | 
						|
          sightings => $sightings,
 | 
						|
          ports     => $ports,
 | 
						|
          wireless  => $wireless,
 | 
						|
          netbios   => $netbios,
 | 
						|
        }, { layout => undef };
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        my $ports = param('deviceports')
 | 
						|
          ? $rs_dp->search({ -and => [@where_mac, @porttimes] }) : undef;
 | 
						|
 | 
						|
        if (defined $ports and $ports->has_rows) {
 | 
						|
            return template 'ajax/search/node_by_mac.tt', {
 | 
						|
              ips       => $ips,
 | 
						|
              sightings => $sightings,
 | 
						|
              ports     => $ports,
 | 
						|
              wireless  => $wireless,
 | 
						|
              netbios   => $netbios,
 | 
						|
            }, { layout => undef };
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    my $set = schema('netdisco')->resultset('NodeNbt')
 | 
						|
        ->search_by_name({nbname => $likeval, @active, @times});
 | 
						|
 | 
						|
    unless ( $set->has_rows ) {
 | 
						|
        if (my $ip = NetAddr::IP::Lite->new($node)) {
 | 
						|
            # search_by_ip() will extract cidr notation if necessary
 | 
						|
            $set = schema('netdisco')->resultset('NodeIp')
 | 
						|
              ->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});
 | 
						|
 | 
						|
            # if the user selects Vendor search opt, then
 | 
						|
            # we'll try the OUI company name as a fallback
 | 
						|
 | 
						|
            if (param('show_vendor') and not $set->has_rows) {
 | 
						|
                $set = schema('netdisco')->resultset('NodeIp')
 | 
						|
                  ->with_times
 | 
						|
                  ->search(
 | 
						|
                    {'oui.company' => { -ilike => ''.sql_match($node)}, @times},
 | 
						|
                    {'prefetch' => 'oui'},
 | 
						|
                  );
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return unless $set and $set->has_rows;
 | 
						|
    $set = $set->search_rs({}, { order_by => 'me.mac' });
 | 
						|
 | 
						|
    template 'ajax/search/node_by_ip.tt', {
 | 
						|
      macs => $set,
 | 
						|
      archive_filter => {@active},
 | 
						|
    }, { layout => undef };
 | 
						|
};
 | 
						|
 | 
						|
true;
 |