Task-Server und -Control-Modul auf neue Konfigurationsdateinamen angepasst
[kivitendo-erp.git] / SL / System / TaskServer.pm
1 package SL::System::TaskServer;
2
3 use strict;
4
5 use parent qw(Rose::Object);
6
7 use Rose::Object::MakeMethods::Generic (
8   scalar => [ qw(last_command_output) ],
9 );
10
11 use File::Slurp;
12 use File::Spec::Functions qw(:ALL);
13
14 use SL::System::Process;
15
16 use constant {
17   OK           =>  0,
18   ERR_PID_FILE => -1,
19   ERR_PROCESS  => -2,
20 };
21
22 sub status {
23   my ($self) = @_;
24
25   my $pid = $self->_read_pid;
26   return ERR_PID_FILE unless $pid;
27
28   return kill(0, $pid) ? OK : ERR_PROCESS;
29 }
30
31 sub is_running {
32   my ($self) = @_;
33
34   return $self->status == OK;
35 }
36
37 sub start {
38   my ($self) = @_;
39
40   return $self->_run_script_command('start');
41 }
42
43 sub stop {
44   my ($self) = @_;
45
46   return $self->_run_script_command('stop');
47 }
48
49 sub wake_up {
50   my ($self) = @_;
51
52   my $pid = $self->_read_pid;
53   return undef unless $pid;
54   return kill('ALRM', $pid) ? 1 : undef;
55 }
56
57 #
58 # private methods
59 #
60
61 sub _read_pid {
62   my ($self) = @_;
63
64   my $exe_dir = SL::System::Process->exe_dir;
65
66   foreach my $conf (qw(kivitendo.conf lx_office.conf kivitendo.conf.default)) {
67     my $pid_file_name = join '.', splitdir($exe_dir), "config.${conf}.pid";
68     my $pid_file_path = catfile(catdir($exe_dir, 'users', 'pid'), $pid_file_name);
69
70     return join('', read_file($pid_file_path)) * 1 if -f $pid_file_path;
71   }
72 }
73
74 sub _run_script_command {
75   my ($self, $command) = @_;
76
77   my $exe = catfile(catdir(SL::System::Process->exe_dir, 'scripts'), 'task_server.pl');
78   $self->last_command_output(`${exe} ${command}`);
79
80   return $? == 0 ? 1 : undef;
81 }
82
83 1;
84 __END__
85
86 =pod
87
88 =encoding utf8
89
90 =head1 NAME
91
92 SL::System::TaskServer - programmatic interface to the external task server component
93
94 =head1 SYNOPSIS
95
96   # Create interface
97   my $task_server = SL->TaskServer->new;
98
99   # Start the server if it is not running
100   if (!$task_server->is_running) {
101     $task_server->start;
102   }
103
104   # Stop it if it is running
105   if ($task_server->is_running) {
106     $task_server->stop;
107   }
108
109 =head1 FUNCTIONS
110
111 =over 4
112
113 =item C<is_running>
114
115 Returns C<trueish> if the server is running. This is done by using
116 Perl's C<kill> function with a "signal" of C<0> for the process ID
117 which in turn is read from the daemon's PID file.
118
119 If the PID file is not found or if C<kill> returns a non-successful
120 value then a C<falsish> value is returned.
121
122 =item C<last_command_output>
123
124 Returns the output of the last C<system> command executed, e.g. from a
125 call to L<start> or L<stop>.
126
127 =item C<start>
128
129 Starts the task server. Does not check whether or not it is running,
130 neither before not after trying to start it.
131
132 Returns C<1> if the system command C<./scripts/task_server.pl start>
133 exits with an exit code of C<0> and C<undef> otherwise.
134
135 The command's output can be queried with L<last_command_output>.
136
137 =item C<status>
138
139 Queries the task server status. Returns one of these values:
140
141 =over 4
142
143 =item *
144
145 C<OK> or C<0>: the task server is running and signals can be sent to
146 it.
147
148 =item *
149
150 C<ERR_PID_FILE> or C<-1>: the PID file could not be found or read
151
152 =item *
153
154 C<ERR_PROCESS> or C<-2>: the PID file could was found and read, but
155 it's not possible to send signals to the process, e.g. because it is
156 not running or owned by a different user ID.
157
158 =back
159
160 =item C<stop>
161
162 Stops the task server. Does not check whether or not it is running,
163 neither before not after trying to start it.
164
165 Returns C<1> if the system command C<./scripts/task_server.pl stop>
166 exits with an exit code of C<0> and C<undef> otherwise.
167
168 The command's output can be queried with L<last_command_output>.
169
170 =item C<wake_up>
171
172 Sends a signal to the task server process causing it to wake up and
173 process its job queue immediately.
174
175 Returns C<1> if the signal could be sent and C<undef> otherwise.
176
177 =back
178
179 =head1 BUGS
180
181 Nothing here yet.
182
183 =head1 AUTHOR
184
185 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
186
187 =cut