------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ require_once 'YATTA/Proceso.php'; require_once 'YATTA/ProcesoDB.php'; require_once 'YATTA/Servidor.php'; /** * Clase para el manejo centralizado de toda la informacion de YATTA. * * @access public */ 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) { //@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'); // 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. * * @param DB $db Conexion a la base de datos. * @param mixed $datos Datos necesarios del proceso. * * @return mixed * @access public */ function agregarProceso($db, $datos) { //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. //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; } $datos['server'] = $res; $datos['fecha'] = date('Y-m-d'); $res = $db->autoExecute('yatta.procesos', $datos, DB_AUTOQUERY_INSERT); if (DB::isError($res)) { return $res; } $SERVER =& new YATTA_Servidor; return $SERVER->agregarProceso($db, $datos['server']); } /** * 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 public */ 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; } //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); } /** * Busca un proceso en cola para el servidor * * @param DB $db Conexion a la base de datos. * @param int $id Identificador del servidor. * * @return mixed * @access public */ 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 $res->fetchRow(DB_FETCHMODE_ASSOC); } /** * Busca si un proceso que se esta ejecutando tiene pedido de cancelacion. * * @param DB $db Conexion a la base de datos. * @param int $id Identificador del proceso. * * @return mixed * @access public */ 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']; } } ?>