diff --git a/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm b/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm index 5a0343c0..e7a5647d 100644 --- a/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm +++ b/lib/App/Netdisco/DB/Result/Virtual/PortUtilization.pm @@ -23,12 +23,12 @@ __PACKAGE__->result_source_instance->view_definition(< ?::interval) ) + AND (age(LOCALTIMESTAMP, to_timestamp(extract(epoch from d.last_discover) - (d.uptime/100))::timestamp) < ?::interval) + AND (last_node.time_last IS NULL OR (age(LOCALTIMESTAMP, last_node.time_last)) > ?::interval) ) THEN 1 WHEN ( (dp.type IS NULL OR dp.type !~* '^(53|ieee8023adLag|propVirtual|l2vlan|l3ipvlan|135|136|137)\$') AND dp.up_admin = 'up' AND dp.up != 'up' - AND (age(now(), to_timestamp(extract(epoch from d.last_discover) - (d.uptime - dp.lastchange)/100)) > ?::interval) ) + AND (age(LOCALTIMESTAMP, to_timestamp(extract(epoch from d.last_discover) - (d.uptime - dp.lastchange)/100)::timestamp) > ?::interval) ) THEN 1 ELSE 0 END) as ports_free diff --git a/lib/App/Netdisco/DB/ResultSet/DevicePort.pm b/lib/App/Netdisco/DB/ResultSet/DevicePort.pm index d95bf542..d160abcc 100644 --- a/lib/App/Netdisco/DB/ResultSet/DevicePort.pm +++ b/lib/App/Netdisco/DB/ResultSet/DevicePort.pm @@ -70,9 +70,9 @@ sub with_is_free { # NOTE this query is in `git grep 'THREE PLACES'` \["me.up_admin = 'up' AND me.up != 'up' AND " ."(me.type IS NULL OR me.type !~* '^(53|ieee8023adLag|propVirtual|l2vlan|l3ipvlan|135|136|137)\$') AND " - ."((age(now(), to_timestamp(extract(epoch from device.last_discover) - (device.uptime/100))) < ?::interval " - ."AND (last_node.time_last IS NULL OR age(now(), last_node.time_last) > ?::interval)) " - ."OR age(now(), to_timestamp(extract(epoch from device.last_discover) - (device.uptime - me.lastchange)/100)) > ?::interval)", + ."((age(LOCALTIMESTAMP, to_timestamp(extract(epoch from device.last_discover) - (device.uptime/100))::timestamp) < ?::interval " + ."AND (last_node.time_last IS NULL OR age(LOCALTIMESTAMP, last_node.time_last) > ?::interval)) " + ."OR age(LOCALTIMESTAMP, to_timestamp(extract(epoch from device.last_discover) - (device.uptime - me.lastchange)/100)::timestamp) > ?::interval)", [{} => $interval],[ {} => $interval],[ {} => $interval]] }, join => [qw/device last_node/], }); @@ -107,14 +107,14 @@ sub only_free_ports { ], -or => [ -and => [ - \["age(now(), to_timestamp(extract(epoch from device.last_discover) - (device.uptime/100))) < ?::interval", + \["age(LOCALTIMESTAMP, to_timestamp(extract(epoch from device.last_discover) - (device.uptime/100))::timestamp) < ?::interval", [{} => $interval]], -or => [ 'last_node.time_last' => undef, - \["age(now(), last_node.time_last) > ?::interval", [{} => $interval]], + \["age(LOCALTIMESTAMP, last_node.time_last) > ?::interval", [{} => $interval]], ] ], - \["age(now(), to_timestamp(extract(epoch from device.last_discover) - (device.uptime - me.lastchange)/100)) > ?::interval", + \["age(LOCALTIMESTAMP, to_timestamp(extract(epoch from device.last_discover) - (device.uptime - me.lastchange)/100)::timestamp) > ?::interval", [{} => $interval]], ], },{ join => [qw/device last_node/] }, diff --git a/lib/App/Netdisco/Worker/Plugin/Arpnip/Nodes.pm b/lib/App/Netdisco/Worker/Plugin/Arpnip/Nodes.pm index feb04a41..1b8fc8ff 100644 --- a/lib/App/Netdisco/Worker/Plugin/Arpnip/Nodes.pm +++ b/lib/App/Netdisco/Worker/Plugin/Arpnip/Nodes.pm @@ -29,7 +29,7 @@ register_worker({ phase => 'early', # select and do something with the updated set (see set archive, below) vars->{'timestamp'} = ($job->is_offline and $job->entered) ? (schema('netdisco')->storage->dbh->quote($job->entered) .'::timestamp') - : 'to_timestamp('. (join '.', gettimeofday) .')'; + : 'to_timestamp('. (join '.', gettimeofday) .')::timestamp'; # initialise the cache vars->{'arps'} ||= []; diff --git a/lib/App/Netdisco/Worker/Plugin/Arpnip/Subnets.pm b/lib/App/Netdisco/Worker/Plugin/Arpnip/Subnets.pm index 36fd8d49..d3073e28 100644 --- a/lib/App/Netdisco/Worker/Plugin/Arpnip/Subnets.pm +++ b/lib/App/Netdisco/Worker/Plugin/Arpnip/Subnets.pm @@ -21,7 +21,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { my @subnets = gather_subnets($device); # TODO: IPv6 subnets - my $now = 'to_timestamp('. (join '.', gettimeofday) .')'; + my $now = 'to_timestamp('. (join '.', gettimeofday) .')::timestamp'; store_subnet($_, $now) for @subnets; return Status->info(sprintf ' [%s] arpnip - processed %s Subnet entries', diff --git a/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm b/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm index 48422e91..0ded2519 100644 --- a/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm +++ b/lib/App/Netdisco/Worker/Plugin/Macsuck/Nodes.pm @@ -30,7 +30,7 @@ register_worker({ phase => 'early', # select and do something with the updated set (see set archive, below) vars->{'timestamp'} = ($job->is_offline and $job->entered) ? (schema('netdisco')->storage->dbh->quote($job->entered) .'::timestamp') - : 'to_timestamp('. (join '.', gettimeofday) .')'; + : 'to_timestamp('. (join '.', gettimeofday) .')::timestamp'; # initialise the cache vars->{'fwtable'} ||= {}; @@ -225,13 +225,13 @@ All four fields in the tuple are required. If you don't know the VLAN ID, Netdisco supports using ID "0". Optionally, a fifth argument can be the literal string passed to the time_last -field of the database record. If not provided, it defaults to C. +field of the database record. If not provided, it defaults to C. =cut sub store_node { my ($ip, $vlan, $port, $mac, $now) = @_; - $now ||= 'now()'; + $now ||= 'LOCALTIMESTAMP'; $vlan ||= 0; schema('netdisco')->txn_do(sub { diff --git a/lib/App/Netdisco/Worker/Plugin/Macsuck/WirelessNodes.pm b/lib/App/Netdisco/Worker/Plugin/Macsuck/WirelessNodes.pm index 454bc4c3..39825577 100644 --- a/lib/App/Netdisco/Worker/Plugin/Macsuck/WirelessNodes.pm +++ b/lib/App/Netdisco/Worker/Plugin/Macsuck/WirelessNodes.pm @@ -15,7 +15,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub { my $snmp = App::Netdisco::Transport::SNMP->reader_for($device) or return Status->defer("macsuck failed: could not SNMP connect to $device"); - my $now = 'to_timestamp('. (join '.', gettimeofday) .')'; + my $now = 'to_timestamp('. (join '.', gettimeofday) .')::timestamp'; my $cd11_txrate = $snmp->cd11_txrate; return unless $cd11_txrate and scalar keys %$cd11_txrate; diff --git a/lib/App/Netdisco/Worker/Plugin/Nbtstat/Core.pm b/lib/App/Netdisco/Worker/Plugin/Nbtstat/Core.pm index 5ccfaa2b..2fa0af66 100644 --- a/lib/App/Netdisco/Worker/Plugin/Nbtstat/Core.pm +++ b/lib/App/Netdisco/Worker/Plugin/Nbtstat/Core.pm @@ -19,7 +19,7 @@ register_worker({ phase => 'main' }, sub { -bool => 'me.active', -bool => 'nodes.active', 'nodes.switch' => $host, - 'me.time_last' => \[ '>= now() - ?::interval', $interval ], + 'me.time_last' => \[ '>= LOCALTIMESTAMP - ?::interval', $interval ], },{ join => 'nodes', columns => 'ip', @@ -32,7 +32,7 @@ register_worker({ phase => 'main' }, sub { # Unless we have IPs don't bother if (scalar @ips) { - my $now = 'to_timestamp('. (join '.', gettimeofday) .')'; + my $now = 'to_timestamp('. (join '.', gettimeofday) .')::timestamp'; my $resolved_nodes = nbtstat_resolve_async(\@ips); # update node_nbt with status entries