Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2014, 13:09   #1
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию вложенные массивы, вытащить ключи как?

Здраствуйте.
Имеем: свичи Длинк, включенные звездой, один в роли аплинка, остальные звездой от него.
Задача: вычислить, какой коммутатор какими портами куда скоммутирован.
Т.е. этакая мелкая карта сети, для "лень двигатель прогресса".
Для этой задачи выбираю опрос по SNMP, мибы нарыты в просторах.
1. Стучимся в первый из заданного диапазона ип свич.
2. получаем от него инфу:
а. мак адрес собственно его,
б. какие порты (26--28) в каком состоянии находятся (Up--Down)
в. какие маки в каких портах(26--28) светятся в нем
г. конвертируем полученные маки в HEX, т.к. длинки по другому и не умеют..
Данный пункт 2 проделываем с каждым девайсом.
3. Имея полученные маки все, спрашиваем в каждом же свиче в каком порту светятся "чужие" маки, т.е. аналог телнета sh arpentry

Ну и строим методом сравнения кто куда подключен...

Что получилось:
1. работает
2. работает
т.е. я инфу то по циклу получаю от каждого свича.
Но т.к. я еще не писал серьезных вещей потому и застрял на пункте, как вытащить отдельно для каждого свича и запомнить информацию то...
Я понимаю что весь опрос в цикле и его значения надо загнать в массив и далее делать с ним (массивом) что угодно, но блин не могу сообразить никак..

Т.е. принцип работы таков:
Иду в свич
Получаю инфу
Иду в следующий
Получаю инфу..
......
А вот теперь взять бы все что вытащено сразу и анализировать.
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 17.06.2014, 13:09   #2
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

Немного кода для опроса:

Код:
<?php
error_reporting(E_ALL ^ E_WARNING);
#Диапазон ипшнеков последнего октета = 19--24
$i = 19;

for ($i = 19; $i<=24; $i++)
{

$first_array = array ($ip, $serial, $MAC, $ip_dex_full);



#########################################################################
# THIS IS OLE MIB From Switch Dlink DES-3200-XX
# snmpget ip-address, community, oli_mib,time-out
#########################################################################
#        LOCATION
$address = snmpget("192.168.1.$i", "public", ".1.3.6.1.2.1.1.6.0", 500);
$address =  substr($address,strrpos($address, "STRING:")+7);
#########################################################################
#		Type DEVICE aka "des-3200-xx"
$info = snmpget("192.168.1.$i", "public", ".1.3.6.1.2.1.1.1.0", 500);
//STRING: "DES-3200-28 Fast Ethernet Switch"
// if (($info == "")
$info =  substr($info,strrpos($info, "STRING:")+7);
$type_hard = explode (" ", $info);
$info = $type_hard[1];

#########################################################################
# UP TIME
#.1.3.6.1.2.1.1.3.0
$uptime = snmpget("192.168.1.$i", "public", ".1.3.6.1.2.1.1.3.0", 500);
$uptime =  substr($uptime,strrpos($uptime, ")")+1);
#########################################################################
#		SERIAL NUMBER
$serial = snmpget("192.168.1.$i", "public", ".1.3.6.1.4.1.171.10.75.15.2.1.30.0", 500);
$serial =  substr($serial,strrpos($serial, "STRING:")+7);
if (($info == "") or ($serial == ""))
{
$info = 'not connect';
$serial = 'not connect';
$address = 'not connect';
}

###########################################################################
# MAC-ADDRESS SWITCH
#.1.3.6.1.4.1.171.10.75.15.2.86.3.4.0
#
$MAC = snmpget("192.168.1.$i", "public", ".1.3.6.1.4.1.171.10.75.15.2.86.3.4.0", 500);
//STRING: "C8-BE-19-3D-35-94"
$MAC =  substr($MAC,strrpos($MAC, "STRING:")+9);
$MAC =  substr($MAC, 0, -1);
$ring = explode("-", $MAC);
#Find MAC-ADDRESS and CONVERT THIS from HEX--DEC
#
#
$at = '.';
$ip_dex1 = hexdec($ring[0]);
$ip_dex2 = hexdec($ring[1]);
$ip_dex3 = hexdec($ring[2]);
$ip_dex4 = hexdec($ring[3]);
$ip_dex5 = hexdec($ring[4]);
$ip_dex6 = hexdec($ring[5]);
$ip_dex_full = $ip_dex1 . $at . $ip_dex2 . $at . $ip_dex3 . $at . $ip_dex4 . $at . $ip_dex5 . $at . $ip_dex6;
#string snmpgetnext ( string $host , string $community , string $object_id [, int $timeout = 1000000 [, int $retries = 5 ]] )
//.1.3.6.1.2.1.17.7.1.2.2.1.2.126.216.254.227.58.116.68


$mac_find = snmpget("192.168.1.$i", "public", ".1.3.6.1.2.1.17.7.1.2.2.1.2.126.$ip_dex_full{21}", 500);
echo '==='; echo ".1.3.6.1.2.1.17.7.1.2.2.1.2.126."; echo $ip_dex_full; echo '<br>';
echo $mac_find; echo '<br>';


$ip = snmpget("192.168.1.$i", "public", ".1.3.6.1.2.1.16.19.11.1.1.37", 500);
$ip =  substr($ip,strrpos($ip, "STRING:")+11);
var_dump($first_array); echo '-----<br>';
echo $first_array[1]; echo '-----<br>';

echo '<tr><td>';
echo $ip;echo '  ';
echo'. ';
echo $info; 
echo ' ';
echo $address;
echo '_S/N: '; echo $serial; echo '  '; //echo $uptime;
echo '  '; echo 'MAC--> ';echo $MAC; echo '  ';   echo 'hex_mac = '; echo $ip_dex_full; echo '<br>';
#.1.3.6.1.2.1.2.2.1.8.25 -- status port (up(1)-down(2))
#.1.3.6.1.2.1.17.7.1.2.2.1.2.126.0.24.116.47.87.64; Value (Integer): 28
for ($d = 26; $d<=28; $d++)
{
$ports = snmpget("192.168.1.$i", "public", ".1.3.6.1.2.1.2.2.1.8.$d", 500);
$ports =  substr($ports,strrpos($ports, "STRING:")+9);
if ($ports == "1")
 {$status_port = "Up";}
if ($ports == '2') {$status_port = 'Down';}

echo "Port $d is "; echo $status_port; echo '<br>';
}
echo '<br>';

}


?>
Что выводит:

[HTML].1.3.6.1.2.1.17.7.1.2.2.1.2.126.216 .254.227.58.115.228

array(4) { [0]=> string(12) "192.168.1.22" [1]=> string(16) " "QBM51D8003183"" [2]=> string(17) "D8-FE-E3-3A-74-44" [3]=> string(21) "216.254.227.58.116.68" } -----
"QBM51D8003183"-----
192.168.1.23 . "DES-1210-28/ME _S/N: "QBM51D8003181" MAC--> D8-FE-E3-3A-73-E4 hex_mac = 216.254.227.58.115.228
Port 26 is Up
Port 27 is Down
Port 28 is Up

===.1.3.6.1.2.1.17.7.1.2.2.1.2.126. 216.254.227.58.116.20

array(4) { [0]=> string(12) "192.168.1.23" [1]=> string(16) " "QBM51D8003181"" [2]=> string(17) "D8-FE-E3-3A-73-E4" [3]=> string(22) "216.254.227.58.115.228" } -----
"QBM51D8003181"-----
192.168.1.24 . "DES-1210-28/ME _S/N: "QBM51D8003182" MAC--> D8-FE-E3-3A-74-14 hex_mac = 216.254.227.58.116.20
Port 26 is Down
Port 27 is Down
Port 28 is Up/HTML]

помощь треба, ежели обчеству не в тягость
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 17.06.2014, 13:12   #3
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

собственно отсюда:
Код:
$i = 19;

for ($i = 19; $i<=24; $i++)
{
как то надо объявить, что все что получится это массив, и далее как то брать ключики.
Не откажите в любезности товарищи.
А то очень уж полезная штука вырисовывается..
Поясню что выводится на примере строки:
array(4) { [0]=> string(12) "192.168.1.19" [1]=> string(16) " "QBM51D8002519"" [2]=> string(17) "D8-FE-E3-39-F7-C4" [3]=> string(22) "216.254.227.57.247.196" } -----
ip adress свича; серийник; мак-адрес свича; его(мак-адресс) конвертация в HEX, чтоб использовать далее.
Т.е. цикл проходит успешно, но блин как выдернуть ВСЕ что получалось?
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".

Последний раз редактировалось bush007; 17.06.2014 в 13:17.
bush007 вне форума Ответить с цитированием
Старый 18.06.2014, 09:38   #4
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

опа...
тему закрыть, решение нашел.
(тут как принято в интернетах не должно быть самого решения, но я не такой )

Итак...
в месте, где мы получаем необходимое значение (в этом примере мак-адрес устройства):
Код:
$MAC = snmpget("192.168.1.$i", "public", ".1.3.6.1.4.1.171.10.75.15.2.86.3.4.0", 500);
//STRING: "C8-BE-19-3D-35-94"
$MAC =  substr($MAC,strrpos($MAC, "STRING:")+9);
$MAC =  substr($MAC, 0, -1);
#Объявляем, что полученное значение - это массив!
$mmac [] = $MAC;
Идем в самый самый конец скрипта и вытаскиваем то что уже найдено:

Код:
}
echo 'bebebe '; echo $mmac[0]; echo '<BR>';
echo 'bebebe '; echo $mmac[1]; echo '<BR>';
echo 'bebebe '; echo $mmac[2]; echo '<BR>';
echo 'bebebe '; echo $mmac[3]; echo '<BR>';
echo 'bebebe '; echo $mmac[4]; echo '<BR>';



?>
Ответ :

Код:
bebebe D8-FE-E3-39-F7-C4
bebebe D8-FE-E3-39-F7-64
bebebe
bebebe D8-FE-E3-3A-74-44
bebebe D8-FE-E3-3A-73-E4
То что пусто = этого коммутатора нет в сети, но это отдельная история
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 18.06.2014, 09:45   #5
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

Объясню, пока сам не забыл, строки кода:
Код:
$MAC =  substr($MAC,strrpos($MAC, "STRING:")+9);
$MAC =  substr($MAC, 0, -1);
т.к. полученное значение равно
Код:
STRING: "asdasdasdasd"
то отрезаем слева 9 символов, а потом справа один.
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вложенные циклы + массивы kuy Паскаль, Turbo Pascal, PascalABC.NET 19 09.10.2013 21:32
Массивы, авторизация через ВК, как вытащить данные? Delphinchik PHP 0 23.01.2012 19:12
Массивы. Вложенные циклы Usefur Помощь студентам 4 27.12.2010 22:48
двумерные массивы.вложенные циклы Горящее сердце Помощь студентам 2 26.05.2010 20:29
массивы и вложенные циклы cobrita24 Помощь студентам 10 03.12.2009 15:22