В настоящее время я создаю систему сетевого мониторинга на основе 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 файлы в нужном мне формате или кто-то может указать мне правильное направление, чтобы мой код работал правильно и наиболее эффективно?