Ad Widget

Collapse

Предобработка JavaScript

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • dmitryIT42
    Junior Member
    • Mar 2021
    • 29

    #1

    Предобработка JavaScript

    Добрый день.
    Добавляю элемент данных с типом HTTP агент, get запросом получаю ответ. Делаю предобработку javascript он пишет undefined return value. Тип информации указываю журнал(лог). Что делаю не так подскажите пожалуйста. Локально на компе запускаю js всё в норме. Я новичок в этом деле)
    вот код js:
    Code:
    function parseResult(result) {
    var globalPP = {};
    
    result = result.replace("contextualModel = ModelFactory.create(ModelFactory.type.CONTEXTUAL_M ODEL),","");
    result = result.replace("Current_JobStatus = contextualModel.get('Current_JobStatus'),","");
    result = result.replace("self = Model.apply(self, arguments);","");
    result = result.replace("self.name = 'JobSts_PrnJobLog_PrnJobsModel';","");
    result = result.replace("_pp = self.pp().properties;","let _pp = {};");
    for (var i=0; i<12; i++) {
    result = result.replace("Current_JobStatus[jobStatus]", " '' ");
    }
    result = result.replace("self.pp().properties = _pp;","globalPP=_pp;");
    result = result.replace("JobSts_PrnJobLog_PrnJobsModel = ModelFactory.create(ModelFactory.type.MODEL, Constructor);"," Constructor(); ");
    eval(result);
    
    var times = "";
    for(var n=0; n<10; n++) {
    if (!globalPP.JobTime[n]) continue;
    times += globalPP.JobTime[n]+";"+globalPP.JobUsername[n]+";"+globalPP.JobName[n]+"\r\n";
    }
    return times
    }
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Ну, раз новичок, то и начать надо было с документации (ссылка).
    Перевод на русский язык немного корявый, но вполне понятный.
    Для начала: в параметрах задаётся тело функции, которая на входе получает исходное значение в переменной с именем value (это описывать не надо, это и так уже делается), а на выходе обработанное значение возвращается через return. Zabbix сам оборачивает это тело объявлением функции и фигурными скобками, как показано в примере в самом начале.

    Comment

    • dmitryIT42
      Junior Member
      • Mar 2021
      • 29

      #3
      Прочитал, всё равно не понятно что и куда писать. В запрос тела? Как в итоге мне обработать ответ от лишних строк?)) Помогите пожалуйста.

      Comment

      • Victor Vislobokov
        Senior Member
        • Aug 2018
        • 298

        #4
        А у меня другой вопрос на эту же тему.
        Где взять доку по изучению этого самого диалекта JavaScript, который используется в Zabbix? (Ducktape насколько я понял). На сайте Ducktape есть доки как это установить и встроить, но руководства по самому языку я не нашёл

        Comment

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

          #5
          Originally posted by Victor Vislobokov
          А у меня другой вопрос на эту же тему.
          Где взять доку по изучению этого самого диалекта JavaScript, который используется в Zabbix? (Ducktape насколько я понял). На сайте Ducktape есть доки как это установить и встроить, но руководства по самому языку я не нашёл
          Вот это, кстати, хороший вопрос. Ищешь по интернету всякие учебники - находишь, например, такой (довольно неплохой, кстати); но вскоре выясняется, что он описывает более новую версию (ECMAScript 6), в то время как Ducktape поддерживает лишь спецификацию ECMAScript 5.1. И, например, рекомендуемые в этом учебнике объявления переменных через let не работают: их надо объявлять только через var.

          Согласен с тем, что документация по Ducktape ориентирована скорее на программистов на Си, которые хотят встроить этот движок в свой проект, нежели на программистов на JavaScript, которые этот движок будут применять. А ссылки на спецификацию ECMAScript 5.1, конечно, полезны, но спецификация отнюдь не заменяет учебника.

          Вот довольно неплохое описание (причём, на русском языке) есть здесь - пожалуй, на данный момент это один из наиболее полезных ресурсов.

          Прочитал, всё равно не понятно что и куда писать. В запрос тела? Как в итоге мне обработать ответ от лишних строк?)) Помогите пожалуйста.
          Убрать из своей функции первую и последнюю строки (объявление функции и фигурные скобки) - они будут добавлены Zabbix-ом автоматически. И обрабатывать параметр с именем "value" (объявлять его тоже не надо). А то у вас получается объявление функции, которая нигде не вызывается.
          Либо, как вариант - просто дописать к своему коду внизу ещё одной строкой явный вызов вашей функции:
          Code:
          return parseResult(value);

          Comment

          • dmitryIT42
            Junior Member
            • Mar 2021
            • 29

            #6
            Убрать из своей функции первую и последнюю строки (объявление функции и фигурные скобки) - они будут добавлены Zabbix-ом автоматически. И обрабатывать параметр с именем "value" (объявлять его тоже не надо). А то у вас получается объявление функции, которая нигде не вызывается.
            Либо, как вариант - просто дописать к своему коду внизу ещё одной строкой явный вызов вашей функции:
            Code:
            return parseResult(value);
            Пробовал и так и так. Всё равно ошибки.
            Code:
            SyntaxError: parse error (line 32)
            at [anon] (input:32) internal
            at [anon] (duktape.c:69397) internal
            at eval () native strict directeval preventsyield
            at [anon] (function:13) preventsyield
            Так понимаю что он eval не понимает.

            Comment

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

              #7
              Originally posted by dmitryIT42
              Так понимаю что он eval не понимает.
              Честно говоря, я тоже её не очень понимаю.
              Погуглил, что это такое, нашёл вот это:
              It is not recommended to use eval() because it is slow, not secure, and makes code unreadable and maintainable.
              Подозреваю, что либо при вызове функции eval() ей передаётся что-то, что не получается интерпретировать как валидный JavaScript, либо срабатывают какие-то ограничения по безопасности. В любом случае, скорее всего, можно обойтись без eval(), если показать, что получаете на входе и что нужно получить на выходе.
              Last edited by Kos; 21-04-2021, 17:30.

              Comment

              • dmitryIT42
                Junior Member
                • Mar 2021
                • 29

                #8
                Originally posted by Kos

                Честно говоря, я тоже её не очень понимаю.
                Погуглил, что это такое, нашёл вот это:

                Подозреваю, что либо при вызове функции eval() ей передаётся что-то, что не получается интерпретировать как валидный JavaScript, либо срабатывают какие-то ограничения по безопасности. В любом случае, скорее всего, можно обойтись без eval(), если показать, что получаете на входе и что нужно получить на выходе.
                На выходе я получаю несколько строк в строке текст разделяется ; как в csv уж. Может из-за этого?

                Comment

                • dmitryIT42
                  Junior Member
                  • Mar 2021
                  • 29

                  #9
                  Получилось парсить принтеры kyocera(а именно кто что и когда печатал), вдруг кому понадобится
                  Code:
                  function getQuotedParam(lineBegin, txt) {
                  var tmpos = txt.indexOf(lineBegin);
                  txt = txt.substr(tmpos+10);
                  var tmresut = "";
                  tmpos = txt.indexOf("'");
                  txt = txt.substr(tmpos+1);
                  tmpos = txt.indexOf("'");
                  tmresut = txt.substr(0,tmpos);
                  return [tmresut, txt.substr(tmpos+1) ];
                  }
                  
                  var result = [];
                  var text = value;
                  var pos = text.indexOf("_pp.JobKey[Index]");
                  while (pos > -1) {
                  var res = {};
                  var finded = getQuotedParam("_pp.JobKey[Index]", text);
                  res.jobNum = finded[0];
                  text = finded[1];
                  
                  var finded = getQuotedParam("_pp.JobUsername[Index]", text);
                  res.userName = finded[0];
                  text = finded[1];
                  
                  var finded = getQuotedParam("_pp.JobName[Index]", text);
                  res.jobName = finded[0];
                  text = finded[1];
                  
                  var finded = getQuotedParam("_pp.JobTime[Index]", text);
                  res.jobTime = finded[0];
                  text = finded[1];
                  
                  result.push(res);
                  pos = text.indexOf("_pp.JobKey[Index]");
                  }
                  
                  var times = "";
                  for(let i in result) {
                  times += result[i].jobTime+";"+result[i].userName+";"+result[i].jobName+"\r\n";
                  }
                  return times;

                  Comment

                  Working...