Buenas tardes, 
   les comparto un ejemplo muy básico que demuestra la posibilidad de utilizar 
la acl externa. Es meramente ilustrativo, para un 
entorno de producción hay que ser más exigentes con el tratamiento de errores, 
configuración, quizá valorar otro lenguaje para buscar más 
rendimiento.

Primeramente la configuración de squid:

# usar alguna acl previa para permitir el acceso, por ejemplo: 

# acl localnet src 192.168.0.0/16 # RFC 1918 possible internal network
# http_access allow localnet

http_access allow "alguna acl previamente declarada"

# para squid 3.1
external_acl_type php_helper children=5 concurrency=1 ttl=0 %<{Content-Type} 
%<{Content-Length} /usr/local/bin/php_helper.php

# para squid >= 3.2, quitar comentario de la sgte. linea si es el caso y 
comentar la anterior
#external_acl_type php_helper children-max=5 children-startup=5 concurrency=1 
ttl=0 %<{Content-Type} %<{Content-Length} /usr/local/bin/php_helper.php

#
# concurrency, pensado para entornos multihilos, cada helper posee n cantidad 
de hilos
# ttl, tiempo que la respuesta permanecerá en caché, acelera la respuesta
# %<{Content-Type}, tipo de contenido de la respuesta
# %<{Content-Length}, tamaño de la respuesta en bytes
#  /usr/local/bin/php_helper.php, ruta del programa
#

acl size_check external php_helper

# http_reply_access en lugar de http_access porque se usaran las cabeceras de 
la respuesta
http_reply_access allow size_check

http_access deny all

//----------------------------------------------------------------------------------------------------------------------------

Código del programa:

#!/usr/bin/php5
<?php
stream_set_timeout(STDIN, 86400); // tiempo de espera

$handler = fopen('/usr/local/bin/php_helper.log', 'a'); // fichero de log para 
almacenar cada entrada que recibe el programa

/**
 * fuente de reglas dinámicas: arreglo (tipo de contenido => tamaño en bytes)
 * puede ser una tabla en una BD, un fichero, etc.
 */
$rules = array(
    'application/octet-stream' => 104857600, // 100 MB
    'application/pdf' => 20971520, // 2 MB
);

/**
 * en espera de la petición de squid, que traerá el formato "ID Content-Type 
Content-Length"
 * 
 * ID: When using the concurrency= option the protocol is changed by
 * introducing a query channel tag infront of the request/response.
 * The query channel tag is a number between 0 and concurrency-1.
 */
while ($line = fgets(STDIN)) {
    fputs($handler, $line, strlen($line)); // escribir en el fichero de log

    $parts = split(' ', trim($line)); // separar la entrada por espacios

    $id = $parts[0];
    $type = $parts[1];
    $size = $parts[2];

    if (isset($rules[$type]) && $size > $rules[$type]) { 
        print $parts[0] . " " . "ERR\n"; // si la regla existe y se cumple 
denegar acceso
    } else {
        print $parts[0] . " " . "OK\n"; // permitir acceso
    }
}

fclose($handler);

//----------------------------------------------------------------------------------------------------------------------------
Permisos:

El programa debe poder ejecutarse por squid:
chown proxy:proxy /usr/local/bin/php_helper.php
chmod +x /usr/local/bin/php_helper.php

El fichero de log debe poder escribirse:
chown proxy:proxy /usr/local/bin/php_helper.log
chmod 775 /usr/local/bin/php_helper.log

//----------------------------------------------------------------------------------------------------------------------------

Espero que les sea útil. 
La variante de ICAP es un poco más complicada, ver greasyspoon.sourceforge.net/ 
o a c-icap.sourceforge.net/.

Saludos

----- Mensaje original -----
De: "Damián Tomey Soto" <dam...@emprequin.co.cu>
Para: "Lista cubana de soporte técnico en Tecnologias Libres" jovenclub.cu>
Enviados: Jueves, 5 de Marzo 2015 7:26:07
Asunto: Re: [Gutl-l] Duda squid

Saludos colega, tienes algún ejemplo con el que nos puedas ilustrar 
tanto para la variante con external_acl_type o con ICAP?

Damián Tomey Soto
Administrador Red EQRO
Tel: (32) 413011 Ext. 1488

El 04/03/2015 a las 06:02 p.m., Ing. José Ramón Hermosilla Moreno escribió:
> Definitivamente se debe trabajar con las cabeceras de la respuesta, 
> específicamente la que contiene el tamaño (content-length).
> Lo interesante del caso es que la acl que tiene que ver con eso no permite 
> comparar como se quiere, sino solo comprobar si es determinado valor.
> Así que quizá hay que tomar el camino de una acl externa (external_acl_type) 
> y solo si se usa squid 3.1 o superior, pues versiones anteriores (2.7) no 
> permiten pasar las cabeceras de respuesta.
>
> Otra variante es usar ICAP, y trabajar con la cabecera de respuesta, es 
> parecido a lo anterior, pero con más sobrecarga, al menos si se usa para ese 
> solo problema.
>
> Cualquier solución que se tome sacará provecho de combinar el content-length 
> con el content-type.
>
> Saludos
>
> ----- Mensaje original -----
> De: "Ariel" <ar...@cncc.cult.cu>
> Para: "Lista cubana de soporte técnico en Tecnologias Libres" jovenclub.cu>
> Enviados: Miércoles, 4 de Marzo 2015 16:13:25
> Asunto: Re: [Gutl-l] Duda squid
>
> si existe
>
> El 04/03/2015 12:06, Damián Tomey Soto escribió:
>> Saludos, existe alguna forma de saber el tamaño de un archivo desde
>> squid para si es mayor de un valor denegar su descarga en horario
>> laboral?
>>
>>
>>
>> ______________________________________________________________________
>> Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
>> Gutl-l@jovenclub.cu
>> https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l
>
>
>
> ______________________________________________________________________
> Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
> Gutl-l@jovenclub.cu
> https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l

-- 
Este mensaje ha sido analizado por MailScanner
en busca de virus y otros contenidos peligrosos,
y se considera que est� limpio.

______________________________________________________________________
Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
Gutl-l@jovenclub.cu
https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l

Responder a