Исходный данные:
84.56.32.7 | Головной офис |
84.56.54.34 | Филиал |
Задача:
Нужно каждый месяц забирать определенное количество MB по прокси серверу у своего филиал
Обязательный условия:
Архитектура
Каждый месяц первого числа наш прокси сервер(squid) будет переключаться в каскадный режим(т.е. будет работать через другой прокси), каждуй ночь данные будут скидываться в базу mysql, как только набираем определенное количество MB переключаемся обратно(считать трафик будем c помощью ipcad)
Настраиваем squid
У вас должно быть три файла conf в каталоге squid(/etc/squid)
cache_peer 84.56.54.34 parent 3128 0 no-query
Настраиваем ipcad:
capture-ports enable; buffers = 128k; interface eth1; interface eth0; aggregate 192.168.50.0/24 strip32; rsh enable at 127.0.0.1; rsh root@127.0.0.1 admin; rsh root@127.0.0.1 backup; rsh root@127.0.0.1; rsh 127.0.0.1 view-only; rsh ttl = 3; rsh timeout = 30; dumpfile = /var/log/ipcad/ipcad.dump; pidfile = /var/run/ipcad.pid; memory_limit = 80m;
Создадим базу допустим spacedust
[root@spacedust ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1000 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database spacedust; Query OK, 1 row affected (0.03 sec)
mysql> show databases; +-----------+ | Database | +-----------+ | mysql | | spacedust | | test | +-----------+ 3 rows in set (0.00 sec)
mysql>
Теперь создадим таблицу b255 куда будут скидываться наши данные
[root@spacedust ~]# mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1001 to server version: 4.1.20
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use spacedust; Database changed mysql> create table b255( id int(11) NOT NULL AUTO_increment,date DATE,ip VARCHAR(90) not null,input int(90) not null, primary key(id)); Query OK, 0 rows affected (0.06 sec)
mysql> show tables; +---------------------+ | Tables_in_spacedust | +---------------------+ | b255 +---------------------+ 2 rows in set (0.02 sec)
mysql>
Создаем в каталоге /var/www/html папку traf_inza
Считаем входящий трафик идущий на внешний интерфейс по порту в 3128(в реальном времени)
от филиала. Создаем скрипт traf_b255 со следующим содержанием:
/usr/bin/rsh localhost show ip accounting | grep -w 84.56.32.7 |awk '{if($1=="84.56.54.34" && $8=="eth1" && $5=="3128"){s+=$4}} END {printf "%i\n ",((s/1024)/1024)}'
Скрипт который будет запускаться каждую ночь(время задаете в crond), он будет
скидывать статистику за день в базу mysql и обнулять ее
Создаем скрипт mysql_b255 со следующим содержанием:
path="/var/www/html/traf_inza/traf_b255"; day=$(date +%d); month=$(date +%m); year=$(date +%Y); date=$year-$month-$day; execl=$(exec $path); traf=$(expr $execl); mysql -u root -Bse "use spacedust;insert into b255 (date,ip,input) values ('$date','84.56.32.7','$traf');" /usr/bin/rsh localhost clear ip accounting
Теперь сам скрипт который будет заниматься переключением, можете его загнать в crond
и запускать каждые час или два, у меня стоит забирать 700MB, и до 10 числа месяца делать
перелючение, до это времени мы полюбому добираем столько метров.
Создаем скрипт squid_b255 со следующим содержанием:
path="/var/www/html/traf_inza/b255"; path1="/etc/squid/squid.conf"; path2="/etc/squid/squid.conf_kudr"; path3="/etc/squid/squid.conf_b255"; limit=700; rm -f $path; sum=0; day=$(date +%d); month=$(date +%m); year=$(date +%Y); date_begin=$year-$month-01; date_end=$year-$month-31; mysql -u root -Bse "use spacedust; select input from b255 where ip='84.56.32.7' && date>='$date_begin' && date<='$date_end';" >> $path /var/www/html/traf_inza/traf_b255 >> $path for i in $(cat $path); do sum=$(expr $i + $sum); done echo "Zabrali u b255 = " $sum"Mb"; rm -f $path; if [ $(expr $day) -lt 10 ]; then { echo "day" $(expr $day) - "perekluchenie ON"; if [ $sum -lt $limit ]; then { rm -f $path1; cp -p $path3 $path1; /etc/init.d/squid reload; echo $sum"Mb" "<" $limit"Mb"; echo "now squid - b255"; } fi if [ $sum -gt $limit ]; then { rm -f $path1; cp -p $path2 $path1; /etc/init.d/squid reload; echo $sum"Mb" ">" $limit"Mb"; echo "now squid - kudr"; } fi } else { echo "day" $(expr $day) - "perekluchenie OFF"; } fi