1 package SL::System::TaskServer;
5 use parent qw(Rose::Object);
7 use Rose::Object::MakeMethods::Generic (
8 scalar => [ qw(last_command_output) ],
12 use File::Spec::Functions qw(:ALL);
13 use File::Temp qw(tempfile);
15 use SL::System::Process;
23 use constant PID_BASE => "users/pid";
28 my $pid = $self->_read_pid;
29 return ERR_PID_FILE unless $pid;
31 return kill(0, $pid) ? OK : ERR_PROCESS;
37 return $self->status == OK;
43 return $self->_run_script_command('start');
49 return $self->_run_script_command('stop');
55 my $pid = $self->_read_pid;
56 return undef unless $pid;
57 return kill('ALRM', $pid) ? 1 : undef;
67 my $exe_dir = SL::System::Process->exe_dir;
69 foreach my $conf (qw(kivitendo.conf lx_office.conf kivitendo.conf.default)) {
70 my $pid_file_path = catfile(catdir($exe_dir, splitdir(PID_BASE())), "config.${conf}.pid");
72 return join('', read_file($pid_file_path)) * 1 if -f $pid_file_path;
76 sub _run_script_command {
77 my ($self, $command) = @_;
79 my ($fh, $file_name) = tempfile();
80 my $exe = catfile(catdir(SL::System::Process->exe_dir, 'scripts'), 'task_server.pl');
82 system "${exe} ${command} >> ${file_name} 2>&1";
86 $self->last_command_output(read_file($file_name));
88 return $? == 0 ? 1 : undef;
100 SL::System::TaskServer - programmatic interface to the external task server component
105 my $task_server = SL->TaskServer->new;
107 # Start the server if it is not running
108 if (!$task_server->is_running) {
112 # Stop it if it is running
113 if ($task_server->is_running) {
123 Returns C<trueish> if the server is running. This is done by using
124 Perl's C<kill> function with a "signal" of C<0> for the process ID
125 which in turn is read from the daemon's PID file.
127 If the PID file is not found or if C<kill> returns a non-successful
128 value then a C<falsish> value is returned.
130 =item C<last_command_output>
132 Returns the output of the last C<system> command executed, e.g. from a
133 call to L<start> or L<stop>.
137 Starts the task server. Does not check whether or not it is running,
138 neither before not after trying to start it.
140 Returns C<1> if the system command C<./scripts/task_server.pl start>
141 exits with an exit code of C<0> and C<undef> otherwise.
143 The command's output can be queried with L<last_command_output>.
147 Queries the task server status. Returns one of these values:
153 C<OK> or C<0>: the task server is running and signals can be sent to
158 C<ERR_PID_FILE> or C<-1>: the PID file could not be found or read
162 C<ERR_PROCESS> or C<-2>: the PID file could was found and read, but
163 it's not possible to send signals to the process, e.g. because it is
164 not running or owned by a different user ID.
170 Stops the task server. Does not check whether or not it is running,
171 neither before not after trying to start it.
173 Returns C<1> if the system command C<./scripts/task_server.pl stop>
174 exits with an exit code of C<0> and C<undef> otherwise.
176 The command's output can be queried with L<last_command_output>.
180 Sends a signal to the task server process causing it to wake up and
181 process its job queue immediately.
183 Returns C<1> if the signal could be sent and C<undef> otherwise.
193 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>