File: | C4/Scheduler.pm |
Coverage: | 95.6% |
line | stmt | bran | cond | sub | time | code |
---|---|---|---|---|---|---|
1 | package C4::Scheduler; | |||||
2 | ||||||
3 | # Copyright 2007 Liblime Ltd | |||||
4 | # | |||||
5 | # This file is part of Koha. | |||||
6 | # | |||||
7 | # Koha is free software; you can redistribute it and/or modify it under the | |||||
8 | # terms of the GNU General Public License as published by the Free Software | |||||
9 | # Foundation; either version 2 of the License, or (at your option) any later | |||||
10 | # version. | |||||
11 | # | |||||
12 | # Koha is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
13 | # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||||
14 | # A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||||
15 | # | |||||
16 | # You should have received a copy of the GNU General Public License along | |||||
17 | # with Koha; if not, write to the Free Software Foundation, Inc., | |||||
18 | # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |||||
19 | ||||||
20 | 3 3 3 | 24019 6 142 | use strict; | |||
21 | #use warnings; FIXME - Bug 2505 | |||||
22 | ||||||
23 | 3 3 3 | 14 4 209 | use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); | |||
24 | 3 3 3 | 184 5 55 | use C4::Context; | |||
25 | 3 3 3 | 75964 14314 192 | use Schedule::At; | |||
26 | ||||||
27 | BEGIN { | |||||
28 | # set the version for version checking | |||||
29 | 3 | 4 | $VERSION = 0.02; | |||
30 | 3 | 16 | require Exporter; | |||
31 | 3 | 39 | @ISA = qw(Exporter); | |||
32 | 3 | 727 | @EXPORT = | |||
33 | qw(get_jobs get_at_jobs get_at_job add_at_job remove_at_job); | |||||
34 | } | |||||
35 | ||||||
36 - 46 | =head1 NAME C4::Scheduler - Module for running jobs with the unix at command =head1 SYNOPSIS use C4::Scheduler; =head1 DESCRIPTION =cut | |||||
47 | ||||||
48 - 54 | =head1 METHODS =head2 get_jobs(); This will return all scheduled jobs =cut | |||||
55 | ||||||
56 | sub get_jobs { | |||||
57 | 1 | 380125 | my $jobs = get_at_jobs(); | |||
58 | # add call to get cron jobs here too | |||||
59 | 1 | 201 | return ($jobs); | |||
60 | } | |||||
61 | ||||||
62 - 66 | =head2 get_at_jobs(); This will return all At scheduled jobs =cut | |||||
67 | ||||||
68 | sub get_at_jobs { | |||||
69 | 2 | 20 | my %jobs = Schedule::At::getJobs(); | |||
70 | 2 | 115868 | return (\%jobs); | |||
71 | } | |||||
72 | ||||||
73 - 77 | =head2 get_at_job($id) This will return the At job with the given id =cut | |||||
78 | ||||||
79 | sub get_at_job { | |||||
80 | 1 | 1 | my ($id)=@_; | |||
81 | 1 | 10 | my %jobs = Schedule::At::getJobs(JOBID => $id); | |||
82 | } | |||||
83 | ||||||
84 - 90 | =head2 add_at_job ($time,$command) Given a timestamp and a command this will schedule the job to run at that time. Returns true if the job is added to the queue and false otherwise. =cut | |||||
91 | ||||||
92 | sub add_at_job { | |||||
93 | 1 | 16654 | my ($time,$command) = @_; | |||
94 | # FIXME - a description of the task to be run | |||||
95 | # may be a better tag, since the tag is displayed | |||||
96 | # in the job list that the administrator sees - e.g., | |||||
97 | # "run report foo, send to foo@bar.com" | |||||
98 | 1 | 186 | Schedule::At::add(TIME => $time, COMMAND => $command, TAG => $command); | |||
99 | ||||||
100 | # FIXME - this method of checking whether the job was added | |||||
101 | # to the queue is less than perfect: | |||||
102 | # | |||||
103 | # 1. Since the command is the tag, it is possible that there is | |||||
104 | # already a job in the queue with the same tag. However, since | |||||
105 | # the tag is what displays in the job list, we can't just | |||||
106 | # give it a unique ID. | |||||
107 | # 2. Schedule::At::add() is supposed to return a non-zero | |||||
108 | # value if it fails to add a job - however, it does | |||||
109 | # not check all error conditions - in particular, it does | |||||
110 | # not check the return value of the "at" run; it basically | |||||
111 | # complains only if it can't find at. | |||||
112 | # 3. Similary, Schedule::At::add() does not do something more useful, | |||||
113 | # such as returning the job ID. To be fair, it is possible | |||||
114 | # that 'at' does not allow this in any portable way. | |||||
115 | # 4. Although unlikely, it is possible that a job could be added | |||||
116 | # and completed instantly, thus dropping off the queue. | |||||
117 | 1 | 25563 | my $job_found = 0; | |||
118 | 1 | 82 | eval { | |||
119 | 1 | 132 | my %jobs = Schedule::At::getJobs(TAG => $command); | |||
120 | 1 | 11354 | $job_found = scalar(keys %jobs) > 0; | |||
121 | }; | |||||
122 | 1 | 154 | if ($@) { | |||
123 | 0 | 0 | return 0; | |||
124 | } else { | |||||
125 | 1 | 267 | return $job_found; | |||
126 | } | |||||
127 | } | |||||
128 | ||||||
129 | sub remove_at_job { | |||||
130 | 1 | 63 | my ($jobid)=@_; | |||
131 | 1 | 25 | Schedule::At::remove(JOBID => $jobid); | |||
132 | } | |||||
133 | ||||||
134 | 1; |