source: branches/2.2/workflow/inc/class.so_adminjobs.inc.php @ 3167

Revision 3167, 8.1 KB checked in by viani, 14 years ago (diff)

Ticket #1135 - Merged r1990:3166 from /trunk/workflow into /branches/2.2/workflow

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