]> git.llucax.com Git - mecon/yatta.git/blobdiff - lib/YATTA/Controlador.php
BugFix en YATTA_DB
[mecon/yatta.git] / lib / YATTA / Controlador.php
index 670ddd0271e48c7245330dbd5e45f83cf63c7a16..0a98e0c08163ef244543a40b23f7b3ddb2fafe4f 100644 (file)
@@ -25,8 +25,11 @@ $Id$
 -----------------------------------------------------------------------------*/
 
 require_once 'YATTA/Proceso.php';
+require_once 'YATTA/ProcesoDB.php';
 require_once 'YATTA/Servidor.php';
 
+define ('PATH_TACHO', '/var/www/yatta/tacho/');
+
 /**
  * Clase para el manejo centralizado de toda la informacion de YATTA.
  *
@@ -34,10 +37,44 @@ require_once 'YATTA/Servidor.php';
  */
 class YATTA_Controlador {
 
+    /**
+     * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
+     *
+     * @param DB $db Conexion a la base de datos.
+     *
+     * @return mixed
+     * @access private
+     */
+    function _obtenerServidor($db) {
+        $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
+            FROM yatta.servidores AS s 
+            ORDER BY ponderacion ASC, s.escala DESC');
+        // Si hay error lo devuelve.
+        if (DB::isError($res)) {
+            return $res;
+        }
+        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+        return  $res['id'];
+    }
     /**
      * Agrega un proceso a la base de datos
-     * Los datos obligatorios a pasar son: script, id_sistema, descripcion,
-     * owner, destinos, prioridad, scheduling y notificar.
+     * Los datos a pasar son: 
+     *  Obligatorios
+     *   script     : Path completo para el require_once.
+     *   id_sistema : Identificador del sistema al que pertenece .
+     *   descripcion: Es lo que permite al usuario identificar al proecso.
+     *   owner      : Login@Organismo de la persona responsable del proceso.
+     *
+     *  Opcionales
+     *   destinos   : Login@Organismo separado por comas de aquellos usuarios
+     *                que deben poder ver los resultados del proceso.
+     *   prioridad  : Indica la prioridad del proceso.
+     *   notificar  : Indica si hay que notificar al owner y a los destinos
+     *                cuando finalize el proceso.
+     *   resultado  : En caso que el proceso genere archivos resultado, se debe
+     *                indicar aqui el nombre del archivo que deben visualizar
+     *                los usuarios.
      *
      * @param  DB $db Conexion a la base de datos.
      * @param  mixed $datos Datos necesarios del proceso.
@@ -49,10 +86,18 @@ class YATTA_Controlador {
         //XXX Dentro de los datos puede estar el tiempo estimado de ejecucion
         //del proceso. Esta informacion podria ser utilizada en futuras
         //versiones para asignar servidores.
-        if (!is_array($datos)) {
+
+        //Si no es un array
+        if (is_object($datos) && is_a ($datos, 'YATTA_ProcesoDB')) {
             $datos = $datos->obtenerDatos();
         }
+        elseif (!is_array($datos)) {
+            return new PEAR_Error ("Error con los datos pasados. El segundo".
+                    " parametro debe ser un array asociativo o una instancia".
+                    " del objeto YATTA_Proceso.");
+        }
         $res = $this->_obtenerServidor($db);
+
         if (DB::isError($res)) {
             return $res;
         }
@@ -63,67 +108,148 @@ class YATTA_Controlador {
             return $res;
         }
         $SERVER =& new YATTA_Servidor;
-        $res = $SERVER->agregarProceso($db, $datos['server']);
-        return $res;
+        return $SERVER->agregarProceso($db, $datos['server']);
     }
 
     /**
-     * Obtiene el nombre del servidor al cual asignar un nuevo proceso.
+     * Obtiene los procesos de un usuario.
      *
      * @param DB $db Conexion a la base de datos.
+     * @param string $owner Usuario duenio de los procesos.
+     * @param int $id Identificador del proceso a buscar
      *
      * @return mixed
-     * @access private
+     * @access public
      */
-    function _obtenerServidor($db) {
-        $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion
-            FROM yatta.servidores AS s 
-            ORDER BY ponderacion DESC, s.escala DESC');
-        // Si hay error lo devuelve.
+    function obtenerProcesosUsuario($db, $owner, $id = null) {
+        $proceso =& new YATTA_ProcesoDB;
+        $proceso->owner = $owner;
+        if (@$id) {
+            $proceso->id = $id;
+            $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
+            $res = $proceso->cargar($res);
+            return $proceso;
+        }
+        else {
+            return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
+        }
+    }
+
+    /**
+     * Actualiza los datos de un proceso al terminar.
+     *
+     * @param DB $db Conexion a la base de datos.
+     * @param int $id_proceso Identificador del proceso.
+     * @param int $id_server Identificador del Servidor.
+     * @param int $status Identificador del estado de finalizacion.
+     * @param string $nota Nota de error o similar.
+     * @param string $archivo Nombre del archivo temporal que esta en el fs.
+     * @param int $notificar Indica si hay que notificar al owner.
+     *
+     * @return mixed
+     * @access public
+     */
+    function terminarProceso($db, $id_proceso, $id_server, $status, $nota =
+            null, $archivo = null, $notificar = 0) {
+
+        //Actualizo la base procesos
+        $sql = 'UPDATE yatta.procesos SET status = '. $status;
+        if (@$nota) {
+            $sql.= ', nota = '. $nota;
+        }
+        if (@$archivo) {
+            $sql.= ', archivo = '. $archivo;
+        }
+        if (@$notificar) {
+            $sql.= ', notificar = '. $notificar;
+        }
+        $sql.= ' WHERE id = '. $id_proceso;
+        $res = $db->query($sql);
         if (DB::isError($res)) {
             return $res;
         }
-        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
-        return  $res['id'];
+
+        //NOTIFICO
+        if (@$notificar) {
+            $res = $db->query(
+                    "SELECT p.descripcion AS descripcion, p.owner AS owner, ".
+                    "p.destinos AS destinos ".
+                    "FROM yatta.procesos AS p"/
+                    "WHERE p.id = ". $id_proceso);
+            if (DB::isError($res)) {
+                return $res;
+            }
+            $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+            $dest = split (',', @$res['destinos']);
+            $to = $owner.'.gov.ar';
+            foreach ($dest as $d) {
+                $to = $to . ", $d.gov.ar";
+            }
+            $headers = "From: Intranet - YATTA <intranet@mecon.gov.ar>\r\n";
+            $subject = "Proceso finalizado";
+            $body = "El proceso:\n".
+                $res['descripcion'] .
+                "\nha finalizado. Puede verificar el estado de finalizacion\n".
+                "en el sistema YATTA dentro de la intranet.\n".
+                "\n\n\n".
+                "************************************************************\n".
+                "Este es un mensaje generado automaticamente por MECON_YATTA.\n".
+                "Por favor no responder a esta direccion de e-mail.\n".
+                "************************************************************\n";
+            mail($to, $subject, $body, $headers);
+        }
+
+        //COPIO EL ARCHIVO
+        if (@$archivo) {
+            $arch = basename ($archivo);
+            rename ($archivo, PATH_TACHO.$arch);
+        }
+        
+        //Actualizo los servidores
+        $SERVER =& new YATTA_Servidor;
+        return $SERVER->quitarProceso($db, $id_server);
     }
+
     /**
-     * Obtiene los procesos de un usuario.
+     * Busca un proceso en cola para el servidor
      *
      * @param DB $db Conexion a la base de datos.
-     * @param string $owner Usuario duenio de los procesos.
-     * @param int $id Identificador del proceso a buscar
+     * @param int $id Identificador del servidor.
      *
      * @return mixed
      * @access public
      */
-    function obtenerProcesosUsuario($db, $owner, $id = null) {
-        $proceso =& new YATTA_Proceso;
-        $proceso->owner = $owner;
-        if (@$id) {
-            $proceso->id = $id;
+    function obtenerNuevoProceso($db, $id) {
+        $res = $db->query('SELECT p.id AS id, p.script AS script
+                FROM yatta.procesos AS p
+                WHERE p.server = '.$id.' AND status = 0 
+                ORDER BY p.prioridad, p.id');
+        // Si hay error lo devuelve.
+        if (DB::isError($res)) {
+            return $res;
         }
-        return $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
+        return $res->fetchRow(DB_FETCHMODE_ASSOC);
     }
 
     /**
-     * Obtiene un proceso de un usuario.
+     * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion.
      *
      * @param DB $db Conexion a la base de datos.
-     * @param string $owner Usuario duenio de los procesos.
-     * @param int $id Identificador del proceso a buscar
+     * @param int $id Identificador del proceso.
      *
      * @return mixed
      * @access public
      */
-    function obtenerProcesoUsuario($db, $owner, $id) {
-        $proceso =& new YATTA_Proceso;
-        $proceso->owner = $owner;
-        $proceso->id = $id;
-        $res = $proceso->buscar($db, MECON_DBO_AND, ' id ASC');
-        $proceso->cargar($res);
-        return $proceso;
+    function abortar($db, $id) {
+        $res = $db->query('SELECT count(*) AS cuenta 
+                FROM yatta.procesos
+                WHERE id = '.$id.' AND status = 5');
+        // Si hay error lo devuelve.
+        if (DB::isError($res)) {
+            return $res;
+        }
+        $res = $res->fetchRow(DB_FETCHMODE_ASSOC);
+        return  $res['cuenta'];
     }
-   
 }
 ?>
\ No newline at end of file