Биллинговая система Nodeny

Главная категория => Модули для Nodeny => Тема начата: Fredik от 02 Ноября 2009, 20:03:43



Название: Модуль получения МАС-адреса (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;
    use IO::Socket;

    $lsn = new IO::Socket::INET(Listen => 1, LocalPort => 8080);
    $sel = new IO::Select( $lsn );

    while(@ready = $sel->can_read) {
        foreach $fh (@ready) {
            if($fh == $lsn) {
                # Create a new socket
                $new = $lsn->accept;
                $sel->add($new);
            }
            else {
                # Process socket

                # Maybe we have finished with the socket
                $sel->remove($fh);
                $fh->close;
            }
        }
    }


Название: 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
в админке
Wrong first octet 171.**.**.**
Operation Completed!
Ну дык ты скопипастил скрипты и пытаешся их под свои подсети юзать. Я ж написал в инсталле.тхт - что у меня подсети вида 10.1.подсеть.*, потому я проверяю октет чтобы он был "10". Тебе прийдёться под себя внутренности переписать.
Или просить меня сделать скрипт более универсальным. Возможно это будет немного позже, но стопудово после 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
Настроил под свои подсети упешно - мак пингуется и отображается праивльно.

Но проблема - при нажатии кнопки обновить - пишет Internal Server Error!

Вроде все хорошо, в настройках скриптов поле 4 и есть поле для мака, как посмотреть подробнее где ошыбка?
В error.log'ах Апача.
При нажатии на кнопку "Обнеовить" происходит отправка AJAX-запроса на сервер.
Ошибка может возникать из-за того, что не выполняеться подпрограмма модуля.
Код:
# Нам пришел запрос на обновления кеша IP<->MAC
$ip = &Filtr_out($F{arpupd});
# Проверяем, ИП ли это?
$ipcheck = &ARP_checkip($ip);
if ( $ipcheck == 1 ){
# Делаем запрос на сервак
use IO::Socket;
$|=1;
$socket = IO::Socket::INET->new(PeerAddr => $ARP_config{"server"},
                                PeerPort => $ARP_config{"updport"},
                                Proto    => $ARP_config{"proto"},
                                Type     => SOCK_STREAM)
or die "Content-type: text/html\n\nCouldn't connect to ".$ARP_config{"server"}.":".$ARP_config{"pingport"}." : $@\n";
$socket->autoflush(1);
# Шлём в сокет ИП
$socket->send($ip."\n");
# Нам пришел ответ
$socket->recv($answer, 1024);
close($socket);
# Закрываем сокет
# И отправим клиенту всю эту бадягу
print "Content-type: text/html\n\n".$answer;
exit;
}else{
# Шлём клиенту
if($ipcheck == 0){
$err = "Параметр не похож на IP-адрес\n";
}else{
$err = "Не верный ".(-1 * $ipcheck)." октет IP-адреса\n";
}
$out = "Не верно указан IP-адрес ".$ip."\n".$err;
print "Content-type: text/html\n\n".$out;
exit;
}
- возможно что-то здесь изменили, или не происходит соединение со скриптом, который выполняет подстановку.


Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса)
Отправлено: Andrey Zentavr от 19 Декабря 2009, 14:45:47
Извените если возможно не в тему.
Абоненты авторизируются по PPPoE:
1) нужно чтоб скрипт делал заносил MAК клиетна в его Дополнительные данные.
Но привязку по МАК делать не нужно.
Откуда скрипту их брать (маки)? У меня когда-то в своё время был скрипт, который три недели собирал маки клиентов, чтобы 1.5к записей не вносить ручками. Когда более-менее на 90% база заполнилась - скрипт-сборщик остановили и остальное дописывали ручками.

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
Извените если возможно не в тему.
Абоненты авторизируются по PPPoE:
1) нужно чтоб скрипт делал заносил MAК клиетна в его Дополнительные данные.
Но привязку по МАК делать не нужно.
Откуда скрипту их брать (маки)? У меня когда-то в своё время был скрипт, который три недели собирал маки клиентов, чтобы 1.5к записей не вносить ручками. Когда более-менее на 90% база заполнилась - скрипт-сборщик остановили и остальное дописывали ручками.


Авторизация через 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?
Заранее Спасибо!
Код:
# Запрашиваем МАС
                                                $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) != ''";


Название: 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
Starting arp_refresh
[root@novour /usr/local/etc/rc.d]# Use of uninitialized value $err in numeric eq (==) at /usr/local/sbin/arp_refresh.pl line 27.
^C
[root@novour /usr/local/etc/rc.d]#
Если это важно, то:
Код:
[root@novour /home/admin/arping/srv/sbin]# uname -a
FreeBSD novour.com 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Wed Mar 17 22:16:55 YEKT 2010     admin@novour.com:/usr/src/sys/i386/compile/NODENY  i386
[root@novour /home/admin/arping/srv/sbin]#


Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса)
Отправлено: Jovani от 12 Апреля 2010, 09:31:55
У меня вот такое... подскажите что не так?
Код:
satellite# /usr/local/etc/rc.d/arping_serv.sh start
Starting arping_serv
satellite# Use of uninitialized value in numeric eq (==) at /usr/local/sbin/arping_serv.pl line 113.
Can't bind : IO::Socket::INET: Address already in use

Код:
satellite# /usr/local/etc/rc.d/arp_refresh.sh start
Starting arp_refresh
satellite# Use of uninitialized value in numeric eq (==) at /usr/local/sbin/arp_refresh.pl line 27.
Can't bind : IO::Socket::INET: Address already in use




Название: 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    *:*
root     perl5.8.8  2131  3  tcp4   172.16.1.101:14121    *:*

sockstat показал по портах только это...


Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса)
Отправлено: Jovani от 12 Апреля 2010, 14:14:08
Код:
root     perl5.8.8  2134  3  tcp4   172.16.1.101:14120    *:*
root     perl5.8.8  2131  3  tcp4   172.16.1.101:14121    *:*

sockstat показал по портах только это...

При запуске:
Код:
/usr/local/etc/rc.d/arp_refresh.sh start
Starting arp_refresh
You have new mail.
satellite# Use of uninitialized value in numeric eq (==) at /usr/local/sbin/arp_refresh.pl line 27.
Can't bind : IO::Socket::INET: Address already in use

Код:
/usr/local/etc/rc.d/arping_serv.sh start
Starting arping_serv
satellite# Use of uninitialized value in numeric eq (==) at /usr/local/sbin/arping_serv.pl line 113.

При проверке:
Код:
ps aux | grep arp
root    3190  0.0  0.2  5456  5088  p0  S     2:43PM   0:00.14 /usr/bin/perl -w /usr/local/sbin/arp_refresh.pl (perl5.8.8)
root    4192  0.0  0.2  4752  4408  p0  S     3:06PM   0:00.06 /usr/bin/perl -w /usr/local/sbin/arping_serv.pl (perl5.8.8)

А при нажатии на кнопке "Пинговать" в консоли такая запись:
Код:
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.**.**
Operation Completed!



Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса)
Отправлено: nops от 12 Апреля 2010, 18:19:19
Офигеть. А мне кто-нибудь подскажет?
первый пост на 4-й странице....


Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса)
Отправлено: Cell от 12 Апреля 2010, 19:04:26
У меня так и не получилось..
пишет:
Код:
Wrong second octet **.0.**.**
Operation Completed!

дык что-то не правильно )


Название: 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 = (
                        "pid" => "/var/run/arp_refresh.pid",
                        "arp" => "/usr/sbin/arp",
                        "count" => 5,
                        "ip"    => "172.16.1.101", # IP Шлюза клиентов который смотрит в локалку, тут менять под себя.
                        "port"  => "14121",
                        "proto" => "tcp",
                        "MySQL" => {
                                    "sqlfirst" => "DBI:mysql:bill;192.0.1.1",
                                        "sqllogin" => "flflflflfl",
                                        "sqlpasswd" => "55555555",
                        },
                        "dopfield_id" => 4,
);

# Тут тоже все менять под себя. Я думаю все понятно...что тут. Пример ниже на сеть 172.16.0.0/20

if($first eq 172 ){   
                                if($second eq 16){
                                        if($net eq 0 ||
                                                $net eq 1 ||
                                                $net eq 2 ||
                                                $net eq 3 ||
                                                $net eq 4 ||
                                                $net eq 5 ||
                                                $net eq 6 ||
                                                $net eq 7 ||
                                                $net eq 8 ||
                                                $net eq 9 ||
                                                $net eq 10 ||
                                                $net eq 11 ||
                                                $net eq 12 ||
                                                $net eq 13 ||
                                                $net eq 14 ||
                                                $net eq 15) {

arping_serv

Код:
my %config = (
                        "pid" => "/var/run/arping_serv.pid",
                        "arping" => "/usr/local/sbin/arping",
                        "count" => 5,
                        "ip"    => "172.16.1.101", # IP Шлюза клиентов который смотрит в локалку, тут менять под себя.
                        "port"  => "14120",
                        "proto" => "tcp",
                        "cards" => {
                                    "0" => "xl2",  # И тут я думаю все понятно, подсети на сетевухе. Пример ниже на сеть 172.16.0.0/20
                                    "1" => "xl2",
                                    "2" => "xl2",
                                    "3" => "xl2",
                                    "4" => "xl2",
                                    "5" => "xl2",
                                    "6" => "xl2",
                                    "7" => "xl2",
                                    "8" => "xl2",
                                    "9" => "xl2",
                                    "10" => "xl2",
                                    "11" => "xl2",
                                    "12" => "xl2",
                                    "13" => "xl2",
                                    "14" => "xl2",
                                    "15" => "xl2",
#                                       "31" => "em1",
#                                       "32" => "em2",
#                                       "33" => "em3",
#                                       "34" => "em4",
#                                       "24" => "vlan24",
#                                       "25" => "vlan25",
#                                       "26" => "vlan26",
#                                       "28" => "vlan28"

# И 41-42 строка изменить под свою сеть. Пример ниже на сеть 172.16.0.0/20

if($first eq 172 ){
                                if($second eq 16){
Вроде ничего не забыл, кажется...
И осталось только поменять в Sarping.pl

Код:
my %ARP_config = (
                        "server" => "172.16.1.101", # IP Шлюза клиентов который смотрит в локалку, тут менять под себя.
                        "pingport" => "14120",
                        "updport" => "14121",
                        "proto" => "tcp",
        );


Название: 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 = (
                        "pid" => "/var/run/arp_refresh.pid",
                        "arp" => "/usr/sbin/arp",
                        "count" => 5,
                        "ip"    => "172.16.1.101", # IP Шлюза клиентов который смотрит в локалку, тут менять под себя.
                        "port"  => "14121",
                        "proto" => "tcp",
                        "MySQL" => {
                                    "sqlfirst" => "DBI:mysql:bill;192.0.1.1",
                                        "sqllogin" => "flflflflfl",
                                        "sqlpasswd" => "55555555",
                        },
                        "dopfield_id" => 4,
);

# Тут тоже все менять под себя. Я думаю все понятно...что тут. Пример ниже на сеть 172.16.0.0/20

if($first eq 172 ){   
                                if($second eq 16){
                                        if($net eq 0 ||
                                                $net eq 1 ||
                                                $net eq 2 ||
                                                $net eq 3 ||
                                                $net eq 4 ||
                                                $net eq 5 ||
                                                $net eq 6 ||
                                                $net eq 7 ||
                                                $net eq 8 ||
                                                $net eq 9 ||
                                                $net eq 10 ||
                                                $net eq 11 ||
                                                $net eq 12 ||
                                                $net eq 13 ||
                                                $net eq 14 ||
                                                $net eq 15) {

arping_serv

Код:
my %config = (
                        "pid" => "/var/run/arping_serv.pid",
                        "arping" => "/usr/local/sbin/arping",
                        "count" => 5,
                        "ip"    => "172.16.1.101", # IP Шлюза клиентов который смотрит в локалку, тут менять под себя.
                        "port"  => "14120",
                        "proto" => "tcp",
                        "cards" => {
                                    "0" => "xl2",  # И тут я думаю все понятно, подсети на сетевухе. Пример ниже на сеть 172.16.0.0/20
                                    "1" => "xl2",
                                    "2" => "xl2",
                                    "3" => "xl2",
                                    "4" => "xl2",
                                    "5" => "xl2",
                                    "6" => "xl2",
                                    "7" => "xl2",
                                    "8" => "xl2",
                                    "9" => "xl2",
                                    "10" => "xl2",
                                    "11" => "xl2",
                                    "12" => "xl2",
                                    "13" => "xl2",
                                    "14" => "xl2",
                                    "15" => "xl2",
#                                       "31" => "em1",
#                                       "32" => "em2",
#                                       "33" => "em3",
#                                       "34" => "em4",
#                                       "24" => "vlan24",
#                                       "25" => "vlan25",
#                                       "26" => "vlan26",
#                                       "28" => "vlan28"

# И 41-42 строка изменить под свою сеть. Пример ниже на сеть 172.16.0.0/20

if($first eq 172 ){
                                if($second eq 16){
Вроде ничего не забыл, кажется...
И осталось только поменять в Sarping.pl

Код:
my %ARP_config = (
                        "server" => "172.16.1.101", # IP Шлюза клиентов который смотрит в локалку, тут менять под себя.
                        "pingport" => "14120",
                        "updport" => "14121",
                        "proto" => "tcp",
        );
Перепроверил, всё пормально
Код:
[root@novour /usr/local/sbin]# ps aux | grep arp
root     1628  0.0  0.3  7128  5320  v0- S    Sun11PM   0:07.28 /usr/bin/perl -w /usr/local/sbin/arp_refresh.pl (perl5.10.1)
root     1631  0.0  0.2  7016  4560  v0- S    Sun11PM   0:07.24 /usr/bin/perl -w /usr/local/sbin/arping_serv.pl (perl5.10.1)
root    19111  0.0  0.3 10340  6876   1- S    Mon11AM   0:20.22 perl nomake.pl arp.txt (perl5.10.1)
root    35934  0.0  0.1  3492  1212   3  S+   11:11AM   0:00.00 grep arp
[root@novour /usr/local/sbin]#
arping ставил из портов
Код:
[root@novour /usr/local/etc/rc.d]# uname -a
FreeBSD novour.com 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Wed Mar 17 22:16:55 YEKT 2010     admin@novour.com:/usr/src/sys/i386/compile/NODENY  i386
[root@novour /usr/local/etc/rc.d]#
сеть у меня 192.168.0.0/16
везде проверил, везде всё стоит правильно... Поэтому и написал сюда


Название: 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;
                        $second = $2;
                        $net    = $3;
                        if($first eq 192 or 172){
                                if($second eq 168 or 16){
                                        if(exists($config{"cards"}{$net})) {

Просто дописываем or и нужные значения  :).


Название: Re: Модуль получения МАС-адреса (OLD: получение МАС адреса)
Отправлено: Александр (AleksHr) от 26 Сентября 2011, 09:28:24
Апаю тему, так как возникла необходимость еще реализовать кнопочку - отвязать MAC адрес. Тоесть что-бы выполнялося простое arp -d ip абонента.

Кто может сделать на платной основе? Можна в личкку.