From 33ff11fa718cba3ae931e13caf8e41617f46eb59 Mon Sep 17 00:00:00 2001 From: Oliver Gorwits Date: Sat, 11 Feb 2012 16:38:19 +0000 Subject: [PATCH] add rest of POD and fixes for Device helper renaming --- Netdisco/lib/Netdisco/DB/Result/Device.pm | 88 +++++ Netdisco/lib/Netdisco/DB/Result/DeviceIp.pm | 16 + .../lib/Netdisco/DB/Result/DevicePortVlan.pm | 24 ++ Netdisco/lib/Netdisco/DB/Result/DeviceVlan.pm | 37 ++ Netdisco/lib/Netdisco/DB/ResultSet/Device.pm | 350 ++++++++++++++---- .../lib/Netdisco/DB/ResultSet/DevicePort.pm | 10 +- Netdisco/lib/Netdisco/DB/ResultSet/Node.pm | 2 +- Netdisco/lib/Netdisco/DB/ResultSet/NodeIp.pm | 10 +- Netdisco/lib/Netdisco/Web/Device.pm | 14 +- Netdisco/lib/Netdisco/Web/Search.pm | 19 +- 10 files changed, 467 insertions(+), 103 deletions(-) diff --git a/Netdisco/lib/Netdisco/DB/Result/Device.pm b/Netdisco/lib/Netdisco/DB/Result/Device.pm index 5c3221c3..19185daa 100644 --- a/Netdisco/lib/Netdisco/DB/Result/Device.pm +++ b/Netdisco/lib/Netdisco/DB/Result/Device.pm @@ -82,9 +82,44 @@ __PACKAGE__->set_primary_key("ip"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:671/XuuvsO2aMB1+IRWFjg +=head1 RELATIONSHIPS + +=head2 device_ips + +Returns rows from the C table which relate to this Device. That is, +all the interface IP aliases configured on the Device. + +=cut + __PACKAGE__->has_many( device_ips => 'Netdisco::DB::Result::DeviceIp', 'ip' ); + +=head2 vlans + +Returns the C entries for this Device. That is, the list of VLANs +configured on or known by this Device. + +=cut + __PACKAGE__->has_many( vlans => 'Netdisco::DB::Result::DeviceVlan', 'ip' ); + +=head2 ports + +Returns the set of ports on this Device. + +=cut + __PACKAGE__->has_many( ports => 'Netdisco::DB::Result::DevicePort', 'ip' ); + +=head2 port_vlans + +Returns the set of VLANs known to be configured on Ports on this Device, +either tagged or untagged. + +The JOIN is of type "RIGHT" meaning that the results are constrained to VLANs +only on Ports on this Device. + +=cut + __PACKAGE__->has_many( port_vlans => 'Netdisco::DB::Result::DevicePortVlan', 'ip', { join_type => 'RIGHT' } @@ -93,4 +128,57 @@ __PACKAGE__->has_many( # helper which assumes we've just RIGHT JOINed to Vlans table sub vlan { return (shift)->vlans->first } +=head1 ADDITIONAL COLUMNS + +=head2 uptime_age + +Formatted version of the C field. + +The format is in "X days/months/years" style, similar to: + + 1 year 4 months 05:46:00 + +=cut + +sub uptime_age { return (shift)->get_column('uptime_age') } + +=head2 last_discover_stamp + +Formatted version of the C field, accurate to the minute. + +The format is somewhat like ISO 8601 or RFC3339 but without the middle C +between the date stamp and time stamp. That is: + + 2012-02-06 12:49 + +=cut + +sub last_discover_stamp { return (shift)->get_column('last_discover_stamp') } + +=head2 last_macsuck_stamp + +Formatted version of the C field, accurate to the minute. + +The format is somewhat like ISO 8601 or RFC3339 but without the middle C +between the date stamp and time stamp. That is: + + 2012-02-06 12:49 + +=cut + +sub last_macsuck_stamp { return (shift)->get_column('last_macsuck_stamp') } + +=head2 last_arpnip_stamp + +Formatted version of the C field, accurate to the minute. + +The format is somewhat like ISO 8601 or RFC3339 but without the middle C +between the date stamp and time stamp. That is: + + 2012-02-06 12:49 + +=cut + +sub last_arpnip_stamp { return (shift)->get_column('last_arpnip_stamp') } + 1; diff --git a/Netdisco/lib/Netdisco/DB/Result/DeviceIp.pm b/Netdisco/lib/Netdisco/DB/Result/DeviceIp.pm index ae1de223..df80f67a 100644 --- a/Netdisco/lib/Netdisco/DB/Result/DeviceIp.pm +++ b/Netdisco/lib/Netdisco/DB/Result/DeviceIp.pm @@ -34,7 +34,23 @@ __PACKAGE__->set_primary_key("ip", "alias"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:/ugGtBSGyrJ7s6yqJ9bclQ +=head1 RELATIONSHIPS + +=head2 device + +Returns the entry from the C table to which this IP alias relates. + +=cut + __PACKAGE__->belongs_to( device => 'Netdisco::DB::Result::Device', 'ip' ); + +=head2 device_port + +Returns the Port on which this IP address is configured (typically a loopback, +routed port or virtual interface). + +=cut + __PACKAGE__->belongs_to( device_port => 'Netdisco::DB::Result::DevicePort', { 'foreign.port' => 'self.port', 'foreign.ip' => 'self.ip' } ); diff --git a/Netdisco/lib/Netdisco/DB/Result/DevicePortVlan.pm b/Netdisco/lib/Netdisco/DB/Result/DevicePortVlan.pm index 12046cad..9616b3ce 100644 --- a/Netdisco/lib/Netdisco/DB/Result/DevicePortVlan.pm +++ b/Netdisco/lib/Netdisco/DB/Result/DevicePortVlan.pm @@ -39,10 +39,34 @@ __PACKAGE__->set_primary_key("ip", "port", "vlan"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:/3KLjJ3D18pGaPEaw9EU5w +=head1 RELATIONSHIPS + +=head2 device + +Returns the entry from the C table which hosts the Port on which this +VLAN is configured. + +=cut + __PACKAGE__->belongs_to( device => 'Netdisco::DB::Result::Device', 'ip' ); + +=head2 port + +Returns the entry from the C table on which this VLAN is configured. + +=cut + __PACKAGE__->belongs_to( port => 'Netdisco::DB::Result::DevicePort', { 'foreign.ip' => 'self.ip', 'foreign.port' => 'self.port', }); + +=head2 vlan + +Returns the entry from the C table describing this VLAN in +detail, typically in order that the C can be retrieved. + +=cut + __PACKAGE__->belongs_to( vlan => 'Netdisco::DB::Result::DeviceVlan', { 'foreign.ip' => 'self.ip', 'foreign.vlan' => 'self.vlan', }); diff --git a/Netdisco/lib/Netdisco/DB/Result/DeviceVlan.pm b/Netdisco/lib/Netdisco/DB/Result/DeviceVlan.pm index 34b5c10d..b1c651ad 100644 --- a/Netdisco/lib/Netdisco/DB/Result/DeviceVlan.pm +++ b/Netdisco/lib/Netdisco/DB/Result/DeviceVlan.pm @@ -37,7 +37,22 @@ __PACKAGE__->set_primary_key("ip", "vlan"); # Created by DBIx::Class::Schema::Loader v0.07015 @ 2012-01-07 14:20:02 # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hBJRcdzOic4d3u4pD1m8iA +=head1 RELATIONSHIPS + +=head2 device + +Returns the entry from the C table on which this VLAN entry was discovered. + +=cut + __PACKAGE__->belongs_to( device => 'Netdisco::DB::Result::Device', 'ip' ); + +=head2 port_vlans_tagged + +Link relationship for C, see below. + +=cut + __PACKAGE__->has_many( port_vlans_tagged => 'Netdisco::DB::Result::DevicePortVlan', { 'foreign.ip' => 'self.ip', @@ -47,6 +62,13 @@ __PACKAGE__->has_many( port_vlans_tagged => 'Netdisco::DB::Result::DevicePortVla where => { -not_bool => 'me.native' }, } ); + +=head2 port_vlans_native + +Link relationship to support C, see below. + +=cut + __PACKAGE__->has_many( port_vlans_native => 'Netdisco::DB::Result::DevicePortVlan', { 'foreign.ip' => 'self.ip', @@ -56,7 +78,22 @@ __PACKAGE__->has_many( port_vlans_native => 'Netdisco::DB::Result::DevicePortVla where => { -bool => 'me.native' }, } ); + +=head2 tagging_ports + +Returns the set of Device Ports on which this VLAN is configured to be tagged. + +=cut + __PACKAGE__->many_to_many( tagging_ports => 'port_vlans_tagged', 'port' ); + +=head2 native_ports + +Returns the set of Device Ports on which this VLAN is the native VLAN (that +is, untagged). + +=cut + __PACKAGE__->many_to_many( native_ports => 'port_vlans_native', 'port' ); 1; diff --git a/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm b/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm index 61af0676..fa49bea1 100644 --- a/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm +++ b/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm @@ -5,52 +5,132 @@ use strict; use warnings FATAL => 'all'; use NetAddr::IP::Lite ':lower'; -# override the built-in so we can munge some columns -sub find { - my ($set, $ip, $attr) = @_; - $attr ||= {}; +=head1 ADDITIONAL METHODS - return $set->SUPER::find($ip, - { - %$attr, - '+select' => [ - \"replace(age(timestamp 'epoch' + uptime / 100 * interval '1 second', timestamp '1970-01-01 00:00:00-00')::text, 'mon', 'month')", - \"to_char(last_discover, 'YYYY-MM-DD HH24:MI')", - \"to_char(last_macsuck, 'YYYY-MM-DD HH24:MI')", - \"to_char(last_arpnip, 'YYYY-MM-DD HH24:MI')", - ], - '+as' => [qw/ uptime last_discover last_macsuck last_arpnip /], - } - ); +=head2 with_times + +This is a modifier for any C (including the helpers below) which +will add the following additional synthesized columns to the result set: + +=over 4 + +=item uptime_age + +=item last_discover_stamp + +=item last_macsuck_stamp + +=item last_arpnip_stamp + +=back + +=cut + +sub with_times { + my ($rs, $cond, $attrs) = @_; + $cond ||= {}; + $attrs ||= {}; + + return $rs + ->search_rs($cond, $attrs) + ->search({}, + { + '+select' => [ + \"replace(age(timestamp 'epoch' + uptime / 100 * interval '1 second', + timestamp '1970-01-01 00:00:00-00')::text, 'mon', 'month')", + \"to_char(last_discover, 'YYYY-MM-DD HH24:MI')", + \"to_char(last_macsuck, 'YYYY-MM-DD HH24:MI')", + \"to_char(last_arpnip, 'YYYY-MM-DD HH24:MI')", + ], + '+as' => [qw/ + uptime_age + last_discover_stamp + last_macsuck_stamp + last_arpnip_stamp + /], + }); } -# finds distinct values of a col for use in form selections -sub get_distinct { - my ($set, $col) = @_; - return $set unless $col; +=head2 search_by_field( \%cond, \%attrs? ) - return $set->search({}, - { - columns => [$col], - order_by => $col, - distinct => 1 - } - )->get_column($col)->all; -} +This variant of the standard C method returns a ResultSet of Device +entries. It is written to support web forms which accept fields that match and +locate Devices in the database. + +The hashref parameter should contain fields from the Device table which will +be intelligently used in a search query. + +In addition, you can provide the key C which, given a True or False +value, controls whether fields must all match or whether any can match, to +select a row. + +Supported keys: + +=over 4 + +=item matchall + +If a True value, fields must all match to return a given row of the Device +table, otherwise any field matching will cause the row to be included in +results. + +=item name + +Can match the C field as a substring. + +=item location + +Can match the C field as a substring. + +=item description + +Can match the C field as a substring (usually this field contains +a description of the vendor operating system). + +=item model + +Will match exactly the C field. + +=item os_ver + +Will match exactly the C field, which is the operating sytem software version. + +=item vendor + +Will match exactly the C (manufacturer). + +=item dns + +Can match any of the Device IP address aliases as a substring. + +=item ip + +Can be a string IP or a NetAddr::IP object, either way being treated as an +IPv4 or IPv6 prefix within which the device must have one IP address alias. + +=back + +=cut + +sub search_by_field { + my ($rs, $p, $attrs) = @_; + + die "condition parameter to search_by_field must be hashref\n" + if ref {} ne ref $p or 0 == scalar keys %$p; + $attrs ||= {}; -sub by_field { - my ($set, $p) = @_; - return $set unless ref {} eq ref $p; my $op = $p->{matchall} ? '-and' : '-or'; - # this is a bit of an ungraceful backflip to catch junk entry - # whilst avoiding returning all devices in the DB - my $ip = ($p->{ip} ? - (NetAddr::IP::Lite->new($p->{ip}) || NetAddr::IP::Lite->new('255.255.255.255')) - : undef); + # this is a bit of an inelegant trick to catch junk data entry, + # whilst avoiding returning *all* entries in the table + if (exists $p->{ip} and defined $p->{ip} and 'NetAddr::IP::Lite' ne ref $p->{ip}) { + $p->{ip} = ( NetAddr::IP::Lite->new($p->{ip}) + || NetAddr::IP::Lite->new('255.255.255.255') ); + } - return $set->search( - { + return $rs + ->search_rs({}, $attrs) + ->search({ $op => [ ($p->{name} ? ('me.name' => { '-ilike' => "\%$p->{name}\%" }) : ()), @@ -58,22 +138,25 @@ sub by_field { { '-ilike' => "\%$p->{location}\%" }) : ()), ($p->{description} ? ('me.description' => { '-ilike' => "\%$p->{description}\%" }) : ()), + ($p->{model} ? ('me.model' => { '-in' => $p->{model} }) : ()), ($p->{os_ver} ? ('me.os_ver' => { '-in' => $p->{os_ver} }) : ()), ($p->{vendor} ? ('me.vendor' => { '-in' => $p->{vendor} }) : ()), + ($p->{dns} ? ( - -or => [ - 'me.dns' => { '-ilike' => "\%$p->{dns}\%" }, - 'device_ips.dns' => { '-ilike' => "\%$p->{dns}\%" }, - ]) : ()), - ($ip ? ( - -or => [ - 'me.ip' => { '<<=' => $ip->cidr }, - 'device_ips.alias' => { '<<=' => $ip->cidr }, - ]) : ()), + -or => [ + 'me.dns' => { '-ilike' => "\%$p->{dns}\%" }, + 'device_ips.dns' => { '-ilike' => "\%$p->{dns}\%" }, + ]) : ()), + + ($p->{ip} ? ( + -or => [ + 'me.ip' => { '<<=' => $p->{ip}->cidr }, + 'device_ips.alias' => { '<<=' => $p->{ip}->cidr }, + ]) : ()), ], }, { @@ -84,9 +167,38 @@ sub by_field { ); } -sub by_any { - my ($set, $q) = @_; - return $set unless $q; +=head2 search_fuzzy( $value ) + +This method accepts a single parameter only and returns a ResultSet of rows +from the Device table where one field matches the passed parameter. + +The following fields are inspected for a match: + +=over 4 + +=item contact + +=item serial + +=item location + +=item name + +=item description + +=item dns + +=item ip (including aliases) + +=back + +=cut + +sub search_fuzzy { + my ($rs, $q) = @_; + + die "missing param to search_by_field\n" + unless $q; $q = "\%$q\%" if $q !~ m/\%/; # basic IP check is a string match @@ -104,7 +216,7 @@ sub by_any { ]; } - return $set->search( + return $rs->search( { -or => [ 'me.contact' => { '-ilike' => $q }, @@ -127,39 +239,123 @@ sub by_any { ); } -sub carrying_vlan { - my ($set, $vlan) = @_; - return $set unless $vlan and $vlan =~ m/^\d+$/; +=head2 carrying_vlan( \%cond, \%attrs? ) - return $set->search( - { - 'vlans.vlan' => $vlan, - 'port_vlans.vlan' => $vlan, - }, - { - order_by => [qw/ me.dns me.ip /], - columns => [qw/ me.ip me.dns me.model me.os me.vendor /], - join => 'port_vlans', - prefetch => 'vlans', - }, - ); + my $set = $rs->carrying_vlan({ vlan => 123 }); + +Like C, this returns a ResultSet of matching rows from the Device +table. + +The returned devices each are aware of the given Vlan and have at least one +Port configured in the Vlan (either tagged, or not). + +=over 4 + +=item * + +The C parameter must be a hashref containing a key C with +the value to search for. + +=item * + +Results are ordered by the Device DNS and IP fields. + +=item * + +Related rows from the C table will be prefetched. + +=back + +=cut + +sub carrying_vlan { + my ($rs, $cond, $attrs) = @_; + + die "vlan number required for carrying_vlan\n" + if ref {} ne ref $cond or !exists $cond->{vlan}; + + $cond->{'vlans.vlan'} = $cond->{vlan}; + $cond->{'port_vlans.vlan'} = delete $cond->{vlan}; + $attrs ||= {}; + + return $rs + ->search_rs($cond, + { + order_by => [qw/ me.dns me.ip /], + columns => [qw/ me.ip me.dns me.model me.os me.vendor /], + join => 'port_vlans', + prefetch => 'vlans', + }) + ->search({}, $attrs); } -sub carrying_vlan_name { - my ($set, $name) = @_; - return $set unless $name; - $name = "\%$name\%" if $name !~ m/\%/; +=head2 carrying_vlan_name( \%cond, \%attrs? ) - return $set->search( - { - 'vlans.description' => { '-ilike' => $name }, - }, - { + my $set = $rs->carrying_vlan_name({ name => 'Branch Office' }); + +Like C, this returns a ResultSet of matching rows from the Device +table. + +The returned devices each are aware of the named Vlan and have at least one +Port configured in the Vlan (either tagged, or not). + +=over 4 + +=item * + +The C parameter must be a hashref containing a key C with +the value to search for. The value may optionally include SQL wildcard +characters. + +=item * + +Results are ordered by the Device DNS and IP fields. + +=item * + +Related rows from the C table will be prefetched. + +=back + +=cut + +sub carrying_vlan_name { + my ($rs, $cond, $attrs) = @_; + + die "vlan name required for carrying_vlan_name\n" + if ref {} ne ref $cond or !exists $cond->{name}; + + $cond->{'vlans.description'} = { '-ilike' => $cond->{name} }; + $attrs ||= {}; + + return $rs + ->search_rs({}, { order_by => [qw/ me.dns me.ip /], columns => [qw/ me.ip me.dns me.model me.os me.vendor /], prefetch => 'vlans', - }, - ); + }) + ->search($cond, $attrs); +} + +=head2 get_distinct( $column ) + +Returns an asciibetical sorted list of the distinct values in the given column +of the Device table. This is useful for web forms when you want to provide a +drop-down list of possible options. + +=cut + +sub get_distinct { + my ($rs, $col) = @_; + return $rs unless $col; + + return $rs->search({}, + { + columns => [$col], + order_by => $col, + distinct => 1 + } + )->get_column($col)->all; } 1; diff --git a/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm b/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm index ec9992da..606eca15 100644 --- a/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm +++ b/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm @@ -8,7 +8,7 @@ use warnings FATAL => 'all'; my $set = $rs->search_by_mac({mac => '00:11:22:33:44:55'}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the DevicePort table. =over 4 @@ -55,7 +55,7 @@ sub search_by_mac { my $set = $rs->search_by_ip({ip => '192.0.2.1'}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the DevicePort table. =over 4 @@ -103,7 +103,7 @@ sub search_by_ip { my $set = $rs->search_by_name({name => 'sniffer'}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the DevicePort table. =over 4 @@ -141,7 +141,7 @@ sub search_by_name { my $set = $rs->search_by_vlan({vlan => 123}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the DevicePort table. =over 4 @@ -179,7 +179,7 @@ sub search_by_vlan { my $set = $rs->search_by_port({port => 'FastEthernet0/23'}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the DevicePort table. =over 4 diff --git a/Netdisco/lib/Netdisco/DB/ResultSet/Node.pm b/Netdisco/lib/Netdisco/DB/ResultSet/Node.pm index be24b60a..916d2a43 100644 --- a/Netdisco/lib/Netdisco/DB/ResultSet/Node.pm +++ b/Netdisco/lib/Netdisco/DB/ResultSet/Node.pm @@ -8,7 +8,7 @@ use warnings FATAL => 'all'; my $set = $rs->search_by_mac({mac => '00:11:22:33:44:55', active => 1}); -Like C, this returns a C<$resultset> of matching rows from the Node +Like C, this returns a ResultSet of matching rows from the Node table. =over 4 diff --git a/Netdisco/lib/Netdisco/DB/ResultSet/NodeIp.pm b/Netdisco/lib/Netdisco/DB/ResultSet/NodeIp.pm index 02336a42..5158c2cc 100644 --- a/Netdisco/lib/Netdisco/DB/ResultSet/NodeIp.pm +++ b/Netdisco/lib/Netdisco/DB/ResultSet/NodeIp.pm @@ -18,8 +18,8 @@ column. =cut sub has_dns_col { - my $set = shift; - return $set->result_source->has_column('dns'); + my $rs = shift; + return $rs->result_source->has_column('dns'); } my $search_attr = { @@ -37,7 +37,7 @@ my $search_attr = { my $set = $rs->search_by_ip({ip => '192.0.2.1', active => 1}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the NodeIp table. =over 4 @@ -96,7 +96,7 @@ sub search_by_ip { my $set = $rs->search_by_name({dns => 'foo.example.com', active => 1}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the NodeIp table. =over 4 @@ -152,7 +152,7 @@ sub search_by_dns { my $set = $rs->search_by_mac({mac => '00:11:22:33:44:55', active => 1}); -Like C, this returns a C<$resultset> of matching rows from the +Like C, this returns a ResultSet of matching rows from the NodeIp table. =over 4 diff --git a/Netdisco/lib/Netdisco/Web/Device.pm b/Netdisco/lib/Netdisco/Web/Device.pm index fd22a1a0..c95660de 100644 --- a/Netdisco/lib/Netdisco/Web/Device.pm +++ b/Netdisco/lib/Netdisco/Web/Device.pm @@ -57,7 +57,8 @@ ajax '/ajax/content/device/addresses' => sub { my $ip = param('q'); return unless $ip; - my $set = schema('netdisco')->resultset('DeviceIp')->search({ip => $ip}, { order_by => 'alias' }); + my $set = schema('netdisco')->resultset('DeviceIp') + ->search({ip => $ip}, { order_by => 'alias' }); return unless $set->count; content_type('text/html'); @@ -71,17 +72,19 @@ ajax '/ajax/content/device/ports' => sub { my $ip = param('q'); return unless $ip; - my $set = schema('netdisco')->resultset('DevicePort')->search_by_ip({ip => $ip}); + my $set = schema('netdisco')->resultset('DevicePort') + ->search_by_ip({ip => $ip}); # refine by ports if requested my $q = param('f'); if ($q) { if ($q =~ m/^\d+$/) { - $set = $set->by_vlan($q); + $set = $set->search_by_vlan({vlan => $q}); } else { my $c = schema('netdisco')->resultset('DevicePort') - ->search_by_ip({ip => $ip})->search_by_port({port => $q}); + ->search_by_ip({ip => $ip}) + ->search_by_port({port => $q}); if ($c->count) { $set = $set->search_by_port({port => $q}); } @@ -115,7 +118,8 @@ ajax '/ajax/content/device/details' => sub { my $ip = param('q'); return unless $ip; - my $device = schema('netdisco')->resultset('Device')->find($ip); + my $device = schema('netdisco')->resultset('Device') + ->with_times()->find($ip); return unless $device; content_type('text/html'); diff --git a/Netdisco/lib/Netdisco/Web/Search.pm b/Netdisco/lib/Netdisco/Web/Search.pm index 1cf84e35..764d5352 100644 --- a/Netdisco/lib/Netdisco/Web/Search.pm +++ b/Netdisco/lib/Netdisco/Web/Search.pm @@ -42,13 +42,13 @@ ajax '/ajax/content/search/device' => sub { my $set; if ($has_opt) { - $set = schema('netdisco')->resultset('Device')->by_field(scalar params); + $set = schema('netdisco')->resultset('Device')->search_by_field(scalar params); } else { my $q = param('q'); return unless $q; - $set = schema('netdisco')->resultset('Device')->by_any($q); + $set = schema('netdisco')->resultset('Device')->search_fuzzy($q); } return unless $set->count; @@ -136,15 +136,15 @@ ajax '/ajax/content/search/node' => sub { # devices carrying vlan xxx ajax '/ajax/content/search/vlan' => sub { - my $vlan = param('q'); - return unless $vlan; + my $q = param('q'); + return unless $q; my $set; - if ($vlan =~ m/^\d+$/) { - $set = schema('netdisco')->resultset('Device')->carrying_vlan($vlan); + if ($q =~ m/^\d+$/) { + $set = schema('netdisco')->resultset('Device')->carrying_vlan({vlan => $q}); } else { - $set = schema('netdisco')->resultset('Device')->carrying_vlan_name($vlan); + $set = schema('netdisco')->resultset('Device')->carrying_vlan_name({name => $q}); } return unless $set->count; @@ -208,9 +208,8 @@ get '/search' => sub { } } else { - if ($s->resultset('Device')->search({ - dns => { '-ilike' => "\%$q\%" }, - })->count) { + if ($s->resultset('Device') + ->search({dns => { '-ilike' => "\%$q\%" }})->count) { params->{'tab'} = 'device'; } elsif ($s->resultset('DevicePort')