X-Git-Url: https://git.llucax.com/mecon/yatta.git/blobdiff_plain/8d4c0f0f27f064fae5f7b9f3baca5efe1b079725..b6a6a2a30f3d83d558a55fcf809b6098a4b73566:/lib/YATTA/Controlador.php?ds=sidebyside diff --git a/lib/YATTA/Controlador.php b/lib/YATTA/Controlador.php index a1ba0db..610ba02 100644 --- a/lib/YATTA/Controlador.php +++ b/lib/YATTA/Controlador.php @@ -28,6 +28,8 @@ require_once 'YATTA/Proceso.php'; require_once 'YATTA/ProcesoDB.php'; require_once 'YATTA/Servidor.php'; +define ('PATH_TACHO', '/var/www/sistemas/yatta/tacho/'); + /** * Clase para el manejo centralizado de toda la informacion de YATTA. * @@ -44,10 +46,6 @@ class YATTA_Controlador { * @access private */ function _obtenerServidor($db) { - - //@FIXME La ponderacion esta mal. No tengo que buscar el que tenga mas - //alta o mas baja OJO!!! Volver a pensar el calculo. - $res = $db->query('SELECT s.id, s.escala * s.procesos AS ponderacion FROM yatta.servidores AS s ORDER BY ponderacion ASC, s.escala DESC'); @@ -61,8 +59,24 @@ class YATTA_Controlador { /** * Agrega un proceso a la base de datos - * Los datos obligatorios a pasar son: script, id_sistema, descripcion, - * owner, destinos, prioridad, scheduling y notificar. + * Recibe un array asociativo con: + * Obligatorios + * script : Path completo para el require_once. + * id_sistema : Identificador del sistema al que pertenece. (Es el id que + * asigna SAMURAI) + * descripcion: Es lo que permite al usuario identificar al proceso. + * 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. + * parametros : Parametros que hay que pasarle al metodo run del script. * * @param DB $db Conexion a la base de datos. * @param mixed $datos Datos necesarios del proceso. @@ -82,10 +96,15 @@ class YATTA_Controlador { 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."); + " del objeto YATTA_ProcesoDB."); } $res = $this->_obtenerServidor($db); + //Serializo los parametros + if (@$datos['parametros']) { + $datos['parametros'] = serialize($datos['parametros']); + } + if (DB::isError($res)) { return $res; } @@ -140,59 +159,37 @@ class YATTA_Controlador { 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; + //NOTIFICO + if (@$notificar) { + $this->_emailUsuario ($db, $id_proceso, $status, $nota, $archivo); + } + + //COPIO EL ARCHIVO + if (@$archivo) { + $arch = basename ($archivo); + rename ($archivo, PATH_TACHO.$arch); + } + + //ACTUALIZO LA BASE PROCESOS + $sql = 'UPDATE yatta.procesos SET status = '. + $db->quoteSmart($status); if (@$nota) { - $sql.= ', nota = '. $nota; + $sql.= ', nota = '. $db->quoteSmart($nota); } if (@$archivo) { - $sql.= ', archivo = '. $archivo; + $sql.= ', archivo = '. $db->quoteSmart(PATH_TACHO.$arch); } if (@$notificar) { - $sql.= ', notificar = '. $notificar; + $sql.= ', notificar = '. $db->quoteSmart($notificar); } - $sql.= ' WHERE id = '. $id_proceso; + $sql.= ' WHERE id = '. $db->quoteSmart($id_proceso); + $res = $db->query($sql); if (DB::isError($res)) { return $res; } - //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, '/var/www/yatta_tacho/'.$arch); - } - //Actualizo los servidores $SERVER =& new YATTA_Servidor; return $SERVER->quitarProceso($db, $id_server); @@ -208,7 +205,8 @@ class YATTA_Controlador { * @access public */ function obtenerNuevoProceso($db, $id) { - $res = $db->query('SELECT p.id AS id, p.script AS script + $res = $db->query('SELECT p.id AS id, p.script AS script, p.parametros + AS parametros FROM yatta.procesos AS p WHERE p.server = '.$id.' AND status = 0 ORDER BY p.prioridad, p.id'); @@ -239,5 +237,135 @@ class YATTA_Controlador { $res = $res->fetchRow(DB_FETCHMODE_ASSOC); return $res['cuenta']; } + + /** + * Envia el email al usuario informandole la finalizacion de uno de sus + * procesos. + * + * @param DB $db Conexion a la base de datos. + * @param int $id_proceso Identificador del proceso. + * @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. + * + * @return void + * @access private + */ + function _emailUsuario($db, $id_proceso, $status, $nota = null, $archivo = null) { + $res = $db->query( + "SELECT p.descripcion AS descripcion, p.owner AS owner, ". + "p.destinos AS destinos, p.resultado AS resultado, ". + "p.status AS estado, p.nota AS nota ". + "FROM yatta.procesos AS p ". + "WHERE p.id = ". $id_proceso); + + if (DB::isError($res)) { + return $res; + } + $res = $res->fetchRow(DB_FETCHMODE_ASSOC); + + +//@FIXME El email se lo envio al owner y a los destinos, o al owner solamente? + + $dest = split (',', @$res['destinos']); + $to = $res['owner'].'.gov.ar'; + foreach ($dest as $d) { + $to = $to . ", $d.gov.ar"; + } + $headers = "From: Intranet - YATTA \r\n"; + $subject = "INTRANET - YATTA - Proceso Finalizado"; + + $body = "El proceso {$res['descripcion']} ha finalizado "; + + switch ($status) { + case 2: + $body .= "con éxito.\n"; + break; + case 3: + $body .= "con errores.\n"; + if ($nota) { + $body .= "Motivo:\n$nota\n"; + } + break; + case 4: + $body .= "porque se abortó su ejecución.\n"; + if ($nota) { + $body .= "Motivo:\n$nota\n"; + } + break; + } + + if ($archivo) { + $body .= "Usted puede obtener el archivo resultado del proceso\n". + "en la seccion Archivos del sistema YATTA.\n". + "Recuerde que este archivo puede ser borrado sin previo aviso\n". + "por tres motivos:\n". + "1- El archivo supera la antigüedad máxima establecida.\n". + "2- Se supero la capacidad máxima de información permitida\n". + " por usuario.\n". + "3- Decisión administrativa por mantenimiento de los servidores.\n"; + } + + + + $body .="\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); + } + + /** + * Verifica si un usuario tiene alguna informacion en la base de yatta para + * mostrarle el icono en la lista de sistemas de la intranet. + * + * @param DB $db Conexion a la base de datos. + * @param string $login Usuario que se esta verificando + * + * @return bool + * @access public + * @static + */ + function visible($DB, $login) { + $res = $db->query('SELECT count (p.id) AS id FROM yatta.procesos AS p'. + ' WHERE (p.owner LIKE \'%'. $login .'%\') OR'. + ' (p.destinos LIKE \'%'. $login .'%\')'); + + if (DB::isError($res)) { + return $res; + } + $res = $res->fetchRow(DB_FETCHMODE_ASSOC); + + return $res['id']; + } + + /** + * Busca los usuarios que tienen al menos una entrada en el mysql como + * owners. + * + * @param DB $db Conexion a la base de datos. + * + * @return mixed + * @access public + */ + function obtenerListaOwners($db) { + return $db->query('SELECT DISTINCT p.owner AS owner + FROM yatta.procesos As p'); + } + + /** + * Obtiene las cuotas especiales de los usuarios. + * + * @param DB $db Conexion a la base de datos. + * + * @return mixed + * @access public + */ + function obtenerListaCuotas($db) { + return $db->query('SELECT login, cuota + FROM yatta.cuotas'); + } } ?> \ No newline at end of file