Languages

User login


startpage.pl, nou redirector per a l'Squid


Provant el capo, que es un redirector per al Squid, he vist que no acabava de funcionar del tot bé. En comptes de retocar el codi existent, he decidit fer un redirector nou, que no s'ahgi de compilar, amb Perl i que sigui més fàcil. Al menys m'ho sembla a mi :-)

Aquest és l'script:

#!/usr/bin/perl

#
# startpage.pl (Squid Proxy Redirector)
# joan.llopart@guifi.net 03-2008

# Redirects proxy user to a defined startpage every certain time.

use strict;

#
# --- CONFIG ---
#
# Startpage will be shown every ... (time in seconds)
my $ref_time = 3600; # 1 hour
#
# Redirection to this webpage
my $startp = "302:http://guifi.net";
#
# Directory to save user/timestamp DB
# (squid owner needs write permissions in this directory)
my $dat_dir = "/tmp";
#
# Track users by IP or username. Username only effective if proxy uses
# some kind of authentication.
my $match = "user"; # user / IP


# Autoflush STDOUT on each printed character
local $| = 1;

$SIG{INT} = sub { die "Bye!"; };


while ( 1 ) {

# Get stuff from squid
my $buff_in = <>;
chomp( $buff_in );
my ( $url, $src_add, $ident, $method) = split( / /, $buff_in );

# Quits if squid does
if( !$url || !$src_add || !$ident || !$method ) { die("Bye!"); };

# Match by username or IP
my $id = ($match eq "user") ? $ident : $src_add;

# Check user's timestamp
open(DATA, "<$dat_dir/startpage.dat");
my $newdat='';
# (flag1) 0 = new user / 1 = timestamp OK / 2 = update timestamp
my $flag1=0;
while ( my $line=<DATA> ) {
chomp($line);
my( $user, $ltime ) = split( /:/, $line );
if( $user eq $id ) {
$flag1=1;
if( ($ltime + $ref_time) < time() ) {
$flag1=2;
$ltime=time();
}
}
$newdat.="$user:$ltime\n";
}
close(DATA);


# If new user or user timestamp changed, update DB
if( $flag1!=1 ) {
# New user? add it ...
if( !$flag1 ) { $newdat.="$id:".time()."\n"; }
open(DATA, ">$dat_dir/startpage.dat");
print DATA $newdat;
close(DATA);
}

# Show startpage if necessary
if( $flag1!=1 ) {
print $startp." ".$src_add." ".$ident." ".$method."\n";
} else {
print $url." ".$src_add." ".$ident." ".$method."\n";
}


} # while( 1 )

El poseu en el lloc que us agradi mes, en aquest l'exemple l'he guardat a /home/joan/scripts, amb el nom startpage.pl. Editeu el /etc/squid/squid.conf, busqueu on hi ha el Tag de url_rewrite_program i hi afegiu:

url_rewrite_program /home/joan/scripts/startpage.pl

Per a configurar el redirector startpage.pl, l'obriu amb l'editor i podeu canviar:

  • $ref_time. El temps, en segons, que ha de transcorrer per a que es redirigeixi de nou els usuaris cap a la pàgina d'inici
  • $startp. La pàgina web a la que voleu que es redirigeixi. Ha d'anar precedit de '302:'
  • $dat_dir. El directori on el redirector guardarà el fitxer amb l'usuari i el seu timestamp. L'usuari amb el que corra el Squid ha de tenir permissos d'escriptura en aquest directori.
  • $match. Si conté "user", identifica als usuaris per el nom d'usuari que fa servir per autenticar-se al proxy. Si conté "IP", o qualsevol altre cosa, identifica als usuaris per la IP de procedència.

Recarregeu l'squid i llestos. No l'he pogut provar en un proxy amb molta càrrega, solament en un de proves, però crec que ha de funcionar sense cap mena de problema.

Comentaris

Opcions de visualització de comentaris

Selecciona la vostra manera preferida de visualitzar els comentaris i feu clic en "Desa la configuració" per activar els canvis.

Gracies

Molt bo el com es fa jo el tinc funcionant i va molt be

un pregunta per variar com es pot fer per que redirigeixi cada user o ip a un lloc difrent?

be moltes gracies

S'ha de modificar l'script de

S'ha de modificar l'script de manera que tinguis una llista amb els nom d'ususuari i a quina web els vols redirigir. I que quan arribi una solicitud a l'script, comprovi el nom d'usuari en a aquesta llista i el redirigeixi, si cal, a la URL definida.