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 (внешнее изменение)