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';
32 * Clase para el manejo centralizado de toda la informacion de YATTA.
36 class YATTA_Controlador {
39 * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
41 * @param DB $db Conexion a la base de datos.
46 function _obtenerServidor($db) {
48 //@FIXME La ponderacion esta mal. No tengo que buscar el que tenga mas
49 //alta o mas baja OJO!!! Volver a pensar el calculo.
51 $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
52 FROM yatta.servidores AS s
53 ORDER BY ponderacion ASC, s.escala DESC');
54 // Si hay error lo devuelve.
55 if (DB::isError($res)) {
58 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
63 * Agrega un proceso a la base de datos
64 * Los datos obligatorios a pasar son: script, id_sistema, descripcion,
65 * owner, destinos, prioridad, scheduling y notificar.
67 * @param DB $db Conexion a la base de datos.
68 * @param mixed $datos Datos necesarios del proceso.
73 function agregarProceso($db, $datos) {
74 //XXX Dentro de los datos puede estar el tiempo estimado de ejecucion
75 //del proceso. Esta informacion podria ser utilizada en futuras
76 //versiones para asignar servidores.
79 if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
80 $datos = $datos->obtenerDatos();
82 elseif (!is_array($datos)) {
83 return new PEAR_Error ("Error con los datos pasados. El segundo".
84 " parametro debe ser un array asociativo o una instancia".
85 " del objeto YATTA_Proceso.");
87 $res = $this->_obtenerServidor($db);
89 if (DB::isError($res)) {
92 $datos['server'] = $res;
93 $datos['fecha'] = date('Y-m-d');
94 $res = $db->autoExecute('yatta.procesos', $datos, DB_AUTOQUERY_INSERT);
95 if (DB::isError($res)) {
98 $SERVER =& new YATTA_Servidor;
99 return $SERVER->agregarProceso($db, $datos['server']);
103 * Obtiene los procesos de un usuario.
105 * @param DB $db Conexion a la base de datos.
106 * @param string $owner Usuario duenio de los procesos.
107 * @param int $id Identificador del proceso a buscar
112 function obtenerProcesosUsuario($db, $owner, $id = null) {
113 $proceso =& new YATTA_ProcesoDB;
114 $proceso->owner = $owner;
117 $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
118 $res = $proceso->cargar($res);
122 return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
127 * Actualiza los datos de un proceso al terminar.
129 * @param DB $db Conexion a la base de datos.
130 * @param int $id_proceso Identificador del proceso.
131 * @param int $id_server Identificador del Servidor.
132 * @param int $status Identificador del estado de finalizacion.
133 * @param string $nota Nota de error o similar.
134 * @param string $archivo Nombre del archivo temporal que esta en el fs.
135 * @param int $notificar Indica si hay que notificar al owner.
140 function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
141 null, $archivo = null, $notificar = 0) {
143 //Actualizo la base procesos
144 $sql = 'UPDATE yatta.procesos SET status = '. $status;
146 $sql.= ', nota = '. $nota;
149 $sql.= ', archivo = '. $archivo;
152 $sql.= ', notificar = '. $notificar;
154 $sql.= ' WHERE id = '. $id_proceso;
155 $res = $db->query($sql);
156 if (DB::isError($res)) {
163 "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
164 "p.destinos AS destinos ".
165 "FROM yatta.procesos AS p"/
166 "WHERE p.id = ". $id_proceso);
167 if (DB::isError($res)) {
170 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
171 $dest = split (',', @$res['destinos']);
172 $to = $owner.'.gov.ar';
173 foreach ($dest as $d) {
174 $to = $to . ", $d.gov.ar";
176 $headers = "From: Intranet - YATTA <intranet@mecon.gov.ar>\r\n";
177 $subject = "Proceso finalizado";
178 $body = "El proceso:\n".
179 $res['descripcion'] .
180 "\nha finalizado. Puede verificar el estado de finalizacion\n".
181 "en el sistema YATTA dentro de la intranet.\n".
183 "************************************************************\n".
184 "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
185 "Por favor no responder a esta direccion de e-mail.\n".
186 "************************************************************\n";
187 mail($to, $subject, $body, $headers);
192 $arch = basename ($archivo);
193 rename ($archivo, '/var/www/yatta_tacho/'.$arch);
196 //Actualizo los servidores
197 $SERVER =& new YATTA_Servidor;
198 return $SERVER->quitarProceso($db, $id_server);
202 * Busca un proceso en cola para el servidor
204 * @param DB $db Conexion a la base de datos.
205 * @param int $id Identificador del servidor.
210 function obtenerNuevoProceso($db, $id) {
211 $res = $db->query('SELECT p.id AS id, p.script AS script
212 FROM yatta.procesos AS p
213 WHERE p.server = '.$id.' AND status = 0
214 ORDER BY p.prioridad, p.id');
215 // Si hay error lo devuelve.
216 if (DB::isError($res)) {
219 return $res->fetchRow(DB_FETCHMODE_ASSOC);
223 * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
225 * @param DB $db Conexion a la base de datos.
226 * @param int $id Identificador del proceso.
231 function abortar($db, $id) {
232 $res = $db->query('SELECT count(*) AS cuenta
234 WHERE id = '.$id.' AND status = 5');
235 // Si hay error lo devuelve.
236 if (DB::isError($res)) {
239 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
240 return $res['cuenta'];