]> git.llucax.com Git - mecon/yatta.git/blob - lib/YATTA/Controlador.php
Todavia no se probo en servidores. Se agrego funcionalidad que no estaba lista en...
[mecon/yatta.git] / lib / YATTA / Controlador.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     YATTA!
5 -------------------------------------------------------------------------------
6 This file is part of YATTA!.
7
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)
11 any later version.
12
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.
16  
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 -------------------------------------------------------------------------------
24 $Id$
25 -----------------------------------------------------------------------------*/
26
27 require_once 'YATTA/Proceso.php';
28 require_once 'YATTA/ProcesoDB.php';
29 require_once 'YATTA/Servidor.php';
30
31 /**
32  * Clase para el manejo centralizado de toda la informacion de YATTA.
33  *
34  * @access public
35  */
36 class YATTA_Controlador {
37
38     /**
39      * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
40      *
41      * @param DB $db Conexion a la base de datos.
42      *
43      * @return mixed
44      * @access private
45      */
46     function _obtenerServidor($db) {
47         
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.
50         
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)) {
56             return $res;
57         }
58         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
59         return  $res['id'];
60     }
61  
62     /**
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.
66      *
67      * @param  DB $db Conexion a la base de datos.
68      * @param  mixed $datos Datos necesarios del proceso.
69      *
70      * @return mixed
71      * @access public
72      */
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.
77
78         //Si no es un array
79         if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
80             $datos = $datos->obtenerDatos();
81         }
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.");
86         }
87         $res = $this->_obtenerServidor($db);
88
89         if (DB::isError($res)) {
90             return $res;
91         }
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)) {
96             return $res;
97         }
98         $SERVER =& new YATTA_Servidor;
99         return $SERVER->agregarProceso($db, $datos['server']);
100     }
101
102     /**
103      * Obtiene los procesos de un usuario.
104      *
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
108      *
109      * @return mixed
110      * @access public
111      */
112     function obtenerProcesosUsuario($db, $owner, $id = null) {
113         $proceso =& new YATTA_ProcesoDB;
114         $proceso->owner = $owner;
115         if (@$id) {
116             $proceso->id = $id;
117             $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
118             $res = $proceso->cargar($res);
119             return $proceso;
120         }
121         else {
122             return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
123         }
124     }
125
126     /**
127      * Actualiza los datos de un proceso al terminar.
128      *
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.
136      *
137      * @return mixed
138      * @access public
139      */
140     function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
141             null, $archivo = null, $notificar = 0) {
142
143         //Actualizo la base procesos
144         $sql = 'UPDATE yatta.procesos SET status = '. $status;
145         if (@$nota) {
146             $sql.= ', nota = '. $nota;
147         }
148         if (@$archivo) {
149             $sql.= ', archivo = '. $archivo;
150         }
151         if (@$notificar) {
152             $sql.= ', notificar = '. $notificar;
153         }
154         $sql.= ' WHERE id = '. $id_proceso;
155         $res = $db->query($sql);
156         if (DB::isError($res)) {
157             return $res;
158         }
159
160         //NOTIFICO
161         if (@$notificar) {
162             $res = $db->query(
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)) {
168                 return $res;
169             }
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";
175             }
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".
182                 "\n\n\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);
188         }
189
190         //COPIO EL ARCHIVO
191         if (@$archivo) {
192             $arch = basename ($archivo);
193             rename ($archivo, '/var/www/yatta_tacho/'.$arch);
194         }
195         
196         //Actualizo los servidores
197         $SERVER =& new YATTA_Servidor;
198         return $SERVER->quitarProceso($db, $id_server);
199     }
200
201     /**
202      * Busca un proceso en cola para el servidor
203      *
204      * @param DB $db Conexion a la base de datos.
205      * @param int $id Identificador del servidor.
206      *
207      * @return mixed
208      * @access public
209      */
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)) {
217             return $res;
218         }
219         return $res->fetchRow(DB_FETCHMODE_ASSOC);
220     }
221
222     /**
223      * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
224      *
225      * @param DB $db Conexion a la base de datos.
226      * @param int $id Identificador del proceso.
227      *
228      * @return mixed
229      * @access public
230      */
231     function abortar($db, $id) {
232         $res = $db->query('SELECT count(*) AS cuenta 
233                 FROM yatta.procesos
234                 WHERE id = '.$id.' AND status = 5');
235         // Si hay error lo devuelve.
236         if (DB::isError($res)) {
237             return $res;
238         }
239         $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
240         return  $res['cuenta'];
241     }
242 }
243 ?>