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