Jump to content
Калькуляторы

Опыт использования и допилки LibreNMS

Коллеги, сейчас опять хочу вернуться к этому чудо софту http://0x1.tv/20150626F , поделитесь опытом использования и допилки LibreNMS

Share this post


Link to post
Share on other sites

Я недавно изучал эту штуку - из коробки много что работает, но если надо что-то добавить чего нету, то это геморр.

 

Железяку (например коммутатор Eltex) со стандартными метриками ещё можно добавить, через создание описания /opt/librenms/includes/definitions/eltex.yaml

 

А чего-то новое, типа отображения на отдельной закладке ONT портов для gpon-терминала Eltex LTP, я сделал, но провозился неделю. По факту - это программирование на php.

 

Потом мне попались на глаза графики "Interface Non Unicast" и я увидел что они не правильные. Написал разрабам, они проигнорили. Теперь не планирую особо использовать LibreNMS.

 

В общем - ознакомился с продуктом.

 

P.S. Жалко, конечно, т.к. от интерфейса Zabbix'а меня тошнит - помойка метрик.

Share this post


Link to post
Share on other sites
3 hours ago, Urs_ak said:

 

Потом мне попались на глаза графики "Interface Non Unicast" и я увидел что они не правильные. Написал разрабам, они проигнорили. Теперь не планирую особо использовать LibreNMS.

Ты им завели issue на github ?

 

3 hours ago, Urs_ak said:

А чего-то новое, типа отображения на отдельной закладке ONT портов для gpon-терминала Eltex LTP, я сделал, но провозился неделю. По факту - это программирование на php.

А можешь пояснить как или поделиться ?

Share this post


Link to post
Share on other sites
19 часов назад, shafiev сказал:

А можешь пояснить как или поделиться ?

Я могу пояснить суть (на примере gpon-терминала Eltex LTP-4X), только без деталей, т.к. я охладел к LibreNMS на год-два точно

 

Но есть ли в этом смысл, если это добавление довольно муторно делается?

 

Из моих записей:

 

1. Добавить узнавание модели LTP-4X

 

librenms/includes/definitions/eltex-olt.yaml

Скрытый текст

discovery:
    - sysObjectID:
        - .1.3.6.1.4.1.35265.1.70

 

2. Скопировать MIB'ы для LTP-4X в librenms/mibs/eltex-my

 

3. Собирать свои метрики poller'ом, сохранять в rrd, также сохранять в mysql номера портов и их описание

 

librenms/includes/polling/eltex-pon.inc.php
 

Скрытый текст



use LibreNMS\RRD\RrdDefinition;

...

// Get metrics from ONT ports

$OLTmetrics        = array();
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateChannel',      $OLTmetrics, 'ELTEX-LTP8X', null, '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateID',           $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTConfigDescription', $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateState',        $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OeQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateDistance',     $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateTxPower',      $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateRxPower',      $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateTemperature',  $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');

// Get traffic from ONT ports

foreach ($OLTmetrics as $OLTmetricId=>$OLTmetric) {
    $snmp_query = "ltp8xONTCrossConnectDSCounterValue.$OLTmetricId.1.1 ltp8xONTCrossConnectUSCounterValue.$OLTmetricId.1.1";
    $OLTmetrics_traffic    = snmp_get_multi($device, $snmp_query, '-OQUsb', 'ELTEX-LTP8X', 'eltex-my');
    $OLTmetrics[$OLTmetricId]['ltp8xONTCrossConnectDSCounterValue'] = $OLTmetrics_traffic["$OLTmetricId.1.1"]['ltp8xONTCrossConnectDSCounterValue'];
    $OLTmetrics[$OLTmetricId]['ltp8xONTCrossConnectUSCounterValue'] = $OLTmetrics_traffic["$OLTmetricId.1.1"]['ltp8xONTCrossConnectUSCounterValue'];
}
...
сохранить в mysql номера портов и desc
...
// Generate RRD files
foreach ($OLTmetrics as $OLTmetricId=>$OLTmetric) {
        $ONTchannel  = $OLTmetric['ltp8xONTStateChannel'];
        $ONTstateid  = $OLTmetric['ltp8xONTStateID'];
        $ONTifname   = $ONTchannel.'/'.$ONTstateid;
        $ONTdesc     = $OLTmetric['ltp8xONTConfigDescription'];
        $ONTstate    = $OLTmetric['ltp8xONTStateState'];
        $ONTdistance = $OLTmetric['ltp8xONTStateDistance'];
        $ONTtxpower  = $OLTmetric['ltp8xONTStateTxPower'];
        $ONTrxpower  = $OLTmetric['ltp8xONTStateRxPower'];
        $ONTtemp     = $OLTmetric['ltp8xONTStateTemperature'];
        $ONTdownload = $OLTmetric['ltp8xONTCrossConnectDSCounterValue'];
        $ONTupload   = $OLTmetric['ltp8xONTCrossConnectUSCounterValue'];

        echo "* ONT Interface: ".  $ONTifname."\n";
        echo "  ONT Description: ".$ONTdesc."\n";
        echo "  ONT State: ".      $ONTstate."\n";
        echo "  ONT Distance: ".   $ONTdistance."\n";
        echo "  ONT TX Power: ".   $ONTtxpower."\n";
        echo "  ONT RX Power: ".   $ONTrxpower."\n";
        echo "  ONT Temperature: ".$ONTtemp."\n";
        echo "  ONT Download: ".   $ONTdownload."\n";
        echo "  ONT Upload: ".     $ONTupload."\n";

        $rrd_def = RrdDefinition::make()
            ->addDataset('state',    'GAUGE',     0)
            ->addDataset('distance', 'GAUGE',     0)
            ->addDataset('txpower',  'GAUGE',     0)
            ->addDataset('rxpower',  'GAUGE',  null)
            ->addDataset('temp',     'GAUGE',     0)
            ->addDataset('download', 'COUNTER',   0)
            ->addDataset('upload',   'COUNTER',   0);

        $fields = array(
            'state'    => $ONTstate,
            'distance' => $ONTdistance,
            'txpower'  => $ONTtxpower,
            'rxpower'  => $ONTrxpower,
            'temp'     => $ONTtemp,
            'download' => $ONTdownload,
            'upload'   => $ONTupload,
        );

        $tags = compact('rrd_def');

        $rrdfname = "ponport-".$ONTchannel.'-'.$ONTstateid;
        data_update($device, $rrdfname, $tags, $fields);

}

 


 

 

 

 

4. Проверочный запуск поллера

librenms/poller.php -h <ip> -m eltex-pon -d -v

 

5. Сделать свою закладку для устройства Eltex LTP

добавить код вызова закладки PON (122 строка) в страницу device

 

librenms/html/pages/device.inc.php

Скрытый текст

        if ($device['os'] == 'eltex-olt') {
            echo '<li role="presentation" '.$select['pon'].'>
                <a href="'.generate_device_url($device, array('tab' => 'pon')).'">
                <i class="fa fa-sitemap fa-lg icon-theme"  aria-hidden="true"></i> PON
                </a>
                </li>';
        }

 

6. Сделать отображение этой закладки, по аналогии с таблицей обычных портов

librenms/html/pages/device/pon.inc.php

 

Share this post


Link to post
Share on other sites
36 minutes ago, Urs_ak said:

Но есть ли в этом смысл, если это добавление довольно муторно делается?

Оки , а чем не муторно ?

И еще пару вопросов :

  1. А где у тебя в коде вызывается сохраненение в mysql?
  2. И почему нельзя это плагином сделать , туда можно и функционал добавления, выключение ОНТ сделать ?

 

Да и спасибо за код

Edited by shafiev
Забыл добавить спасибо

Share this post


Link to post
Share on other sites
5 минут назад, shafiev сказал:

А где у тебя в коде вызывается сохраненение в mysql?

Там и вызывается, в п. 3

Я это не расписывал, т.к. это замыливание сути - как LibreNMS получает метрики и сохраняет в rrd

Записи в mysql они больше нужны для вывода активных портов на закладке, для отображения

 

11 минут назад, shafiev сказал:

И почему нельзя это плагином сделать , туда можно и функционал добавления, выключение ОНТ сделать ?

Наверно можно, я же это делал чтобы разобраться как LibreNMS работает, на примере конкретной задачи

Если я бы дошёл до стадии "отправить рабочий код разработчикам", то навёл бы красоты, может переписал бы через плугины

Share this post


Link to post
Share on other sites
2 minutes ago, Urs_ak said:

Я это не расписывал, т.к. это замыливание сути - как LibreNMS получает метрики и сохраняет в rrd

Да у них сейчас и в influxdb и в Prometheus тоже поддержка есть, что радует , ведь проект сам по себе развивается.

 

 

Share this post


Link to post
Share on other sites
2 hours ago, Urs_ak said:

discovery:
    - sysObjectID:
        - .1.3.6.1.4.1.35265.1.70 

Если можно будет еще пару вопросов .Вот то что выше это запрос на все онт какие есть или уже готовый с ifindex интерфейса ? (Меня просто попросили помочь с OLT Huawei , там вначале спрашиваешь какие есть интерфейсы , потом выбираешь какие gpon ,чтобы потом получить как ONT ID к ним привязанны и дальше делаешь опросы ) ?

И ты где инфу по внутреннестям брал( на каких ресурсах , примерах , и/или кого то спрашивал ) ?

Share this post


Link to post
Share on other sites
В 26.12.2018 в 11:17, Urs_ak сказал:

Потом мне попались на глаза графики "Interface Non Unicast" и я увидел что они не правильные. Написал разрабам, они проигнорили. Теперь не планирую особо использовать LibreNMS.

А патч-то приложили?

 

2 часа назад, Urs_ak сказал:

Я могу пояснить суть (на примере gpon-терминала Eltex LTP-4X), только без деталей, т.к. я охладел к LibreNMS на год-два точно

 

Но есть ли в этом смысл, если это добавление довольно муторно делается?

 

Из моих записей:

 

1. Добавить узнавание модели LTP-4X

 

librenms/includes/definitions/eltex-olt.yaml

  Показать содержимое

discovery:
    - sysObjectID:
        - .1.3.6.1.4.1.35265.1.70

 

2. Скопировать MIB'ы для LTP-4X в librenms/mibs/eltex-my

 

3. Собирать свои метрики poller'ом, сохранять в rrd, также сохранять в mysql номера портов и их описание

 

librenms/includes/polling/eltex-pon.inc.php
 

  Показать содержимое

 



use LibreNMS\RRD\RrdDefinition;

...

// Get metrics from ONT ports

$OLTmetrics        = array();
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateChannel',      $OLTmetrics, 'ELTEX-LTP8X', null, '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateID',           $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTConfigDescription', $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateState',        $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OeQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateDistance',     $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateTxPower',      $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateRxPower',      $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');
$OLTmetrics    = snmpwalk_cache_multi_oid($device, 'ltp8xONTStateTemperature',  $OLTmetrics, 'ELTEX-LTP8X', 'eltex-my', '-OQUsb');

// Get traffic from ONT ports

foreach ($OLTmetrics as $OLTmetricId=>$OLTmetric) {
    $snmp_query = "ltp8xONTCrossConnectDSCounterValue.$OLTmetricId.1.1 ltp8xONTCrossConnectUSCounterValue.$OLTmetricId.1.1";
    $OLTmetrics_traffic    = snmp_get_multi($device, $snmp_query, '-OQUsb', 'ELTEX-LTP8X', 'eltex-my');
    $OLTmetrics[$OLTmetricId]['ltp8xONTCrossConnectDSCounterValue'] = $OLTmetrics_traffic["$OLTmetricId.1.1"]['ltp8xONTCrossConnectDSCounterValue'];
    $OLTmetrics[$OLTmetricId]['ltp8xONTCrossConnectUSCounterValue'] = $OLTmetrics_traffic["$OLTmetricId.1.1"]['ltp8xONTCrossConnectUSCounterValue'];
}
...
сохранить в mysql номера портов и desc
...
// Generate RRD files
foreach ($OLTmetrics as $OLTmetricId=>$OLTmetric) {
        $ONTchannel  = $OLTmetric['ltp8xONTStateChannel'];
        $ONTstateid  = $OLTmetric['ltp8xONTStateID'];
        $ONTifname   = $ONTchannel.'/'.$ONTstateid;
        $ONTdesc     = $OLTmetric['ltp8xONTConfigDescription'];
        $ONTstate    = $OLTmetric['ltp8xONTStateState'];
        $ONTdistance = $OLTmetric['ltp8xONTStateDistance'];
        $ONTtxpower  = $OLTmetric['ltp8xONTStateTxPower'];
        $ONTrxpower  = $OLTmetric['ltp8xONTStateRxPower'];
        $ONTtemp     = $OLTmetric['ltp8xONTStateTemperature'];
        $ONTdownload = $OLTmetric['ltp8xONTCrossConnectDSCounterValue'];
        $ONTupload   = $OLTmetric['ltp8xONTCrossConnectUSCounterValue'];

        echo "* ONT Interface: ".  $ONTifname."\n";
        echo "  ONT Description: ".$ONTdesc."\n";
        echo "  ONT State: ".      $ONTstate."\n";
        echo "  ONT Distance: ".   $ONTdistance."\n";
        echo "  ONT TX Power: ".   $ONTtxpower."\n";
        echo "  ONT RX Power: ".   $ONTrxpower."\n";
        echo "  ONT Temperature: ".$ONTtemp."\n";
        echo "  ONT Download: ".   $ONTdownload."\n";
        echo "  ONT Upload: ".     $ONTupload."\n";

        $rrd_def = RrdDefinition::make()
            ->addDataset('state',    'GAUGE',     0)
            ->addDataset('distance', 'GAUGE',     0)
            ->addDataset('txpower',  'GAUGE',     0)
            ->addDataset('rxpower',  'GAUGE',  null)
            ->addDataset('temp',     'GAUGE',     0)
            ->addDataset('download', 'COUNTER',   0)
            ->addDataset('upload',   'COUNTER',   0);

        $fields = array(
            'state'    => $ONTstate,
            'distance' => $ONTdistance,
            'txpower'  => $ONTtxpower,
            'rxpower'  => $ONTrxpower,
            'temp'     => $ONTtemp,
            'download' => $ONTdownload,
            'upload'   => $ONTupload,
        );

        $tags = compact('rrd_def');

        $rrdfname = "ponport-".$ONTchannel.'-'.$ONTstateid;
        data_update($device, $rrdfname, $tags, $fields);

}

 

 

 

 

 

 

4. Проверочный запуск поллера

librenms/poller.php -h <ip> -m eltex-pon -d -v

 

5. Сделать свою закладку для устройства Eltex LTP

добавить код вызова закладки PON (122 строка) в страницу device

 

librenms/html/pages/device.inc.php

  Показать содержимое

        if ($device['os'] == 'eltex-olt') {
            echo '<li role="presentation" '.$select['pon'].'>
                <a href="'.generate_device_url($device, array('tab' => 'pon')).'">
                <i class="fa fa-sitemap fa-lg icon-theme"  aria-hidden="true"></i> PON
                </a>
                </li>';
        }

 

6. Сделать отображение этой закладки, по аналогии с таблицей обычных портов

librenms/html/pages/device/pon.inc.php

 

 

Круто, но где merge request в сторону разработчиков? Если так постить на форумах, то продукт за счёт комьюнити не разовьётся?

Share this post


Link to post
Share on other sites
4 часа назад, shafiev сказал:

Вот то что выше это запрос на все онт какие есть или уже готовый с ifindex интерфейса ? (Меня просто попросили помочь с OLT Huawei , там вначале спрашиваешь какие есть интерфейсы , потом выбираешь какие gpon ,чтобы потом получить как ONT ID к ним привязанны и дальше делаешь опросы ) ?

Ну у вас , видимо, начальный уровень по этой теме, раз такой вопрос :)

И наверно вы даже не читали это https://docs.librenms.org/Developing/os/Initial-Detection/ и вообще там всю ветку надо посмотреть

 

sysObjectID - это в SNMP уникальный идентификатор железки/модели, по нему NMS'ы определяют куда соотнести железку и какие метрики, в итоге, запрашивать

 

Запустите smpwalk на железку и полУчите этот код sysObjectID:

snmpwalk -Oqnv -v2c -c <community> <ip> 1.3.6.1.2.1.1.2

 

Сделайте файл, по аналогии с соседними, напр. librenms/includes/definitions/huawei-olt.yaml

и напишите туда полученный код sysObjectID

и далее, по прочитанному

 

Вот более простой пример, как добавить свою железку - коммутатор Eltex MES 3124F (это я себе заметку делал):

Скрытый текст

 

https://docs.librenms.org/#Developing/Support-New-OS/

 

/opt/librenms/includes/definitions/eltex.yaml                    - основной, с описанием железки
/opt/librenms/includes/polling/os/eltex.inc.php                 - переменные для морды и т.п.
/opt/librenms/includes/definitions/discovery/eltex.yaml     - свои счётчики

 

0)

Загрузка своих MIB
загрузить
wget https://eltex-co.ru/upload/iblock/12f/eltex_mib_2.5.48.zip
и разархивировать private в mibs/eltex

Пример обращений:
snmpwalk -v2c -c <community> -M mibs:mibs/eltex -m RADLAN-rndMng <ip> rlCpuUtilDuringLast5Minutes.0
snmpwalk -v2c -c <community> -M mibs:mibs/eltex <ip> RADLAN-rndMng::rlCpuUtilDuringLast5Minutes.0

 

1)
#/opt/librenms/includes/definitions/eltex.yaml
os: eltex                            - уникальное имя (+ будет mib'ы искать в папке с таким именем)
text: 'Eltex MES'
ifname: true
type: network
icon: eltex
mib_dir:
    - cisco                           - дополнительная папка с mib'ами
bad_ifXEntry:                     - подстройка, чтобы метрики правильно показывать
    - 'MES3124F'                  - модель
over:                                 - графики "над мышкой"
    - { graph: device_bits, text: 'Device Traffic' }
    - { graph: device_processor, text: 'CPU Usage' }        - processor - значит взять значения из modules->processors->data файла includes/definitions/discovery/eltex.yaml
poller_modules:
    bgp-peers: false
    hr-mib: false
    ntp: false
    ospf: false
    ucd-diskio: false
    ucd-mib: false
    wireless: false
discovery_modules:
    bgp-peers: false
    cisco-vrf-lite: false
    ntp: false
    ucd-diskio: false
    wireless: false
discovery:
    - sysObjectID:
            - .1.3.6.1.4.1.35265.1.30

 

2)

#/opt/librenms/includes/polling/os/eltex.inc.php
<?php

use LibreNMS\RRD\RrdDefinition;
$version = str_replace('"', '', snmp_get($device, '.1.3.6.1.4.1.89.2.4.0', '-Oqv'));
$hardware = str_replace('"', '', snmp_get($device, '.1.3.6.1.4.1.89.53.14.1.11.1', '-Oqv'));
- переменные, которые будут отображаться в описании устройства

* не обязательный
* $cpu_usage не заработал

 

3)

#/opt/librenms/includes/definitions/discovery/eltex.yaml
mib: RADLAN-rndMng
modules:
    processors:
          data:
              -
                  oid: rlCpuUtilDuringLast5Minutes
                  num_oid: '.1.3.6.1.4.1.89.1.9.{{ $index }}'

* не обязательный

 

4)
Проверка (для уже найденного уст-ва)
/opt/librenms/discovery.php -h <ip> -d -m os
/opt/librenms/poller.php -h <ip> -d -m processors

* если сбилось и определяется как Generic,то надо запустить discovery опять
/opt/librenms/discovery.php -h <ip> -d -v >lsd2 2>&1

 

 

 

Вообще в LibreNMS нету, на данный момент, инфраструктуры для нормального мониторинга OLT-терминалов.

На том что есть, можно добавить узнавание железки и мониторинг стандартных метрик - обычные интерфейсы, CPU и т.п.

Графики загрузки ONT портов вы так просто не получите.

 

Share this post


Link to post
Share on other sites
2 minutes ago, Urs_ak said:

Графики загрузки ONT портов вы так просто не получите.

Вот я и хочу сделать все нормально , чтобы был автодетектинг ОНТ со всеми параметрами .

 

 

3 minutes ago, Urs_ak said:

Ну у вас , видимо, начальный уровень по этой теме, раз такой вопрос :)

ну дык я ее когда тыкал еще этих доков не было )
 

Вопрос в догонку я потом же эти полученные ОНТшки по их SNMP ID полученным ранее смогу в своем плагине оперировать и если да то через mysql ?

Share this post


Link to post
Share on other sites
6 минут назад, shafiev сказал:

Вопрос в догонку я потом же эти полученные ОНТшки по их SNMP ID полученным ранее смогу в своем плагине оперировать и если да то через mysql ?

Про плугины меня не спрашивайте я туда не погружался. Почитайте доки, там видимо много они добавили информации.

 

Мне втемяшилось, что я хочу закладку "PON", рядом с Ports.

Чтобы там был список сконфигуренных ONT портов на железке

А по клику на выбранный ONT порт открывалась статистика для этого порта: UL/DL,уровень сигнала,расстояние и т.п.

 

HTML код для отображения полученных метрик, взял с закладки "Ports":

  librenms/html/pages/device/ports.inc.php
  librenms/html/pages/device/port.inc.php

  librenms/html/includes/graphs/port/
и сделал по аналогии

 

Share this post


Link to post
Share on other sites

А для TR-69 у вас eltex.acs ?

Share this post


Link to post
Share on other sites

Больше никто не работал с ним ?

Share this post


Link to post
Share on other sites

есть у кого какие подвижки в пон

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now