X-Git-Url: https://git.llucax.com/mecon/yatta.git/blobdiff_plain/be82111e27a9d9b492bdde542a283624c752b3fc..bb0e12e3bf9629b7209a4e5e72caff8395e2bf96:/lib/YATTA/Controlador.php?ds=sidebyside diff --git a/lib/YATTA/Controlador.php b/lib/YATTA/Controlador.php index 670ddd0..0a98e0c 100644 --- a/lib/YATTA/Controlador.php +++ b/lib/YATTA/Controlador.php @@ -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 \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