1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
5 -------------------------------------------------------------------------------
6 This file is part of YATTA!.
8 YATTA! is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
13 YATTA! is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA 02111-1307 USA
20 -------------------------------------------------------------------------------
21 Creado: vie ene 9 16:28:04 ART 2004
22 Autor: Martin Marrese <mmarre@mecon.gov.ar>
23 -------------------------------------------------------------------------------
25 -----------------------------------------------------------------------------*/
27 require_once 'YATTA/Proceso.php';
28 require_once 'YATTA/ProcesoDB.php';
29 require_once 'YATTA/Servidor.php';
31 define ('PATH_TACHO', '/var/www/sistemas/yatta/tacho/');
34 * Clase para el manejo centralizado de toda la informacion de YATTA.
38 class YATTA_Controlador {
41 * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
43 * @param DB $db Conexion a la base de datos.
48 function _obtenerServidor($db) {
49 $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
50 FROM yatta.servidores AS s
51 ORDER BY ponderacion ASC, s.escala DESC');
52 // Si hay error lo devuelve.
53 if (DB::isError($res)) {
56 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
61 * Agrega un proceso a la base de datos
62 * Recibe un array asociativo con:
64 * script : Path completo para el require_once.
65 * id_sistema : Identificador del sistema al que pertenece. (Es el id que
67 * descripcion: Es lo que permite al usuario identificar al proceso.
68 * owner : Login@Organismo de la persona responsable del proceso.
71 * destinos : Login@Organismo separado por comas de aquellos usuarios
72 * que deben poder ver los resultados del proceso.
73 * prioridad : Indica la prioridad del proceso.
74 * notificar : Indica si hay que notificar al owner y a los destinos
75 * cuando finalize el proceso.
76 * resultado : En caso que el proceso genere archivos resultado, se debe
77 * indicar aqui el nombre del archivo que deben visualizar
79 * parametros : Parametros que hay que pasarle al metodo run del script.
81 * @param DB $db Conexion a la base de datos.
82 * @param mixed $datos Datos necesarios del proceso.
87 function agregarProceso($db, $datos) {
88 //XXX Dentro de los datos puede estar el tiempo estimado de ejecucion
89 //del proceso. Esta informacion podria ser utilizada en futuras
90 //versiones para asignar servidores.
93 if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
94 $datos = $datos->obtenerDatos();
96 elseif (!is_array($datos)) {
97 return new PEAR_Error ("Error con los datos pasados. El segundo".
98 " parametro debe ser un array asociativo o una instancia".
99 " del objeto YATTA_ProcesoDB.");
101 $res = $this->_obtenerServidor($db);
103 //Serializo los parametros
104 if (@$datos['parametros']) {
105 $datos['parametros'] = serialize($datos['parametros']);
108 if (DB::isError($res)) {
111 $datos['server'] = $res;
112 $datos['fecha'] = date('Y-m-d');
113 $res = $db->autoExecute('yatta.procesos', $datos, DB_AUTOQUERY_INSERT);
114 if (DB::isError($res)) {
117 $SERVER =& new YATTA_Servidor;
118 return $SERVER->agregarProceso($db, $datos['server']);
122 * Obtiene los procesos de un usuario.
124 * @param DB $db Conexion a la base de datos.
125 * @param string $owner Usuario duenio de los procesos.
126 * @param int $id Identificador del proceso a buscar
131 function obtenerProcesosUsuario($db, $owner, $id = null) {
132 $proceso =& new YATTA_ProcesoDB;
133 $proceso->owner = $owner;
136 $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
137 $res = $proceso->cargar($res);
141 return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
146 * Actualiza los datos de un proceso al terminar.
148 * @param DB $db Conexion a la base de datos.
149 * @param int $id_proceso Identificador del proceso.
150 * @param int $id_server Identificador del Servidor.
151 * @param int $status Identificador del estado de finalizacion.
152 * @param string $nota Nota de error o similar.
153 * @param string $archivo Nombre del archivo temporal que esta en el fs.
154 * @param int $notificar Indica si hay que notificar al owner.
159 function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
160 null, $archivo = null, $notificar = 0) {
162 //Actualizo la base procesos
163 $sql = 'UPDATE yatta.procesos SET status = '.
164 $db->quoteSmart($status);
166 $sql.= ', nota = '. $db->quoteSmart($nota);
169 $sql.= ', archivo = '. $db->quoteSmart($archivo);
172 $sql.= ', notificar = '. $db->quoteSmart($notificar);
174 $sql.= ' WHERE id = '. $db->quoteSmart($id_proceso);
176 $res = $db->query($sql);
177 if (DB::isError($res)) {
183 $this->_emailUsuario ($db, $id_proceso, $status, $nota, $archivo);
188 $arch = basename ($archivo);
189 rename ($archivo, PATH_TACHO.$arch);
192 //Actualizo los servidores
193 $SERVER =& new YATTA_Servidor;
194 return $SERVER->quitarProceso($db, $id_server);
198 * Busca un proceso en cola para el servidor
200 * @param DB $db Conexion a la base de datos.
201 * @param int $id Identificador del servidor.
206 function obtenerNuevoProceso($db, $id) {
207 $res = $db->query('SELECT p.id AS id, p.script AS script, p.parametros
209 FROM yatta.procesos AS p
210 WHERE p.server = '.$id.' AND status = 0
211 ORDER BY p.prioridad, p.id');
212 // Si hay error lo devuelve.
213 if (DB::isError($res)) {
216 return $res->fetchRow(DB_FETCHMODE_ASSOC);
220 * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
222 * @param DB $db Conexion a la base de datos.
223 * @param int $id Identificador del proceso.
228 function abortar($db, $id) {
229 $res = $db->query('SELECT count(*) AS cuenta
231 WHERE id = '.$id.' AND status = 5');
232 // Si hay error lo devuelve.
233 if (DB::isError($res)) {
236 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
237 return $res['cuenta'];
241 * Envia el email al usuario informandole la finalizacion de uno de sus
244 * @param DB $db Conexion a la base de datos.
245 * @param int $id_proceso Identificador del proceso.
246 * @param int $status Identificador del estado de finalizacion.
247 * @param string $nota Nota de error o similar.
248 * @param string $archivo Nombre del archivo temporal que esta en el fs.
253 function _emailUsuario($db, $id_proceso, $status, $nota = null, $archivo = null) {
255 "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
256 "p.destinos AS destinos, p.resultado AS resultado, ".
257 "p.estado AS estado, p.nota AS nota ".
258 "FROM yatta.procesos AS p".
259 "WHERE p.id = ". $id_proceso);
260 if (DB::isError($res)) {
263 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
265 //@FIXME El email se lo envio al owner y a los destinos, o al owner solamente?
267 $dest = split (',', @$res['destinos']);
268 $to = $owner.'.gov.ar';
269 foreach ($dest as $d) {
270 $to = $to . ", $d.gov.ar";
272 $headers = "From: Intranet - YATTA <intranet2@mecon.gov.ar>\r\n";
273 $subject = "INTRANET - YATTA - Proceso Finalizado";
275 $body = "El proceso {$res['descripcion']} ha finalizado ";
279 $body .= "con éxito.\n";
282 $body .= "con errores.\n";
284 $body .= "Motivo:\n$nota\n";
288 $body .= "porque se abortó su ejecución.\n";
290 $body .= "Motivo:\n$nota\n";
296 $body .= "Usted puede obtener el archivo resultado del proceso\n".
297 "en la seccion Archivos del sistema YATTA.\n".
298 "Recuerde que este archivo puede ser borrado sin previo aviso\n".
299 "por tres motivos:\n".
300 "\t1- El archivo supera la antigüedad máxima establecida.\n".
301 "\t2- Se supero la capacidad máxima de información permitida\n".
303 "\t3- Decisión administrativa por mantenimiento de los servidores.\n";
309 "************************************************************\n".
310 "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
311 "Por favor no responder a esta direccion de e-mail.\n".
312 "************************************************************\n";
314 mail($to, $subject, $body, $headers);
318 * Verifica si un usuario tiene alguna informacion en la base de yatta para
319 * mostrarle el icono en la lista de sistemas de la intranet.
321 * @param DB $db Conexion a la base de datos.
322 * @param string $login Usuario que se esta verificando
328 function visible($DB, $login) {
329 $res = $db->query('SELECT count (p.id) AS id FROM yatta.procesos AS p'.
330 ' WHERE (p.owner LIKE \'%'. $login .'%\') OR'.
331 ' (p.destinos LIKE \'%'. $login .'%\')');
333 if (DB::isError($res)) {
336 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
342 * Busca los usuarios que tienen al menos una entrada en el mysql como
345 * @param DB $db Conexion a la base de datos.
350 function obtenerListaOwners($db) {
351 return $db->query('SELECT DISTINCT p.owner AS owner
352 FROM yatta.procesos As p');
356 * Obtiene las cuotas especiales de los usuarios.
358 * @param DB $db Conexion a la base de datos.
363 function obtenerListaCuotas($db) {
364 return $db->query('SELECT login, cuota