Разбор файлов SNMP MIB в массив в PHP - PullRequest
0 голосов
/ 04 апреля 2020

В настоящее время я создаю систему сетевого мониторинга на основе PHP и ищу способ правильного разбора файлов SNMP MIB в массив для использования в PHP, чтобы я мог создать сценарий обнаружения для устройств с поддержкой SNMP.

Код, который я сейчас написал, работает для указанного c MIB-файла для оборудования MikroTik, но обнаружил только, что форматирование не одинаково (например, в mikrotik MIB :: = SEQUENCE { находится на одной строке в качестве имени последовательности, но в других MIB, он находится на новой строке)

Я также не уверен, эффективен ли мой код.

Пример:

Один из последовательности в файле MIB выглядят так:

MtxrWlStatEntry ::= SEQUENCE {
    mtxrWlStatIndex ObjectIndex,
    mtxrWlStatTxRate Gauge32,
    mtxrWlStatRxRate Gauge32,
    mtxrWlStatStrength Integer32,
    mtxrWlStatSsid DisplayString,
    mtxrWlStatBssid MacAddress,
    mtxrWlStatFreq Integer32,
    mtxrWlStatBand DisplayString,
    mtxrWlStatTxCCQ Counter32,
    mtxrWlStatRxCCQ Counter32
}

Моя функция анализа файла MIB:

//Parse sequences
function parseSNMPMibSequence($fileHandle) {
    $rows = explode("\n", $fileHandle);
    $sequenceArray = [];
    foreach($rows as $key => $row) {
        if(strpos($row, ' ::= SEQUENCE {')) {
            $createArray = rtrim($row, ' ::= SEQUENCE {');

            for($i=($key+1);$i++;) {
                //Build array 
                $arrayKey = preg_replace('/\s+/', '', substr($rows[$i], 0, strrpos($rows[$i], ' ')));
                $arrayValue = preg_replace('/\s+/', '', rtrim(strrchr($rows[$i], ' '), ','));

                //Create if not null
                if(preg_replace('/\s+/', '', substr($rows[$i], 0, strrpos($rows[$i], ' ')))) {
                    $sequenceArray[$createArray][$arrayKey] = $arrayValue;
                }

                //Break on closing tag
                if(strpos($rows[$i], '}') == '}') {
                    break;
                }
            }
        }
    }
    return($sequenceArray);
}

, которая возвращает массив:

Array(
    [MtxrWlStatEntry] => Array(
        [mtxrWlStatTxRate] => Gauge32
        [mtxrWlStatRxRate] => Gauge32
        [mtxrWlStatStrength] => Integer32
        [mtxrWlStatSsid] => DisplayString
        [mtxrWlStatBssid] => MacAddress
        [mtxrWlStatFreq] => Integer32
        [mtxrWlStatBand] => DisplayString
        [mtxrWlStatTxCCQ] => Counter32
        [mtxrWlStatRxCCQ] => Counter32
    )
)

Однако, например, когда я анализирую IF-MIB в своей функции, я не получаю ничего в моем массиве из-за того, что ::= SEQUENCE { находится на новой строке и содержит пробелы.

Существует ли существующая функция, которая можно разобрать MIB fi файлы в нужном мне формате или кто-то может указать мне правильное направление, чтобы мой код работал правильно и наиболее эффективно?

...