Files
netdisco/lib/App/Netdisco/Backend/Worker/Poller/Expiry.pm
2017-06-28 16:32:06 +01:00

133 lines
4.2 KiB
Perl
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package App::Netdisco::Backend::Worker::Poller::Expiry;
use Dancer qw/:moose :syntax :script/;
use Dancer::Plugin::DBIC 'schema';
use Time::Piece;
use App::Netdisco::Backend::Util ':all';
use Role::Tiny;
use namespace::clean;
# expire devices and nodes according to config
sub expire {
my ($self, $job) = @_;
if (setting('expire_devices') and setting('expire_devices') > 0) {
schema('netdisco')->txn_do(sub {
schema('netdisco')->resultset('Device')->search({
-or => [ 'vendor' => undef, 'vendor' => { '!=' => 'netdisco' }],
last_discover => \[q/< (now() - ?::interval)/,
(setting('expire_devices') * 86400)],
})->delete();
});
}
if (setting('expire_nodes') and setting('expire_nodes') > 0) {
schema('netdisco')->txn_do(sub {
schema('netdisco')->resultset('Node')->search({
time_last => \[q/< (now() - ?::interval)/,
(setting('expire_nodes') * 86400)],
})->delete();
});
}
if (setting('expire_nodes_archive') and setting('expire_nodes_archive') > 0) {
schema('netdisco')->txn_do(sub {
schema('netdisco')->resultset('Node')->search({
-not_bool => 'active',
time_last => \[q/< (now() - ?::interval)/,
(setting('expire_nodes_archive') * 86400)],
})->delete();
});
}
if (setting('expire_jobs') and setting('expire_jobs') > 0) {
schema('netdisco')->txn_do(sub {
schema('netdisco')->resultset('Admin')->search({
entered => \[q/< (now() - ?::interval)/,
(setting('expire_jobs') * 86400)],
})->delete();
});
}
# now update stats
my $schema = schema('netdisco');
eval { require SNMP::Info };
my $snmpinfo_ver = ($@ ? 'n/a' : $SNMP::Info::VERSION);
# TODO: (when we have the capabilities table?)
# $stats{waps} = sql_scalar('device',['COUNT(*)'], {"model"=>"AIR%"});
$schema->txn_do(sub {
$schema->resultset('Statistics')->update_or_create({
day => localtime->ymd,
device_count =>
$schema->resultset('Device')->count_rs->as_query,
device_ip_count =>
$schema->resultset('DeviceIp')->count_rs->as_query,
device_link_count =>
$schema->resultset('Virtual::DeviceLinks')
->count_rs({'me.left_ip' => {'>', \'me.right_ip'}})->as_query,
device_port_count =>
$schema->resultset('DevicePort')->count_rs->as_query,
device_port_up_count =>
$schema->resultset('DevicePort')->count_rs({up => 'up'})->as_query,
ip_table_count =>
$schema->resultset('NodeIp')->count_rs->as_query,
ip_active_count =>
$schema->resultset('NodeIp')->search({-bool => 'active'},
{columns => 'ip', distinct => 1})->count_rs->as_query,
node_table_count =>
$schema->resultset('Node')->count_rs->as_query,
node_active_count =>
$schema->resultset('Node')->search({-bool => 'active'},
{columns => 'mac', distinct => 1})->count_rs->as_query,
netdisco_ver => pretty_version($App::Netdisco::VERSION, 3),
snmpinfo_ver => $snmpinfo_ver,
schema_ver => $schema->schema_version,
perl_ver => pretty_version($], 3),
pg_ver =>
pretty_version($schema->storage->dbh->{pg_server_version}, 2),
}, { key => 'primary' });
});
return job_done("Checked expiry and updated stats");
}
# take perl or pg versions and make pretty
sub pretty_version {
my ($version, $seglen) = @_;
return unless $version and $seglen;
return $version if $version !~ m/^[0-9.]+$/;
$version =~ s/\.//g;
$version = (join '.', reverse map {scalar reverse}
unpack("(A${seglen})*", reverse $version));
$version =~ s/\.000/.0/g;
$version =~ s/\.0+([1-9]+)/.$1/g;
return $version;
}
# expire nodes for a specific device
sub expirenodes {
my ($self, $job) = @_;
return job_error('Missing device') unless $job->device;
schema('netdisco')->txn_do(sub {
schema('netdisco')->resultset('Node')->search({
switch => $job->device->ip,
($job->port ? (port => $job->port) : ()),
})->delete(
($job->extra ? () : ({ archive_nodes => 1 }))
);
});
return job_done("Expired nodes for ". $job->device->ip);
}
1;