also link to manual topology from device ports fix tooltip reinit on datatables paging Squashed commit of the following: commit85d52ed174Merge:66e3536607446ed7Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 31 08:59:19 2017 +0000 Merge branch 'master' into og-newnetmap commit66e353669dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 31 00:16:49 2017 +0000 add docs link commit809f1ede76Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 31 00:11:29 2017 +0000 node links to other devices commit187e1ea803Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 23:58:56 2017 +0000 add node infostring commit6453f99b28Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 23:41:19 2017 +0000 link infostrings! commitf3ba260142Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 22:42:09 2017 +0000 maxnoderadius is now based on dynamic size calc commit0af415e391Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 22:33:22 2017 +0000 fix to get aggregate ports in matching order on left and right side commit3f36121a4cAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 22:07:28 2017 +0000 initial aggregate link summing commite5b96b0781Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 14:55:00 2017 +0000 tidy and refactor commit79f22a47b3Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 13:42:58 2017 +0000 get rid of d3 v3/v4 and only have v3 commit18c3f16c8fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 12:54:45 2017 +0000 fullscreen exit now works commit93f8181fc8Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 30 08:58:04 2017 +0000 implement show link speeds on links commit72961f172dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 28 23:51:26 2017 +0000 add speed to retrieved devicelinks commitae5496310eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 11:21:12 2017 +0000 remove annealing on label change commit885cb92bd3Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 11:15:21 2017 +0000 reorder options commit015a1debe0Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 11:11:01 2017 +0000 fix d3-force debug link messing up svg text elements commit10ccaa78b1Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 26 10:52:47 2017 +0000 show ips functionality; improvement to maximise icon; bugfix d3-force label wrap commit71a1a20909Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 25 13:21:23 2017 +0000 move labels on neighbor view commit9578215349Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 25 13:13:13 2017 +0000 force running spinner commit6618fba548Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 23:13:33 2017 +0000 fix neighbors pinning commit938848551eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 18:12:04 2017 +0000 implement dynamic sizing option commite4b19be5d7Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 13:25:00 2017 +0000 zoom to device on neighbor show; do not save positions on neighbor show commit58b576b464Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 13:10:48 2017 +0000 better neighbors/save interaction commit2c77660f2fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 13:03:46 2017 +0000 fix labels on checkboxes to be clickable commit2c2dc62cdaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:50:26 2017 +0000 prevent save positions when in neighbor view mode commit78c558b5beAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:37:51 2017 +0000 add tooltip to show why host groups radio is disabled commit7000d4b0ebAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:12:29 2017 +0000 allow port control role to edit manual topology commit547d2934cbAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 12:09:40 2017 +0000 working save/restore node positions with groups commitbf7e231ffeAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 24 10:09:26 2017 +0000 node colors! commite23594b041Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 23:42:17 2017 +0000 wooo device group selection is working commitb1b22c9811Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 22:31:23 2017 +0000 send full query str from netmap for json commit9a13bb7f9bAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 22:06:24 2017 +0000 implement host_group_displaynames and fix vlan save bug commit35ed34ed2fAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 17:52:14 2017 +0000 when neighbors only can restrict the links search commitf9e5ec02abAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 17:44:41 2017 +0000 tweak mapshow commit9f9971ff4eAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 23 00:47:17 2017 +0000 better sidebar look and layout commit1def41da67Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 21 23:54:44 2017 +0000 sidebar with many options!! commit4203cbb225Merge:7c12df6b7db65932Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 21 20:14:55 2017 +0000 Merge branch 'master' into og-newnetmap commit7c12df6b83Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 21 00:13:03 2017 +0000 refresh tooltips when the datatables table is updated commit081b89d5dcAuthor: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:59:15 2017 +0000 shortcut from device port to manual topology commit9520438960Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:34:44 2017 +0000 tighten the sql for neighbor links commitd6b0275931Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:26:22 2017 +0000 tweak layout again commit9e5e2f0ed5Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 23:18:57 2017 +0000 fullscreen mode for netmap commitaba359d2a9Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 20 22:05:51 2017 +0000 save and load netmap positions for same device groups commitb7cd0251ffAuthor: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 19 23:24:47 2017 +0000 basic positions upload commit786115ebdaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 19 22:13:16 2017 +0000 working group drag commit91f98d4f33Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 18 23:00:16 2017 +0000 drag all selected nodes commitba48eee5f7Merge:60412cd67f8e3edfAuthor: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 18 20:14:20 2017 +0000 Merge branch 'master' into og-newnetmap commit60412cd6e6Merge:39ca14917dc79f72Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 17 20:23:41 2017 +0000 Merge branch 'master' into og-newnetmap commit39ca1491b0Merge:69622582c8806beaAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 17 19:52:49 2017 +0000 Merge branch 'master' into og-newnetmap commit6962258223Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 17 19:52:26 2017 +0000 bleed versions commit444e82b8a3Author: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 16 15:33:41 2017 +0000 use d3 v4 only commit01cd7a908dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Sat Dec 16 15:22:08 2017 +0000 two d3 connected commit854f37fc94Author: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 14 21:34:49 2017 +0000 more fiddling with d3 commit61a3a9e06dAuthor: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 14 19:15:21 2017 +0000 working worker commitebadebe69aAuthor: Oliver Gorwits <oliver@cpan.org> Date: Thu Dec 14 07:57:55 2017 +0000 borken worker commitc327b28513Author: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 13 13:45:03 2017 +0000 fix node center commit33bd9d39daAuthor: Oliver Gorwits <oliver@cpan.org> Date: Wed Dec 13 01:14:50 2017 +0000 improvements to graphing commit6178bf2298Merge:1c627eaf925940c9Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 12 23:44:48 2017 +0000 Merge branch 'master' into og-newnetmap commit1c627eaf3cMerge:77ca8f96000cbaa1Author: Oliver Gorwits <oliver@cpan.org> Date: Tue Dec 12 23:38:00 2017 +0000 Merge branch 'master' into og-newnetmap commit77ca8f96e1Author: Oliver Gorwits <oliver@cpan.org> Date: Mon Dec 11 00:09:08 2017 +0000 working rendering using d3-force plugin commit187265fc03Author: Oliver Gorwits <oliver@cpan.org> Date: Sun Dec 10 23:19:23 2017 +0000 initial work on moving to d3-force-apex-plugin - json data
		
			
				
	
	
		
			388 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			388 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| use utf8;
 | |
| package App::Netdisco::DB::Result::Device;
 | |
| 
 | |
| # Created by DBIx::Class::Schema::Loader
 | |
| # DO NOT MODIFY THE FIRST PART OF THIS FILE
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| use NetAddr::IP::Lite ':lower';
 | |
| use App::Netdisco::Util::DNS 'hostname_from_ip';
 | |
| 
 | |
| use overload '""' => sub { shift->ip }, fallback => 1;
 | |
| 
 | |
| use base 'DBIx::Class::Core';
 | |
| __PACKAGE__->table("device");
 | |
| __PACKAGE__->add_columns(
 | |
|   "ip",
 | |
|   { data_type => "inet", is_nullable => 0 },
 | |
|   "creation",
 | |
|   {
 | |
|     data_type     => "timestamp",
 | |
|     default_value => \"current_timestamp",
 | |
|     is_nullable   => 1,
 | |
|     original      => { default_value => \"now()" },
 | |
|   },
 | |
|   "dns",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "description",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "uptime",
 | |
|   { data_type => "bigint", is_nullable => 1 },
 | |
|   "contact",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "name",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "location",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "layers",
 | |
|   { data_type => "varchar", is_nullable => 1, size => 8 },
 | |
|   "ports",
 | |
|   { data_type => "integer", is_nullable => 1 },
 | |
|   "mac",
 | |
|   { data_type => "macaddr", is_nullable => 1 },
 | |
|   "serial",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "model",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "ps1_type",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "ps2_type",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "ps1_status",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "ps2_status",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "fan",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "slots",
 | |
|   { data_type => "integer", is_nullable => 1 },
 | |
|   "vendor",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "os",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "os_ver",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "log",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "snmp_ver",
 | |
|   { data_type => "integer", is_nullable => 1 },
 | |
|   "snmp_comm",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "snmp_class",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "vtp_domain",
 | |
|   { data_type => "text", is_nullable => 1 },
 | |
|   "last_discover",
 | |
|   { data_type => "timestamp", is_nullable => 1 },
 | |
|   "last_macsuck",
 | |
|   { data_type => "timestamp", is_nullable => 1 },
 | |
|   "last_arpnip",
 | |
|   { data_type => "timestamp", is_nullable => 1 },
 | |
| );
 | |
| __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<device_ip> table which relate to this Device. That is,
 | |
| all the interface IP aliases configured on the Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many( device_ips => 'App::Netdisco::DB::Result::DeviceIp', 'ip' );
 | |
| 
 | |
| =head2 vlans
 | |
| 
 | |
| Returns the C<device_vlan> entries for this Device. That is, the list of VLANs
 | |
| configured on or known by this Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many( vlans => 'App::Netdisco::DB::Result::DeviceVlan', 'ip' );
 | |
| 
 | |
| =head2 ports
 | |
| 
 | |
| Returns the set of ports on this Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many( ports => 'App::Netdisco::DB::Result::DevicePort', 'ip' );
 | |
| 
 | |
| =head2 modules
 | |
| 
 | |
| Returns the set chassis modules on this Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many( modules => 'App::Netdisco::DB::Result::DeviceModule', 'ip' );
 | |
| 
 | |
| =head2 power_modules
 | |
| 
 | |
| Returns the set of power modules on this Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many( power_modules => 'App::Netdisco::DB::Result::DevicePower', '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 => 'App::Netdisco::DB::Result::DevicePortVlan',
 | |
|     'ip', { join_type => 'RIGHT' }
 | |
| );
 | |
| 
 | |
| # helper which assumes we've just RIGHT JOINed to Vlans table
 | |
| sub vlan { return (shift)->vlans->first }
 | |
| 
 | |
| =head2 wireless_ports
 | |
| 
 | |
| Returns the set of wireless IDs known to be configured on Ports on this
 | |
| Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many(
 | |
|     wireless_ports => 'App::Netdisco::DB::Result::DevicePortWireless',
 | |
|     'ip', { join_type => 'RIGHT' }
 | |
| );
 | |
| 
 | |
| =head2 ssids
 | |
| 
 | |
| Returns the set of SSIDs known to be configured on Ports on this Device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many(
 | |
|     ssids => 'App::Netdisco::DB::Result::DevicePortSsid',
 | |
|     'ip', { join_type => 'RIGHT' }
 | |
| );
 | |
| 
 | |
| =head2 powered_ports
 | |
| 
 | |
| Returns the set of ports known to have PoE capability
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_many(
 | |
|     powered_ports => 'App::Netdisco::DB::Result::DevicePortPower',
 | |
|     'ip', { join_type => 'RIGHT' }
 | |
| );
 | |
| 
 | |
| =head2 community
 | |
| 
 | |
| Returns the row from the community string table, if one exists.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->might_have(
 | |
|     community => 'App::Netdisco::DB::Result::Community', 'ip');
 | |
| 
 | |
| =head2 throughput
 | |
| 
 | |
| Returns a sum of speeds on all ports on the device.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| __PACKAGE__->has_one(
 | |
|     throughput => 'App::Netdisco::DB::Result::Virtual::DevicePortSpeed', 'ip');
 | |
| 
 | |
| =head1 ADDITIONAL METHODS
 | |
| 
 | |
| =head2 is_pseudo
 | |
| 
 | |
| Returns true if the vendor of the device is "netdisco".
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub is_pseudo {
 | |
|   my $device = shift;
 | |
|   return (defined $device->vendor and $device->vendor eq 'netdisco');
 | |
| }
 | |
| 
 | |
| =head2 has_layer( $number )
 | |
| 
 | |
| Returns true if the device provided sysServices and supports the given layer.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub has_layer {
 | |
|   my ($device, $layer) = @_;
 | |
|   return unless $layer and $layer =~ m/^[1-7]$/;
 | |
|   return ($device->layers and (substr($device->layers, (8-$layer), 1) == 1));
 | |
| }
 | |
| 
 | |
| =head2 renumber( $new_ip )
 | |
| 
 | |
| Will update this device and all related database records to use the new IP
 | |
| C<$new_ip>. Returns C<undef> if $new_ip seems invalid, otherwise returns the
 | |
| Device row object.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub renumber {
 | |
|   my ($device, $ip) = @_;
 | |
|   my $schema = $device->result_source->schema;
 | |
| 
 | |
|   my $new_addr = NetAddr::IP::Lite->new($ip)
 | |
|     or return;
 | |
| 
 | |
|   my $old_ip = $device->ip;
 | |
|   my $new_ip = $new_addr->addr;
 | |
| 
 | |
|   return
 | |
|     if $new_ip eq '0.0.0.0'
 | |
|     or $new_ip eq '127.0.0.1';
 | |
| 
 | |
|   # Community is not included as SNMP::test_connection will take care of it
 | |
|   foreach my $set (qw/
 | |
|     DeviceIp
 | |
|     DeviceModule
 | |
|     DevicePower
 | |
|     DeviceVlan
 | |
|     DevicePort
 | |
|     DevicePortLog
 | |
|     DevicePortPower
 | |
|     DevicePortSsid
 | |
|     DevicePortVlan
 | |
|     DevicePortWireless
 | |
|   /) {
 | |
|     $schema->resultset($set)
 | |
|       ->search({ip => $old_ip})
 | |
|       ->update({ip => $new_ip});
 | |
|   }
 | |
| 
 | |
|   $schema->resultset('DevicePort')
 | |
|     ->search({remote_ip => $old_ip})
 | |
|     ->update({remote_ip => $new_ip});
 | |
| 
 | |
|   $schema->resultset('Node')
 | |
|     ->search({switch => $old_ip})
 | |
|     ->update({switch => $new_ip});
 | |
| 
 | |
|   $schema->resultset('Topology')
 | |
|     ->search({dev1 => $old_ip})
 | |
|     ->update({dev1 => $new_ip});
 | |
| 
 | |
|   $schema->resultset('Topology')
 | |
|     ->search({dev2 => $old_ip})
 | |
|     ->update({dev2 => $new_ip});
 | |
| 
 | |
|   $device->update({
 | |
|     ip  => $new_ip,
 | |
|     dns => hostname_from_ip($new_ip),
 | |
|   });
 | |
| 
 | |
|   return $device;
 | |
| }
 | |
| 
 | |
| =head1 ADDITIONAL COLUMNS
 | |
| 
 | |
| =head2 oui
 | |
| 
 | |
| Returns the first half of the device MAC address.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub oui { return substr( ((shift)->mac || ''), 0, 8 ) }
 | |
| 
 | |
| =head2 port_count
 | |
| 
 | |
| Returns the number of ports on this device. Enable this
 | |
| column by applying the C<with_port_count()> modifier to C<search()>.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub port_count { return (shift)->get_column('port_count') }
 | |
| 
 | |
| 
 | |
| =head2 uptime_age
 | |
| 
 | |
| Formatted version of the C<uptime> 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<last_discover> field, accurate to the minute.
 | |
| 
 | |
| The format is somewhat like ISO 8601 or RFC3339 but without the middle C<T>
 | |
| 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<last_macsuck> field, accurate to the minute.
 | |
| 
 | |
| The format is somewhat like ISO 8601 or RFC3339 but without the middle C<T>
 | |
| 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<last_arpnip> field, accurate to the minute.
 | |
| 
 | |
| The format is somewhat like ISO 8601 or RFC3339 but without the middle C<T>
 | |
| 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')  }
 | |
| 
 | |
| =head2 since_last_discover
 | |
| 
 | |
| Number of seconds which have elapsed since the value of C<last_discover>.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub since_last_discover  { return (shift)->get_column('since_last_discover')  }
 | |
| 
 | |
| =head2 since_last_macsuck
 | |
| 
 | |
| Number of seconds which have elapsed since the value of C<last_macsuck>.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub since_last_macsuck  { return (shift)->get_column('since_last_macsuck')  }
 | |
| 
 | |
| =head2 since_last_arpnip
 | |
| 
 | |
| Number of seconds which have elapsed since the value of C<last_arpnip>.
 | |
| 
 | |
| =cut
 | |
| 
 | |
| sub since_last_arpnip  { return (shift)->get_column('since_last_arpnip')  }
 | |
| 
 | |
| 1;
 |