Пока выложу то что есть, хотя еще хотса добавить работу юзера по расписанию, а не как сейчас -- круглосуточно. Но времени, увы, пока нету
Проксик у меня не прозрачный, части народа нужна была авторизация, а прикручивать ntlm не хотелось. Так что тем у кого прозрачный проксик, придется поменять запросы и строки что пишутся в файл с фарволом.... hostdeny нужен для портсентру, туда вносятся хосты что сканили машину.
Код: Выделить всё
CREATE DATABASE trafd;
USE trafd;
CREATE TABLE `groups` (
`idGroup` int(10) unsigned NOT NULL auto_increment,
`NameGroup` char(45) NOT NULL default '',
`quota` char(12) NOT NULL default '100000000',
`email` char(30) NOT NULL default '',
`boss` char(30) NOT NULL default '',
`step1` char(12) NOT NULL default '',
`mailed` char(1) NOT NULL default '0',
PRIMARY KEY (`idGroup`)
) TYPE=MyISAM;
CREATE TABLE `hostallow` (
`idHost` int(10) unsigned NOT NULL auto_increment,
`hostname` char(40) NOT NULL default '',
`idGroup` int(10) unsigned NOT NULL default '0',
`ttl` date NOT NULL default '0000-00-00',
`bps` char(12) NOT NULL default '64000',
`bps2` char(12) NOT NULL default '32000',
`User` char(30) NOT NULL default '',
`pwd` char(15) NOT NULL default '""',
PRIMARY KEY (`idHost`)
) TYPE=MyISAM;
CREATE TABLE `hostdeny` (
`host` char(16) NOT NULL default '',
`name` char(50) NOT NULL default '',
`ports` char(4) NOT NULL default '',
`date` datetime NOT NULL default '0000-00-00 00:00:00'
) TYPE=MyISAM;
INSERT INTO `groups` (`idGroup`,`NameGroup`,`quota`,`email`,`boss`,`step1`,`mailed`) VALUES
(1,'Отдел 1','419430400','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','32000000','0'),
(2,'Отдел 2','104857600','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','32000000','0'),
(3,'Отдел 3','999999999','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
(4,'Отдел 4','104857600','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
(5,'Отдел 5','999999999','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','999999999','0'),
(6,'Отдел 6','104857600','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
(7,'Отдел 7','100000000','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','104000000','0'),
(8,'Отдел 8','100000000','<начальник отдела>@mbfkk.spb.ru','Имя начальника отдела','100000000','0');
INSERT INTO `hostallow` (`idHost`,`hostname`,`idGroup`,`ttl`,`bps`,`bps2`,`User`,`pwd`) VALUES
(4,'192.168.0.28',1,'2099-12-30','64000','32000','Имя юзера',''),
(5,'192.168.0.50',5,'2099-12-30','128000','128000','Имя юзера',''),
(6,'192.168.0.131',5,'2099-12-30','128000','128000','Имя юзера',''),
(7,'192.168.0.12',1,'2099-12-30','64000','32000','Имя юзера',''),
(8,'192.168.0.46',3,'2099-12-30','64000','32000','Имя юзера',''),
(9,'192.168.0.110',6,'2099-12-30','64000','32000','Имя юзера','1111'),
(10,'192.168.0.55',1,'2099-12-30','64000','32000','Имя юзера',''),
(11,'192.168.0.144',7,'2099-12-30','64000','32000','Имя юзера',''),
(12,'192.168.0.77',3,'2099-12-30','64000','32000','Имя юзера','');
Код: Выделить всё
#!/usr/bin/perl
use DBI();
$rcfw = "/etc/rc.firewall";
$nwfw = ">/etc/rc.firewal.new";
$hostsallow = ">/usr/local/etc/squid/hostsallow.conf";
$db = "trafd";
$user = "trafd";
$pass = "trafd";
$iface = "xl0";
$admemail = "admin\@mbfkk.spb.ru";
$RobotName = "Stat Robot";
$RobotAddr = "admin\@mbfkk.spb.ru";
$admbody = "";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
$year += 1900;
++$mon;
$mon2 = $mon + 1;
sub SendEMail {
open (SENDMAIL, "|/usr/sbin/sendmail -t") or die "sendmail not ready";
print SENDMAIL "From: $RobotName <$RobotAddr>\n";
print SENDMAIL "To: $_[0]\n";
print SENDMAIL "Reply-To: Evgeniy V. Podlesniy <$admemail>\n";
print SENDMAIL "Content-Type: text/plain; charset=windows-1251\n";
print SENDMAIL "Subject: $_[1]\n\n";
print SENDMAIL "$_[2]";
close (SENDMAIL) or warn "sendmail didn`t close nicely";
};
$dbh = DBI->connect("DBI:mysql:$db", $user, $pass) || die "Can\'t connect to MySQL\n";
# Выбираем траффик по не отключенным группам
$sql="select `hostallow`.`idgroup`, namegroup, boss, email, quota, \n".
"step1, mailed, sum(allbytes) \n".
"from hostallow, ${iface}_$year \n".
"left join groups on `groups`.`idgroup` = `hostallow`.`idgroup` \n".
"where to_ip = hostname \n".
" and ((from_ip = '192.168.0.200' and \n".
" port_from_ip = '3128') or \n".
" from_ip not like '192.168.%') \n".
" and mailed < 2 \n".
" and month(`${iface}_$year`.`date`) = $mon \n".
"group by `hostallow`.`idgroup`;\n";
$sth = $dbh->prepare($sql);
$sth->execute();
while (@tmp = $sth->fetchrow_array()) {
($idgroup, $NameGroup, $boss, $email, $quota, $step1, $mailed, $traffic) = @tmp;
if ($traffic > $quota) {
# Метим и отсылаем уведомление
$sql="update groups set mailed = '2' where idGroup = $idgroup;\n".
$stb = $dbh->prepare($sql);
$stb->execute();
# Выбираем статистику группы по хостам
$sql="select hostname, user, sum(allbytes)\n".
"from hostallow, ${iface}_$year \n".
"where to_ip = hostname\n".
" and ((from_ip = '192.168.0.200' and\n".
" port_from_ip = '3128') or\n".
" from_ip not like '192.168.%')\n".
" and month(`${iface}_$year`.`date`) = $mon\n".
" and idgroup = $idgroup\n".
"group by user;\n";
$stb = $dbh->prepare($sql);
$stb->execute();
$report = '';
while (($host, $user, $usertraff) = $stb->fetchrow_array()) {
$usertraff = int($usertraff / 1048576 * 100) / 100;
$report .= "\n$host\t${usertraff} Mb \t$user";
};
$stb->finish();
$traffic = int($traffic / 1048576 * 100) / 100;
$quota = int($quota / 1048576 * 100) / 100;
$body = "Здравствуйте, $boss!\n\n".
"Настоящим сообщаю, что Ваш отдел $NameGroup\n".
"перешол порог отключения, который составляет $quota Mb.\n".
"На текущий момент у вас получено $traffic Mb.\n\n".
"Статистика:\n$report";
SendEMail("$boss <$email>", "Интернет отключен", "$body");
$admbody .= "Отдел: $NameGroup\tОтключен\tВыбрано: ${traffic}Mb из ${quota}Mb".
$report."\n\n";
} elsif (($traffic > $step1) and ($mailed = 0)) {
# Метим и отсылаем уведомление
$sql="update groups set mailed = '1' where idGroup = $idgroup;\n".
$stb = $dbh->prepare($sql);
$stb->execute();
# Выбираем статистику группы по хостам
$sql="select hostname, user, sum(allbytes), bps2 \n".
"from hostallow, ${iface}_$year \n".
"where to_ip = hostname\n".
" and ((from_ip = '192.168.0.200' and\n".
" port_from_ip = '3128') or\n".
" from_ip not like '192.168.%')\n".
" and month(`${iface}_$year`.`date`) = $mon\n".
" and idgroup = $idgroup\n".
"group by user;\n";
$stb = $dbh->prepare($sql);
$stb->execute();
$report = '';
while (($host, $user, $usertraff, $bps) = $stb->fetchrow_array()) {
$users[$#user + 1] = [($host, $bps)];
$usertraff = int($usertraff / 1048576 * 100) / 100;
$report .= "\n$host\t${usertraff} Mb \t$user";
};
$stb->finish();
$traffic = int($traffic / 1048576 * 100) / 100;
$quota = int($quota / 1048576 * 100) / 100;
$body = "Здравствуйте, $boss!\n\n".
"Настоящим сообщаю, что Ваш отдел $NameGroup\n".
"приблизился к порогу отключения, который составляет $quota Mb.\n".
"На текущий момент у вас получено $traffic Mb.\n\n".
"Статистика:\n$report";
SendEMail("$boss <$email>", "Вы подошли к порогу отключения", "$body");
$admbody .= "Отдел: $NameGroup\tПредупреждение\tВыбрано: ${traffic}Mb из ${quota}Mb".
$report."\n\n";
$stb->finish();
}; # if
} # while (@tmp
$sth->finish();
if ($admbody) { # Если ругались на юзверей -- жалуемся админу
SendEMail("Urgor <$admemail>", "Интернет: зверства", "Гигабитного тебе коннекта, Urgor!\n\n $admbody");
}
# Выбираем список юзеров кому можно в инет
$sql="select hostname, mailed, bps, bps2, pwd\n".
"from hostallow, groups\n".
"where `groups`.`idgroup` = `hostallow`.`idgroup`\n".
" and ttl > now()\n".
" and mailed < 2;\n";
$stb = $dbh->prepare($sql);
$stb->execute();
while (($host, $mailed, $bps, $bps2, $pwd) = $stb->fetchrow_array()) {
if ($mailed == 0) {$users[$#users + 1] = [($host, $bps, $pwd)]}
else {$users[$#users + 1] = [($host, $bps2, $pwd)]};
};
$stb->finish();
open(f1,$rcfw) || die "Can\'t open file: $rcfw\n";
open(f2,$nwfw) || die "Can\'t create file: $nwfw\n";
open(squid,$hostsallow) || die "Can\'t create file: $hostsallow\n";
while (<f1>) {
print f2 $_;
if (index($_, "--pipe") > 0) {
$pipe = 10;
for $i (0 .. $#users) {
($host, $bps, $pwd) = @{$users[$i]};
print f2 "\${FwCMD} add pipe $pipe ip from \${IpIn} 3128 to $host\n";
print f2 "\${FwCMD} pipe $pipe config bw $bps"."bit/s\n";
if ($pwd eq "") { print squid "$host\n" };
++$pipe;
}; # for $i
# Открываем черный список
$sql="select host\n".
"from hostdeny;\n";
$stb = $dbh->prepare($sql);
$stb->execute();
while (($host) = $stb->fetchrow_array()) {
print f2 "\${FwCMD} add deny ip from $host to any\n";
}; # while
$stb->finish();
}; # if --pipe
if (index($_, "--divert") > 0) {
for $i (0 .. $#users) {
($host, $bps, $pwd) = @{$users[$i]};
print f2 "\${FwCMD} add divert natd ip from $host to any out via ${LanOut}\n";
}; # for $i
}; # if --pipe
}; # while (<f1>)
close(f1);
close(f2);
close(squid);
$dbh->disconnect;
$comm = `/bin/sh /etc/rc.firewall.new`;
$comm = `squid -k reconfigure`;