есть предложение зделать кнопочку гденибуть (в тех данных) получить мак адрес, а то заводиш юзера либо просто сетевушку меняеш, и тут на тебе нада конектится по ссх чтобы мак снять.
Я думаю, кнопочку в тех-данных писать не совсем как бы правильно, ибо прир апдейте версии писать её туда прийдётся ещё раз.. и ещё раз..
Правильнее будет это реализовать модулем клиентской статистики, доступным
только администраторам (т.е. когда попадаешь в статистику из профиля пользователя в админке).
Выглядеть это будет как-то так:
При нажатие на кнопку "Пинговать" будет что-то происходить
(на старой системе у меня 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);
Хотелось бы с форками разобраться и чтоб он обрабатывал несколько соединений сразу. ..До этого руки так и не дошли.