source: branches/1.2/workflow/inc/class.so_adminjobs.inc.php @ 1349

Revision 1349, 8.3 KB checked in by niltonneto, 15 years ago (diff)

Ticket #561 - Inclusão do módulo Workflow faltante nessa versão.

Line 
1<?php
2/**************************************************************************\
3* eGroupWare                                                               *
4* http://www.egroupware.org                                                *
5* --------------------------------------------                             *
6*  This program is free software; you can redistribute it and/or modify it *
7*  under the terms of the GNU General Public License as published by the   *
8*  Free Software Foundation; either version 2 of the License, or (at your  *
9*  option) any later version.                                              *
10\**************************************************************************/
11
12require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'ProcessManager.php';
13require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'JobManager.php';
14require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'ActivityManager.php';
15
16/**
17 * Camada Model para Administração de Jobs.
18 * @package Workflow
19 * @author Sidnei Augusto Drovetto Jr. - drovetto@gmail.com
20 * @license http://www.gnu.org/copyleft/gpl.html GPL
21 */
22class so_adminjobs
23{
24        /**
25         * @var bool True se o usuário for administrador do expresso.
26         * @access private
27         */
28        private $isAdmin;
29
30        /**
31         * @var int ID do usuário logado no Expresso
32         * @access private
33         */
34        private $userID;
35
36        /**
37         * @var object Link para a ACL do Workflow.
38         * @access private
39         */
40        private $acl;
41
42        /**
43         * @var object Link para o Banco de Dados do Expresso.
44         * @access private
45         */
46        private $db;
47
48        /**
49         * @var object Link para o objeto de Administração de Jobs
50         * @access private
51         */
52        private $jobManager;
53
54        /**
55         * Checa se o usuário possui direitos administrativos em um processo.
56         * @param int $processID O ID do processo que se quer checar se o usuário tem direito administrativo.
57         * @param int $jobID O ID do job que se quer checar acesso.
58         * @return bool True em caso de sucesso. Em caso de falha, a execução é abortada.
59         * @access private
60         */
61        private function checkAccess($processID, $jobID = null)
62        {
63                $error = array('error' => array('Você não tem permissão para executar este procedimento!'));
64
65                /* the user is an administrator */
66                if ($this->isAdmin)
67                        return true;
68
69                if (is_null($processID) && is_null($jobID))
70                        return $error;
71
72                if (!is_null($jobID))
73                {
74                        $jobInfo = $this->jobManager->getJob((int) $jobID);
75
76                        if (is_null($processID))
77                                $processID = $jobInfo['wf_process_id'];
78                        else
79                                if ($jobInfo['wf_process_id'] != $processID)
80                                        return $error;
81                }
82
83                if ($this->acl->checkUserGroupAccessToResource('PRO', $this->userID, $processID))
84                        return true;
85
86                return $error;
87        }
88
89        /**
90         * Construtor da classe so_adminjobs
91         * @return object
92         */
93        function so_adminjobs()
94        {
95                $this->userID = $_SESSION['phpgw_info']['workflow']['account_id'];
96                $this->isAdmin = $_SESSION['phpgw_info']['workflow']['user_is_admin'];
97                $this->acl = &$GLOBALS['ajax']->acl;
98                $this->db = &$GLOBALS['workflow']['workflowObjects']->getDBGalaxia()->Link_ID;
99                $this->jobManager = new JobManager(&$this->db);
100        }
101
102        /**
103         * Carrega a lista de todos os jobs de um determinado processo.
104         * @param int $processID O ID do processo
105         * @return array Lista dos jobs
106         * @access public
107         */
108        function loadJobs($processID)
109        {
110                $processID = (int) $processID;
111                if (($errors = $this->checkAccess($processID)) !== true)
112                        return $errors;
113
114                return $this->jobManager->getJobsByProcessID($processID);
115        }
116
117        /**
118         * Atualiza um job
119         * @param int $jobID O ID do Job que será atualizado
120         * @param int $processID O ID do processo a qual o Job pertence
121         * @param string $name O nome do Job
122         * @param string $description A descrição do Job
123         * @param string $timeStart Uma string cujo conteúdo é um data e horário devidamente formatados
124         * @param int $intervalValue O intervalo de repetição
125         * @param int $intervalUnity A unidade de repetição (dia, mês, etc.)
126         * @param int $dateType O tipo que define quando o Job é executado
127         * @param int $weekDays Inteiro que representa os dias da semana em que o Job será executado
128         * @param int $monthOffset Intervalo de execução relativa a mês
129         * @param bool $active Indica se o job está ativo (true) ou não (false)
130         * @return array Lista de possíveis erros
131         * @access public
132         */
133        function updateJob($jobID, $processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active)
134        {
135                $processID = (int) $processID;
136                $jobID = (int) $jobID;
137                if (($errors = $this->checkAccess($processID, $jobID)) !== true)
138                        return $errors;
139
140                $this->jobManager->updateJob($jobID, $processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active);
141                return array('error' => $this->jobManager->get_error(true));
142        }
143
144        /**
145         * Cria um novo Job
146         * @param int $processID O ID do processo a qual o Job pertence
147         * @param string $name O nome do Job
148         * @param string $description A descrição do Job
149         * @param string $timeStart Uma string cujo conteúdo é um data e horário devidamente formatados
150         * @param int $intervalValue O intervalo de repetição
151         * @param int $intervalUnity A unidade de repetição (dia, mês, etc.)
152         * @param int $dateType O tipo que define quando o Job é executado
153         * @param int $weekDays Inteiro que representa os dias da semana em que o Job será executado
154         * @param int $monthOffset Intervalo de execução relativa a mês
155         * @param bool $active Indica se o job está ativo (true) ou não (false)
156         * @return array Lista de possíveis erros
157         * @access public
158         */
159        function createJob($processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active)
160        {
161                $processID = (int) $processID;
162                if (($errors = $this->checkAccess($processID)) !== true)
163                        return $errors;
164
165                $this->jobManager->createJob($processID, $name, $description, $timeStart, $intervalValue, $intervalUnity, $dateType, $weekDays, $monthOffset, $active);
166                return array('error' => $this->jobManager->get_error(true));
167        }
168
169        /**
170         * Remove um Job
171         * @param int $jobID O ID do job
172         * @return void
173         * @access public
174         */
175        function removeJob($jobID)
176        {
177                $jobID = (int) $jobID;
178                if (($errors = $this->checkAccess(null, $jobID)) !== true)
179                        return $errors;
180
181                return $this->jobManager->removeJob($jobID);
182        }
183
184        /**
185         * Carrega a lista dos logs de um Job
186         * @param int $jobID O ID do job
187         * @return array Lista dos logs
188         * @access public
189         */
190        function loadLogs($jobID)
191        {
192                $jobID = (int) $jobID;
193                if (($errors = $this->checkAccess(null, $jobID)) !== true)
194                        return $errors;
195
196                return $this->jobManager->getLogsByJobID($jobID);
197        }
198
199        /**
200         * Alterna o status do Job entre ativado e desativado
201         * @param int $jobID O ID do job
202         * @return array Lista de possíveis erros
203         * @access public
204         */
205        function toggleActive($jobID)
206        {
207                $jobID = (int) $jobID;
208                if (($errors = $this->checkAccess(null, $jobID)) !== true)
209                        return $errors;
210
211                $jobInfo = $this->jobManager->getJob($jobID);
212                $newStatus = ($jobInfo['active'] != 't');
213                $this->jobManager->setActive($jobID, $newStatus);
214                return array('error' => $this->jobManager->get_error(true));
215        }
216
217        /**
218         * Executa um determinado Job
219         * @param int $jobID O ID do job
220         * @return array Uma array contendo a saída da execução do Job (saída padrão e saída de erro) e outras mensagens
221         * @access public
222         */
223        function runJob($jobID)
224        {
225                $jobID = (int) $jobID;
226                if (($errors = $this->checkAccess(null, $jobID)) !== true)
227                        return $errors;
228
229                $output = array();
230                $job = $this->jobManager->getJob($jobID);
231                $jobScheduler = &$GLOBALS['workflow']['factory']->getInstance('JobScheduler');
232                $totalTime = microtime(true);
233                $thread = $jobScheduler->execute($job, true);
234                while ($thread->isActive())
235                        usleep(50000);
236                $totalTime = microtime(true) - $totalTime;
237
238                $output['output']['messages'] = array();
239                $output['output']['messages'][] = 'Tempo de execução: ' . number_format($totalTime, 4) . 's (o tempo máximo permitido é de ' . JobScheduler::MAXIMUM_EXECUTION_TIME/1000000.0 . 's)';
240                $output['output']['default'] = htmlentities($thread->listen());
241                $output['output']['error'] = htmlentities($thread->getError());
242
243                if ($thread->isActive())
244                        $thread->kill();
245                else
246                        $thread->close();
247
248                if (strpos($output['output']['error'], 'PHP Fatal error') !== false)
249                        $this->jobManager->writeLog($jobID, $jobScheduler->getCurrentDate(), $output['output']['error'], JobManager::STATUS_ERROR);
250
251                return $output;
252        }
253}
254?>
Note: See TracBrowser for help on using the repository browser.