Pa4ka
|
|
« Ответ #555 : 27 Марта 2014, 18:14:14 » |
|
Где-то уже была теме про authtraf - perl-модуль, который использует этот модуль, глючный. Как будет время заменю его на вызов arping
а много нужно переписать что бы работало?
|
|
|
Записан
|
|
|
|
maxx
|
|
« Ответ #556 : 28 Марта 2014, 12:39:54 » |
|
Возник вопрос. Как выдавать айпи из определенного пула определенным клиентам. Например есть есть группа пользователей с серыми адресами и с динамическими реальными. Как указать что адрес нужно брать из пула? и вопрос намбер цвай, как купить модуль? Не могу зачислить денег на счет. Спс.
|
|
|
Записан
|
|
|
|
Redmen
NoDeny
Ветеран
Карма: 62
Offline
Сообщений: 546
Подяку в КАРМУ
|
|
« Ответ #557 : 28 Марта 2014, 12:59:10 » |
|
Где-то уже была теме про authtraf - perl-модуль, который использует этот модуль, глючный. Как будет время заменю его на вызов arping
а много нужно переписать что бы работало? я вчера хотел переделать даный модуль на перловский Net::Arping, но проблема остановила меня в самом начале, т.к. Net::Arping несмог поставить на фрю!! есть 2 выхода из ситуации: 1) переделать authtraf на вызов системной команды Arping; 2) отказаться от authtraf, а взамен переделать модуль коллектора так, чтобы при снятии среза, если есть у клиента трафик и авторизация "всегда онлайн" вызывать ("CALL set_auth(?,?)", $p{ipa}, $opts);
|
|
|
Записан
|
|
|
|
Pa4ka
|
|
« Ответ #558 : 29 Марта 2014, 12:55:05 » |
|
Где-то уже была теме про authtraf - perl-модуль, который использует этот модуль, глючный. Как будет время заменю его на вызов arping
а много нужно переписать что бы работало? я вчера хотел переделать даный модуль на перловский Net::Arping, но проблема остановила меня в самом начале, т.к. Net::Arping несмог поставить на фрю!! есть 2 выхода из ситуации: 1) переделать authtraf на вызов системной команды Arping; 2) отказаться от authtraf, а взамен переделать модуль коллектора так, чтобы при снятии среза, если есть у клиента трафик и авторизация "всегда онлайн" вызывать ("CALL set_auth(?,?)", $p{ipa}, $opts); а почему не смогли поставить? странно... меня только первый вариант устраивает, так как если у абонента "всегда онлайн" но доступ запрещен то вообще почти никакой трафик не идёт кроме заглушки, а он не считаеться... а через пинг и арпинг все работающие в сети хосты были видны, есть ли к ним хоть какая то связь ил нет
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #559 : 30 Марта 2014, 13:59:49 » |
|
я вчера хотел переделать даный модуль на перловский Net::Arping, но проблема остановила меня в самом начале, т.к. Net::Arping несмог поставить на фрю!! есть 2 выхода из ситуации: 1) переделать authtraf на вызов системной команды Arping;
а если пойти дальше и вообще отказаться от Arping - в данном случае это просто арп таблица. ну где-то так sub main { my($task, $single, $config) = @_; my $interface = $config->{interface}; my %p = Db->line("SELECT DATE_FORMAT(NOW(), 'X%Y_%c_%e') AS x_tbl_name"); &arp; %p or return; my $ntraf_sql = "SELECT INET_NTOA(i.ip) AS ipa, ". "(SELECT 1 FROM $p{x_tbl_name} WHERE uid = u.id AND `in` >0 AND `out` >0 AND time>(UNIX_TIMESTAMP()-60) LIMIT 1) AS has_traf ". " FROM users u JOIN ip_pool i ON i.uid = u.id WHERE u.lstate = 1"; my $db = Db->sql( $ntraf_sql ); while( my %p = $db->line ) { $mac=$macTable{$p{ip}}; debug("arp_lookup $p{ipa}: $mac"); my $opts = "mod=authtraf"; if( length $mac == 12 ) { $opts .= ";user=$mac;"; } elsif( !$p{has_traf} ) { next; } Db->do("CALL set_auth(?,?)", $p{ipa}, $opts); } }
sub arp { use strict; use Net::SNMP qw(snmp_dispatcher oid_lex_sort); my ($ip,$key,$mac,%macTable,$oid,$host,$community,$result,$session,$error); $oid = '.1.3.6.1.2.1.3.1.1.2'; $host='127.0.0.1'; $community='ser'; ($session, $error) = Net::SNMP->session(-hostname => $host,-community => $community,-port => 161); if (!defined($session)) { debug("error snmp"); exit 1; } if (defined($result = $session->get_table(-baseoid => $oid))) { foreach (oid_lex_sort(keys(%{$result}))) { $ip = $_; $ip =~ s/$oid.//; $ip = substr($ip,4); $mac = substr($result->{$_},2); $macTable{$ip} = $mac; } } }
з.ы. В работе не тестировалось , да и лишние переменные надо бы убрать....
|
|
|
Записан
|
|
|
|
Pa4ka
|
|
« Ответ #560 : 31 Марта 2014, 12:52:14 » |
|
я вчера хотел переделать даный модуль на перловский Net::Arping, но проблема остановила меня в самом начале, т.к. Net::Arping несмог поставить на фрю!! есть 2 выхода из ситуации: 1) переделать authtraf на вызов системной команды Arping;
а если пойти дальше и вообще отказаться от Arping - в данном случае это просто арп таблица. ну где-то так sub main { my($task, $single, $config) = @_; my $interface = $config->{interface}; my %p = Db->line("SELECT DATE_FORMAT(NOW(), 'X%Y_%c_%e') AS x_tbl_name"); &arp; %p or return; my $ntraf_sql = "SELECT INET_NTOA(i.ip) AS ipa, ". "(SELECT 1 FROM $p{x_tbl_name} WHERE uid = u.id AND `in` >0 AND `out` >0 AND time>(UNIX_TIMESTAMP()-60) LIMIT 1) AS has_traf ". " FROM users u JOIN ip_pool i ON i.uid = u.id WHERE u.lstate = 1"; my $db = Db->sql( $ntraf_sql ); while( my %p = $db->line ) { $mac=$macTable{$p{ip}}; debug("arp_lookup $p{ipa}: $mac"); my $opts = "mod=authtraf"; if( length $mac == 12 ) { $opts .= ";user=$mac;"; } elsif( !$p{has_traf} ) { next; } Db->do("CALL set_auth(?,?)", $p{ipa}, $opts); } }
sub arp { use strict; use Net::SNMP qw(snmp_dispatcher oid_lex_sort); my ($ip,$key,$mac,%macTable,$oid,$host,$community,$result,$session,$error); $oid = '.1.3.6.1.2.1.3.1.1.2'; $host='127.0.0.1'; $community='ser'; ($session, $error) = Net::SNMP->session(-hostname => $host,-community => $community,-port => 161); if (!defined($session)) { debug("error snmp"); exit 1; } if (defined($result = $session->get_table(-baseoid => $oid))) { foreach (oid_lex_sort(keys(%{$result}))) { $ip = $_; $ip =~ s/$oid.//; $ip = substr($ip,4); $mac = substr($result->{$_},2); $macTable{$ip} = $mac; } } }
з.ы. В работе не тестировалось , да и лишние переменные надо бы убрать.... ну немножно не верно( у меня к примеру в арп таблице связка мак и ИП считаеться действительной 1200 секунд, значит и хост будет считаться 20 минут авторизированым, хотя это не так ? (172.20.5.162) at b8:a3:86:0c:5c:03 on bce1 expires in 1192 seconds
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #561 : 31 Марта 2014, 12:57:06 » |
|
ну немножно не верно( у меня к примеру в арп таблице связка мак и ИП считаеться действительной 1200 секунд, значит и хост будет считаться 20 минут авторизированым, хотя это не так ? (172.20.5.162) at b8:a3:86:0c:5c:03 on bce1 expires in 1192 seconds arp_lookup() $mac = Net::ARP::arp_lookup($dev,"192.168.1.1"); This looks up the MAC address for the ip address 192.168.1.1 and stores it in the variable $mac. The return value is "unknown" if the mac cannot be looked up. то есть аналогично arp -a
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #562 : 31 Марта 2014, 22:07:01 » |
|
если пинговать arping то можно так где-то use strict; use threads; use threads::shared; use Net::Netmask; no warnings 'threads'; sub main { my $net = '13.13.10.0/24'; #подсеть хотя ее можно считать из конфига.... my $interface = $config->{interface}; my $block = Net::Netmask->new($net); my @devices; my $size=$block->size(); for (my $i=0; $i<=$size; $i++) { push (@devices, $block->nth($i)); } $SIG{CHLD} = 'IGNORE'; my @trl; my $threads :shared = 0; my $threads_all :shared = 256; foreach (@devices) { sleep 1 while ($threads>$threads_all); if ($threads<=$threads_all) { $trl[$_]=threads->create(\&trp,$_); $trl[$_]->detach(); } } 1 while (scalar(threads->list(threads::running))>0); threads->exit(); sub trp { $threads++; my $host = shift; my $sleeptime = int(rand()*5); sleep($sleeptime); my @res=`/usr/local/sbin/arping -p -uv -c 1 -i $interface $host`; my $res=$res[3]; $res =~ s/\n//g; $res =~ s/\://g; my @ma=split/\s+/,$res; my $opts="mod=authtraf"; if ($ma[3]) { $opts .= ";user=$ma[3];"; Db->do("CALL set_auth(?,?)", $host, $opts); } $threads--; } }
тут смысл запускается многопоточно на всю подсеть ... но прикол в том что у меня на freebsd 10 arping не работает нормально....
|
|
|
Записан
|
|
|
|
Pa4ka
|
|
« Ответ #563 : 01 Апреля 2014, 10:01:52 » |
|
если пинговать arping то можно так где-то use strict; use threads; use threads::shared; use Net::Netmask; no warnings 'threads'; sub main { my $net = '13.13.10.0/24'; #подсеть хотя ее можно считать из конфига.... my $interface = $config->{interface}; my $block = Net::Netmask->new($net); my @devices; my $size=$block->size(); for (my $i=0; $i<=$size; $i++) { push (@devices, $block->nth($i)); } $SIG{CHLD} = 'IGNORE'; my @trl; my $threads :shared = 0; my $threads_all :shared = 256; foreach (@devices) { sleep 1 while ($threads>$threads_all); if ($threads<=$threads_all) { $trl[$_]=threads->create(\&trp,$_); $trl[$_]->detach(); } } 1 while (scalar(threads->list(threads::running))>0); threads->exit(); sub trp { $threads++; my $host = shift; my $sleeptime = int(rand()*5); sleep($sleeptime); my @res=`/usr/local/sbin/arping -p -uv -c 1 -i $interface $host`; my $res=$res[3]; $res =~ s/\n//g; $res =~ s/\://g; my @ma=split/\s+/,$res; my $opts="mod=authtraf"; if ($ma[3]) { $opts .= ";user=$ma[3];"; Db->do("CALL set_auth(?,?)", $host, $opts); } $threads--; } }
тут смысл запускается многопоточно на всю подсеть ... но прикол в том что у меня на freebsd 10 arping не работает нормально.... и у меня на 10-ке не работает как следует, то timeout пишет то ваще ничего
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #564 : 01 Апреля 2014, 10:34:26 » |
|
и у меня на 10-ке не работает как следует, то timeout пишет то ваще ничего
аналогично - поэтому скрипт проверялся на 8.2 но проверялся отдельно от билинга....
|
|
|
Записан
|
|
|
|
Pa4ka
|
|
« Ответ #565 : 03 Апреля 2014, 09:51:25 » |
|
Значит так как на arping не хочу делать, решил сделать что то типа такого: значит скриптик который выбирает количество запущеных процессов под названием authtraf и если значение его равно нулю то перезапустить процес, если другое то напечатать что процес запущен и по крону каждую минуту проверять состояние процесса вот так выглядит #!/usr/bin/perl -w $EXCLUDE=`ps -ax | grep authtraf | grep -v grep | wc -l`; $PROC_NUM=0; $RESTART="/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=authtraf -d &"; if ($EXCLUDE == $PROC_NUM) { system ($RESTART); } else { print "Proces zapushchen\n"; }
в кроне: * * * * * root /usr/bin/perl /usr/local/nodeny/restartavrotiz.pl права: -rw-r--r-- 1 root wheel 258 3 апр 10:22 restartavrotiz.pl Если из оболочки запускать то всё чётко, а вот беда кода по крону, процес только добавляеться и за 10 минут "/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=authtraf -d" запущен 10 раз В программировании вообще не силён, если кому не лень помогите) Спасибо!
|
|
|
Записан
|
|
|
|
ser970
NoDeny
Спец
Карма: 70
Offline
Сообщений: 1323
|
|
« Ответ #566 : 03 Апреля 2014, 12:29:48 » |
|
Значит так как на arping не хочу делать, решил сделать что то типа такого: значит скриптик который выбирает количество запущеных процессов под названием authtraf и если значение его равно нулю то перезапустить процес, если другое то напечатать что процес запущен и по крону каждую минуту проверять состояние процесса вот так выглядит #!/usr/bin/perl -w $EXCLUDE=`ps -ax | grep authtraf | grep -v grep | wc -l`; $PROC_NUM=0; $RESTART="/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=authtraf -d &"; if ($EXCLUDE == $PROC_NUM) { system ($RESTART); } else { print "Proces zapushchen\n"; }
в кроне: * * * * * root /usr/bin/perl /usr/local/nodeny/restartavrotiz.pl права: -rw-r--r-- 1 root wheel 258 3 апр 10:22 restartavrotiz.pl Если из оболочки запускать то всё чётко, а вот беда кода по крону, процес только добавляеться и за 10 минут "/usr/bin/perl /usr/local/nodeny/nokernel.pl -m=authtraf -d" запущен 10 раз В программировании вообще не силён, если кому не лень помогите) Спасибо! monit используй /usr/ports/sysutils/monit но если хочешь то ps -ax | grep authtraf | grep -v grep | wc -l для скрипта полный путь надо указывать для ps grep или изменить окружение
|
|
|
Записан
|
|
|
|
ivanmfan
|
|
« Ответ #567 : 07 Апреля 2014, 10:03:09 » |
|
из /var/log/debug.log заметил что скрипт events.pl обрабатывает запрос 2-4 секунды, как по мне то это долго. Как думаете? Apr 7 10:59:11 <local7.debug> vector-net dhcpd: execute_statement argv[2] = commit Apr 7 10:59:11 <local7.debug> vector-net dhcpd: execute_statement argv[3] = 192.168.19.13 Apr 7 10:59:11 <local7.debug> vector-net dhcpd: execute_statement argv[4] = 0:11:f5:3e:9c:91 Apr 7 10:59:11 <local7.debug> vector-net dhcpd: execute_statement argv[5] = Apr 7 10:59:11 <local7.debug> vector-net dhcpd: execute_statement argv[6] = Apr 7 10:59:13 <local7.debug> vector-net dhcpd: execute_statement argv[0] = /usr/bin/perl Apr 7 10:59:13 <local7.debug> vector-net dhcpd: execute_statement argv[1] = /usr/local/nodeny/modules/dhcp/events.pl
|
|
|
Записан
|
|
|
|
Fredik
NoDeny
Старожил
Карма: 5
Offline
Сообщений: 362
|
|
« Ответ #568 : 12 Апреля 2014, 08:40:06 » |
|
в логе мускуля пишет вот такое, файл становится огромным приходится чистить руками. 140412 9:37:28 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe Statement: call radupdate('Rombas','10.126.21.230', 'user=64:66:b3:36:82:c1;nas=127.0.0.1')
9.1-RELEASE-p8 FreeBSD 9.1-RELEASE-p8 где подправить?
|
|
|
Записан
|
|
|
|
Efendy
|
|
« Ответ #569 : 12 Апреля 2014, 08:58:00 » |
|
|
|
|
Записан
|
|
|
|
|