Название: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 02 Ноября 2009, 20:03:43 есть предложение зделать кнопочку гденибуть (в тех данных) получить мак адрес, а то заводиш юзера либо просто сетевушку меняеш, и тут на тебе нада конектится по ссх чтобы мак снять.
Название: Re: получение МАС адреса Отправлено: Efendy от 02 Ноября 2009, 22:49:30 есть предложение зделать кнопочку гденибуть (в тех данных) получить мак адрес, а то заводиш юзера либо просто сетевушку меняеш, и тут на тебе нада конектится по ссх чтобы мак снять. с арп таблицы роутера мак выуживать? а если комп клиента выключен?Название: Re: получение МАС адреса Отправлено: Cell от 03 Ноября 2009, 07:54:00 есть предложение зделать кнопочку гденибуть (в тех данных) получить мак адрес, а то заводиш юзера либо просто сетевушку меняеш, и тут на тебе нада конектится по ссх чтобы мак снять. В эзернет сергменте просто ping ip arp -a ip Если клиент за роутером то вариантов других нет. Если непосредственно на клиенте то ipconfig /all Делов то ) Название: Re: получение МАС адреса Отправлено: blackjack от 03 Ноября 2009, 14:03:56 Что значит никаких, нипример у нас юзеры маршрутизируются циской, на циске настроили rsh и через rsh можно получить любые данные с циски, например так
Код: rsh -l <login> <cisco_ip> sh arp если роутер не циско, а например unix like system то можно используя авторизацию по ключам черех ssh забирать данные, например так Код: ssh <login>@<unix_ip> arp -an | grep <required_ip> вот так, нет неразрешаемых проблем, есть неприятные решения. Название: Re: получение МАС адреса Отправлено: Fredik от 03 Ноября 2009, 19:48:28 с арп таблицы роутера мак выуживать? а если комп клиента выключен? [/quote] мак берется в 2 случаях 1) заводим абонента(пишем ip руками в сетевушке, заходим на сервер и заводим юзера ) 2) смена сетевушки в обеих случаях в арп таблице мак присудствует, так как обращение с серваком идет. покаместь мак юзается только для ДХЦП. Думаю для многих будет нужная вещь Название: Re: получение МАС адреса Отправлено: Andrey Zentavr от 10 Ноября 2009, 09:04:15 Я занимаюсь этим модулем сейчас. Будет скоро в паблике. Вот, сразу после модуля "всегда онлайн"
Тему можно переобозвать : Модуль получения МАС-адреса. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 10 Ноября 2009, 10:54:44 ждемссс...с нетерпением ))
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 12 Ноября 2009, 08:49:47 есть предложение зделать кнопочку гденибуть (в тех данных) получить мак адрес, а то заводиш юзера либо просто сетевушку меняеш, и тут на тебе нада конектится по ссх чтобы мак снять. Я думаю, кнопочку в тех-данных писать не совсем как бы правильно, ибо прир апдейте версии писать её туда прийдётся ещё раз.. и ещё раз..Правильнее будет это реализовать модулем клиентской статистики, доступным только администраторам (т.е. когда попадаешь в статистику из профиля пользователя в админке). Выглядеть это будет как-то так: (http://xmages.net/out.php/i644241_Sarping.png) При нажатие на кнопку "Пинговать" будет что-то происходить ??? (на старой системе у меня PHP скрипт обращался к Пёрл-скрипту, который висел на сокете и занимался арпингом.) Как сделать сейчас - не знаю. Так как Цитировать $ arping -i em2 10.1.32.194 то можно, конечно, чделать всё это через ССШ на сертификатах. Но по идейным соображениям у меня вход рута по ССШ везде отключен (вру, не везде. Есть сервер в далёкой галактике с рутом из-под ссш).arping: must run as root Так вот, предварительно это будет примерно так: 1) на сервере (серверах), который смотрит на юзеров, запущен некий скрипт, который слушает TCP/12345 2) Фаером говорим ОСи, что на этот порт ходить только биллинг. 3) В модуле жмакаем "Пинговать", шлём запрос на сервер WWW который соответвтенно обращается на юзерский сервак за скриптом. 4) Выводим в форме (где у меня написано "Тут ещё ничего нет...." выхлоп арпинга (например 10 пингов на ИП)) Раньше сокет слушал примерно такой срипт: Цитировать #!/usr/bin/perl -w Хотелось бы с форками разобраться и чтоб он обрабатывал несколько соединений сразу. ..До этого руки так и не дошли.%cards =( "30" => "em0", "31" => "em1", "32" => "em2", "33" => "em3", "34" => "em4" ); $count=5; $arping="/usr/local/sbin/arping"; $pidfile="/var/run/arping_serv.pid"; open PID, ">$pidfile" or $err=$!; if ($err==0) { print PID $$; close PID; } use IO::Socket; # Создаём сокет my $sock = new IO::Socket::INET ( LocalAddr => '10.1.10.3', LocalPort => '14120', Proto => 'tcp', Listen => 1 ) or die "Can't bind : $@\n"; # Открываем Listen-сокет $sock->listen(); my $new_sock; #my $pid; # принимаем коннекты while($new_sock = $sock->accept()) { print "Connected from: ", $new_sock->peerhost(); # Display messages print " Port: ", $new_sock->peerport(), "\n"; # Обрабатываем соединение #$pid=fork(); #unless($pid){ while(<$new_sock>){ chomp($_); if(/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/) { ($first, $second, $net) = /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.[0-9]{1,3}/; #print "We get IP! => $_\n"; #print "We get net: $first, $second, $net, $last\n"; #print $new_sock "We get IP! => $_\nWe get net: $net\n"; $ip = $_; if($first eq 10 ){ if($second eq 1 or $second eq 2){ if(exists($cards{$net})) { # Арпинг с карты em1 #print $new_sock "$arping -i$card2x -c$count $ip\n"; foreach(`$arping -i$cards{$net} -c$count $ip`){ #print "$_\n"; if(/\w+ bytes from \w+:\w+:\w+:\w+:\w+:\w+ .+/){ ($mac) = /\w+ bytes from (\w+:\w+:\w+:\w+:\w+:\w+) .+/; print $new_sock "$mac\n"; } } } else { print $new_sock "Wrong Net $net"; } } else { print $new_sock "Wrong Subnet $second!"; } } else { print $new_sock "Wrong network $first!"; } } else { print "Garbage: $_\n"; } #sleep(200); $new_sock->shutdown(2); } #exit(); #} #waitpid($pid, 0); #undef $pid; print("Connection closed.\n"); } close($sock); Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Efendy от 12 Ноября 2009, 23:15:01 Лучше не форкать, а реализовать многопоточную обработку с помощью IO::Select
http://search.cpan.org/~gbarr/IO-1.25/lib/IO/Select.pm Код: use IO::Select; Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: VitalVas от 13 Ноября 2009, 18:26:04 ну что, кто то уже тестил??
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 13 Ноября 2009, 21:12:47 а что тестить? они тока советуются и решают что и как
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 17 Ноября 2009, 19:58:57 ну как там разработки уже есть?
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 17 Ноября 2009, 21:58:27 ну как там разработки уже есть? Сегодня написан и тестируется серверный компонент получения МАС-адреса (переписан тот, что был выложен пару постов выше). Теперь можно одновременно к нему образаться (до этого - только один оператор в единицу времени).Завтра будет скорее всего закончен серверный компонент обновления мак-адреса на сервере (рядом с кнопкой пинговать будет кнопка "Обновить на сервере"). Ну, а потом будем заканчивать веб-интерфейс для оператора. ЗЫ: я вообще-то не программист, я больше сисадмин. А всё остальное - хобби + универовское прошлое :) Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 18 Ноября 2009, 01:05:19 это хорошо, помню твои спасающие посты еще с "локала" по поводу старгейзера ))
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Cell от 19 Ноября 2009, 01:24:52 это хорошо, помню твои спасающие посты еще с "локала" по поводу старгейзера )) Бог мой, да тут я смотрю нас много )Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 19 Ноября 2009, 10:31:08 та отож. ))
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 22 Ноября 2009, 05:18:12 Модуль готов, проходит обкат в одной из сетей г. Запорожье.
С пользовательской стороны выглядит примерно следующим образом: (http://xmages.net/upload/df5751dd.png) ..Модуль подключается в клиентскую статистику и доступен только из админки. При нажатии оператором/администратором на кнопку "Пинговать" отправляется XMLHttpRequest (тот самый Ajax) на скрипт stat.pl, который через IO::Socket цепляеться непосредственно на роутер где юзеры висят (точнее на TCP-порт, который слушает Perl-скрипт и выполняет всякий арпинг (пинг по маку)). Роутер выдаёт выхлоп, который перенаправляется в браузер через админку НоуДеная. При любом результате ответ отображается в правом div'е. При нажатии на кнопку "Обновить" выполняется привязка текущего значения дополнительного параметра MAC-адрес к ИПу учётной записи. Причём если это поле пустое - то генериться случайный мак и выполняется привязка к случайному маку. Работа модуля была проверена в следующих браузерах: 1) Mozilla Firefox 3.5.5 2) Opera 9.63 (новее в загашнике не нашел, уверен что проблем не будет) 3) Apple Safari 4.03 4) MS Internet Explorer 8.0.7600.16385 Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 22 Ноября 2009, 17:42:33 а нам когда потестить даш?
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 22 Ноября 2009, 17:50:14 а нам когда потестить даш? Так лень писать доки в выходные. Напишу доку по установке и выложу.Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: VitalVas от 22 Ноября 2009, 17:51:21 ждемсс....
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 23 Ноября 2009, 15:46:36 Модуль и дока во вложении. Перед установкой смотри install.txt
О результатах работы отписываемся здесь. Модуль тестировался на версии 50.32 Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 23 Ноября 2009, 17:23:34 /usr/local/etc/rc.d/arping_serv.sh start
Starting arping_serv Use of uninitialized value in numeric eq (==) at /usr/local/sbin/arping_serv.pl line 98. /usr/local/etc/rc.d/arp_refresh.sh start Starting arp_refresh Use of uninitialized value in numeric eq (==) at /usr/local/sbin/arp_refresh.pl line 27. в админке Wrong first octet 171.**.**.** Operation Completed! Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Efendy от 23 Ноября 2009, 21:28:25 это в результате ключа -w перла. Ключ заставляет перл выводить предупреждения. В данном случае это не критично, хотя для лучшего стиля лучше б было определить переменную $err
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 23 Ноября 2009, 21:55:56 в админке Ну дык ты скопипастил скрипты и пытаешся их под свои подсети юзать. Я ж написал в инсталле.тхт - что у меня подсети вида 10.1.подсеть.*, потому я проверяю октет чтобы он был "10". Тебе прийдёться под себя внутренности переписать.Wrong first octet 171.**.**.** Operation Completed! Или просить меня сделать скрипт более универсальным. Возможно это будет немного позже, но стопудово после 29го января, когда я защитю второй диплом, который не имеет отношения к моей первой технической специальности. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 14 Декабря 2009, 16:03:42 Настроил под свои подсети упешно - мак пингуется и отображается праивльно.
Но проблема - при нажатии кнопки обновить - пишет Internal Server Error! Вроде все хорошо, в настройках скриптов поле 4 и есть поле для мака, как посмотреть подробнее где ошыбка? Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 15 Декабря 2009, 17:13:21 Ну кто нибудь поможет? Неужели никто не использует у себя?
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Maks от 17 Декабря 2009, 12:05:35 Извените если возможно не в тему.
Абоненты авторизируются по PPPoE: 1) нужно чтоб скрипт делал заносил MAК клиетна в его Дополнительные данные. Но привязку по МАК делать не нужно. 2 )Реализовать поиск маков по биллингу. Это поможет в вычислениях вирусовых абонов, да и другие конфликты где видно мак сетевой карты. IP можно сменить ( если ручками писать) а вот мак, мало кто будет менять.( я не отрицаю что это возможно). Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 19 Декабря 2009, 14:39:45 Настроил под свои подсети упешно - мак пингуется и отображается праивльно. В error.log'ах Апача.Но проблема - при нажатии кнопки обновить - пишет Internal Server Error! Вроде все хорошо, в настройках скриптов поле 4 и есть поле для мака, как посмотреть подробнее где ошыбка? При нажатии на кнопку "Обнеовить" происходит отправка AJAX-запроса на сервер. Ошибка может возникать из-за того, что не выполняеться подпрограмма модуля. Код: # Нам пришел запрос на обновления кеша IP<->MAC Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 19 Декабря 2009, 14:45:47 Извените если возможно не в тему. Откуда скрипту их брать (маки)? У меня когда-то в своё время был скрипт, который три недели собирал маки клиентов, чтобы 1.5к записей не вносить ручками. Когда более-менее на 90% база заполнилась - скрипт-сборщик остановили и остальное дописывали ручками.Абоненты авторизируются по PPPoE: 1) нужно чтоб скрипт делал заносил MAК клиетна в его Дополнительные данные. Но привязку по МАК делать не нужно. 2 )Реализовать поиск маков по биллингу. У меня поиск по маку ведёться следующим образом:Это поможет в вычислениях вирусовых абонов, да и другие конфликты где видно мак сетевой карты. IP можно сменить ( если ручками писать) а вот мак, мало кто будет менять.( я не отрицаю что это возможно). В админке справа вверху есть ссылка "Поиск", нажимаем на неё -> Поиск клиентов по данным в разделе -> выбираем "Сетевые параметры" -> ну и тут уже вбиваем мак. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 19 Декабря 2009, 17:44:05 Цитировать [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] , referer: https://10.46.16.1/stat.pl?pp=T1-435304263WZ5w!wNAfQOPUXgZNEjHiQ&a=101&id=124&a=302 [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] Couldn't connect to 10.46.16.1:14120 : IO::Socket::INET: connect: Connection refused, referer: https [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] Premature end of script headers: stat.pl, referer: https://10.46.16.1/stat.pl?pp=T1-435304263W [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] File does not exist: /usr/local/www/stats/data/error, referer: https://10.46.16.1/stat.pl?pp=T Вот такие ошыбки в логах апача при нажатии кнопку обновить. Проблема в соединении на сколько я понял, но мак адрес же отображается правильно когда нажымать пинговать! Sarping.pl Цитировать sub ARP_main{ # так как конфижить всё это добро в конфиге биллинга нельзя, прийдёться это сделать один раз здесь. my %ARP_config = ( "server" => "10.46.16.1", "pingport" => "14120", "updport" => "14121", "proto" => "tcp", ); Кусок с настройками. В чем может быть проблемма? arp_refresh.pl Цитировать #!/usr/bin/perl -w use POSIX; use IO::Socket; use IO::Select; use Fcntl; use Tie::RefHash; use DBI; my %config = ( "pid" => "/var/run/arp_refresh.pid", "arp" => "/usr/sbin/arp", "count" => 5, "ip" => "10.46.16.1", "port" => "14121", "proto" => "tcp", "MySQL" => { "sqlfirst" => "DBI:mysql:bill;127.0.0.1", "sqllogin" => "***", "sqlpasswd" => "***", }, "dopfield_id" => 4, ); open PID, ">".$config{"pid"} or $err=$!; if ($err==0) { print PID $$; close PID; } sub trim { my($string)=@_; for ($string) { s/^\s+//; s/\s+$//; } return $string; } # handle($socket) deals with all pending requests for $client sub handle { # requests are in $ready{$client} # send output to $outbuffer{$client} my $client = shift; my $request; foreach $request (@{$ready{$client}}) { # $request is the text of the request # put text of reply into $outbuffer{$client} $str = trim($request); # Do we have ip?? if( $str =~ /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.[0-9]{1,3}/) { $first = $1; $second = $2; $net = $3; if($first eq 10 ){ if($second eq 46){ if($net eq 16 || $net eq 17 || $net eq 18 || $net eq 19) { ################################## undef $dbh; undef $myst; # Коннектимся к Мускл $dbh=DBI->connect($config{"MySQL"}{"sqlfirst"},$config{"MySQL"}{"sqllogin"},$config{"MySQL"}{"sqlpasswd"}) or print "Error $! !\n"; # Запрашиваем МАС $query="SELECT d.field_value AS mac FROM users u, dopvalues d, ( SELECT u.ip AS ip, MAX(d.revision) AS rev FROM users u, dopvalues d WHERE u.id=d.parent_id AND d.dopfield_id=".$config{'dopfield_id'}." AND u.ip='".$str."' GROUP BY ip ) AS tmp WHERE u.id=d.parent_id AND d.dopfield_id=".$config{'dopfield_id'}." AND u.ip=tmp.ip AND d.revision=tmp.rev AND TRIM(d.field_value) != ''"; # Готовим запрос $myst = $dbh->prepare($query); # Делаем экзекуцию запросу :) $myst->execute; # Выдёргиваем МАС ($mac) = $myst->fetchrow; # Если вдруг мака нету, генерим какой-то фэйковый if($mac eq ''){ $mac = sprintf("%x:%x:%x:%x:%x:%x", int(rand(255)), int(rand(255)), int(rand(255)), int(rand(255)), int(rand(255)),int(rand(255))); $outbuffer{$client} .= "Generated FAKE mac!\n"; } # Делаем привязку IP <-> MAC system($config{"arp"}." -s ".$str." ".$mac); $outbuffer{$client} .= $str." ".$mac."\n"; # Закрываем MySQL соединение $myst->finish; $dbh->disconnect; ##################################### } else { $outbuffer{$client} .= "Wrong third octet **.**.".$net.".**\n"; } } else { $outbuffer{$client} .= "Wrong second octet **.".$second.".**.**\n"; } } else { $outbuffer{$client} .= "Wrong first octet ".$first.".**.**.**\n"; } } else { print "Garbage from ".$client->peerhost().":".$client->peerport().": ".$str."\n"; } ################################################# } delete $ready{$client}; } # nonblock($socket) puts socket into nonblocking mode sub nonblock { my $socket = shift; my $flags; $flags = fcntl($socket, F_GETFL, 0) or die "Can't get flags for socket: $!\n"; fcntl($socket, F_SETFL, $flags | O_NONBLOCK) or die "Can't make socket nonblocking: $!\n"; } # Создаём сокет my $server = IO::Socket::INET->new ( LocalAddr => $config{"ip"}, LocalPort => $config{"port"}, Proto => $config{"proto"}, Listen => 10, Reuse => 1, ) or die "Can't bind : $@\n"; nonblock($server); my $select = new IO::Select->new($server); # begin with empty buffers %inbuffer = (); %outbuffer = (); %ready = (); tie %ready, 'Tie::RefHash'; while(1){ my $client; my $rv; my $data; # смотрим какая инфа у нас есть? # может что-то принять, обработать?? foreach $client ($select->can_read(1)) { if ($client == $server) { # Принимаем коннект $client = $server->accept(); $select->add($client); nonblock($client); }else{ # читаем данные $data = ''; $rv = $client->recv($data, POSIX::BUFSIZ, 0); unless (defined($rv) && length $data) { # Наверное от клиента ничего больше не будет :( delete $inbuffer{$client}; delete $outbuffer{$client}; delete $ready{$client}; $select->remove($client); close $client; #print "Client had gone :(\n"; next; } $inbuffer{$client} .= $data; # test whether the data in the buffer or the data we # just read means there is a complete request waiting # to be fulfilled. If there is, set $ready{$client} # to the requests waiting to be fulfilled. while ($inbuffer{$client} =~ s/(.*\n)//) { push( @{$ready{$client}}, $1 ); } } } # Any complete requests to process? foreach $client (keys %ready) { handle($client); } # Buffers to flush? foreach $client ($select->can_write(1)) { # Skip this client if we have nothing to say next unless exists $outbuffer{$client}; $rv = $client->send($outbuffer{$client}, 0); unless (defined $rv) { # Whine, but move on. warn "I was told I could write, but I can't.\n"; next; } if ($rv == length $outbuffer{$client} || $! == POSIX::EWOULDBLOCK ) { substr($outbuffer{$client}, 0, $rv) = ''; delete $outbuffer{$client} unless length $outbuffer{$client}; } else { # Couldn't write all the data, and it wasn't because # it would have blocked. Shutdown and move on. delete $inbuffer{$client}; delete $outbuffer{$client}; delete $ready{$client}; $select->remove($client); close($client); next; } } # Out of band data? foreach $client ($select->has_exception(0)) { # arg is timeout # Deal with out-of-band data here, if you want to. } } exit 0; arping_serv.pl Цитировать #!/usr/bin/perl -w use POSIX; use IO::Socket; use IO::Select; use Fcntl; use Tie::RefHash; my %config = ( "pid" => "/var/run/arping_serv.pid", "arping" => "/usr/local/sbin/arping", "count" => 5, "ip" => "10.46.16.1", "port" => "14120", "proto" => "tcp", "cards" => { "16" => "fxp0", "17" => "fxp0", "18" => "fxp0", "19" => "fxp0" }, ); sub trim { my($string)=@_; for ($string) { s/^\s+//; s/\s+$//; } return $string; } # handle($socket) deals with all pending requests for $client sub handle { # requests are in $ready{$client} # send output to $outbuffer{$client} my $client = shift; my $request; foreach $request (@{$ready{$client}}) { # $request is the text of the request # put text of reply into $outbuffer{$client} $str = trim($request); # Do we have ip?? if( $str =~ /^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.[0-9]{1,3}/) { $first = $1; $second = $2; $net = $3; if($first eq 10 ){ if($second eq 46){ if(exists($config{"cards"}{$net})) { #print $new_sock "$arping -i$card2x -c$count $ip\n"; foreach(`$config{"arping"} -i$config{"cards"}{$net} -c$config{"count"} $str`){ #print "$_\n"; if(/\w+ bytes from \w+:\w+:\w+:\w+:\w+:\w+ .+/){ ($mac) = /\w+ bytes from (\w+:\w+:\w+:\w+:\w+:\w+) .+/; $outbuffer{$client} .= "$mac\n"; } } } else { $outbuffer{$client} .= "Wrong third octet **.**.".$net.".**\n"; } } else { $outbuffer{$client} .= "Wrong second octet **.".$second.".**.**\n"; } } else { $outbuffer{$client} .= "Wrong first octet ".$first.".**.**.**\n"; } } else { print "Garbage from ".$client->peerhost().":".$client->peerport().": ".$str."\n"; } ################################################# } $outbuffer{$client} .= "Operation Completed!\n"; delete $ready{$client}; } # nonblock($socket) puts socket into nonblocking mode sub nonblock { my $socket = shift; my $flags; $flags = fcntl($socket, F_GETFL, 0) or die "Can't get flags for socket: $!\n"; fcntl($socket, F_SETFL, $flags | O_NONBLOCK) or die "Can't make socket nonblocking: $!\n"; } open PID, ">".$config{"pid"} or $err=$!; if ($err==0) { print PID $$; close PID; } my $server = IO::Socket::INET->new ( LocalAddr => $config{"ip"}, LocalPort => $config{"port"}, Proto => $config{"proto"}, Listen => 10, Reuse => 1, ) or die "Can't bind : $@\n"; nonblock($server); my $select = new IO::Select->new($server); # begin with empty buffers %inbuffer = (); %outbuffer = (); %ready = (); tie %ready, 'Tie::RefHash'; # Arping Server main code while(1){ my $client; my $rv; my $data; # смотрим какая инфа у нас есть? # может что-то принять, обработать?? foreach $client ($select->can_read(1)) { if ($client == $server) { # Принимаем коннект $client = $server->accept(); $select->add($client); nonblock($client); }else{ # читаем данные $data = ''; $rv = $client->recv($data, POSIX::BUFSIZ, 0); unless (defined($rv) && length $data) { # Наверное от клиента ничего больше не будет :( delete $inbuffer{$client}; delete $outbuffer{$client}; delete $ready{$client}; $select->remove($client); close $client; #print "Client had gone :(\n"; next; } $inbuffer{$client} .= $data; # test whether the data in the buffer or the data we # just read means there is a complete request waiting # to be fulfilled. If there is, set $ready{$client} # to the requests waiting to be fulfilled. while ($inbuffer{$client} =~ s/(.*\n)//) { push( @{$ready{$client}}, $1 ); } } } # Any complete requests to process? foreach $client (keys %ready) { handle($client); } # Buffers to flush? foreach $client ($select->can_write(1)) { # Skip this client if we have nothing to say next unless exists $outbuffer{$client}; $rv = $client->send($outbuffer{$client}, 0); unless (defined $rv) { # Whine, but move on. warn "I was told I could write, but I can't.\n"; next; } if ($rv == length $outbuffer{$client} || $! == POSIX::EWOULDBLOCK ) { substr($outbuffer{$client}, 0, $rv) = ''; delete $outbuffer{$client} unless length $outbuffer{$client}; } else { # Couldn't write all the data, and it wasn't because # it would have blocked. Shutdown and move on. delete $inbuffer{$client}; delete $outbuffer{$client}; delete $ready{$client}; $select->remove($client); close($client); next; } } # Out of band data? foreach $client ($select->has_exception(0)) { # arg is timeout # Deal with out-of-band data here, if you want to. } } exit 0; Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Maks от 19 Декабря 2009, 19:53:18 Извените если возможно не в тему. Откуда скрипту их брать (маки)? У меня когда-то в своё время был скрипт, который три недели собирал маки клиентов, чтобы 1.5к записей не вносить ручками. Когда более-менее на 90% база заполнилась - скрипт-сборщик остановили и остальное дописывали ручками.Абоненты авторизируются по PPPoE: 1) нужно чтоб скрипт делал заносил MAК клиетна в его Дополнительные данные. Но привязку по МАК делать не нужно. Авторизация через PPPoE при авторизации МАК светится на сервере. Но я не силен , как эго дальше заставить записываться в Ноудени. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 23 Декабря 2009, 05:17:29 Цитировать [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] , referer: https://10.46.16.1/stat.pl?pp=T1-435304263WZ5w!wNAfQOPUXgZNEjHiQ&a=101&id=124&a=302 [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] Couldn't connect to 10.46.16.1:14120 : IO::Socket::INET: connect: Connection refused, referer: https [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] Premature end of script headers: stat.pl, referer: https://10.46.16.1/stat.pl?pp=T1-435304263W [Sat Dec 19 17:36:52 2009] [error] [client 10.46.16.211] File does not exist: /usr/local/www/stats/data/error, referer: https://10.46.16.1/stat.pl?pp=T У тебя скрипты порты слушают? Телнет на порты цепляться? Может быть скрипт вываливаеться с ошибкой (я про arp_refresh.pl или arping_serv.pl) в процессе работы? Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: zloyadmin от 02 Февраля 2010, 19:54:11 Freebsd 7.2 nodeny 50.32
Настраивал все по инструкции при нажатии "Пинг по мак" получаем Internal Server Error и лог апача [Tue Feb 02 19:48:01 2010] [error] [client] Undefined subroutine &main::AP_main called at /usr/local/www/apache22/cgi-bin/adm/stat.pl line 413., referer: https://1.1.1.1/cgi-bin/adm/stat.pl?uu=ao&pp=T1-44372073Z/ry9VRYAVssO5ZwIW9rTA&id=146 что сделал не так? Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: versus от 03 Февраля 2010, 00:07:10 тут же русским языком по английски написано что не может быть найдена функция AP_main
Может права не выставил может модуля нет... Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: zloyadmin от 03 Февраля 2010, 11:32:12 nod# pwd
/usr/local/nodeny/web nod# ll total 1020 -r-------- 1 www wheel 11679 Jan 8 22:30 LANG_RU.pl -r-------- 1 www wheel 1384 Jan 8 22:30 SSeance.pl -r-------- 1 www wheel 7092 Feb 2 18:59 Sarping.pl -r-------- 1 www wheel 5632 Jan 8 22:30 Scards.pl -r-------- 1 www wheel 4192 Feb 2 15:46 Schpass.pl -r-------- 1 www wheel 4494 Jan 8 22:30 Sdaytraf.pl -r-------- 1 www wheel 4327 Jan 8 22:30 Sdemo.pl -r-------- 1 www wheel 3015 Jan 8 22:30 Sdetailtraf.pl -r-------- 1 www wheel 1691 Jan 8 22:30 Sdogovor.pl - Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 14 Марта 2010, 19:34:06 Все работает, все подставляет. Но после перезагрузки сервера - все пропадает... и каждому клиенту нужно вновьо нажымать обновить... может есть выход?
Например автоматическое нажатие обновить всем за один раз, или писать мак+айпи в текстовый файл а потом скармливать утилите arp. Автор или кто вкурсе - отзовитесь... Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: md5 от 17 Марта 2010, 02:30:31 у меня такая борода получается
Wrong second octet **.0.**.** Operation Completed! Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 17 Марта 2010, 07:43:54 у меня такая борода получается Wrong second octet **.0.**.** Operation Completed! Поправь текст скрипта под себя. Я вообще по перле 0. Но за полчаса понял что нужно изменить сам ))), там нет ничего сложного... Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: md5 от 21 Марта 2010, 03:50:15 так может подскажешь ?
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Fredik от 21 Марта 2010, 21:30:26 все ок все работает )) спс Andrey Zentavr
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: poxy. от 21 Марта 2010, 23:12:55 Всем доброй ночи!
Кто нить решил проблему с пропаданием арп-таблицы после ребута...может есть вариант подсовывать файлик с маками и ип утилите арп? или кто как решает это у себя? Заранее Спасибо за ответы! Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Cell от 22 Марта 2010, 00:55:36 Всем доброй ночи! Я себе не делал, как бы без надобности, но проблем особых не вижу. Можно по крону собирать таблицу арп в файлик и скармливать ее при старте системы скрипту, который восстановит статику ключем -sКто нить решил проблему с пропаданием арп-таблицы после ребута...может есть вариант подсовывать файлик с маками и ип утилите арп? или кто как решает это у себя? Заранее Спасибо за ответы! Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 29 Марта 2010, 00:44:32 Напишите мне ПМ со своим скайпом/аськой - попробую помочь.
ЗЫ: только без фанатизма :) Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: poxy. от 30 Марта 2010, 13:04:32 Напишите мне ПМ со своим скайпом/аськой - попробую помочь. Привет !аську оставил видел что вы писали ...меня небыло ..можно вечером или как удобней )эт на тему арпа ...)ЗЫ: только без фанатизма :) Поставил 49.33 и так как там поменялась структура базы назрел вопрос достаточно ли изменить dopvalues на old_dopvalues? Заранее Спасибо! Код: # Запрашиваем МАС Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Andrey Zentavr от 04 Апреля 2010, 08:31:55 Я на 33ю версию ещё не обновлялся, хотя обновление на почту пришло давно.
Нужно смотреть внутрь базы. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: nops от 09 Апреля 2010, 06:26:42 народ, а у меня вот такая лабуда:
Код: [root@novour /usr/local/etc/rc.d]# ./arp_refresh.sh start Код: [root@novour /home/admin/arping/srv/sbin]# uname -a Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 09:31:55 У меня вот такое... подскажите что не так?
Код: satellite# /usr/local/etc/rc.d/arping_serv.sh start Код: satellite# /usr/local/etc/rc.d/arp_refresh.sh start Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Elisium от 12 Апреля 2010, 12:00:48 Код: Can't bind : IO::Socket::INET: Address already in use Посмотри через sockstat, что висит на том порту. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 13:41:17 Код: root perl5.8.8 2134 3 tcp4 172.16.1.101:14120 *:* sockstat показал по портах только это... Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 14:14:08 Код: root perl5.8.8 2134 3 tcp4 172.16.1.101:14120 *:* sockstat показал по портах только это... При запуске: Код: /usr/local/etc/rc.d/arp_refresh.sh start Код: /usr/local/etc/rc.d/arping_serv.sh start При проверке: Код: ps aux | grep arp А при нажатии на кнопке "Пинговать" в консоли такая запись: Код: Can't exec "/usr/local/sbin/arping": No such file or directory at /usr/local/sbin/arping_serv.pl line 75. Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 14:21:03 Тема снята. Все работает... Протупил...
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Maks от 12 Апреля 2010, 15:38:32 Так скажи где, остальным будет полезно.
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 15:57:15 Не поверишь, arping не установил, и я хотел чтоб работало...
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 16:12:24 Всем доброй ночи! Кто нить решил проблему с пропаданием арп-таблицы после ребута...может есть вариант подсовывать файлик с маками и ип утилите арп? или кто как решает это у себя? Заранее Спасибо за ответы! Попробуй по этой статейке http://www.opennet.ru/base/net/arp_fix_bsd.txt.html (http://www.opennet.ru/base/net/arp_fix_bsd.txt.html) Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 16:15:53 Или так: http://cowax.info/index.php?option=com_content&task=view&id=81&Itemid=67
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Cell от 12 Апреля 2010, 16:16:01 да что там пробовать, arp -f /path/my/file/static_arp.txt
в файле должны быть собраны при помощи nomake пары ip mac типа 10.10.10.10 00:00:00:11:22:33 ВСЕ Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: md5 от 12 Апреля 2010, 18:06:39 У меня так и не получилось..
пишет: Код: Wrong second octet **.0.**.** Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: nops от 12 Апреля 2010, 18:19:19 Офигеть. А мне кто-нибудь подскажет?
первый пост на 4-й странице.... Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Cell от 12 Апреля 2010, 19:04:26 У меня так и не получилось.. дык что-то не правильно )пишет: Код: Wrong second octet **.0.**.** Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Jovani от 12 Апреля 2010, 21:35:37 Офигеть. А мне кто-нибудь подскажет? первый пост на 4-й странице.... Там все нормально... Ты только под свою сеть в коде поменяй все... ps aux | grep arp проверь после запуска... Вы установили arping с портов? Я сначала тоже протупил, внимательно почитал доку исправил под свою сеть ( arp_refresh.pl arping_serv.pl ) Вот тут основные настройки: Пример на сети 172.16.0.0/20 arp_refresh Код: my %config = ( arping_serv Код: my %config = ( И осталось только поменять в Sarping.pl Код: my %ARP_config = ( Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: md5 от 13 Апреля 2010, 17:55:55 Хороший ответ!
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: nops от 21 Апреля 2010, 07:15:58 Там все нормально... Ты только под свою сеть в коде поменяй все... ps aux | grep arp проверь после запуска... Перепроверил, всё пормальноВы установили arping с портов? Я сначала тоже протупил, внимательно почитал доку исправил под свою сеть ( arp_refresh.pl arping_serv.pl ) Вот тут основные настройки: Пример на сети 172.16.0.0/20 arp_refresh Код: my %config = ( arping_serv Код: my %config = ( И осталось только поменять в Sarping.pl Код: my %ARP_config = ( Код: [root@novour /usr/local/sbin]# ps aux | grep arp Код: [root@novour /usr/local/etc/rc.d]# uname -a везде проверил, везде всё стоит правильно... Поэтому и написал сюда Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: amasis от 18 Февраля 2011, 23:50:06 а если шлюзов несколько ? к примеру десяток вланов и на каждом есть отдельный шлюз для абонентов
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 19 Февраля 2011, 11:39:42 а если шлюзов несколько ? к примеру десяток вланов и на каждом есть отдельный шлюз для абонентов Также интересует... пользуюсь одним пока что... Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 21 Февраля 2011, 15:36:30 Up, что никто не использовал для нескольких диапазонов?
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 30 Марта 2011, 22:51:28 Up второй раз! Может кто на платной основе, чисто символически доделает? Думаю там работы для кодера мало.
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 13 Апреля 2011, 21:54:43 Блин, очень НУЖНО, цена вопроса доделки? 3 раз апаю >:(.
Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 14 Апреля 2011, 14:45:11 Проблему решил САМ, вас не дождешся :-\.
Выкладываю, все гениальное как всегда просто: arping_serv.pl Код: $first = $1; Просто дописываем or и нужные значения :). Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса) Отправлено: Александр (AleksHr) от 26 Сентября 2011, 09:28:24 Апаю тему, так как возникла необходимость еще реализовать кнопочку - отвязать MAC адрес. Тоесть что-бы выполнялося простое arp -d ip абонента.
Кто может сделать на платной основе? Можна в личкку. |