Ad Widget

Collapse

javascript в браузере работает, а в zabbix не хочет.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Lurker
    Member
    • Nov 2016
    • 83

    #1

    javascript в браузере работает, а в zabbix не хочет.

    Code:
    var value = '[{"{#SNMPINDEX}":"5003","{#POWERSUPPLYNAME}":"Sw 5, PS1 Normal, RPS NotExist"},{"{#SNMPINDEX}":"6003","{#POWERSUPPLYNA ME}":"Sw6, PS1 Normal, RPS NotExist"},{"{#SNMPINDEX}":"7003","{#POWERSUPPLYNA ME}":"Sw7, PS1 Normal, RPS NotExist"}]';
    function nameparser(value){
      var value2 = '';
      value = value.split('},{');//to array
      value.push(value.pop().slice(0,-2));
      for (var val of value) {
        var swnum = val.match(/"{#POWERSUPPLYNAME}":"Sw(itch )?[1-8]/);
        if (swnum != null){
          swnum=swnum.toString().slice(0, -1);
          swnum = swnum.replace('"{#POWERSUPPLYNAME}"','"{#SWNUM}"') ;
          }else{
          swnum='"{#SWNUM}":"nostack'
          }
        value2 = value2 + val + "," + swnum +'"},{';
        }
      value=value2.slice(0,-3)+"}]";
      return(value);
      }
    value = nameparser(value)
    console.log(value);​
    вот такое работает в браузере.
    Пихаю в предобработку дискавера внутренности функции, а заббикс 6.2 ругается SyntaxError: parse error (line 4)
    Т.е. ему не нравится
    for (var val of value) {
    Что я делаю не так?

    Смысл скрипта дёрнуть из {#POWERSUPPLYNAME} номер свича и положить его в отдельный макрос {#SWNUM}
    Вывод такой:
    [{"{#SNMPINDEX}":"5003","{#POWERSUPPLYNAME}":"Sw 5, PS1 Normal, RPS NotExist","{#SWNUM}":"Sw5"},{"{#SNMPINDEX}":"6003" ,"{#POWERSUPPLYNAME}":"Sw6, PS1 Normal, RPS NotExist","{#SWNUM}":"Sw6"},{"{#SNMPINDEX}":"7003" ,"{#POWERSUPPLYNAME}":"Sw7, PS1 Normal, RPS NotExist","{#SWNUM}":"Sw7"}]​
    Last edited by Lurker; 24-11-2023, 23:22.
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    1) при написании сообщения на этом форуме есть возможность форматирования: по нажатию кнопки "A" в правом верхнем углу поля ввода открывается/скрывается панель инструментов. В этой панели есть, например, кнопка "#" для оформления кода - тогда он не будет расплываться и будет отображаться шрифтом фиксированной ширины. А ваше сообщение будет гораздо легче понять.

    2) JavaScript в браузере и JavaScript на сервере Zabbix - это немножко разные вещи. Zabbix использует реализацию на базе движка Duktape, который соответствует спецификациям ES 5.0 и ES 5.1.​ Это далеко не самые последние версии спецификации, и в браузерах, как правило, есть более новые вещи.
    Например, он не понимает объявлений переменных с помощью ключевого слова let (только var); наверняка найдутся и другие отличия.
    Я бы для начала попробовал вынести объявление переменной из команды for (объявил бы её заранее перед циклом).

    Comment

    • Lurker
      Member
      • Nov 2016
      • 83

      #3
      вынесение var из for не помогло. так-же ругается на строку с for.
      как же не хочется разбираться со спецификациями... пойду в бубен побью.

      Comment

      • Lurker
        Member
        • Nov 2016
        • 83

        #4
        https://x-team.com/blog/javascript-e...ods-explained/
        Сделал через foreach, упоминается что в es 5.0 он уже несколько лет есть, всё равно ругается. Теперь на строчку с foreach
        Code:
        var value2 = '';
        value = value.split('},{');//to array
        value.push(value.pop().slice(0,-2));
        value.forEach ((val)=> {
        var swnum = val.match(/"{#POWERSUPPLYNAME}":"Sw(itch )?[1-8]/);
        if (swnum != null){
        swnum=swnum.toString().slice(0, -1);
        swnum = swnum.replace('"{#POWERSUPPLYNAME}"','"{#SWNUM}"') ;
        }else{
        swnum='"{#SWNUM}":"nostack'
        }
        value2 = value2 + val + "," + swnum +'"},{';
        })
        value=value2.slice(0,-3)+"}]";
        return(value);​
        Last edited by Lurker; 27-11-2023, 11:04.

        Comment

        • Lurker
          Member
          • Nov 2016
          • 83

          #5
          Дедовы метоты с for (i,n, i++) работают
          Code:
          var value2 = '';
          value = value.split('},{');//to array
          value.push(value.pop().slice(0,-2));
          var i, n, val, swnum;
          for (i = 0, n = value.length; i < n; i++) {
          val=value[i];
          swnum = val.match(/"{#POWERSUPPLYNAME}":"Sw(itch )?[1-8]/);
          if (swnum != null){
          swnum=swnum.toString().slice(0, -1);
          swnum = swnum.replace('"{#POWERSUPPLYNAME}"','"{#SWNUM}"') ;
          }else{
          swnum='"{#SWNUM}":"nostack'
          }
          value2 = value2 + val + "," + swnum +'"},{';
          }
          value=value2.slice(0,-3)+"}]";
          return(value);​

          Comment

          • Kos
            Senior Member
            Zabbix Certified SpecialistZabbix Certified Professional
            • Aug 2015
            • 3404

            #6
            Originally posted by Lurker
            Сделал через foreach, упоминается что в es 5.0 он уже несколько лет есть, всё равно ругается. Теперь на строчку с foreach
            Видимо, ему не нравится не сам for(), а конструкция "=>". Хотя, может и forEach(), фиг его знает, в какой версии JavaScript он появился

            Comment

            • Semiadmin
              Senior Member
              • Oct 2014
              • 1625

              #7
              стрелочные функции точно не поддерживаются

              Comment

              • Lurker
                Member
                • Nov 2016
                • 83

                #8
                Раунд 2.
                В браузере работает.
                В zabbix не изменяет входные данные. Не ругается.
                цель программы: в дискавере есть предельное значение датчика температуры. Исходя из него и температуры окружающей среды вычислить нормальную температуру.(да, значение не совсем корректное, но я думаю сойдёт) и записать её в дискавер.
                Code:
                var value=[{"{#SNMPINDEX}":"1","{#SENSORNAME}":"air inlet","{#TEMPLIMIT}":"60"},{"{#SNMPINDEX}":"2","{#SENSORNAME}":"air outlet","{#TEMPLIMIT}":"76"},{"{#SNMPINDEX}":"11","{#SENSORNAME}":"air inlet","{#TEMPLIMIT}":"60"},{"{#SNMPINDEX}":"12","{#SENSORNAME}":"air outlet","{#TEMPLIMIT}":"76"},{"{#SNMPINDEX}":"21","{#SENSORNAME}":"XPP","{#TEMPLIMIT}":"64"},{"{#SNMPINDEX}":"22","{#SENSORNAME}":"XPP Remote","{#TEMPLIMIT}":"75"},{"{#SNMPINDEX}":"23","{#SENSORNAME}":"IFE","{#TEMPLIMIT}":"68"},{"{#SNMPINDEX}":"24","{#SENSORNAME}":"IFE Remote","{#TEMPLIMIT}":"74"},{"{#SNMPINDEX}":"25","{#SENSORNAME}":"CPU","{#TEMPLIMIT}":"61"},{"{#SNMPINDEX}":"26","{#SENSORNAME}":"CPU Remote","{#TEMPLIMIT}":"77"},{"{#SNMPINDEX}":"31","{#SENSORNAME}":"XPP","{#TEMPLIMIT}":"64"},{"{#SNMPINDEX}":"32","{#SENSORNAME}":"XPP Remote","{#TEMPLIMIT}":"75"},{"{#SNMPINDEX}":"33","{#SENSORNAME}":"IFE","{#TEMPLIMIT}":"68"},{"{#SNMPINDEX}":"34","{#SENSORNAME}":"IFE Remote","{#TEMPLIMIT}":"74"},{"{#SNMPINDEX}":"35","{#SENSORNAME}":"CPU","{#TEMPLIMIT}":"61"},{"{#SNMPINDEX}":"36","{#SENSORNAME}":"CPU Remote","{#TEMPLIMIT}":"77"},{"{#SNMPINDEX}":"41","{#SENSORNAME}":"air inlet","{#TEMPLIMIT}":"60"},{"{#SNMPINDEX}":"42","{#SENSORNAME}":"air outlet","{#TEMPLIMIT}":"76"},{"{#SNMPINDEX}":"51","{#SENSORNAME}":"air inlet","{#TEMPLIMIT}":"60"},{"{#SNMPINDEX}":"52","{#SENSORNAME}":"air outlet","{#TEMPLIMIT}":"76"},{"{#SNMPINDEX}":"61","{#SENSORNAME}":"air inlet","{#TEMPLIMIT}":"60"},{"{#SNMPINDEX}":"62","{#SENSORNAME}":"air outlet","{#TEMPLIMIT}":"76"}]
                function nameparser(value){
                var i, templimit, tempnominal;
                //var AMBIENT_TEMP = '{$AMBIENT_TEMP}';
                var AMBIENT_TEMP = 16;
                for (i = 0, n = value.length; i < n; i++) {
                  templimit=value[i]["{#TEMPLIMIT}"];
                  if (templimit<=60){//for intake temp sensor
                    tempnominal=AMBIENT_TEMP+5;
                    if ((AMBIENT_TEMP+10)>templimit){
                      tempnominal=templimit-10;//delta temp not less then 10
                      }
                    }else{//for other temp sensor
                    tempnominal=AMBIENT_TEMP+0.5*(templimit-AMBIENT_TEMP);
                    }
                  tempnominal=Math.round(tempnominal);
                  tempnominal=tempnominal.toString();
                  value[i]["{#TEMPNOMINAL}"]=tempnominal;
                  }
                return(value);
                }
                value = nameparser(value);
                console.log(value);​

                Comment

                • Lurker
                  Member
                  • Nov 2016
                  • 83

                  #9
                  Разобрался.
                  Code:
                  var value='
                  ...
                  Т.е. заббикс отдаёт переменную в формате строки, несмотря на то, что это объект.
                  Ну и соответственно потом
                  value=JSON.parse(value);
                  и
                  return(JSON.stringify(value));

                  Comment

                  Working...