Uploaded image for project: 'ZABBIX BUGS AND ISSUES'
  1. ZABBIX BUGS AND ISSUES
  2. ZBX-26441

Zabbix script error: Maximum count of HttpRequest objects was reached

XMLWordPrintable

    • Icon: Problem report Problem report
    • Resolution: Won't fix
    • Icon: Trivial Trivial
    • None
    • None
    • Server (S)
    • None

      I’m trying to retrieve critical problems from some software using its API. In JavaScript, I first send a GET request to obtain a list of devices:

      *GET: https://192.168.1.1/securetrack/api/devices*

      Then, for each device and each severity level, I send a GET request to retrieve all problems for that device:

      GET: https://192.168.1.1/securetrack/api/violating_rules/\{deviceId:[0-9]+}/device_violations?type=SECURITY_POLICY&severity=severity

      severity: CRITICAL, HIGH, MEDIUM, LOW

      Where severity can be one of: CRITICAL, HIGH, MEDIUM, or LOW.

      Unfortunately, it's not possible to retrieve all problems in a single request, so I cannot reduce the number of HTTP calls.

      When I fetch problems for only one severity level, the code works fine. However, when I include multiple severity levels (e.g., loop through all of them), I consistently encounter an error:

       

      Here is my code:

      // covar Device = {
          params: {},    setParams: function (params) {
              ['my_ip', 'my_token'].forEach(function (field) {
                  if (typeof params !== 'object' || typeof params[field] === 'undefined' || params[field] === '') {
                      throw 'Required param is not set: ' + field + '.';
                  }
              });
              Device.params = params;
          },
          
          getDevices: function () {
              var req = new HttpRequest();
              req.addHeader('Accept: application/json');
              req.addHeader('Authorization: Basic ' + Device.params.my_token);
              var resp = req.get('https://' + Device.params.my_ip + '/securetrack/api/devices/');
              if (req.getStatus() != 200) {
                  throw 'Response code: '+ req.getStatus();
              }
              return JSON.parse(resp).devices.device;
          },
          getDeviceViolations: function (device_id, severity) {
              var device = [];
              var req = new HttpRequest();
              req.addHeader('Accept: application/json');
              req.addHeader('Authorization: Basic ' + Device.params.my_token);
              var dict = {};
              var resp = req.get('https://' + Device.params.my_ip + '/securetrack/api/violating_rules/' + device_id + '/device_violations?severity=' + severity + '&type=SECURITY_POLICY');
              if (req.getStatus() != 200) {
                  throw 'Response code: '+ req.getStatus();
              }
              resp = JSON.parse(resp);
              var device_name = resp.security_policy_device_problems.device_name;
              var severity_name = resp.security_policy_device_problems.severity;
              resp = resp.security_policy_device_problems.violating_rules.violating_rule;
              if (resp.length>0){
                  resp.forEach(function (rule){
                      var dev_problems = [];
                      rule.problems.problem.forEach(function (problem){
                          dev_problems.push(problem.severity + ' problem from ' + problem.security_requirement.from_zone + ' to ' + problem.security_requirement.to_zone);
                      });
                      dict = {
                              'device': device_name,
                              'severity': severity_name,
                              'rule': rule.rule.name,
                              'problems': dev_problems
                          }
                      device.push(dict);
                  });
              }
              return device;
          },};try {
          Device.setParams(JSON.parse(value));
          var dev = Device.getDevices();
          var json = [];
          var severities = ['CRITICAL','HIGH', 'MEDIUM', 'LOW']; //['MEDIUM'];
          dev.forEach(function (device){
              severities.forEach(function (severity) {
                  json = json.concat(Device.getDeviceproblems(device.id, severity));
              });
          });    return JSON.stringify(json);
          
      } catch (error) {
          return "Script error: " + error;
      }
      }

            zabbix.support Zabbix Support Team
            arina.lebedeva Arina Lebedeva
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: