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 ====== | ||
| - | Советую для начала прочитать, | + | Советую для начала прочитать, |
| Среда окружения: | Среда окружения: | ||
| Строка 16: | Строка 16: | ||
| </ | </ | ||
| - | Порядок действий: | + | ===== Порядок действий |
| **1.** Устанавливаем порты: | **1.** Устанавливаем порты: | ||
| Строка 22: | Строка 22: | ||
| / | / | ||
| / | / | ||
| + | / | ||
| </ | </ | ||
| Порт p5-DBD-mysql51 должен согласовываться с вашей установленной версией MySQL server. | Порт p5-DBD-mysql51 должен согласовываться с вашей установленной версией MySQL server. | ||
| Строка 29: | Строка 30: | ||
| mkdir -p / | mkdir -p / | ||
| mkdir / | mkdir / | ||
| + | mkdir / | ||
| </ | </ | ||
| Строка 95: | Строка 97: | ||
| # Читаем конфиг. файл. | # Читаем конфиг. файл. | ||
| ######################### | ######################### | ||
| - | open (CONFIG, "/usr/local/ | + | open (CONFIG, "/var/scripts/ |
| while (< | while (< | ||
| Строка 187: | Строка 189: | ||
| @modules =split (" | @modules =split (" | ||
| my $mod; | my $mod; | ||
| + | $mod = ""; | ||
| if (defined $modules[0]) { | if (defined $modules[0]) { | ||
| foreach my $modules (@modules) { | foreach my $modules (@modules) { | ||
| Строка 473: | Строка 476: | ||
| exit(0); | 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.1302367999.txt.gz · Последнее изменение: d.m.Y H:i (внешнее изменение)
