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;
147 $sql.= ', nota = '. $nota;
150 $sql.= ', archivo = '. $archivo;
153 $sql.= ', notificar = '. $notificar;
155 $sql.= ' WHERE id = '. $id_proceso;
157 $res = $db->query($sql);
158 // Si hay error lo devuelve.
159 if (DB::isError($res)) {
163 //@TODO Aca notificar
164 // if (@$notificar) {
167 //Actualizo los servidores
168 $SERVER =& new YATTA_Servidor;
169 return $SERVER->quitarProceso($db, $id_server);
173 * Busca un proceso en cola para el servidor
175 * @param DB $db Conexion a la base de datos.
176 * @param int $id Identificador del servidor.
181 function obtenerNuevoProceso($db, $id) {
182 $res = $db->query('SELECT p.id AS id, p.script AS script
183 FROM yatta.procesos AS p
184 WHERE p.server = '.$id.' AND status = 0
185 ORDER BY p.prioridad, p.id');
186 // Si hay error lo devuelve.
187 if (DB::isError($res)) {
190 return $res->fetchRow(DB_FETCHMODE_ASSOC);
194 * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
196 * @param DB $db Conexion a la base de datos.
197 * @param int $id Identificador del proceso.
202 function abortar($db, $id) {
203 $res = $db->query('SELECT count(*) AS cuenta
205 WHERE id = '.$id.' AND status = 5');
206 // Si hay error lo devuelve.
207 if (DB::isError($res)) {
210 $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
211 return $res['cuenta'];