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/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 * Los datos a pasar son:
64 * script : Path completo para el require_once.
65 * id_sistema : Identificador del sistema al que pertenece .
66 * descripcion: Es lo que permite al usuario identificar al proecso.
67 * owner : Login@Organismo de la persona responsable del proceso.
70 * destinos : Login@Organismo separado por comas de aquellos usuarios
71 * que deben poder ver los resultados del proceso.
72 * prioridad : Indica la prioridad del proceso.
73 * notificar : Indica si hay que notificar al owner y a los destinos
74 * cuando finalize el proceso.
75 * resultado : En caso que el proceso genere archivos resultado, se debe
76 * indicar aqui el nombre del archivo que deben visualizar
79 * @param DB $db Conexion a la base de datos.
80 * @param mixed $datos Datos necesarios del proceso.
85 function agregarProceso($db, $datos) {
86 //XXX Dentro de los datos puede estar el tiempo estimado de ejecucion
87 //del proceso. Esta informacion podria ser utilizada en futuras
88 //versiones para asignar servidores.
91 if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
92 $datos = $datos->obtenerDatos();
94 elseif (!is_array($datos)) {
95 return new PEAR_Error ("Error con los datos pasados. El segundo".
96 " parametro debe ser un array asociativo o una instancia".
97 " del objeto YATTA_Proceso.");
99 $res = $this->_obtenerServidor($db);
101 if (DB::isError($res)) {
104 $datos['server'] = $res;
105 $datos['fecha'] = date('Y-m-d');
106 $res = $db->autoExecute('yatta.procesos', $datos, DB_AUTOQUERY_INSERT);
107 if (DB::isError($res)) {
110 $SERVER =& new YATTA_Servidor;
111 return $SERVER->agregarProceso($db, $datos['server']);
115 * Obtiene los procesos de un usuario.
117 * @param DB $db Conexion a la base de datos.
118 * @param string $owner Usuario duenio de los procesos.
119 * @param int $id Identificador del proceso a buscar
124 function obtenerProcesosUsuario($db, $owner, $id = null) {
125 $proceso =& new YATTA_ProcesoDB;
126 $proceso->owner = $owner;
129 $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
130 $res = $proceso->cargar($res);
134 return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
139 * Actualiza los datos de un proceso al terminar.
141 * @param DB $db Conexion a la base de datos.
142 * @param int $id_proceso Identificador del proceso.
143 * @param int $id_server Identificador del Servidor.
144 * @param int $status Identificador del estado de finalizacion.
145 * @param string $nota Nota de error o similar.
146 * @param string $archivo Nombre del archivo temporal que esta en el fs.
147 * @param int $notificar Indica si hay que notificar al owner.
152 function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
153 null, $archivo = null, $notificar = 0) {
155 //Actualizo la base procesos
156 $sql = 'UPDATE yatta.procesos SET status = '. $status;
158 $sql.= ', nota = '. $nota;
161 $sql.= ', archivo = '. $archivo;
164 $sql.= ', notificar = '. $notificar;
166 $sql.= ' WHERE id = '. $id_proceso;
167 $res = $db->query($sql);
168 if (DB::isError($res)) {
175 "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
176 "p.destinos AS destinos ".
177 "FROM yatta.procesos AS p"/
178 "WHERE p.id = ". $id_proceso);
179 if (DB::isError($res)) {
182 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
183 $dest = split (',', @$res['destinos']);
184 $to = $owner.'.gov.ar';
185 foreach ($dest as $d) {
186 $to = $to . ", $d.gov.ar";
188 $headers = "From: Intranet - YATTA <intranet@mecon.gov.ar>\r\n";
189 $subject = "Proceso finalizado";
190 $body = "El proceso:\n".
191 $res['descripcion'] .
192 "\nha finalizado. Puede verificar el estado de finalizacion\n".
193 "en el sistema YATTA dentro de la intranet.\n".
195 "************************************************************\n".
196 "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
197 "Por favor no responder a esta direccion de e-mail.\n".
198 "************************************************************\n";
199 mail($to, $subject, $body, $headers);
204 $arch = basename ($archivo);
205 rename ($archivo, PATH_TACHO.$arch);
208 //Actualizo los servidores
209 $SERVER =& new YATTA_Servidor;
210 return $SERVER->quitarProceso($db, $id_server);
214 * Busca un proceso en cola para el servidor
216 * @param DB $db Conexion a la base de datos.
217 * @param int $id Identificador del servidor.
222 function obtenerNuevoProceso($db, $id) {
223 $res = $db->query('SELECT p.id AS id, p.script AS script
224 FROM yatta.procesos AS p
225 WHERE p.server = '.$id.' AND status = 0
226 ORDER BY p.prioridad, p.id');
227 // Si hay error lo devuelve.
228 if (DB::isError($res)) {
231 return $res->fetchRow(DB_FETCHMODE_ASSOC);
235 * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
237 * @param DB $db Conexion a la base de datos.
238 * @param int $id Identificador del proceso.
243 function abortar($db, $id) {
244 $res = $db->query('SELECT count(*) AS cuenta
246 WHERE id = '.$id.' AND status = 5');
247 // Si hay error lo devuelve.
248 if (DB::isError($res)) {
251 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
252 return $res['cuenta'];