You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.3 KiB
135 lines
3.3 KiB
/*
|
|
** Zabbix
|
|
** Copyright (C) 2001-2023 Zabbix SIA
|
|
**
|
|
** This program is free software; you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation; either version 2 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program; if not, write to the Free Software
|
|
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
**/
|
|
|
|
var RPC = {
|
|
'_rpcurl': 'jsrpc.php?output=json-rpc', // rpc url
|
|
'_callid': 0, // rpc request id
|
|
|
|
callid: function() {
|
|
this._callid++;
|
|
return this._callid;
|
|
},
|
|
|
|
rpcurl: function(rpcurl_) {
|
|
if ('undefined' == typeof(rpcurl_)) {
|
|
return this._rpcurl;
|
|
}
|
|
else {
|
|
this._rpcurl = rpcurl_;
|
|
}
|
|
}
|
|
};
|
|
|
|
RPC.Base = function(userParams) {
|
|
this.userParams = {
|
|
'method': null,
|
|
'params': {},
|
|
'notification': 0,
|
|
'request': {},
|
|
'onSuccess': function() {},
|
|
'onFailure': function() {}
|
|
};
|
|
|
|
var params = this.userParams;
|
|
|
|
if (userParams && typeof userParams === 'object') {
|
|
Object.keys(userParams).forEach(function (key) {
|
|
params[key] = userParams[key];
|
|
});
|
|
}
|
|
|
|
this.callid = RPC.callid();
|
|
};
|
|
|
|
RPC.Call = function (userParams) {
|
|
RPC.Base.call(this, userParams);
|
|
this.call();
|
|
};
|
|
|
|
RPC.Call.prototype = {
|
|
call: function() {
|
|
var header = {
|
|
'Content-type': 'application/json-rpc'
|
|
};
|
|
|
|
var body = {
|
|
'jsonrpc': '2.0',
|
|
'method': this.userParams.method,
|
|
'params': this.userParams.params
|
|
};
|
|
|
|
var request = {
|
|
'method': 'POST',
|
|
'headers': header
|
|
};
|
|
|
|
if (this.userParams.notification == 0) {
|
|
body.id = this.callid;
|
|
request.success = this.processRespond.bind(this);
|
|
request.error = this.processError.bind(this);
|
|
}
|
|
|
|
var params = this.userParams;
|
|
if (typeof this.userParams.request === 'object') {
|
|
Object.keys(params.request).forEach(function (key) {
|
|
request[key] = params.request[key];
|
|
});
|
|
}
|
|
request.data = JSON.stringify(body);
|
|
|
|
new jQuery.ajax(RPC.rpcurl(), request);
|
|
},
|
|
|
|
processRespond: function(_, _, resp){
|
|
var isError = this.processError(resp);
|
|
if (isError) {
|
|
return false;
|
|
}
|
|
|
|
if (isset('onSuccess', this.userParams)) {
|
|
this.userParams.onSuccess(resp.responseJSON.result);
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
processError: function(resp) {
|
|
// json request failed or server responded with incorrect json
|
|
if (is_null(resp) || !isset('responseJSON', resp)) {
|
|
throw('RPC call [' + this.userParams.method + '] request failed');
|
|
}
|
|
|
|
// json have wrong header or no respond at all
|
|
if (empty(resp.responseJSON)) {
|
|
throw('RPC: Server call [' + this.userParams.method + '] responded with incorrect JSON.');
|
|
}
|
|
|
|
// rpc responded with error || with incorrect json
|
|
if (isset('error', resp.responseJSON) && isset('onFailure', this.userParams)) {
|
|
this.userParams.onFailure(resp.responseJSON.error);
|
|
return true;
|
|
}
|
|
else if (!isset('result', resp.responseJSON)) {
|
|
throw('RPC: Server call [' + this.userParams.method + '] responded with incorrect JSON.');
|
|
}
|
|
|
|
return false;
|
|
}
|
|
};
|