Как поймать предупреждение PHP snmpwalk?

С Nagios у меня есть активный и резервный сервер, который я пытаюсь отслеживать. Когда актив находится в сети, он ответит на этот OID. Резервный сервер не будет отвечать на этот OID, однако я все же хочу часто его опрашивать. Таким образом, если серверы меняют свое состояние, проверки SNMP будут продолжать работать.

Я настраиваю оба сервера в Nagios для плановых проверок. Моя цель - проверить резервный сервер, и если он истекает, то проверить активный (определяемый переменной $peer), чтобы убедиться, что резервный сервер правильно является резервным. Затем выйдите с помощью ОК. Если резервный И активный не отвечают, выйдите из Критического.

PHP snmpwalk отправляет предупреждение, когда истекает время ожидания и не удается связаться с хостом. Я использую собственный обработчик ошибок, чтобы поймать предупреждение и что-то с этим сделать.

Однако я не могу запустить второй раунд проверки SNMP. Он проходит мимо и переходит к остальной части моего сценария, повторяя по пути все мои отладки. Моим ожидаемым результатом был выход.

Как я могу сделать вложенную попытку и поймать с этой настройкой?

// First, setup error handling. 
function errorHandler($errno, $errstr, $errfile, $errline) {
    throw new Exception($errstr, $errno);
}
set_error_handler('errorHandler');

if (!is_null($peer)) { 
    //Dummy SNMP check to see if we get a timeout error or not. 
    try {
        echo "trying ".$host." \n";
        snmpwalk($host,$community,$oid);
    }
    catch (Exception $e) {
        // If we get here, it timed out. Now check to see if the peer server is up.
        echo "timed out, trying ".$peer." \n";
        try {
            snmpwalk($peer,$community,$oid);
        }
        catch (Exception $e) {
            // At this point, the peer server is up, so chances are we're the standby.
            echo "standby is up, we are ok";
            $output = "OK: It appears this is the standby server. \n"; 
            fwrite(STDOUT, $output);
            exit(0);
        }
    echo "Hmm, something else happened. \n";
    }
}

// Restore default error handler. 
restore_error_handler();

person Pat    schedule 23.09.2013    source источник
comment
Он попадает во 2-й блок catch или просто повторяет «Хм, что-то еще произошло»? Если последнее, то ваш второй вызов snmpwalk работал нормально. Кроме того, есть возвращаемое значение от snmpwalk, которое вы можете использовать, если false, произошла ошибка.   -  person Dave Hilditch    schedule 23.09.2013
comment
Тайм-аут эха истек, попытка пиринга... затем эхо хм, что-то еще произошло. Возможно, вы правы. Поскольку одноранговый узел не вышел из строя, он не перешел к последнему исключению. Я попытался найти возвращаемое значение snmpwalk, но не смог его найти. Я не был уверен, есть ли более простой способ упростить такую ​​проверку.   -  person Pat    schedule 23.09.2013
comment
Ну, различное поведение, по-видимому, связано с разными значениями - $peer и $host. Измените свой 2-й snmpwalk, чтобы снова использовать $host, чтобы проверить, работает ли ваша попытка/поймать.   -  person Dave Hilditch    schedule 23.09.2013
comment
Думаю, вы меня правильно поняли. Я перевел свое ОК на хм, что-то случилось. Затем поместите все серверы во второе исключение, и, похоже, он работает на поверхности.   -  person Pat    schedule 23.09.2013


Ответы (1)


Ваш блок catch содержит комментарии, указывающие на то, что вы думаете, что вам удалось подключиться к $peer, но блок catch запустится только в том случае, если ему НЕ УДАЛОСЬ подключиться к $peer.

Переместите свой код за пределы блока catch, и вы получите желаемое поведение.

person Dave Hilditch    schedule 23.09.2013