doc:os:freebsd:ng_ipacct:ng_ipacct
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| doc:os:freebsd:ng_ipacct:ng_ipacct [d.m.Y H:i] – создано dbehterev | doc:os:freebsd:ng_ipacct:ng_ipacct [d.m.Y H:i] (текущий) – внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Подсчет траффика с помощью ng_ipacct ====== | ====== Подсчет траффика с помощью ng_ipacct ====== | ||
| - | Советую для начала прочитать, | + | Советую для начала прочитать, |
| + | Среда окружения: | ||
| + | * ОС FreeBSD 8.2-Stable | ||
| + | * MySQL server 5.1 | ||
| + | * обновленное дерево портов | ||
| + | * Пересобранное ядро с опциями: | ||
| + | < | ||
| + | options | ||
| + | options | ||
| + | options | ||
| + | options | ||
| + | options | ||
| + | </ | ||
| + | |||
| + | ===== Порядок действий ===== | ||
| + | |||
| + | **1.** Устанавливаем порты: | ||
| + | < | ||
| + | / | ||
| + | / | ||
| + | / | ||
| + | </ | ||
| + | Порт p5-DBD-mysql51 должен согласовываться с вашей установленной версией MySQL server. | ||
| + | |||
| + | **2.** Создаем необходимые каталоги: | ||
| + | < | ||
| + | mkdir -p / | ||
| + | mkdir / | ||
| + | mkdir / | ||
| + | </ | ||
| + | |||
| + | **3.** Создаем БД, которая будет хранить сведения по траффику, | ||
| + | < | ||
| + | # mysql -p | ||
| + | create database ng_stat; | ||
| + | grant insert, | ||
| + | </ | ||
| + | |||
| + | **4.** В / | ||
| + | < | ||
| + | # Имя сервера, | ||
| + | server_db = localhost | ||
| + | # Имя базы данных, | ||
| + | db_name = ng_stat | ||
| + | # Имя пользователи для доступа к базе | ||
| + | db_user = nguser | ||
| + | # Пароль для доступа к базе | ||
| + | db_pass = pass | ||
| + | # Таблица для авторизации пользователей через WEB. | ||
| + | table_auth = ipacct_auth | ||
| + | # Таблица со списком протоколов, | ||
| + | table_protocols = protocols | ||
| + | # Имя хоста с которого снимается статистика | ||
| + | listen_host = localhost | ||
| + | # Имена интерфейсов, | ||
| + | # Указывать через запятую | ||
| + | listen_interfaces = xl0,xl1 | ||
| + | # Загружаемые модули NETGRAPH, необходимые для интерфейсов, | ||
| + | # которые будет обслуживать программа | ||
| + | # По умолчанию загружаются следующие модули: | ||
| + | # ng_ether, | ||
| + | ng_modules = netgraph, | ||
| + | # Какой трешхолд необходимо установить для работы системы. | ||
| + | # Отнеситесь внимательно к выбору этого параметра. Он | ||
| + | # означает сколько записей будет храниться в буфере | ||
| + | # По умолчанию значение равно 5000, но если у вас меньше | ||
| + | # 128 Мегабайт памяти | ||
| + | threshold = 10000 | ||
| + | </ | ||
| + | |||
| + | **5.** В папке bin создадим свой скрипт ng_stat_start.pl: | ||
| + | < | ||
| + | # | ||
| + | |||
| + | use DBI; | ||
| + | use POSIX ": | ||
| + | #use strict; | ||
| + | ######################### | ||
| + | # Список основных переменных | ||
| + | ######################### | ||
| + | my $serverdb = " | ||
| + | my $dbname = " | ||
| + | my $dbuser = " | ||
| + | my $dbpass = " | ||
| + | my $table_auth = " | ||
| + | my $table_proto = " | ||
| + | my $listen_host = " | ||
| + | my @listen_interf; | ||
| + | my $iface_set = " | ||
| + | my @ng_modules; | ||
| + | my $ng_modules_def = " | ||
| + | my $threshold = 5000; | ||
| + | ######################### | ||
| + | # Читаем конфиг. файл. | ||
| + | ######################### | ||
| + | open (CONFIG, "/ | ||
| + | |||
| + | while (< | ||
| + | $comment = '#'; | ||
| + | if(/ | ||
| + | # print " | ||
| + | } | ||
| + | else { | ||
| + | ($param, | ||
| + | chomp $param; | ||
| + | chomp $arg; | ||
| + | my $razdel = ""; | ||
| + | $param =~ s/ | ||
| + | $arg =~ s/ | ||
| + | if ($param eq " | ||
| + | $serverdb = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbname = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbuser = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbpass = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $table_auth = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $table_proto = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $listen_host = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | my $coma = ','; | ||
| + | if (defined $arg) { | ||
| + | $iface_set = " | ||
| + | if ($arg ne "" | ||
| + | if ($arg =~ m/$coma/ ) { | ||
| + | @listen_interf=split($coma, | ||
| + | } | ||
| + | else { | ||
| + | @listen_interf = $arg; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | if ($param eq " | ||
| + | | ||
| + | my $coma = ','; | ||
| + | if ($arg =~ m/$coma/ ){ | ||
| + | @ng_modules = split($coma, | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | @ng_modules = split ($coma, | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $threshold = $arg; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | close (CONFIG); | ||
| + | |||
| + | if (!defined $listen_interf[0]) { | ||
| + | print " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | & | ||
| + | & | ||
| + | | ||
| + | } | ||
| + | |||
| + | sub check_kld_modules { | ||
| + | my @modules; | ||
| + | my $pid; | ||
| + | my $ng_module_cfg; | ||
| + | my $chk_ng_file = "/ | ||
| + | my $check_ng = ' | ||
| + | $check_ng = " | ||
| + | my $check_netgraph = ' | ||
| + | $check_netgraph = " | ||
| + | # $pid = fork; | ||
| + | |||
| + | @modules =split (" | ||
| + | my $mod; | ||
| + | $mod = ""; | ||
| + | if (defined $modules[0]) { | ||
| + | foreach my $modules (@modules) { | ||
| + | $modules=~ s/\d+//g; | ||
| + | if ($modules =~ s/.ko//g) { | ||
| + | # | ||
| + | } | ||
| + | else { | ||
| + | $modules =~ s/ | ||
| + | $mod = "$mod $modules "; | ||
| + | } | ||
| + | } | ||
| + | chop $mod; | ||
| + | |||
| + | foreach my $ng_modules (@ng_modules) { | ||
| + | if ($mod=~m/ | ||
| + | # print "$mod содержит $ng_modules\n"; | ||
| + | } | ||
| + | else { | ||
| + | my ($pid, | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec "/ | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | foreach my $ng_modules (@ng_modules) { | ||
| + | my ($pid, | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec "/ | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | undef $pid; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | |||
| + | sub listening { | ||
| + | my $pid; | ||
| + | $ngctl = "/ | ||
| + | $ipacctctl = "/ | ||
| + | while (@listen_interf){ | ||
| + | | ||
| + | $interface = shift @listen_interf; | ||
| + | #/ | ||
| + | $mkpeer = " | ||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #/ | ||
| + | $connect = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #/ | ||
| + | $name = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #/ | ||
| + | $mkpeer = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #/ | ||
| + | $name = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #/ | ||
| + | $connect = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #$IPACCTCTL ${IFACE}_ip_acct: | ||
| + | $verbose = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | |||
| + | #$IPACCTCTL ${IFACE}_ip_acct: | ||
| + | $set_threshold = " | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | |||
| + | exit(0); | ||
| + | </ | ||
| + | **5.1** Даем права на запуск: | ||
| + | < | ||
| + | chmod a+x ng_stat_start.pl | ||
| + | </ | ||
| + | |||
| + | **5.2** Выполняем скрипт ng_stat_start.pl. Смотрим на ошибки, | ||
| + | Мой вывод: | ||
| + | < | ||
| + | Загрузка необходимого модуля ng_ether | ||
| + | Создание и подключение нового NETGRAPH-узла к уже существующему: | ||
| + | / | ||
| + | ngctl: send msg: File exists | ||
| + | Соединение двух NETGRAPH-узлов на интерфейсе: | ||
| + | / | ||
| + | ngctl: send msg: File exists | ||
| + | Присвоение имени созданному узлу: | ||
| + | / | ||
| + | ngctl: send msg: Address already in use | ||
| + | Создание и подключение нового NETGRAPH-узла к уже существующему: | ||
| + | / | ||
| + | ngctl: send msg: File exists | ||
| + | Присвоение имени созданному узлу: | ||
| + | / | ||
| + | ngctl: send msg: Address already in use | ||
| + | Соединение двух NETGRAPH-узлов на интерфейсе: | ||
| + | / | ||
| + | ngctl: send msg: File exists | ||
| + | Установка режима вывода информации: | ||
| + | / | ||
| + | Установка THRESHOLD: | ||
| + | / | ||
| + | </ | ||
| + | |||
| + | **6.** Создаем в каталоге / | ||
| + | < | ||
| + | # | ||
| + | |||
| + | case " | ||
| + | start) | ||
| + | / | ||
| + | ;; | ||
| + | stop) | ||
| + | / | ||
| + | ;; | ||
| + | *) | ||
| + | echo "" | ||
| + | echo " | ||
| + | echo "" | ||
| + | ;; | ||
| + | esac | ||
| + | </ | ||
| + | |||
| + | **7.** Создаем скрипт / | ||
| + | < | ||
| + | # | ||
| + | |||
| + | use DBI; | ||
| + | use POSIX ": | ||
| + | ######################### | ||
| + | # Список основных переменных | ||
| + | ######################### | ||
| + | my $ngctl = "/ | ||
| + | my $serverdb = " | ||
| + | my $dbname = " | ||
| + | my $dbuser = " | ||
| + | my $dbpass = " | ||
| + | my $table_auth = " | ||
| + | my $table_proto = " | ||
| + | my $listen_host = " | ||
| + | my @listen_interf; | ||
| + | my $iface_set = " | ||
| + | |||
| + | ######################### | ||
| + | # Читаем конфиг. файл. | ||
| + | ######################### | ||
| + | open (CONFIG, "/ | ||
| + | while (< | ||
| + | $comment = '#'; | ||
| + | if(/ | ||
| + | # print " | ||
| + | } | ||
| + | else { | ||
| + | ($param, | ||
| + | chomp $param; | ||
| + | chomp $arg; | ||
| + | my $razdel = ""; | ||
| + | $param =~ s/ | ||
| + | $arg =~ s/ | ||
| + | if ($param eq " | ||
| + | $serverdb = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbname = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbuser = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbpass = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $table_auth = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $table_proto = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $listen_host = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | my $coma = ','; | ||
| + | if (defined $arg) { | ||
| + | if ($arg ne "" | ||
| + | if ($arg =~ m/$coma/ ) { | ||
| + | @listen_interf=split($coma, | ||
| + | } | ||
| + | else { | ||
| + | @listen_interf = $arg; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | close (CONFIG); | ||
| + | |||
| + | if (!defined $listen_interf[0]) { | ||
| + | print " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | | ||
| + | #/ | ||
| + | $shutdown = " | ||
| + | my $pid; | ||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | # sleep 1; | ||
| + | $shutdown = " | ||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | print " | ||
| + | exec " | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | undef $pid; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | exit(0); | ||
| + | |||
| + | </ | ||
| + | |||
| + | **7.1** Даем скрипту ng_stat_stop.pl права на выполнение. | ||
| + | |||
| + | **7.2** Проверяем работу скрипта. | ||
| + | |||
| + | **8.** Cоздаем скрипт / | ||
| + | < | ||
| + | # | ||
| + | |||
| + | use DBI; | ||
| + | use Time:: | ||
| + | use POSIX ": | ||
| + | |||
| + | ######################### | ||
| + | # Список основных переменных | ||
| + | ######################### | ||
| + | my $serverdb = " | ||
| + | my $dbname = " | ||
| + | my $dbuser = " | ||
| + | my $dbpass = " | ||
| + | my $table_auth = " | ||
| + | my $table_proto = " | ||
| + | my $listen_host = " | ||
| + | my @listen_interf; | ||
| + | my $iface_set = " | ||
| + | my @ng_modules; | ||
| + | my $ng_modules_def = " | ||
| + | my $threshold = 5000; | ||
| + | my $ipacct_log = '/ | ||
| + | my @ipacct_arr; | ||
| + | my @ipacct_arr_in; | ||
| + | ########################## | ||
| + | # Читаем конфиг. файл. | ||
| + | ######################### | ||
| + | open (CONFIG, "/ | ||
| + | |||
| + | while (< | ||
| + | $comment = '#'; | ||
| + | if(/ | ||
| + | # print " | ||
| + | } | ||
| + | else { | ||
| + | my ($param, | ||
| + | chomp $param; | ||
| + | chomp $arg; | ||
| + | $param =~ s/ | ||
| + | $arg =~ s/ | ||
| + | if ($param eq " | ||
| + | $serverdb = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbname = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbuser = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $dbpass = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $table_auth = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $table_proto = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $ipacct_log = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | $listen_host = $arg; | ||
| + | } | ||
| + | if ($param eq " | ||
| + | my $coma = ','; | ||
| + | if ($arg =~ m/$coma/ ) { | ||
| + | @listen_interf=split($coma, | ||
| + | } | ||
| + | else { | ||
| + | @listen_interf = $arg; | ||
| + | } | ||
| + | } | ||
| + | if ($param eq " | ||
| + | my $coma = ','; | ||
| + | if ($arg =~ m/$coma/ ){ | ||
| + | @ng_modules = split($coma, | ||
| + | } else { | ||
| + | |||
| + | @ng_modules = split ($coma, | ||
| + | } | ||
| + | |||
| + | } | ||
| + | if ($param eq " | ||
| + | $threshold = $arg; | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | close (CONFIG); | ||
| + | |||
| + | ######################### | ||
| + | # Проверяем время. | ||
| + | ######################### | ||
| + | $gm = localtime(); | ||
| + | $year = ($gm-> | ||
| + | $mounth = ($gm-> | ||
| + | $mday = $gm-> | ||
| + | $date = " | ||
| + | $hour = $gm-> | ||
| + | $min = $gm-> | ||
| + | $sec = $gm-> | ||
| + | $hour=sprintf(" | ||
| + | $min=sprintf(" | ||
| + | $sec=sprintf(" | ||
| + | $time = " | ||
| + | $table_date = " | ||
| + | |||
| + | if (!defined $listen_interf[0]) { | ||
| + | print " | ||
| + | } | ||
| + | else { | ||
| + | |||
| + | while (@listen_interf){ | ||
| + | $interface = shift @listen_interf; | ||
| + | my $pid; | ||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | #$IPACCTCTL ${IFACE}_ip_acct: | ||
| + | exec "/ | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | |||
| + | undef $pid; | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | #$IPACCTCTL ${IFACE}_ip_acct: | ||
| + | exec "/ | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | |||
| + | undef $pid; | ||
| + | |||
| + | $pid = fork; | ||
| + | if (defined $pid) { | ||
| + | if ($pid == 0){ | ||
| + | #$IPACCTCTL ${IFACE}_ip_acct: | ||
| + | exec "/ | ||
| + | exit; | ||
| + | } | ||
| + | } | ||
| + | else { | ||
| + | print " | ||
| + | die " | ||
| + | } | ||
| + | do { | ||
| + | $kid = waitpid $pid,0; | ||
| + | if ($kid == -1) { | ||
| + | print " | ||
| + | } elsif ($kid == 0) { | ||
| + | print " | ||
| + | } | ||
| + | } until $kid=$pid; | ||
| + | |||
| + | undef $pid; | ||
| + | |||
| + | $TMPLOG= " | ||
| + | open (TMPLOG, " | ||
| + | $TMPLOG =~ s/ | ||
| + | while (< | ||
| + | $tmp_log_line=$_; | ||
| + | chomp $tmp_log_line; | ||
| + | $tmp_log_line = " | ||
| + | push @ipacct_arr, | ||
| + | } | ||
| + | close (TMPLOG); | ||
| + | truncate ($TMPLOG, | ||
| + | |||
| + | |||
| + | undef $pid; | ||
| + | } | ||
| + | |||
| + | open (IPCTLOG,">> | ||
| + | while (@ipacct_arr){ | ||
| + | |||
| + | $line_arr = shift @ipacct_arr; | ||
| + | $line_arr = " | ||
| + | print IPCTLOG $line_arr; | ||
| + | |||
| + | } | ||
| + | close(IPCTLOG); | ||
| + | |||
| + | & | ||
| + | & | ||
| + | & | ||
| + | } | ||
| + | |||
| + | sub check_in_mysql { | ||
| + | |||
| + | my ($dbh, | ||
| + | $dbh = DBI-> | ||
| + | or & | ||
| + | $sth = $dbh-> | ||
| + | $sth-> | ||
| + | my @row; | ||
| + | my $tables; | ||
| + | while (@row = $sth-> | ||
| + | foreach $tables (@row){ | ||
| + | push @dbtables, $tables; | ||
| + | } | ||
| + | } | ||
| + | $crt_tbl=" | ||
| + | while (@dbtables) { | ||
| + | $table = shift @dbtables; | ||
| + | if (defined $table) { | ||
| + | if ($table eq $table_date) { | ||
| + | $crt_tbl=" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | if ($crt_tbl eq " | ||
| + | print " | ||
| + | & | ||
| + | } | ||
| + | |||
| + | $sth-> | ||
| + | $dbh-> | ||
| + | |||
| + | } | ||
| + | |||
| + | sub error_connection { | ||
| + | |||
| + | print " | ||
| + | print " | ||
| + | print " | ||
| + | print " | ||
| + | print " всплеск нагрузки на сеть и сервера. По этому обратите внимание на данное"; | ||
| + | print " сообщение и выясните конкретную причину.\n"; | ||
| + | foreach $line_arr(@ipacct_arr_in) { | ||
| + | open (DUMPFILE, ">> | ||
| + | $line_arr = " | ||
| + | print DUMPFILE $line_arr; | ||
| + | close (DUMPFILE); | ||
| + | } | ||
| + | die " | ||
| + | |||
| + | } | ||
| + | |||
| + | sub crt_table_log { | ||
| + | |||
| + | my ($dbh, | ||
| + | $dbh = DBI-> | ||
| + | or & | ||
| + | $select = " | ||
| + | $sth = $dbh-> | ||
| + | $sth-> | ||
| + | $sth-> | ||
| + | $dbh-> | ||
| + | |||
| + | } | ||
| + | |||
| + | sub insert_data_db { | ||
| + | my ($dbh, | ||
| + | $dbh = DBI-> | ||
| + | or & | ||
| + | $insert = " | ||
| + | |||
| + | $sth = $dbh-> | ||
| + | #print " | ||
| + | while (@ipacct_arr_in) { | ||
| + | $line_in = shift @ipacct_arr_in; | ||
| + | ($ip_from, | ||
| + | if (!defined $proto){ | ||
| + | $proto=" | ||
| + | } | ||
| + | if (!defined $packets){ | ||
| + | $packets=" | ||
| + | } | ||
| + | if (!defined $bytes){ | ||
| + | $bytes=" | ||
| + | } | ||
| + | $sth-> | ||
| + | } | ||
| + | |||
| + | $sth-> | ||
| + | $dbh-> | ||
| + | } | ||
| + | |||
| + | sub parse_log_file { | ||
| + | open (PARSFILE, " | ||
| + | while ($line_parse=< | ||
| + | chomp $line_parse; | ||
| + | $line_parse =~ s/ | ||
| + | push @ipacct_arr_in, | ||
| + | } | ||
| + | close (PARSFILE); | ||
| + | truncate (" | ||
| + | } | ||
| + | |||
| + | exit(0); | ||
| + | </ | ||
| + | |||
| + | **8.1** Делаем скрипт исполняемым. | ||
| + | |||
| + | **8.2** Выполняем скрипт. Смотрим на ошибки. | ||
| + | |||
| + | Итак, за каждый месяц должна автоматически создаваться табличка со столбцами: | ||
| + | < | ||
| + | +-----------------+--------+-----------------+--------+-------+---------+---------+----------+----------+-----------+-----------+ | ||
| + | | ip_from | ||
| + | +-----------------+--------+-----------------+--------+-------+---------+---------+----------+----------+-----------+-----------+ | ||
| + | </ | ||
| + | |||
| + | **8.3** Помещаем вызов скрипта ng_stat_in.pl в крон: | ||
| + | < | ||
| + | */15 * * * * root / | ||
| + | </ | ||
| + | |||
| + | TAG: {{tag> ng_ipacct FreeBSD}} | ||
| + | |||
| + | ~~DISCUSSION~~ | ||
/var/www/wiki.itcall.ru/data/attic/doc/os/freebsd/ng_ipacct/ng_ipacct.1302364608.txt.gz · Последнее изменение: d.m.Y H:i (внешнее изменение)
