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.
233 lines
5.4 KiB
233 lines
5.4 KiB
<?php
|
|
|
|
/*
|
|
** 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.
|
|
**/
|
|
|
|
|
|
require_once 'vendor/autoload.php';
|
|
|
|
require_once dirname(__FILE__).'/../../../include/defines.inc.php';
|
|
require_once dirname(__FILE__).'/../../../include/hosts.inc.php';
|
|
|
|
class CAPIHelper {
|
|
|
|
// API request id.
|
|
protected static $request_id = 0;
|
|
// Debug info.
|
|
protected static $debug = [];
|
|
// Session id.
|
|
protected static $session = null;
|
|
|
|
/**
|
|
* Reset API helper state.
|
|
*/
|
|
public static function reset() {
|
|
static::$request_id = 0;
|
|
|
|
static::clearDebugInfo();
|
|
static::setSessionId(null);
|
|
}
|
|
|
|
/**
|
|
* Make API call.
|
|
*
|
|
* @param mixed $data String containing request data as json.
|
|
* @param string $sessionid Authorization token.
|
|
*
|
|
* @return array
|
|
*
|
|
* @throws Exception if API call fails.
|
|
*/
|
|
public static function callRaw($data, string $sessionid = null) {
|
|
global $URL;
|
|
if (!is_string($URL)) {
|
|
$URL = PHPUNIT_URL.'api_jsonrpc.php';
|
|
}
|
|
|
|
if (is_array($data)) {
|
|
$data = json_encode($data);
|
|
}
|
|
|
|
$debug = [
|
|
'request' => $data,
|
|
'response' => null
|
|
];
|
|
|
|
$params = [
|
|
'http' => [
|
|
'method' => 'POST',
|
|
'content' => $data,
|
|
'header' => [
|
|
'Content-type: application/json-rpc',
|
|
'Content-Length: '.strlen($data)
|
|
]
|
|
]
|
|
];
|
|
|
|
if ($sessionid !== null) {
|
|
$params['http']['header'][] = 'Authorization: Bearer '.$sessionid;
|
|
}
|
|
|
|
$handle = @fopen($URL, 'rb', false, stream_context_create($params));
|
|
if ($handle) {
|
|
$response = @stream_get_contents($handle);
|
|
fclose($handle);
|
|
}
|
|
else {
|
|
$php_errormsg = CTestArrayHelper::get(error_get_last(), 'message');
|
|
$response = false;
|
|
}
|
|
|
|
if ($response !== false) {
|
|
$debug['response'] = $response;
|
|
|
|
if ($response !== '') {
|
|
$response = json_decode($response, true);
|
|
|
|
if (!is_array($response)) {
|
|
throw new Exception('API response is not in JSON format');
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
static::$debug[] = $debug;
|
|
throw new Exception('Problem with '.$URL.', '.$php_errormsg);
|
|
}
|
|
|
|
static::$request_id++;
|
|
static::$debug[] = $debug;
|
|
|
|
return $response;
|
|
}
|
|
|
|
/**
|
|
* Prepare request for API call and make API call (@see callRaw).
|
|
*
|
|
* @param string $method API method to be called.
|
|
* @param mixed $params API call params.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function call($method, $params) {
|
|
return static::callRaw([
|
|
'jsonrpc' => '2.0',
|
|
'method' => $method,
|
|
'params' => $params,
|
|
'id' => static::$request_id
|
|
], static::$session);
|
|
}
|
|
|
|
/**
|
|
* Set session id.
|
|
*
|
|
* @param string $session session id to be used.
|
|
*/
|
|
public static function setSessionId($session) {
|
|
static::$session = $session;
|
|
}
|
|
|
|
/**
|
|
* Create session id.
|
|
*
|
|
* @param string $userid user id to be used.
|
|
* @param string $sessionid session id to be used.
|
|
*/
|
|
public static function createSessionId($userid = 1, $sessionid = '09e7d4286dfdca4ba7be15e0f3b2b55a') {
|
|
if (!CDBHelper::getRow('select null from sessions where status=0 and userid='.zbx_dbstr($userid).
|
|
' and sessionid='.zbx_dbstr($sessionid))) {
|
|
$secret = bin2hex(random_bytes(16));
|
|
DBexecute('INSERT INTO sessions (sessionid,userid,secret)'.
|
|
' VALUES ('.zbx_dbstr($sessionid).','.$userid.','.zbx_dbstr($secret).')'
|
|
);
|
|
}
|
|
|
|
static::$session = $sessionid;
|
|
}
|
|
|
|
/**
|
|
* Get session id.
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function getSessionId() {
|
|
return static::$session;
|
|
}
|
|
|
|
/**
|
|
* Authorize as user.
|
|
*
|
|
* @param string $username
|
|
* @param string $password
|
|
*
|
|
* @returns CAPIHelper
|
|
*/
|
|
public static function authorize(string $username, string $password) {
|
|
static::$session = false;
|
|
|
|
$result = static::call('user.login', ['username' => $username, 'password' => $password]);
|
|
if (array_key_exists('result', $result)) {
|
|
static::setSessionId($result['result']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get debug information.
|
|
*
|
|
* @param boolean $clear whether debug info should be cleared after retrieval.
|
|
*
|
|
* @return array
|
|
*/
|
|
public static function getDebugInfo($clear = false) {
|
|
$result = static::$debug;
|
|
if ($clear) {
|
|
static::clearDebugInfo();
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Get debug information as string (@see getDebugInfo).
|
|
*
|
|
* @param boolean $clear whether debug info should be cleared after retrieval.
|
|
*
|
|
* @return string
|
|
*/
|
|
public static function getDebugInfoAsString($clear = false) {
|
|
$steps = [];
|
|
foreach (static::getDebugInfo($clear) as $call) {
|
|
$step = " Request: ".$call['request'];
|
|
if ($call['response'] !== null) {
|
|
$step .= "\n\n Response: ".$call['response'];
|
|
}
|
|
|
|
$steps[] = $step;
|
|
}
|
|
|
|
return implode("\n\n---------------------------\n\n", $steps);
|
|
}
|
|
|
|
/**
|
|
* Remove debug info of previous API calls (if any).
|
|
*/
|
|
public static function clearDebugInfo() {
|
|
static::$debug = [];
|
|
}
|
|
}
|