2 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80 foldmethod=marker:
3 -------------------------------------------------------------------------------
6 -------------------------------------------------------------------------------
7 This file is part of YATTA!.
9 YATTA! is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2 of the License, or (at your option)
14 YATTA! is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License; if not,
19 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20 Boston, MA 02111-1307 USA
21 -------------------------------------------------------------------------------
22 Creado: jue ene 8 16:53:47 ART 2004
23 Autor: Martin Marrese <mmarre@mecon.gov.ar>
24 -------------------------------------------------------------------------------
26 -----------------------------------------------------------------------------*/
29 //==============================================
31 //==============================================
32 //SACAR TODO LO QUE SE PUEDA A LAS CLASES QUE
34 //AGREGAR LAS LINEAS DEL LOG
35 //==============================================
37 define ('YATTA_LOG_DEBUG', 'debug');
38 define ('YATTA_LOG_WARNING', 'warning');
39 define ('YATTA_LOG_FATAL', 'fatal');
42 //Varia su forma de actuar segun el archivo de configuracion
44 //$texto - Texto a agregar al log
45 //$modo - uno de debug, warning, fatal
48 //# touch /var/log/apache/YATTA_Tacho.log
49 //# chown root.www-data /var/log/apache/YATTA_Tacho.log
50 //# chmod 660 /var/log/apache/YATTA_Tacho.log
51 function yatta_log ($texto, $modo = YATTA_LOG_FATAL) {
55 if (!($FH = fopen ($CONF['tacho']['log'], "a"))) {
56 trigger_error("No se pudo abrir el archivo de log.", E_USER_ERROR);
59 $linea = strftime("%b %e %H:%M:%S").' '.$YATTA_SERVER['name'].' '.
60 $YATTA_SERVER['script'].'['.$YATTA_SERVER['pid'].']: '. $texto ."\n";
62 switch ($CONF['tacho']['modo_log']) {
64 if ($modo == YATTA_LOG_FATAL) {
68 case YATTA_LOG_WARNING:
69 if (!($modo == YATTA_LOG_DEBUG)) {
82 //Leo el archivo de configuracion {{{
83 $CONF = parse_ini_file(dirname(__FILE__) . '/configuracion.ini', true);
87 require_once 'PEAR.php';
88 require_once 'YATTA/DB.php';
89 require_once 'YATTA/Controlador.php';
90 require_once 'YATTA/Servidor.php';
91 require_once 'YATTA/Archivo.php';
92 require_once 'Date.php';
93 require_once 'Date/Span.php';
96 //CREO UNA CONEXION MYSQL{{{
97 $db = YATTA_DB::connect($CONF['db']);
98 if (DB::isError($db)) {
99 yatta_log('Se produjo un error. '. $db->getMessage(), YATTA_LOG_FATAL);
100 yatta_log('Finaliza la ejecución debido a un error grave.');
105 //CREO LOS OBJETOS NECESARIOS {{{
106 $CONTROLADOR =& new YATTA_Controlador;
107 $SERVIDOR =& new YATTA_Servidor;
110 //OBTENGO LOS DATOS DEL SERVER {{{
111 $YATTA_SERVER['path_tacho'] = $CONF['tacho']['repositorio'];
112 $YATTA_SERVER['script'] = $argv[0];
113 $YATTA_SERVER['pid'] = getmypid();
114 $YATTA_SERVER['name'] = substr(file_get_contents('/etc/hostname'), 0, strpos
115 (file_get_contents('/etc/hostname'), "\n"));
116 $YATTA_SERVER['id'] = $SERVIDOR->obtenerId($db, $YATTA_SERVER['name']);
117 if (PEAR::isError($YATTA_SERVER['id'])) {
118 yatta_log('Se produjo un error. '. $YATTA_SERVER['id']->getMessage(),
120 yatta_log('Finaliza la ejecución debido a un error grave.');
123 yatta_log ('*************** Comienzo Ejecución ***************');
124 yatta_log (' SCRIPT: ' . $YATTA_SERVER['script']);
125 yatta_log (' PID: ' . $YATTA_SERVER['pid']);
126 yatta_log (' SERVER NAME: ' . $YATTA_SERVER['name']);
127 yatta_log (' SERVER ID: ' . $YATTA_SERVER['id']);
128 yatta_log (' PATH TACHO:' . $YATTA_SERVER['path_tacho']);
129 yatta_log ('**************************************************');
132 //BORRO LOS ARCHIVOS CON MAS DE N DIAS {{{
133 if ($dh = opendir($YATTA_SERVER['path_tacho'])) {
134 yatta_log('Se borran los archivos antiguos.', YATTA_LOG_DEBUG);
135 while (false !== ($fh = readdir($dh))) {
136 if ($fh != '.' && $fh != '..' && !in_array($fh, split(',',
137 $CONF['tacho']['ignorar']))) {
138 $span =& new Date_Span (
139 new Date (filemtime($YATTA_SERVER['path_tacho'].$fh)),
141 if ($span->greater(new Date_Span (
142 array ($CONF['tacho']['cantidad_dias'],0,0,0)))) {
144 $archivo =& new YATTA_Archivo;
145 $archivo->archivo = $fh;
146 $res = $archivo->buscar($DB);
147 if (PEAR::isError($res)) {
148 yatta_log('Se produjo un error. '. $res->getMessage(),
151 $archivo->cargar($res);
152 $res = $archivo->borrar($res);
153 if (PEAR::isError($res)) {
154 yatta_log('Se produjo un error. '. $res->getMessage(),
164 //VERIFICO LAS CUOTAS DE LOS USUARIOS{{{
165 //OBTENGO LA LISTA DE USUARIOS QUE TIENEN AL MENOS UNA ENTRADA EN EL MYSQL {{{
166 $res = $CONTROLADOR->obtenerListaOwners($db, true);
167 if (PEAR::isError($res)) {
168 yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL);
169 yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL);
172 yatta_log('Se obtiene la lista de owners de los archivos.', YATTA_LOG_DEBUG);
175 //OBTENGO LA LISTA DE USUARIOS CON CUOTAS EXCEPCIONALES {{{
176 $cuotas = $CONTROLADOR->obtenerListaCuotas($db);
177 $cuotas = $cuotas->fetchRow(DB_FETCHMODE_ARRAY);
178 if (PEAR::isError($cuotas)) {
179 yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL);
180 yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL);
183 yatta_log('Se obtienen las cuotas excepcionales.', YATTA_LOG_DEBUG);
186 //WHILEO POR USUARIO {{{
187 yatta_log('Se verifica que los usuarios no superen la cuota asignada.',
189 while ($usuario = $res->fetchRow(DB_FETCHMODE_ASSOC)) {
190 //VEO EL TIPO DE CUOTA DEL USUARIO {{{
191 if (@in_array($usuario['owner'], $cuotas)) {
192 if (PEAR::isError($cuotas)) {
193 yatta_log('Se produjo un error. '. $cuotas->getMessage(), YATTA_LOG_FATAL);
194 yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL);
197 $cuota = $cuota[$usuario['owner']];
200 $cuota = $CONF['cuota_tamanio'];
204 //BUSCO LOS ARCHIVOS, TAMANIO y FECHA DEL USUARIO{{{
205 $archivo =& new YATTA_Archivo;
206 $archivo->owner = $usuario['owner'];
207 $res = $archivo->buscar($DB, MECON_DBO_OR, null, false);
208 if (PEAR::isError($res)) {
209 yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL);
210 yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL);
215 while ($archivo->cargar($res)) {
216 if (PEAR::isError($res)) {
217 yatta_log('Se produjo un error. '. $res->getMessage(), YATTA_LOG_FATAL);
218 yatta_log('Finaliza la ejecución debido a un error.', YATTA_LOG_FATAL);
221 //Obtengo la fecha, el tamanio de cada archivo.
222 if (file_exists($archivo->archivo)) {
223 $archivos[$contador]['nombre'] = $archivo->archivo;
224 $archivos[$contador]['resultado'] = $archivo->resultado;
225 $archivos[$contador]['tamanio'] = filesize($archivo->archivo);
226 $archivos[$contador]['fecha'] = filemtime($archivo->archivo);
227 $tamanio += $archivos[$archivo->archivo]['tamanio'] ;
233 //HAY MAS DE LA CUOTA {{{
234 if ($cuota <= (($tamanio / 1024) / 1024)) {
235 //BORRAR LOS ARCHIVOS MAS VIEJOS HASTA LLEGAR AL VALOR DE LA CUOTA.
236 //Ordeno los archivos por la fecha, y voy "borrando" los mas viejos
237 //hasta cumplir con el tamaño de la cuota.
238 yatta_log('El usuario '. $usuario['owner']
239 .' ha excedido la cuota de su casilla', YATTA_LOG_WARNING);
240 usort($archivos, 'usort_archivos_callback');
242 while ($seguir == true) {
243 $archivo = array_shift($archivos);
244 $tamanio -= $archivo['tamanio'];
245 $borrar[] = $archivo['nombre'];
246 $borrar2[] = $archivo['resultado'];
247 if ((($tamanio / 1024) / 1024) <
248 ($CONF['cuota_warning'] * $cuota / 100)) {
252 //Borros los archivos correspondientes.
253 foreach ($borrar as $b) {
254 yatta_llog('Se borra el archivo '. $b .' perteneciente a '.
255 $usuario['owner'], YATTA_LOG_WARNING);
260 array_unshift($borrar2,
261 "La capacidad maxima que usted tiene en el sistema YATTA fue",
263 "Los siguientes archivos han sido borrados del sistema:");
265 "\n\nEste es un mensaje generado automaticamente por YATTA,".
266 " por favor no responder a este email\n");
267 $body = implode ('\n', $borrar);
268 $to = $usuario['owner'].'.gov.ar';
269 $headers = "From: Intranet - YATTA <intranet2@mecon.gov.ar>\r\n";
270 $subject = "INTRANET - SAYONARA - Aviso cuota excedida.";
271 mail($to, $subject, $body, $headers);
276 //HAY MENOS DE LA CUOTA PERO SUPERA LO ESTABLECIDO EN EL ARCHIVO DE CONFIGURAION{{{
277 elseif (($CONF['cuota_warning'] * $cuota / 100) <= (($tamanio / 1024) / 1024)) {
278 //ENVIAR EMAIL SOBRE LA SITUACION Y AVISANDO QUE SI SE SUPERA LA CUOTA
279 //LOS ARCHIVOS MAS VIEJOS SERAN BORRADOS HASTA CUMPLIR EL REQUERIMIENTO
281 //LEVANTAR DEL ARCHIVO DE CONFIGURACION EL HOST PARA EL LINK (ASI EL
282 //USUARIO VA A VER QUE TIENE, QUE BORRA Y QUE NO)
283 yatta_log('El usuario '. $usuario['owner']
284 .' ha superado el limite de aviso. Se envia email.',
287 "Su cuota dentro del sistema YATTA esta por completarse, le \n".
288 "pedimos que libere espacio para futuros archivos.\n".
289 "\nhttp://intranet.mecon.ar/sistemas/intranet/login?redirect".
290 "=/sistemas/yatta\n\n".
291 "\n\nEste es un mensaje generado automaticamente por YATTA,".
292 " por favor no responder a este email\n";
293 $to = $usuario['owner'].'.gov.ar';
294 $headers = "From: Intranet - YATTA <intranet2@mecon.gov.ar>\r\n";
295 $subject = "INTRANET - SAYONARA - Aviso cuota completa.";
296 mail($to, $subject, $body, $headers);
305 //FUNCIONES AUXILIARES {{{
306 //Ordena los archivos segun la "edad"
307 function usort_archivos_callback($arg1, $arg2) {
308 if ($arg1['fecha'] == $arg2['fecha']) {
311 return ($arg1['fecha'] < $arg2['fecha']) ? -1 : 1;