Subversion Repositories cms

Compare Revisions

Ignore whitespace Rev 8 → Rev 9

/trunk/test/SQUID/squid_redirect
6,8 → 6,9
# $Revision$ info@leader.it
# ---------------------------------------------------------------------- #
#
# Seconda bozza di redirector per squid
# Terza bozza di redirector per squid
# con utilizzo della connessione SQL
# ma con LOG direttamente da file di log di Squid, senza salvare in SQL
#
# =============================================================== DEBUG
use Data::Dumper;
27,12 → 28,9
 
# =============================================================== LOG INIT
my $LOG='/var/log/squid_redirector.log';
open LOG, ">>$LOG" or die "Errorr on open file $LOG";
open LOG, ">>$LOG" or die "Error on open file $LOG";
select LOG;
$|=1;
my $sth_InsertLog = $dbh->prepare('insert into logs ("type", "user", ip, host, url) values (?, ?, ?, ?, ?);');
my $sth_CheckLog = $dbh->prepare('select id, url, host from logs where id=(select max(id) from logs where "user" = ? and "type" = ?)');
my $sth_UpdateLog = $dbh->prepare('update logs set url=? where id=?;');
 
sub Log($$$$$){
my($type, $user, $ip, $host, $url) = @_;
39,29 → 37,6
chomp $url;
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
my $time = sprintf("%04d/%02d/%02d %02d:%02d:%02d", 1900+$year, $mon+1, $mday, $hour, $min, $sec);
$dbh->begin_work || warn "DBI Error begin_work: ".DBI::errstr." on Log()\n";
if($user && $user ne '-'){
# inserisco nel database solo una prima riga per accesso
$sth_CheckLog->execute($user, $type);
my @row = $sth_CheckLog->fetchrow_array();
if(@row && $host eq $row[2]){
my $p_url = $row[1];
if($p_url !~ m/$url/ && $url !~ m/[gif|jpeg|jpg|css]$/i && $p_url !~ m/\.\.\.$/){
# valuto la lunghezza del campo
if(length($p_url) + length($url) >= (256-5) ){
$p_url .= ' ...';
}else{
$p_url .= ' '.$url;
}
$sth_UpdateLog->execute($p_url, $row[0]) || warn "DBI Error inser logs: ".DBI::errstr."\n";
}
}else{
$sth_InsertLog->execute($type, $user, $ip, $host, $url) || warn "DBI Error inser logs: ".DBI::errstr."\n";
}
}else{
$sth_InsertLog->execute($type, $user, $ip, $host, $url) || warn "DBI Error inser logs: ".DBI::errstr."\n";
}
$dbh->commit || die "DBI Error commit: ".DBI::errstr."\n";
print LOG "$time $type $user $ip $host $url\n" or warn "on print file $LOG";
}
Log('log', $$, '-', '-', "Start squid_redirector $$");
144,9 → 119,7
 
sub TestListStr($$){
my($LIST, $URL) = @_;
$LIST =~ s/^\s+//;
foreach my $key (split /\s+/, $LIST){
##print STDERR "test [$URL][$key]:".index($URL, $key)."\n";
if(index($URL, $key)>=0){
return 1;
}
165,20 → 138,30
return 0;
}
 
 
sub OLDTestListStr($$){
my($LIST, $URL) = @_;
foreach my $key (split /\s+/, $LIST){
if($URL =~ m/$key/){
return 1;
# verifica se l'host visitato va aggiunto all'elenco
sub TestFollowMe($$){
my($host, $class)=@_;
$FollowMe = 'FM_'.$class;
# test se Docente di una Classe e FollowMe attivo
GoUpdate();
if(!TestListStrEqual($SHARED{$FollowMe}, $host)){
if($SHARED{$FollowMe}){
$SHARED{$FollowMe}.=" $host";
}else{
$SHARED{$FollowMe}="$host";
}
Log('log',$$, '-', '-', "Add FollowMe $host in $class");
$dbh->begin_work || warn "DBI Error begin_work: ".DBI::errstr." on FollowMe update\n";
$sthupdkeys->execute(++$lastkey, $SHARED{$FollowMe}, $FollowMe);
$dbh->commit || die "DBI Error commit: ".DBI::errstr."\n";
# aggiorno anche gli altri processi
HUP_Family();
}
return 0;
}
 
############################################################### LOOP
WORD:
while(1){
for(;;){
GoUpdate();
$HUP_Semaphore='';
last if(! defined($_=<STDIN>));
185,8 → 168,7
chomp;
my($url, $ip_fqdn, $ident, $method) = split;
 
##DEBUG
$ident='test';
##DEBUG $ident='test';
 
$url || ($url='none');
$ip_fqdn || ($ip_fqdn='0');
205,33 → 187,72
$host =~ s|^\w+://||;
$host =~ s|:\d+||;
$host =~ s|/.*||;
# =============================================================== FILTER WordList
# test presenza elenco parole in $host
if(TestListStr($SHARED{WordList}, $lurl)){
print STDOUT "301:about:blank\n";
# =============================================================== CHECK Classes
my($ClassName, $ClassTeacher, $ClassFlags);
# analizzo $SHARED{ClassList}
foreach my $Class (split /\s+/, $SHARED{ClassList}){
($Name, $Teacher, $Flags) = split /:/, $Class, 3;
if(TestListStrEqual($SHARED{'Class_'.$Name}, $ident) ){
($ClassName, $ClassTeacher, $ClassFlags) = ($Name, $Teacher, $Flags);
last;
}
}
# =============================================================== FILTER OkGenList
# test URL sempre autorizzate a tutti gli utenti autenticati
if(TestListStr($SHARED{OkGenList}, $lurl)){
print STDOUT "\n";
Log(lc $method, $ident, $ip, $host, $url);
if($ident eq $ClassTeacher && $ClassFlags =~ m/FM/i){
TestFollowMe($host, $ClassName);
}
next WORD;
}
# =============================================================== FILTER Class
if(!$ClassName){
print STDOUT "http://mason.leader.it/squid_redirector.html?Mess=NoAuth&Url=$url&User=$ident\n";
Log('lock', $ident, $ip, $host, $url);
next WORD;
}
# =============================================================== FILTER OkAuthList
if(TestListStr($SHARED{OkAuthList}, $lurl)){
print STDOUT "\n";
Log(lc $method, $ident, $ip, $host, $url);
if($ident eq $ClassTeacher && $ClassFlags =~ m/FM/i){
TestFollowMe($host, $ClassName);
}
next WORD;
}
# =============================================================== FILTER NoAuthList
if(TestListStr($SHARED{NoAuthList}, $lurl)){
print STDOUT "http://mason.leader.it/squid_redirector.html?Mess=NoAuthList&Url=$url&User=$ident\n";
Log('lock', $ident, $ip, $host, $url);
next WORD;
}
# =============================================================== FILTER OkAuth_<ClassName>
if(TestListStr($SHARED{'OkAuth_'.$ClassName}, $lurl)){
print STDOUT "\n";
Log(lc $method, $ident, $ip, $host, $url);
if($ident eq $ClassTeacher && $ClassFlags =~ m/FM/i){
TestFollowMe($host, $ClassName);
}
next WORD;
}
# =============================================================== FILTER NoAuth_<ClassName>
if(TestListStr($SHARED{'NoAuth_'.$ClassName}, $lurl)){
print STDOUT "http://mason.leader.it/squid_redirector.html?Mess=NoAuthClass&Url=$url&User=$ident\n";
Log('lock', $ident, $ip, $host, $url);
next WORD;
}
# =============================================================== FILTER Command Message
if($host =~ m|^http://-/(.*)$|){
print LOG "$$ redir command $1\n";
$url =~ s|//-/|//127.0.0.1/|;
print LOG "$$ command Message $1\n";
$url =~ s|//-/|//http://mason.leader.it/squid_redirector.html?Mess=$1&User=$ident/|;
}
print STDOUT "$url\n";
# =============================================================== FILTER Default Action
print STDOUT "\n";
Log(lc $method, $ident, $ip, $host, $url);
 
GoUpdate();
# =============================================================== FOLLOWME
# test se Docente di una Classe e FollowMe attivo
if(1){
if(!TestListStrEqual($SHARED{'FollowMe'}, $host)){
$SHARED{'FollowMe'}.=" $host";
Log('log',$$, '-', '-', "Add FollowMe $host");
$dbh->begin_work || warn "DBI Error begin_work: ".DBI::errstr." on FollowMe update\n";
$sthupdkeys->execute(++$lastkey, $SHARED{'FollowMe'}, 'FollowMe');
$dbh->commit || die "DBI Error commit: ".DBI::errstr."\n";
# aggiorno anche gli altri processi
HUP_Family();
}
if($ident eq $ClassTeacher && $ClassFlags =~ m/FM/i){
TestFollowMe($host, $ClassName);
}
}
Log('log',$$, '-', '-', "Stop squid_redirector $$");