Validierungsfunktion für BackgroundJobs
[kivitendo-erp.git] / SL / DB / BackgroundJob.pm
1 package SL::DB::BackgroundJob;
2
3 use strict;
4
5 use DateTime::Event::Cron;
6 use English qw(-no_match_vars);
7
8 use SL::DB::MetaSetup::BackgroundJob;
9 use SL::DB::Manager::BackgroundJob;
10
11 use SL::DB::BackgroundJobHistory;
12
13 use SL::BackgroundJob::Test;
14 use SL::System::Process;
15
16 sub update_next_run_at {
17   my $self = shift;
18
19   my $cron = DateTime::Event::Cron->new_from_cron($self->cron_spec || '* * * * *');
20   $self->update_attributes(next_run_at => $cron->next(DateTime->now_local));
21   return $self;
22 }
23
24 sub run {
25   my $self = shift;
26
27   my $package = "SL::BackgroundJob::" . $self->package_name;
28   my $run_at  = DateTime->now_local;
29   my $history;
30
31   my $ok = eval {
32     my $result = $package->new->run($self);
33
34     $history = SL::DB::BackgroundJobHistory
35       ->new(package_name => $self->package_name,
36             run_at       => $run_at,
37             status       => 'success',
38             result       => $result,
39             data         => $self->data);
40     $history->save;
41
42     1;
43   };
44
45   if (!$ok) {
46     my $error = $EVAL_ERROR;
47     $history = SL::DB::BackgroundJobHistory
48       ->new(package_name => $self->package_name,
49             run_at       => $run_at,
50             status       => 'failure',
51             error_col    => $error,
52             data         => $self->data);
53     $history->save;
54
55     $::lxdebug->message(LXDebug->WARN(), "BackgroundJob ID " . $self->id . " execution error (first three lines): " . join("\n", (split(m/\n/, $error))[0..2]));
56   }
57
58   $self->assign_attributes(last_run_at => $run_at)->update_next_run_at;
59
60   return $history;
61 }
62
63 sub data_as_hash {
64   my $self = shift;
65   return {}                        if !$self->data;
66   return $self->data               if ref($self->{data}) eq 'HASH';
67   return YAML::Load($self->{data}) if !ref($self->{data});
68   return {};
69 }
70
71 sub validate {
72   my ($self) = @_;
73
74   my @errors;
75
76   push @errors, $::locale->text('The execution type is invalid.') if ($self->type         || '') !~ m/^(?: once | interval )$/x;
77
78   if (   (($self->package_name || '') !~ m/^ [A-Z][A-Za-z0-9]+ $/x)
79       || ! -f (SL::System::Process::exe_dir() . "/SL/BackgroundJob/" . $self->package_name . ".pm")) {
80     push @errors, $::locale->text('The package name is invalid.');
81   }
82
83   eval {
84     DateTime::Event::Cron->new_from_cron($self->cron_spec)->next(DateTime->now_local);
85     1;
86   } or push @errors, $::locale->text('The execution schedule is invalid.');
87
88   return @errors;
89 }
90
91 1;