Ad Widget

Collapse

Расширяем snmp lld скриптами

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Jimson
    Senior Member
    • Jan 2008
    • 1327

    #166
    1. это дерево устаревшее, на новых железках другие OID, отдельно для ipv4 отдельно для ipv6
    2. оно не зря повернуто наоборот "адрес -> индекс", в этой таблице будут и secondary адреса, т.о. для одного индекса возможно несколько адресов

    я подкостылил, но не более того
    Attached Files

    Comment

    • tuban
      Senior Member
      Zabbix Certified Specialist
      • Sep 2012
      • 286

      #167
      Originally posted by jimson
      1. это дерево устаревшее, на новых железках другие oid, отдельно для ipv4 отдельно для ipv6
      2. оно не зря повернуто наоборот "адрес -> индекс", в этой таблице будут и secondary адреса, т.о. для одного индекса возможно несколько адресов

      я подкостылил, но не более того
      Большое спасибо. После праздников проверю.

      Comment

      • tuban
        Senior Member
        Zabbix Certified Specialist
        • Sep 2012
        • 286

        #168
        Originally posted by Jimson
        1. это дерево устаревшее, на новых железках другие OID, отдельно для ipv4 отдельно для ipv6
        2. оно не зря повернуто наоборот "адрес -> индекс", в этой таблице будут и secondary адреса, т.о. для одного индекса возможно несколько адресов

        я подкостылил, но не более того
        Проверил как на 12, так и на 15 ios. Увы, скрипт работает некорректно. Путает дескрипты, индексы и ip адреса разных интерфейсов. Первая строка вообще выводится без индекса... Где-то в дескрипт попадают данные, которые к дескрипту отношения не имеют. В общем, на выходе получается каша. К тому же, все выводит в одну строку.
        Я попробую поковырять, но с моими знаниями perl вряд ли я что-то найду.

        Comment

        • Jimson
          Senior Member
          • Jan 2008
          • 1327

          #169
          просто покажи небольшой пример некорректного вывода, используй regex в параметрах скрипта

          что бы сделать читабельный вывод надо заменить в скрипте строку
          print encode_json { data => \@data };
          на
          print JSON->new->utf8->pretty(1)->encode({ data => \@data });

          потом меняя в pretty() аргумент с 1 на 0 можно включать/отключать форматирование

          Comment

          • tuban
            Senior Member
            Zabbix Certified Specialist
            • Sep 2012
            • 286

            #170
            Originally posted by jimson
            просто покажи небольшой пример некорректного вывода, используй regex в параметрах скрипта

            что бы сделать читабельный вывод надо заменить в скрипте строку
            print encode_json { data => \@data };
            на
            print json->new->utf8->pretty(1)->encode({ data => \@data });

            потом меняя в pretty() аргумент с 1 на 0 можно включать/отключать форматирование
            Да, вижу - все нормально. Видимо, я "пропарсил" неверно. :d Сейчас попробую прикрутить к заббиксу. Единственное, так и не понял как скрипт откусывает последние четыре октета.

            Проверил все получилось, правда, пришлось потупить.
            Спасибо.
            Last edited by tuban; 06-05-2015, 03:57.

            Comment

            • Jimson
              Senior Member
              • Jan 2008
              • 1327

              #171
              Во первых сбор этих данных я добавил только для случая без фильтрации по RD, но как я понимаю тут нет тех кому такая фильтрация нужна.
              Вот тут получаются данные от SNMP агента:
              ($ifAddr) = $sess->bulkwalk(0, 10, [['.1.3.6.1.2.1.4.20.1.2']]);
              где в $ifAddr будет помещена ссылка на массив.
              Чуть ниже цикл по этому массиву:
              Code:
              my $v;
              for (@$ifAddr) {
                  if ($_->val =~ /^\d+$/ and exists $json{ $_->val }) {
                      if ( $v = index($_->name, '.1.3.6.1.2.1.4.20.1.2.') == 0 and $v = substr($_->name, $v + 21) ) {
                          if ( $json{ $_->val }->{IFADDR} ) {
                              $json{ $_->val }->{IFADDR} .= " $v";
                          } else {
                              $json{ $_->val }->{IFADDR} = $v;
                          }
                      }
                  }
              }
              который и помещает в результирующий хэш-хэшей %json дополнительный ключ {IFADDR}. Список (массив) @$ifAddr это массив ссылок на объекты SNMP::Varbind (man SNMP), по сути это полученные значения. $_->name полный OID, $_->val значение ($_ это default variable, используется в том числе в качестве временной переменной в циклах, если переменная не указана явно, например `for (@array) { ... }` эквивалентно `for $_ (@array) { ... }`)

              Comment

              • Jeko
                Junior Member
                • Dec 2014
                • 9

                #172
                Jimson, подскажите а как подправить Ваш скрипт, если другой oid у ifalias. Причем, в нём индекс порта идёт не в конце, а в середине (.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3.<IFINDEX> .1)

                Comment

                • Jimson
                  Senior Member
                  • Jan 2008
                  • 1327

                  #173
                  Originally posted by Jeko
                  Jimson, подскажите а как подправить Ваш скрипт, если другой oid у ifalias. Причем, в нём индекс порта идёт не в конце, а в середине (.1.3.6.1.4.1.171.10.134.2.1.1.100.2.1.3.<IFINDEX> .1)
                  Это что за железо такое? ifAlias другим быть не может, это OID из таблицы ifXTable (.1.3.6.1.2.1.31), ваш OID это какой то "vendor specific".
                  Ну а подправить, подправить все можно, код простой, к тому же вас никто не покусает в процессе правки, подставляйте другие OID, выкусывайте "INDEX" не из $_->iid, а из $_->name с помощью substr, или split.

                  Comment

                  • doncelab
                    Member
                    • May 2015
                    • 36

                    #174
                    Здравствуйте. Большое спасибо за скрипт. Пытаюсь разобраться в скрипте, я так понял что он выдает перечень интерфейсов и по 4 группам данные с макросами для заббикса (#ifindex, #iftags, #ifalias, #ifdescr) по которым можно фильтровать. В макросах есть пример где указываются с каких интерфейсах собирать статистику, а как сделать что бы собирались со всех интерфейсах но кроме некоторых?

                    Comment

                    • Gotcha
                      Junior Member
                      • May 2014
                      • 23

                      #175
                      Если я правильно понял, то что Вам надо настраивается в Администрирование>общие>регулярные выражения

                      у меня (ifOper:up, [Результат ИСТИНА]) - совпадает со всеми поднятыми интерфейсами на свиче, в статусе down соответственно не мониторятся.

                      Вы создаете регулярное выражение под свои нужды. Далее указываете это выражение в поле "регулярное выражение" в правиле обнаружения.

                      подробнее посмотрите про регулярные выражения: Здесь
                      Last edited by Gotcha; 18-05-2015, 11:59.

                      Comment

                      • doncelab
                        Member
                        • May 2015
                        • 36

                        #176
                        Спасибо. Т.е. к каждому макросу можно сделать свои выражения.

                        Comment

                        • Jimson
                          Senior Member
                          • Jan 2008
                          • 1327

                          #177
                          Originally posted by doncelab
                          а как сделать что бы собирались со всех интерфейсах но кроме некоторых?
                          Ну вы скажите по какому условию будет определяться "некоторых" и тогда будет понятно как лучше фильтровать. А так у скрипта есть параметр обычный perl-regexp, а можно, как уже написали, добавить в глобальные zabbix-regexp ограничения. Связкой "FLAG" + zabbix-regexp, как это сделано в примере моего шаблона, можно отфильтровывать "все интерфейсы у которых в дескрипшене есть метка".

                          Comment

                          • doncelab
                            Member
                            • May 2015
                            • 36

                            #178
                            Я сейчас хочу упростить скрипт что бы он забиксу отдавал список всех интерфейсов с макросами (ifIndex, ifDescr, ifAdminStatus, Counter64). А в самом забиксе через фильтры буду сортировать со статусов UP в ifAdminStatus и исключать ненужные порты по ifDescr (Null, Loopback, E1). И надо как то придумать что бы забикс брал счетчики из другого OID для интерфейсов поддерживающих Counter64.

                            Comment

                            • sadman
                              Senior Member
                              • Dec 2010
                              • 1611

                              #179
                              Попробуйте мой скрипт -
                              https://www.zabbix.com/forum/showpos...&postcount=165 , https://www.zabbix.com/forum/showpos...&postcount=155
                              В качестве базового oid-а зададите iftype, а потом довесите те поддеревья, где ваши Counter64 хранятся.

                              Comment

                              • blah.blah
                                Junior Member
                                • Mar 2015
                                • 19

                                #180
                                Люди, есть вопрос.
                                У меня обсуждаемый тут скрипт возвращает пустой json. Я перл сегодня увидел впервые, могу глупостей наговорить. Подскажите, плз.
                                Проблема, как мне кажется, возникает вот в этом месте:
                                Code:
                                for (@$ifInOctets) {
                                    $json{ $_->iid } = {} if $_->val =~ /^\d+$/;
                                }
                                Если я правильно истолковал смысл этой конструкции, то для каждого элемента массива @$ifInOctets в переменную $json (так и не определил ее тип) с индексом $_->iid заносится значение $_->val, но только если оно числовое. Текущая переменная $_ представляет собой массив SNMP::Varbind.
                                Да, так вот, когда я добавил внутри этого энумератора вывод элементов (print Dumper $_; ), то увидел вот такие конструкции:
                                Code:
                                $VAR1 = bless( [
                                                 'iso.3.6.1.2.1.2.2.1.10.2',
                                                 '',
                                                 '80045315',
                                                 'COUNTER'
                                               ], 'SNMP::Varbind' );
                                У SNMP::Varbind должен быть формат [<obj>, <iid>, <val>, <type>]. Т.е. iid тут пустой. Соответственно, пустой оказывается и json.
                                Собственно, вопрос - как это побороть? Как вариант, от obj последнее число откусить, например?
                                P.S. Железка - mikrotik.

                                Comment

                                Working...