Ad Widget

Collapse

API-метод audit.get

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • pirate
    Junior Member
    • Sep 2015
    • 15

    #1

    API-метод audit.get

    Добрый день.
    Т.к. занимаюсь интеграцией 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;
            }
    }
    Файл кладется в include/classes/api/services/
    в конфигах надо прописать этот файл:
    API.php - в class API добавить
    PHP Code:
    /**
         * @return CAudit
         */
        
    public static function Audit() {
            return 
    self::getApi('audit');
        } 
    CApiServiceFactory.php - в parent::__construct добавить
    PHP Code:
    'audit' => 'CAudit'
    Last edited by pirate; 08-12-2016, 12:02. Reason: audit_details -> auditlog_details
  • dimir
    Zabbix developer
    • Apr 2011
    • 1080

    #2
    Related ticket: https://support.zabbix.com/browse/ZBXNEXT-4584

    Comment

    Working...