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