#!/usr/bin/php4 -qC ------------------------------------------------------------------------------- $Id$ -----------------------------------------------------------------------------*/ //============================================== //TODO FIXME XXX //============================================== //SACAR TODO LO QUE SE PUEDA A LAS CLASES QUE //CORRESPONDAN //AGREGAR LAS LINEAS DEL LOG //============================================== define ('YATTA_LOG_DEBUG', 'debug'); define ('YATTA_LOG_WARNING', 'warning'); define ('YATTA_LOG_FATAL', 'fatal'); //YATTA LOG {{{ //Varia su forma de actuar segun el archivo de configuracion // //$texto - Texto a agregar al log //$modo - uno de debug, warning, fatal // //Como root: //# touch /var/log/apache/YATTA_Tacho.log //# chown root.www-data /var/log/apache/YATTA_Tacho.log //# chmod 660 /var/log/apache/YATTA_Tacho.log function yatta_log ($texto, $modo = YATTA_LOG_FATAL) { GLOBAL $YATTA_SERVER; GLOBAL $CONF; if (!($FH = fopen ($CONF['tacho']['log'], "a"))) { trigger_error("No se pudo abrir el archivo de log.", E_USER_ERROR); } else { $linea = strftime("%b %e %H:%M:%S").' '.$YATTA_SERVER['name'].' '. $YATTA_SERVER['script'].'['.$YATTA_SERVER['pid'].']: '. $texto ."\n"; switch ($CONF['tacho']['log']) { case YATTA_LOG_FATAL: if ($modo == YATTA_LOG_FATAL) { fwrite($FH, $linea); } break; case YATTA_LOG_WARNING: if (!($modo == YATTA_LOG_DEBUG)) { fwrite($FH, $linea); } break; case YATTA_LOG_DEBUG: fwrite($FH, $linea); break; } fclose ($FH); } } //}}} //Leo el archivo de configuracion {{{ $CONF = parse_ini_file(dirname(__FILE__) . '/configuracion.ini', true); //}}} //REQUIRE ONCE {{{ require_once 'PEAR.php'; require_once 'YATTA/DB.php'; require_once 'YATTA/Controlador.php'; require_once 'YATTA/Servidor.php'; require_once 'YATTA/Archivo.php'; require_once 'Date.php'; require_once 'Date/Span.php'; //}}} //CREO UNA CONEXION MYSQL{{{ $db = YATTA_DB::connect($CONF['db']); if (DB::isError($db)) { yatta_log('Se produjo un error. '. $db->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error grave.'); exit; } //}}} //CREO LOS OBJETOS NECESARIOS {{{ $CONTROLADOR =& new YATTA_Controlador; $SERVIDOR =& new YATTA_Servidor; //}}} //OBTENGO LOS DATOS DEL SERVER {{{ $YATTA_SERVER['path_tacho'] = $CONF['tacho']['repositorio']; $YATTA_SERVER['script'] = $argv[0]; $YATTA_SERVER['pid'] = getmypid(); $YATTA_SERVER['name'] = substr(file_get_contents('/etc/hostname'), 0, strpos (file_get_contents('/etc/hostname'), "\n")); $YATTA_SERVER['id'] = $SERVIDOR->obtenerId($db, $YATTA_SERVER['name']); if (PEAR::isError($YATTA_SERVER['id'])) { yatta_log('Se produjo un error. '. $YATTA_SERVER['id']->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error grave.'); exit; } yatta_log ('*************** Comienzo Ejecución ***************'); yatta_log (' SCRIPT: ' . $YATTA_SERVER['script']); yatta_log (' PID: ' . $YATTA_SERVER['pid']); yatta_log (' SERVER NAME: ' . $YATTA_SERVER['name']); yatta_log (' SERVER ID: ' . $YATTA_SERVER['id']); yatta_log (' PATH TACHO:' . $YATTA_SERVER['path_tacho']); yatta_log ('**************************************************'); //}}} //BORRO LOS ARCHIVOS CON MAS DE N DIAS {{{ if ($dh = opendir($YATTA_SERVER['path_tacho'])) { yatta_log('Se borran los archivos antiguos.', YATTA_LOG_DEBUG); while (false !== ($fh = readdir($dh))) { if ($fh != '.' && $fh != '..' && !in_array($fh, split(',', $CONF['tacho']['ignorar']))) { $span =& new Date_Span ( new Date (filemtime($YATTA_SERVER['path_tacho'].$fh)), new Date ()); if ($span->greater(new Date_Span ( array ($CONF['tacho']['cantidad_dias'],0,0,0)))) { $archivo =& new YATTA_Archivo; $archivo->archivo = $fh; $res = $archivo->buscar($DB); if (PEAR::isError($res)) { yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_WARNING); } $archivo->cargar($res); $res = $archivo->borrar($res); if (PEAR::isError($res)) { yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_WARNING); } } } } closedir($dh); } //}}} //VERIFICO LAS CUOTAS DE LOS USUARIOS{{{ //OBTENGO LA LISTA DE USUARIOS QUE TIENEN AL MENOS UNA ENTRADA EN EL MYSQL {{{ $res = $CONTROLADOR->obtenerListaOwners($db, true); if (PEAR::isError($res)) { yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL); exit; } yatta_log('Se obtiene la lista de owners de los archivos.', YATTA_LOG_DEBUG); //}}} //OBTENGO LA LISTA DE USUARIOS CON CUOTAS EXCEPCIONALES {{{ $cuotas = $CONTROLADOR->obtenerListaCuotas($db); $cuotas = $cuotas->fetchRow(DB_FETCHMODE_ARRAY); if (PEAR::isError($cuotas)) { yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL); exit; } yatta_log('Se obtienen las cuotas excepcionales.', YATTA_LOG_DEBUG); //}}} //WHILEO POR USUARIO {{{ yatta_log('Se verifica que los usuarios no superen la cuota asignada.', YATTA_LOG_DEBUG); while ($usuario = $res->fetchRow(DB_FETCHMODE_ASSOC)) { //VEO EL TIPO DE CUOTA DEL USUARIO {{{ if (@in_array($usuario['owner'], $cuotas)) { if (PEAR::isError($cuotas)) { yatta_log('Se produjo un error. '. $cuotas->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL); exit; } $cuota = $cuota[$usuario['owner']]; } else { $cuota = $CONF['cuota_tamanio']; } //}}} //BUSCO LOS ARCHIVOS, TAMANIO y FECHA DEL USUARIO{{{ $archivo =& new YATTA_Archivo; $archivo->owner = $usuario['owner']; $res = $archivo->buscar($DB, MECON_DBO_OR, null, false); if (PEAR::isError($res)) { yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL); exit; } $tamanio = 0; $contador = 0; while ($archivo->cargar($res)) { if (PEAR::isError($res)) { yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL); yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL); exit; } //Obtengo la fecha, el tamanio de cada archivo. if (file_exists($archivo->archivo)) { $archivos[$contador]['nombre'] = $archivo->archivo; $archivos[$contador]['resultado'] = $archivo->resultado; $archivos[$contador]['tamanio'] = filesize($archivo->archivo); $archivos[$contador]['fecha'] = filemtime($archivo->archivo); $tamanio += $archivos[$archivo->archivo]['tamanio'] ; $contador ++; } } //}}} //HAY MAS DE LA CUOTA {{{ if ($cuota <= (($tamanio / 1024) / 1024)) { //BORRAR LOS ARCHIVOS MAS VIEJOS HASTA LLEGAR AL VALOR DE LA CUOTA. //Ordeno los archivos por la fecha, y voy "borrando" los mas viejos //hasta cumplir con el tamaño de la cuota. yatta_log('El usuario '. $usuario['owner'] .' ha excedido la cuota de su casilla', YATTA_LOG_WARNING); usort($archivos, 'usort_archivos_callback'); $seguir = true; while ($seguir == true) { $archivo = array_shift($archivos); $tamanio -= $archivo['tamanio']; $borrar[] = $archivo['nombre']; $borrar2[] = $archivo['resultado']; if ((($tamanio / 1024) / 1024) < ($CONF['cuota_warning'] * $cuota / 100)) { $seguir = false; } } //Borros los archivos correspondientes. foreach ($borrar as $b) { yatta_llog('Se borra el archivo '. $b .' perteneciente a '. $usuario['owner'], YATTA_LOG_WARNING); unlink($b); } //Envio el email if (@$borrar2) { array_unshift($borrar2, "La capacidad maxima que usted tiene en el sistema YATTA fue", "superada.", "Los siguientes archivos han sido borrados del sistema:"); array_push($borrar2, "\n\nEste es un mensaje generado automaticamente por YATTA,". " por favor no responder a este email\n"); $body = implode ('\n', $borrar); $to = $usuario['owner'].'.gov.ar'; $headers = "From: Intranet - YATTA \r\n"; $subject = "INTRANET - SAYONARA - Aviso cuota excedida."; mail($to, $subject, $body, $headers); } } //}}} //HAY MENOS DE LA CUOTA PERO SUPERA LO ESTABLECIDO EN EL ARCHIVO DE CONFIGURAION{{{ elseif (($CONF['cuota_warning'] * $cuota / 100) <= (($tamanio / 1024) / 1024)) { //ENVIAR EMAIL SOBRE LA SITUACION Y AVISANDO QUE SI SE SUPERA LA CUOTA //LOS ARCHIVOS MAS VIEJOS SERAN BORRADOS HASTA CUMPLIR EL REQUERIMIENTO //DE TAMAÑO //LEVANTAR DEL ARCHIVO DE CONFIGURACION EL HOST PARA EL LINK (ASI EL //USUARIO VA A VER QUE TIENE, QUE BORRA Y QUE NO) yatta_log('El usuario '. $usuario['owner'] .' ha superado el limite de aviso. Se envia email.', YATTA_LOG_WARNING); $body = "Su cuota dentro del sistema YATTA esta por completarse, le \n". "pedimos que libere espacio para futuros archivos.\n". "\nhttp://intranet.mecon.ar/sistemas/intranet/login?redirect". "=/sistemas/yatta\n\n". "\n\nEste es un mensaje generado automaticamente por YATTA,". " por favor no responder a este email\n"; $to = $usuario['owner'].'.gov.ar'; $headers = "From: Intranet - YATTA \r\n"; $subject = "INTRANET - SAYONARA - Aviso cuota completa."; mail($to, $subject, $body, $headers); } //}}} } //}}} //}}} //FIN SCRIPT //FUNCIONES AUXILIARES {{{ //Ordena los archivos segun la "edad" function usort_archivos_callback($arg1, $arg2) { if ($arg1['fecha'] == $arg2['fecha']) { return 0; } return ($arg1['fecha'] < $arg2['fecha']) ? -1 : 1; } //}}} ?>