Files
pannello/proxy/squid_acl/squid_acl.pl
2016-05-05 11:23:24 +02:00

145 lines
2.6 KiB
Perl
Executable File

#!/usr/bin/perl
$|=1;
use DBI;
use Switch;
use FindBin qw($Bin);
require "$Bin/../script/conntrack.conf";
local $SIG{ALRM} = sub {
my $time = localtime; # scalar context
print LOG "$$ - $time - Exit\n";
exit 1;
};
srand($$);
$timeout = 60 * (int(rand(5))+61);
$limit = 50;
my $dbmysql = DBI->connect("DBI:mysql:;host=$DBhost", $DBuser, $DBpass) or die ($DBI::errstr);
$sts = $dbmysql->prepare("use $DBname");
$sts->execute ();
open LOG, ">> /srv/www/htdocs/pannello_vbc/proxy/squid_acl/squid_pool.log";
LOG->autoflush(1);
alarm $timeout;
while($limit) {
my $query = "";
my $input = <>;
chop $input;
my @param = split / /, $input;
my $ritorno = cerca ($param[1],$param[2], -1);
$limit--;
if ($ritorno) {
print LOG "$param[0] - $param[1] - $param[2] - ERR\n";
print "DENY\n";
} else {
$ritorno = cerca ($param[1],$param[2], 1);
if ($ritorno) {
print LOG "$param[0] - $param[1] - $param[2] - OK\n";
print "OK\n";
} else {
print LOG "$param[0] - $param[1] - $param[2] - ERR\n";
print "DENY2\n";
}
}
}
exit;
sub cerca {
my $ip = shift;
my $url = shift;
my $stato = shift;
if ($stato == 1) {
$tutto = "";
} else {
$tutto = "";
}
$query = " SELECT
1
FROM
proxy_pool
JOIN
proxy_acl_ip
ON
proxy_pool.id = proxy_acl_ip.idpool
AND
proxy_acl_ip.stato = $stato
JOIN
proxy_acl_list
ON
proxy_acl_ip.idacllist = proxy_acl_list.id
AND
proxy_acl_list.attivo = 1
JOIN
proxy_acl
ON
proxy_acl.idacllist = proxy_acl_list.id
AND
proxy_acl.attivo = 1
AND
LOCATE(proxy_acl.rif, '$url') > 0
WHERE
proxy_pool.ip = '$ip'
UNION DISTINCT SELECT
1
FROM
proxy_pool
JOIN
proxy_acl_ip
ON
proxy_pool.id = proxy_acl_ip.idpool
AND
proxy_acl_ip.stato = $stato
JOIN
proxy_acl_list
ON
proxy_acl_ip.idacllist = proxy_acl_list.id
AND
proxy_acl_list.nome = 'ALL'
WHERE
proxy_pool.ip = '$ip'
UNION DISTINCT SELECT
1
FROM
proxy_acl
JOIN
proxy_acl_list
ON
proxy_acl_list.id = proxy_acl.idacllist
WHERE
LOCATE(proxy_acl.rif, '$url') > 0
AND
proxy_acl_list.dflt = $stato
AND
proxy_acl_list.id NOT IN (
SELECT
proxy_acl_ip.idacllist
FROM
proxy_acl_ip
JOIN
proxy_pool
ON
proxy_pool.id = proxy_acl_ip.idpool
WHERE
proxy_pool.ip = '$ip'
)
";
# print "$query\n";
$sts = $dbmysql->prepare($query);
$sts->execute ();
if ($ref = $sts->fetchrow_hashref ) {
return 1;
} else {
return 0;
}
}