Добрый день.
Т.к. занимаюсь интеграцией Zabbix с другими системами пришлось пересылать журнал аудита на другой сервер. Иcпользовать дополнительно приямое подключение к БД не стал, т.к. это связано с целой чередой проверок и согласований, а написал API-метод audit.get, за образец взял метод dcheck.get. Последний раз на PHP писал в 2008г, так что не могу проверить что я там написал
НО работает.
CAudit.php
Файл кладется в include/classes/api/services/
в конфигах надо прописать этот файл:
API.php - в class API добавить
CApiServiceFactory.php - в parent::__construct добавить
Т.к. занимаюсь интеграцией Zabbix с другими системами пришлось пересылать журнал аудита на другой сервер. Иcпользовать дополнительно приямое подключение к БД не стал, т.к. это связано с целой чередой проверок и согласований, а написал API-метод audit.get, за образец взял метод dcheck.get. Последний раз на PHP писал в 2008г, так что не могу проверить что я там написал

НО работает.
CAudit.php
PHP Code:
<?php
class CAudit extends CApiService {
protected $tableName = 'auditlog';
protected $tableAlias = 'a';
protected $sortColumns = ['clock'];
public function get($options) {
$result = [];
$userType = self::$userData['type'];
$sqlParts = [
'select' => ['auditlog' => 'a.auditid'],
'from' => ['auditlog' => 'auditlog a'],
'where' => [],
'group' => [],
'order' => [],
'limit' => null
];
$defOptions = [
'auditids' => null,
'userids' => null,
'actionids' => null,
'resourcetypeids' => null,
'resourceids' => null,
'ips' => null,
// filter
'filter' => null,
'search' => null,
'searchByAny' => null,
'startSearch' => null,
'time_from' => null,
'time_till' => null,
'excludeSearch' => null,
'searchWildcardsEnabled' => null,
// output
'output' => API_OUTPUT_EXTEND,
'selectAuditlogs' => null,
'auditDetails' => null,
'countOutput' => null,
'preservekeys' => null,
'countOutput' => null,
'preservekeys' => null,
'sortfield' => '',
'sortorder' => '',
'limit' => null,
'limitSelects' => null
];
$options = zbx_array_merge($defOptions, $options);
// permission check
if (self::$userData['type'] == USER_TYPE_SUPER_ADMIN) {
}
else {
return [];
}
// auditids
if (!is_null($options['auditids'])) {
zbx_value2array($options['auditids']);
$sqlParts['where']['auditid'] = dbConditionInt('a.auditid', $options['auditids']);
}
// userids
if (!is_null($options['userids'])) {
zbx_value2array($options['userids']);
$sqlParts['where']['userid'] = dbConditionInt('a.userid', $options['userids']);
}
// actionids
if (!is_null($options['actionids'])) {
zbx_value2array($options['actionids']);
$sqlParts['where']['action'] = dbConditionInt('a.action', $options['actionids']);
}
// resourcetypeids
if (!is_null($options['resourcetypeids'])) {
zbx_value2array($options['resourcetypeids']);
$sqlParts['where']['resourcetype'] = dbConditionInt('a.resourcetype', $options['resourcetypeids']);
}
// resourceids
if (!is_null($options['resourceids'])) {
zbx_value2array($options['resourceids']);
$sqlParts['where']['resourceid'] = dbConditionInt('a.resourceid', $options['resourceids']);
}
// ips
if (!is_null($options['ips'])) {
zbx_value2array($options['ips']);
$sqlParts['where'][''] = 'a.ip='.zbx_dbstr($options['ips']);
}
// filter
if (is_array($options['filter'])) {
$this->dbFilter('auditlog a', $options, $sqlParts);
}
// search
if (is_array($options['search'])) {
zbx_db_search('auditlog a', $options, $sqlParts);
}
// time_from
if (!is_null($options['time_from'])) {
$sqlParts['where'][] = 'a.clock>'.zbx_dbstr($options['time_from']);
}
// time_till
if (!is_null($options['time_till'])) {
$sqlParts['where'][] = 'a.clock<'.zbx_dbstr($options['time_till']);
}
// limit
if (zbx_ctype_digit($options['limit']) && $options['limit']) {
$sqlParts['limit'] = $options['limit'];
}
//-------
$sqlParts = $this->applyQueryOutputOptions($this->tableName(), $this->tableAlias(), $options, $sqlParts);
$sqlParts = $this->applyQuerySortOptions($this->tableName(), $this->tableAlias(), $options, $sqlParts);
//return $sqlParts;
$res = DBselect($this->createSelectQueryFromParts($sqlParts), $sqlParts['limit']);
while ($auditlog = DBfetch($res)) {
if (!is_null($options['countOutput'])) {
$result = $auditlog['rowscount'];
}
else {
$result[$auditlog['auditid']] = $auditlog;
}
}
if (!is_null($options['countOutput'])) {
return $result;
}
if ($result) {
$result = $this->addRelatedObjects($options, $result);
$result = $this->unsetExtraFields($result, ['auditid'], $options['output']);
}
// Adding audit details.
if (!is_null($options['auditDetails'])) {
$auditlogids = array_keys($result);
$auditdetails = API::getApiService()->select('auditlog_details', [
'output' => $this->outputExtend($options['auditDetails'], ['auditid']),
'filter' => ['auditid' => $auditlogids],
'preservekeys' => true
]);
$relationMap = $this->createRelationMap($auditdetails, 'auditid', 'auditdetailid');
$auditdetails = $this->unsetExtraFields($auditdetails, ['auditdetailid', 'auditid'], []);
$result = $relationMap->mapMany($result, $auditdetails, 'auditDetail');
}
// removing keys (hash -> array)
if (is_null($options['preservekeys'])) {
$result = zbx_cleanHashes($result);
}
return $result;
}
protected function applyQueryOutputOptions($tableName, $tableAlias, array $options, array $sqlParts) {
$sqlParts = parent::applyQueryOutputOptions($tableName, $tableAlias, $options, $sqlParts);
if ($options['countOutput'] === null) {
if ($options['auditDetails'] !== null) {
$sqlParts = $this->addQuerySelect('a.auditid', $sqlParts);
}
}
return $sqlParts;
}
protected function addRelatedObjects(array $options, array $result) {
$result = parent::addRelatedObjects($options, $result);
return $result;
}
}
в конфигах надо прописать этот файл:
API.php - в class API добавить
PHP Code:
/**
* @return CAudit
*/
public static function Audit() {
return self::getApi('audit');
}
PHP Code:
'audit' => 'CAudit',
Comment