1package App::Netdisco::Worker::Plugin::Expire; 2 3use Dancer ':syntax'; 4use App::Netdisco::Worker::Plugin; 5use aliased 'App::Netdisco::Worker::Status'; 6 7use Dancer::Plugin::DBIC 'schema'; 8use App::Netdisco::Util::Statistics 'update_stats'; 9use App::Netdisco::DB::ExplicitLocking ':modes'; 10 11register_worker({ phase => 'main' }, sub { 12 my ($job, $workerconf) = @_; 13 14 if (setting('expire_devices') and setting('expire_devices') > 0) { 15 schema('netdisco')->txn_do(sub { 16 schema('netdisco')->resultset('Device')->search({ 17 -or => [ 'vendor' => undef, 'vendor' => { '!=' => 'netdisco' }], 18 last_discover => \[q/< (now() - ?::interval)/, 19 (setting('expire_devices') * 86400)], 20 })->delete(); 21 }); 22 } 23 24 if (setting('expire_nodes') and setting('expire_nodes') > 0) { 25 schema('netdisco')->txn_do(sub { 26 my $freshness = ((defined setting('expire_nodeip_freshness')) 27 ? setting('expire_nodeip_freshness') : setting('expire_nodes')); 28 if ($freshness) { 29 schema('netdisco')->resultset('NodeIp')->search({ 30 time_last => \[q/< (now() - ?::interval)/, ($freshness * 86400)], 31 })->delete(); 32 } 33 34 schema('netdisco')->resultset('Node')->search({ 35 time_last => \[q/< (now() - ?::interval)/, 36 (setting('expire_nodes') * 86400)], 37 })->delete(); 38 }); 39 } 40 41 if (setting('expire_nodes_archive') and setting('expire_nodes_archive') > 0) { 42 schema('netdisco')->txn_do(sub { 43 my $freshness = ((defined setting('expire_nodeip_freshness')) 44 ? setting('expire_nodeip_freshness') : setting('expire_nodes_archive')); 45 if ($freshness) { 46 schema('netdisco')->resultset('NodeIp')->search({ 47 time_last => \[q/< (now() - ?::interval)/, ($freshness * 86400)], 48 })->delete(); 49 } 50 51 schema('netdisco')->resultset('Node')->search({ 52 -not_bool => 'active', 53 time_last => \[q/< (now() - ?::interval)/, 54 (setting('expire_nodes_archive') * 86400)], 55 })->delete(); 56 }); 57 } 58 59 # also have to clean up node_ip that have no correspoding node 60 schema('netdisco')->resultset('NodeIp')->search({ 61 mac => { -in => schema('netdisco')->resultset('NodeIp')->search( 62 { port => undef }, 63 { join => 'nodes', select => [{ distinct => 'me.mac' }], } 64 )->as_query }, 65 })->delete; 66 67 if (setting('expire_jobs') and setting('expire_jobs') > 0) { 68 schema('netdisco')->txn_do_locked('admin', 'EXCLUSIVE', sub { 69 schema('netdisco')->resultset('Admin')->search({ 70 entered => \[q/< (now() - ?::interval)/, 71 (setting('expire_jobs') * 86400)], 72 })->delete(); 73 }); 74 } 75 76 if (setting('expire_userlog') and setting('expire_userlog') > 0) { 77 schema('netdisco')->txn_do_locked('admin', 'EXCLUSIVE', sub { 78 schema('netdisco')->resultset('UserLog')->search({ 79 creation => \[q/< (now() - ?::interval)/, 80 (setting('expire_userlog') * 86400)], 81 })->delete(); 82 }); 83 } 84 85 # now update stats 86 update_stats(); 87 88 return Status->done('Checked expiry and updated stats'); 89}); 90 91true; 92