Nagios JSON Query Returns Incorrect value
Asked Answered
A

1

9

I have installed Nagios (Nagios® Core™ Version 4.2.2) in Linux Server. I have been using JSON Query Generator to generate an Availablity report in JSON format. It will provide an API. I have created a Javascript which will pass this URL to the Ajax call and based on success result, will print the percentage in our Own dashboard.

JSON URL : http://xx.xx.xx.xx/nagios/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=ALM&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=1514297016&endtime=1514383416

The start and End time contains time in EPOCH format.

In Javascript, I have created a function, which will pass the start and end time as a variable to the URL.

var time = new Date();
var end = Math.floor((new Date).getTime() / 1000);
//var end = ~~(Date.now() /1000) ;
var start = Math.floor(time.setDate(time.getDate() - 1) / 1000);
Availreport = "http://xx.xx.xx.xx/nagios/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=ALM&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=" + start + "&endtime=" + end;

$.ajax({
  url: Availreport,
  timeout: 30000,
  beforeSend: function(xhr) {
    xhr.setRequestHeader('Authorization',
      make_base_auth("nagiosadmin", "nagiosadmin"));
  },

  dataType: 'json', //data format
  success: onOutboundReceived //on receive of reply

});

In the browser, when I check the dashboard, the time_up json key gives an incorrect value (value as 0). The same URL, when executed directly in the browser, gives the correct output.

How can I resolve this issue?

Amphiboly answered 27/12, 2017 at 15:4 Comment(7)
Something in what you are saying doesn't add up. "The same URL when we execute directly in browser, we are getting correct output." I seriously doubt it. If that URL requires Authorization headers, then there is no way you executed it "directly in a browser"Fiance
It pops for authentication, once credentials provided the JSON output will be displayed which contains the correct valueAmphiboly
Your code seems correct. Not able to answer it because of insufficient data. Can you reproduce it in a fiddle or something?Crelin
What response are you getting back from the API? If you are using Chrome you can check the network tab (in Developer tools) for the request sent and the response you received.Forme
From Nagios, Ill try to fetch the availablity Report for Hostgroup with a given start and End Time. The API returns a JSON which contain time_up,time_down and time_unreachable for each server in the HostGroup. I'm getting 0 as value for time_up and time_down and correct vlaue in time_unreachable. The same URL when I execute directly in Chrome (By providing my Nagios credentials), I'm getting the proper response (Time_up contains the correct value)Amphiboly
What is make_base_auth? Can you share implementationLoralyn
@Amphiboly could you open the browser-console observe the log + network tab and see if your are getting any errors or preview the response and get back ? attach the image of them if you can.Audryaudrye
G
1

I tried with my own Nagios XI 5.4.11 installation (you did not referenced any specific version) and I didn't find any difference among availability reports obtained, directly from UI, invoking API in the browser or using a JS script.

So I could not reproduce your issue, but just for reference and to help in debugging here below is the snippet I used successfully to obtain the correct JSON answer from Nagios API archivejson.cgi?query=availability.

The script uses two ways of authentication, the first one, with credentials passed directly in the url, really unsecure:

var time = new Date();
var end = Math.floor((new Date).getTime() / 1000);
var start = Math.floor(time.setDate(time.getDate() - 1) / 1000);

var user = "admin";
var pwd = "admin";

var baseurl = "mynagioshost:443/nagios";

var url1 = "https://"+user+":"+pwd+"@"+baseurl+"/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=application-servers&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=" + start + "&endtime=" + end;
var url2 = "https://"+baseurl+"/cgi-bin/archivejson.cgi?query=availability&availabilityobjecttype=hostgroups&hostgroup=application-servers&assumedinitialhoststate=up&assumedinitialservicestate=ok&starttime=" + start + "&endtime=" + end;

function go1() {
	$.support.cors = true;

	$.ajax({
		url: url1,
		timeout: 30000,
		crossDomain: true,
		dataType: 'json', //data format
		success: function(data) {
			console.log("success: ", data);
			$("#resp1").html(JSON.stringify(data, null, 2));
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			console.log("error: ", errorThrown);
		}
	});
}

function go2() {
	$.support.cors = true;

	$.ajax({
		url: url2,
		timeout: 30000,
		crossDomain: true,
		xhrFields: {
			withCredentials: true
		},
		beforeSend: function(xhr) {
			var auth = make_base_auth(user, pwd);
			console.log("beforeSend: ", auth);
			xhr.setRequestHeader('Authorization', auth);
		},
		dataType: 'json',
		success: function(data) {
			console.log("success: ", data);
			$("#resp2").html(JSON.stringify(data, null, 2));
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			console.log("error: ", errorThrown);
		}
	});
}

function make_base_auth(user, password) {
  var tok = user + ':' + password;
  // Base64 encoding for basic auth encoding username:password
  var hash = btoa(tok);
  // return the auth header
  return "Basic " + hash;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="btn1" onclick="go1()">get report - mode1</button>
<br>
<button id="btn2" onclick="go2()">get report - mode2</button>
<br>
<table>
  <tr>
    <td style="width: 45%">
      <pre id="resp1"></pre>
    </td>
    <td style="width: 45%">
      <pre id="resp2"></pre>
    </td>
  </tr>
</table>

As already stated data received from API are identical anyway (except for timings, obviously) and are about this way:

{
  "format_version": 0,
  "result": {
    "query_time": 1515654147000,
    "cgi": "archivejson.cgi",
    "user": "nagiosadmin",
    "query": "availability",
    "query_status": "released",
    "program_start": 1512375100000,
    "last_data_update": 1515651099000,
    "type_code": 0,
    "type_text": "Success",
    "message": ""
  },
  "data": {
    "selectors": {
      "availabilityobjecttype": 4,
      "starttime": 1515567802000,
      "endtime": 1515654202000,
      "hostgroup": "application-servers",
      ...OMISSIS...
    },
    "hostgroup": {
      "name": "application-servers",
      "hosts": [
        {
          "name": "192.168.2.20",
          "time_up": 86345,
          "time_down": 22,
          "time_unreachable": 0,
          "scheduled_time_up": 0,
          "scheduled_time_down": 0,
          "scheduled_time_unreachable": 0,
          "time_indeterminate_nodata": 0,
          "time_indeterminate_notrunning": 0
        },
        ...OMISSIS...
      ]
    }
  }
}
Garment answered 11/1, 2018 at 7:25 Comment(1)
Thanks for the code snippet. I have modified my javascript.In above JSON response, the time_up contains some numbers. But in my case when my Javascript fetches the JSON response, it gives the value as 0. The same API URL when hit directly in browser by passing the credentials, I'm getting some numbers in time_up field.Amphiboly

© 2022 - 2024 — McMap. All rights reserved.