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 $$"); |