Ad Widget

Collapse

импорт c Микротика по SNMP интерфейсов с комментами(IFALIAS) на кирилице

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • jone31
    Junior Member
    • Mar 2014
    • 6

    #1

    импорт c Микротика по SNMP интерфейсов с комментами(IFALIAS) на кирилице

    есть около трех тысяч интерфейсов на базе микротика, в которых в коментарии к интерфейсу написана информация на кирилице.

    при импорте соответственно кодировка слетает... есть ли возможность пофиксить? немогу найти информацию по проблеме. сама кирилица в интерфейсе забикса работает корректно, если руками вписать. получается проблема именно при импорте из микротика.
  • lioncub
    Member
    • May 2011
    • 39

    #2
    Попробуй выгрузить через snmpwalk/get и посмотреть что там отправляется и в какой кодировке

    Comment

    • Hamardaban
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • May 2019
      • 2713

      #3
      забикс кушает без проблем utf8. остальным давиться.
      а что такое "импорт" при котором кодировка плывет? запросы snmp?

      Comment

      • jone31
        Junior Member
        • Mar 2014
        • 6

        #4
        Originally posted by Hamardaban
        забикс кушает без проблем utf8. остальным давиться.
        а что такое "импорт" при котором кодировка плывет? запросы snmp?
        заводской шаблон snmp discovery заводит эти интерфейсы из snmp и там выплывает эта кириллица(в микротике она в коментах к интерфейсу)

        Comment


        • Hamardaban
          Hamardaban commented
          Editing a comment
          ну тоесть все же банальный snmp get….

          как уже советовали - посмотрите что отдает snmpwalk / get
      • Hamardaban
        Senior Member
        Zabbix Certified SpecialistZabbix Certified Professional
        • May 2019
        • 2713

        #5
        возможно припроцессинг JS и https://learn.javascript.ru/text-decoder помогут…

        Comment

        • jone31
          Junior Member
          • Mar 2014
          • 6

          #6
          snmpwalk показывает следующее:

          Click image for larger version  Name:	123123123.png Views:	0 Size:	47.2 KB ID:	428105

          поигрался c кодировками и выяснил что микротик по SNMP отдает в кодировке win1251... можно ли как то пофиксить в забиксе входящую кодировку?

          Comment

          • jone31
            Junior Member
            • Mar 2014
            • 6

            #7
            Originally posted by Hamardaban
            возможно припроцессинг JS и https://learn.javascript.ru/text-decoder помогут…
            не очень понял как JS связан с обработкой данных скриптами на сервере... в базу уже попадает поломанная кодировка, восстановить её невозможно обратно.

            Comment


            • Hamardaban
              Hamardaban commented
              Editing a comment
              элементы данных (созданные в процессе lld) получают данные запросом snmp и прежде чем попасть в базу значения могут быть подвергнуты обработке припроцессингом для данного ЭД. за подробностями - в документацию https://www.zabbix.com/documentation.../preprocessing
          • jone31
            Junior Member
            • Mar 2014
            • 6

            #8
            пробую в тестах скрипт

            return new TextDecoder('windows-1251').decode(new Uint8Array('��� "���������������"')) - пустая строка возвращается...

            подскажите что не так

            Comment

            • shuum
              Junior Member
              • Dec 2019
              • 11

              #9
              Вроде и некропост, но сам недавно столкнулся с этим и готового решения не нашел, для себя решил так (код JS можно причесать, но я не JS-разраб, поэтому ногами не пинайте).
              Чтобы Zabbix начал понимать русский прилетающий из микрота, нужно в предобработку для всех нужных типов автообнаружения микротовских шаблонов (напр: AP channel discovery, CAPsMAN AP channel discovery, LTE modem discovery, Network interfaces discovery) добавить шаг JavaScript-предобработки с таким текстом:
              Code:
              // Т.к. русские комментарии и вообще русский текст Микротик отдаёт в виде байтов кодировки 1251,
              // то требуется сделать определённые действия для приведения их в читабельный вид.
              
              const cp1251Map = [
                '\u0000', '\u0001', '\u0002', '\u0003', '\u0004', '\u0005', '\u0006', '\u0007',
                '\u0008', '\u0009', '\n', '\u000B', '\u000C', '\r', '\u000E', '\u000F',
                '\u0010', '\u0011', '\u0012', '\u0013', '\u0014', '\u0015', '\u0016', '\u0017',
                '\u0018', '\u0019', '\u001A', '\u001B', '\u001C', '\u001D', '\u001E', '\u001F',
                '\u0020', '\u0021', '\u0022', '\u0023', '\u0024', '\u0025', '\u0026', '\'',
                '\u0028', '\u0029', '\u002A', '\u002B', '\u002C', '\u002D', '\u002E', '\u002F',
                '\u0030', '\u0031', '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037',
                '\u0038', '\u0039', '\u003A', '\u003B', '\u003C', '\u003D', '\u003E', '\u003F',
                '\u0040', '\u0041', '\u0042', '\u0043', '\u0044', '\u0045', '\u0046', '\u0047',
                '\u0048', '\u0049', '\u004A', '\u004B', '\u004C', '\u004D', '\u004E', '\u004F',
                '\u0050', '\u0051', '\u0052', '\u0053', '\u0054', '\u0055', '\u0056', '\u0057',
                '\u0058', '\u0059', '\u005A', '\u005B', '\\', '\u005D', '\u005E', '\u005F',
                '\u0060', '\u0061', '\u0062', '\u0063', '\u0064', '\u0065', '\u0066', '\u0067',
                '\u0068', '\u0069', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E', '\u006F',
                '\u0070', '\u0071', '\u0072', '\u0073', '\u0074', '\u0075', '\u0076', '\u0077',
                '\u0078', '\u0079', '\u007A', '\u007B', '\u007C', '\u007D', '\u007E', '\u007F',
                '\u0402', '\u0403', '\u201A', '\u0453', '\u201E', '\u2026', '\u2020', '\u2021',
                '\u20AC', '\u2030', '\u0409', '\u2039', '\u040A', '\u040C', '\u040B', '\u040F',
                '\u0452', '\u2018', '\u2019', '\u201C', '\u201D', '\u2022', '\u2013', '\u2014',
                '\uFFFD', '\u2122', '\u0459', '\u203A', '\u045A', '\u045C', '\u045B', '\u045F',
                '\u00A0', '\u040E', '\u045E', '\u0408', '\u00A4', '\u0490', '\u00A6', '\u00A7',
                '\u0401', '\u00A9', '\u0404', '\u00AB', '\u00AC', '\u00AD', '\u00AE', '\u0407',
                '\u00B0', '\u00B1', '\u0406', '\u0456', '\u0491', '\u00B5', '\u00B6', '\u00B7',
                '\u0451', '\u2116', '\u0454', '\u00BB', '\u0458', '\u0405', '\u0455', '\u0457',
                '\u0410', '\u0411', '\u0412', '\u0413', '\u0414', '\u0415', '\u0416', '\u0417',
                '\u0418', '\u0419', '\u041A', '\u041B', '\u041C', '\u041D', '\u041E', '\u041F',
                '\u0420', '\u0421', '\u0422', '\u0423', '\u0424', '\u0425', '\u0426', '\u0427',
                '\u0428', '\u0429', '\u042A', '\u042B', '\u042C', '\u042D', '\u042E', '\u042F',
                '\u0430', '\u0431', '\u0432', '\u0433', '\u0434', '\u0435', '\u0436', '\u0437',
                '\u0438', '\u0439', '\u043A', '\u043B', '\u043C', '\u043D', '\u043E', '\u043F',
                '\u0440', '\u0441', '\u0442', '\u0443', '\u0444', '\u0445', '\u0446', '\u0447',
                '\u0448', '\u0449', '\u044A', '\u044B', '\u044C', '\u044D', '\u044E', '\u044F'
              ];
              
              var objectJSON = JSON.parse(value);
              
              objectJSON.forEach(function(item, i, objectJSON) {
                  s = item['{#IFALIAS}'].trim();
                  if (s !== "") {
              
                      var stop = false;
                      var sRes = "";
              
                      // Проверяем, что это похоже на Quoted-printable
                      const regex = /^[0-9A-F]{2,2}/gm;
                      var arrayOfStrings = s.split(' ');
                      for(var ii = 0; ii < arrayOfStrings.length; ii++) {
                          
                          // Если значение не типично для Quoted-printable
                          if (!arrayOfStrings[ii].match(regex) || arrayOfStrings[ii].length !== 2){
                              stop = true;
                              break;
                          }
                          
                          sRes += "%" + arrayOfStrings[ii];
                      }
              
                      if (!stop) {
                          // Вот так нельзя, т.к. JS-движок Заббикса - DuckTape имеет свою реализацию TextDecoder, в которой захардкожено "TextDecoder('utf-8')"
                          // почитать тут: https://duktape.org/guide#builtin-textdecoder
                          //var win1251 = new TextDecoder("windows-1251");
                          //var s1 = win1251.decode(new Uint8Array(sRes.replace(/%/g, ",0x").slice(1).split(",")));
                          
                          // Поэтому используем альтернативный способ с таблицами перекодировки:
                          
                          var data = new Uint8Array(sRes.replace(/%/g, ",0x").slice(1).split(","));              
                          var s1 = "";
                          for (var iii = 0; iii < data.length; iii++) {
                              s1 += cp1251Map[data[iii] & 0xFF];
                          }
              
                          s = sRes.replace(/(?:%[0-9A-F]{2})+/g, s1);
              
                          // Перезаполняем поле объекта сконвертированным значением удаляя лишние пробелы
                          objectJSON[i]['{#IFALIAS}'] = s.trim();
                      }
                  }
              });
              
              return(JSON.stringify(objectJSON));​
              P.S. Вот пример работающего шаблона: скачать тут
              Last edited by shuum; 24-09-2023, 20:07.

              Comment

              Working...