[795] | 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 | */ |
---|
| 19 | class 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; |
---|
[2591] | 95 | $this->db = &Factory::getInstance('WorkflowObjects')->getDBGalaxia()->Link_ID; |
---|
| 96 | $this->jobManager = &Factory::newInstance('JobManager'); |
---|
[795] | 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); |
---|
[2591] | 228 | $jobScheduler =& Factory::getInstance('JobScheduler'); |
---|
[795] | 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 | ?> |
---|