Ad Widget

Collapse

REST API Metrotek M716

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • IvanLis
    Junior Member
    • Feb 2024
    • 3

    #1

    REST API Metrotek M716

    Здравствуйте все!
    С Zabbix я только столкнулся, но необходимо решить задачу.
    Нужно получить результаты измерения с тестера Metrotek M716 (описание).
    У него имеется JSON REST API, по этому логично использовать HTTP Agent.
    Научился обращаться к нему, но логика взаимодействия следующая:
    1. Создание рабочей сессии с помощью REST API. (стр.27) При этом мы проходим аутентификацию, а в ответ получаем ubus_rpc_session, это своего рода идентификатор сессии, который нужно отправлять при следующем обращении, вставляя его в JSON. Я его получаю, но как вставить в следующий запрос не знаю. Получить его однажды не получится, т.к. "время жизни" ограничено 300 сек.
    2. Включение анализатора. (стр.40)
    3. Выключение анализатора. (стр.41)
    4. Просмотр результатов. (стр.41)

    Пока я реализовал п.1.
    Получил ubus_rpc_session, как это значение вставить в JSON строку, которая будет отправлена в п.2 ?
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    К сожалению, тут всё далеко не так хорошо и просто, как хотелось бы.

    В текущих версиях Zabbix (кстати, какая версия у вас?) есть возможность использовать веб-мониторинг: она позволяет создавать многошаговые сценарии, но не подходит для вашей задачи, т.к. не возвращает результирующую страницу. По сути, позволяет анализировать лишь успешность самого сценария (смогли его выполнить или нет), но не позволяет извлекать данные (то, что нужно вам для данной задачи).

    С другой стороны, есть HTTP-агент, с которым ситуация противоположная: он возвращает содержимое страницы, но не позволяет задать сценарии из нескольких шагов.

    Было бы здорово эти две возможности совместить, но пока, к сожалению, это так и не реализовано (и неясно, будет ли реализовано в версии 7.0).

    Поэтому пока остаётся два варианта:
    • изобретать "костыли" вроде описанного в этом блоге (сохранять текущий токен сессии в отдельном макросе, актуальность которого поддерживать при помощи Zabbix API);
    • использовать третий вариант: скриптовый элемент данных, в котором все HTTP-запросы полностью под контролем программиста, пишущего код на JavaScript; можно реализовывать многошаговые сценарии (в том числе, обращаясь к разным URL). Недостаток: надо немного уметь программировать на JavaScript. Впрочем, для предыдущего варианта это тоже нужно, так что я бы предпочёл именно этот вариант.

    Comment

    • IvanLis
      Junior Member
      • Feb 2024
      • 3

      #3
      Originally posted by Kos
      К сожалению, тут всё далеко не так хорошо и просто, как хотелось бы.
      В текущих версиях Zabbix (кстати, какая версия у вас?)
      Спасибо за ответ.
      Zabbix 6.4.11

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

      Comment

      • Alex_UUU
        Senior Member
        • Dec 2018
        • 541

        #4
        Третий вариант: "Внешние проверки" и скрипт на любом достпупном языке, который уже возвратит нужные для обработки данные.

        Comment

        • IvanLis
          Junior Member
          • Feb 2024
          • 3

          #5
          Написал скрипт на JS.
          Пока только один элементарный запрос (Запрос настроек функции «Loopback»), без проверок на доступность и логирования ошибок.
          Но работает нормально и теперь появилась надежда на получение необходимого результата.
          Code:
          var obj = JSON.parse(value);
          const host_ip = obj.host_ip;
          const host_login = obj.host_login;
          const host_pass = obj.host_pass;
          const APIurl = "http://" + host_ip + ":80/api";
          
          var req = new CurlHttpRequest();
          req.AddHeader('Content-Type: application/json');
          
          var json_body = {
          "jsonrpc": "2.0",
          "id": 1,
          "method": "call",
          "params": ["00000000000000000000000000000000", "session", "login", {
          "username": host_login,
          "password": host_pass,
          "timeout": 30
          }]
          };
          var json_post_data = JSON.stringify(json_body);
          var response = JSON.parse(req.Post(APIurl, json_post_data));
          var SID = response.result[1].ubus_rpc_session;
          
          json_body = {
          "jsonrpc": "2.0",
          "id": 1,
          "method": "call",
          "params": [SID, "loopback", "getprm",
          {"ids":{"profile":"profile0"}}]
          };
          
          json_post_data = JSON.stringify(json_body);
          //response = JSON.parse(req.Post(APIurl, json_post_data));
          response = req.Post(APIurl, json_post_data);
          
          return response;
          Скрипт возвращает JSON в виде строки, на следующем шаге с используя функции разбора JSON выдергиваю (для проверки) пока только один параметр:
          Code:
          $.result[1].answer[0].parameters.loopback.type
          Metrotek_api_js_templates.zip
          Attached Files

          Comment

          Working...