Как да уловя PHP snmpwalk предупреждение?

С Nagios имам активна и резервна настройка на сървъра, която се опитвам да наблюдавам. Когато активният е онлайн, той ще отговори на този OID. Режимът на готовност няма да отговори на този OID, но все пак искам да го проверявам често. По този начин, ако сървърите променят състоянието си, SNMP проверките ще продължат да работят.

Конфигурирам и двата сървъра в Nagios за рутинни проверки. Целта ми е да проверя режима на готовност и ако изтече времето, да проверя активния (дефиниран от променлива $peer), за да проверя, че режимът на готовност е правилно режимът на готовност. След това излезте с OK. Ако режимът на готовност И активен не отговаря, тогава излезте от критично.

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-рия блок за улавяне или просто повтаря „Хм, нещо друго се случи“? Ако последното, тогава второто ви повикване на snmpwalk е работило добре. Също така - има върната стойност от snmpwalk, която можете да използвате - ако е невярно, възникнала е грешка.   -  person Dave Hilditch    schedule 23.09.2013
comment
Времето за изчакване на ехото е изтекло, опитвайки се да изпрати... след това ехото хм нещо друго се случи. Може би си прав. Тъй като партньорът не се провали, той не отиде до последното изключение. Опитах се да потърся върнатата стойност на snmpwalk, но не можах да я намеря. Не бях сигурен дали има по-лесен начин за опростяване на този вид проверка.   -  person Pat    schedule 23.09.2013
comment
Ами различното поведение вероятно се дължи на различните стойности - $peer и $host. Променете втория си snmpwalk, за да използвате отново $host, за да видите дали вашият try/catch работи тогава.   -  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