[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разбить последовательность чисел на диапазоны и вы
zend
Здравствуйте.

Есть ряд коммутаторов, на которые заходит скрипт по SNMP и получает некую полезную информацию. Порой коммутаторы выходят из строя и заменяются на новые, с новым IP, таким образом часть IP адресов из подсети которая назначена коммутаторам просто недоступны. Скрипт, когда встречает такой IP, берёт тайм-аут в секунду, за тем понимает, что коммутатор с таким IP не доступен и двигается дальше по диапазону IP адресов обходя все остальные коммутаторы.

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

Вот код:

<?php 

// Задаём диапазон IP адресов (подсеть 192.168.25.0/19)
$network_25 = array('start' => ip2long('192.168.25.0'), 'end' => ip2long('192.168.31.254'));

// Инициируем массив, в котором будем хранить IP активных коммутаторов
$address_ranges = array();

// В цикле обходим все коммутаторы и выясняем доступны ли они
for($i = $network_25['start']; $i <= $network_25['end']; $i++)
{
// Преобразуем число обратно в IP
$ip_dlink = long2ip($i);

// Проверяем доступность коммутатора
$fp = @fsockopen($ip_dlink, '23', $errno, $errstr, 1);
if (!$fp)
{

// Здесь код который делает все хорошо

}
}

?>


Необходимо массив $address_ranges с помощью кода "// Здесь код который делает все хорошо" привести к виду:

$address_ranges = array( 
array('start' => ip2long('192.168.25.145'), 'end' => ip2long('192.168.25.146')),
array('start' => ip2long('192.168.25.150'), 'end' => ip2long('192.168.25.219')),
array('start' => ip2long('192.168.25.221'), 'end' => ip2long('192.168.25.254')),
array('start' => ip2long('192.168.26.1'), 'end' => ip2long('192.168.26.254')),
array('start' => ip2long('192.168.27.1'), 'end' => ip2long('192.168.27.254')),
array('start' => ip2long('192.168.28.1'), 'end' => ip2long('192.168.28.239')),
array('start' => ip2long('192.168.29.241'), 'end' => ip2long('192.168.29.254'))
);


Есть идеи, как такое провернуть?

Решить задачу в лоб в принципе, с начала, кажется не сложно. Необходимо выставить некий флаг, который показывает, что сейчас код "// Здесь код который делает все хорошо" натыкается на недоступные IP (ну ещё бы 192.168.25.0 уж точно не доступен) и как только код "// Здесь код который делает все хорошо" наткнётся на доступный IP он должен сделать:

$address_ranges[$i]['start'] = $ip_dlink


и выставить флаг в положение я работаю с доступными IP, затем, как только код наткнётся на недоступный IP он должен сделать:

$address_ranges[$i]['end'] = $ip_dlink


и выставить флаг в положение я работаю с не доступными IP...

И вот тут начинаются проблемы $address_ranges[$i]['end'] будет присвоен IP недоступного коммутатора, а на самом деле надо присвоить предыдущий IP...

В общем чувствую, что решение где-то рядом совсем, а я его не вижу. Ребята разбирающиеся в математике наверняка легко решат подобную задачу, но вот у меня с математикой проблемы небольшие.

Подтолкните к правильному решению пожалуйста.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.