[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 | require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'ProcessManager.php'; |
---|
| 13 | require_once GALAXIA_LIBRARY . SEP . 'src' . SEP . 'ProcessManager' . SEP . 'JobManager.php'; |
---|
| 14 | require_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 | */ |
---|
| 22 | class 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 | ?> |
---|