コード例 #1
0
 /**
  * Get Host data
  *
  * @param array         $options
  * @param array         $options['nodeids']                  Node IDs
  * @param array         $options['groupids']                 HostGroup IDs
  * @param array         $options['hostids']                  Host IDs
  * @param boolean       $options['monitored_hosts']          only monitored Hosts
  * @param boolean       $options['templated_hosts']          include templates in result
  * @param boolean       $options['with_items']               only with items
  * @param boolean       $options['with_monitored_items']     only with monitored items
  * @param boolean       $options['with_historical_items']    only with historical items
  * @param boolean       $options['with_triggers']            only with triggers
  * @param boolean       $options['with_monitored_triggers']  only with monitored triggers
  * @param boolean       $options['with_httptests']           only with http tests
  * @param boolean       $options['with_monitored_httptests'] only with monitored http tests
  * @param boolean       $options['with_graphs']              only with graphs
  * @param boolean       $options['editable']                 only with read-write permission. Ignored for SuperAdmins
  * @param boolean       $options['selectGroups']             select HostGroups
  * @param boolean       $options['selectItems']              select Items
  * @param boolean       $options['selectTriggers']           select Triggers
  * @param boolean       $options['selectGraphs']             select Graphs
  * @param boolean       $options['selectApplications']       select Applications
  * @param boolean       $options['selectMacros']             select Macros
  * @param boolean|array $options['selectInventory']          select Inventory
  * @param boolean       $options['withInventory']            select only hosts with inventory
  * @param int           $options['count']                    count Hosts, returned column name is rowscount
  * @param string        $options['pattern']                  search hosts by pattern in Host name
  * @param string        $options['extendPattern']            search hosts by pattern in Host name, ip and DNS
  * @param int           $options['limit']                    limit selection
  * @param string        $options['sortfield']                field to sort by
  * @param string        $options['sortorder']                sort order
  *
  * @return array|boolean Host data as array or false if error
  */
 public function get($options = array())
 {
     $result = array();
     $userType = self::$userData['type'];
     $userid = self::$userData['userid'];
     // allowed columns for sorting
     $sortColumns = array('hostid', 'host', 'name', 'status');
     // allowed output options for [ select_* ] params
     $subselectsAllowedOutputs = array(API_OUTPUT_REFER, API_OUTPUT_EXTEND, API_OUTPUT_CUSTOM);
     $sqlParts = array('select' => array('hosts' => 'h.hostid'), 'from' => array('hosts' => 'hosts h'), 'where' => array(), 'group' => array(), 'order' => array(), 'limit' => null);
     $defOptions = array('nodeids' => null, 'groupids' => null, 'hostids' => null, 'proxyids' => null, 'templateids' => null, 'interfaceids' => null, 'itemids' => null, 'triggerids' => null, 'maintenanceids' => null, 'graphids' => null, 'applicationids' => null, 'dhostids' => null, 'dserviceids' => null, 'httptestids' => null, 'monitored_hosts' => null, 'templated_hosts' => null, 'proxy_hosts' => null, 'with_items' => null, 'with_monitored_items' => null, 'with_historical_items' => null, 'with_simple_graph_items' => null, 'with_triggers' => null, 'with_monitored_triggers' => null, 'with_httptests' => null, 'with_monitored_httptests' => null, 'with_graphs' => null, 'with_applications' => null, 'withInventory' => null, 'editable' => null, 'nopermissions' => null, 'filter' => null, 'search' => null, 'searchByAny' => null, 'startSearch' => null, 'excludeSearch' => null, 'searchWildcardsEnabled' => null, 'output' => API_OUTPUT_REFER, 'selectGroups' => null, 'selectParentTemplates' => null, 'selectItems' => null, 'selectDiscoveries' => null, 'selectTriggers' => null, 'selectGraphs' => null, 'selectDHosts' => null, 'selectDServices' => null, 'selectApplications' => null, 'selectMacros' => null, 'selectScreens' => null, 'selectInterfaces' => null, 'selectInventory' => null, 'countOutput' => null, 'groupCount' => null, 'preservekeys' => null, 'sortfield' => '', 'sortorder' => '', 'limit' => null, 'limitSelects' => null);
     $options = zbx_array_merge($defOptions, $options);
     if (is_array($options['output'])) {
         unset($sqlParts['select']['hosts']);
         $dbTable = DB::getSchema('hosts');
         $sqlParts['select']['hostid'] = 'h.hostid';
         foreach ($options['output'] as $field) {
             if (isset($dbTable['fields'][$field])) {
                 $sqlParts['select'][$field] = 'h.' . $field;
             }
         }
         $options['output'] = API_OUTPUT_CUSTOM;
     }
     // editable + PERMISSION CHECK
     if ($userType != USER_TYPE_SUPER_ADMIN && !$options['nopermissions']) {
         $permission = $options['editable'] ? PERM_READ_WRITE : PERM_READ_ONLY;
         $userGroups = getUserGroupsByUserId($userid);
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM hosts_groups hgg' . ' JOIN rights r' . ' ON r.id=hgg.groupid' . ' AND ' . dbConditionInt('r.groupid', $userGroups) . ' WHERE h.hostid=hgg.hostid' . ' GROUP BY hgg.hostid' . ' HAVING MIN(r.permission)>=' . $permission . ')';
     }
     // hostids
     if (!is_null($options['hostids'])) {
         zbx_value2array($options['hostids']);
         $sqlParts['where']['hostid'] = dbConditionInt('h.hostid', $options['hostids']);
     }
     // groupids
     if (!is_null($options['groupids'])) {
         zbx_value2array($options['groupids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['groupid'] = 'hg.groupid';
         }
         $sqlParts['from']['hosts_groups'] = 'hosts_groups hg';
         $sqlParts['where'][] = dbConditionInt('hg.groupid', $options['groupids']);
         $sqlParts['where']['hgh'] = 'hg.hostid=h.hostid';
         if (!is_null($options['groupCount'])) {
             $sqlParts['group']['groupid'] = 'hg.groupid';
         }
     }
     // proxyids
     if (!is_null($options['proxyids'])) {
         zbx_value2array($options['proxyids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['proxy_hostid'] = 'h.proxy_hostid';
         }
         $sqlParts['where'][] = dbConditionInt('h.proxy_hostid', $options['proxyids']);
     }
     // templateids
     if (!is_null($options['templateids'])) {
         zbx_value2array($options['templateids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['templateid'] = 'ht.templateid';
         }
         $sqlParts['from']['hosts_templates'] = 'hosts_templates ht';
         $sqlParts['where'][] = dbConditionInt('ht.templateid', $options['templateids']);
         $sqlParts['where']['hht'] = 'h.hostid=ht.hostid';
         if (!is_null($options['groupCount'])) {
             $sqlParts['group']['templateid'] = 'ht.templateid';
         }
     }
     // interfaceids
     if (!is_null($options['interfaceids'])) {
         zbx_value2array($options['interfaceids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['interfaceid'] = 'hi.interfaceid';
         }
         $sqlParts['from']['interface'] = 'interface hi';
         $sqlParts['where'][] = dbConditionInt('hi.interfaceid', $options['interfaceids']);
         $sqlParts['where']['hi'] = 'h.hostid=hi.hostid';
     }
     // itemids
     if (!is_null($options['itemids'])) {
         zbx_value2array($options['itemids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['itemid'] = 'i.itemid';
         }
         $sqlParts['from']['items'] = 'items i';
         $sqlParts['where'][] = dbConditionInt('i.itemid', $options['itemids']);
         $sqlParts['where']['hi'] = 'h.hostid=i.hostid';
     }
     // triggerids
     if (!is_null($options['triggerids'])) {
         zbx_value2array($options['triggerids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['triggerid'] = 'f.triggerid';
         }
         $sqlParts['from']['functions'] = 'functions f';
         $sqlParts['from']['items'] = 'items i';
         $sqlParts['where'][] = dbConditionInt('f.triggerid', $options['triggerids']);
         $sqlParts['where']['hi'] = 'h.hostid=i.hostid';
         $sqlParts['where']['fi'] = 'f.itemid=i.itemid';
     }
     // httptestids
     if (!is_null($options['httptestids'])) {
         zbx_value2array($options['httptestids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['httptestid'] = 'ht.httptestid';
         }
         $sqlParts['from']['applications'] = 'applications a';
         $sqlParts['from']['httptest'] = 'httptest ht';
         $sqlParts['where'][] = dbConditionInt('ht.httptestid', $options['httptestids']);
         $sqlParts['where']['aht'] = 'a.applicationid=ht.applicationid';
         $sqlParts['where']['ah'] = 'a.hostid=h.hostid';
     }
     // graphids
     if (!is_null($options['graphids'])) {
         zbx_value2array($options['graphids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['graphid'] = 'gi.graphid';
         }
         $sqlParts['from']['graphs_items'] = 'graphs_items gi';
         $sqlParts['from']['items'] = 'items i';
         $sqlParts['where'][] = dbConditionInt('gi.graphid', $options['graphids']);
         $sqlParts['where']['igi'] = 'i.itemid=gi.itemid';
         $sqlParts['where']['hi'] = 'h.hostid=i.hostid';
     }
     // applicationids
     if (!is_null($options['applicationids'])) {
         zbx_value2array($options['applicationids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['applicationid'] = 'a.applicationid';
         }
         $sqlParts['from']['applications'] = 'applications a';
         $sqlParts['where'][] = dbConditionInt('a.applicationid', $options['applicationids']);
         $sqlParts['where']['ah'] = 'a.hostid=h.hostid';
     }
     // dhostids
     if (!is_null($options['dhostids'])) {
         zbx_value2array($options['dhostids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['dhostid'] = 'ds.dhostid';
         }
         $sqlParts['from']['dservices'] = 'dservices ds';
         $sqlParts['where'][] = dbConditionInt('ds.dhostid', $options['dhostids']);
         $sqlParts['where']['dsh'] = 'ds.ip=h.ip';
         if (!is_null($options['groupCount'])) {
             $sqlParts['group']['dhostid'] = 'ds.dhostid';
         }
     }
     // dserviceids
     if (!is_null($options['dserviceids'])) {
         zbx_value2array($options['dserviceids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['dserviceid'] = 'ds.dserviceid';
         }
         $sqlParts['from']['dservices'] = 'dservices ds';
         $sqlParts['from']['interface'] = 'interface i';
         $sqlParts['where'][] = dbConditionInt('ds.dserviceid', $options['dserviceids']);
         $sqlParts['where']['dsh'] = 'ds.ip=i.ip';
         $sqlParts['where']['hi'] = 'h.hostid=i.hostid';
         if (!is_null($options['groupCount'])) {
             $sqlParts['group']['dserviceid'] = 'ds.dserviceid';
         }
     }
     // maintenanceids
     if (!is_null($options['maintenanceids'])) {
         zbx_value2array($options['maintenanceids']);
         if ($options['output'] != API_OUTPUT_SHORTEN) {
             $sqlParts['select']['maintenanceid'] = 'mh.maintenanceid';
         }
         $sqlParts['from']['maintenances_hosts'] = 'maintenances_hosts mh';
         $sqlParts['where'][] = dbConditionInt('mh.maintenanceid', $options['maintenanceids']);
         $sqlParts['where']['hmh'] = 'h.hostid=mh.hostid';
         if (!is_null($options['groupCount'])) {
             $sqlParts['group']['maintenanceid'] = 'mh.maintenanceid';
         }
     }
     // monitored_hosts, templated_hosts
     if (!is_null($options['monitored_hosts'])) {
         $sqlParts['where']['status'] = 'h.status=' . HOST_STATUS_MONITORED;
     } elseif (!is_null($options['templated_hosts'])) {
         $sqlParts['where']['status'] = 'h.status IN (' . HOST_STATUS_MONITORED . ',' . HOST_STATUS_NOT_MONITORED . ',' . HOST_STATUS_TEMPLATE . ')';
     } elseif (!is_null($options['proxy_hosts'])) {
         $sqlParts['where']['status'] = 'h.status IN (' . HOST_STATUS_PROXY_ACTIVE . ',' . HOST_STATUS_PROXY_PASSIVE . ')';
     } else {
         $sqlParts['where']['status'] = 'h.status IN (' . HOST_STATUS_MONITORED . ',' . HOST_STATUS_NOT_MONITORED . ')';
     }
     // with_items, with_monitored_items, with_historical_items, with_simple_graph_items
     if (!is_null($options['with_items'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM items i' . ' WHERE h.hostid=i.hostid' . ')';
     } elseif (!is_null($options['with_monitored_items'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM items i' . ' WHERE h.hostid=i.hostid' . ' AND i.status=' . ITEM_STATUS_ACTIVE . ')';
     } elseif (!is_null($options['with_historical_items'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM items i' . ' WHERE h.hostid=i.hostid' . ' AND i.status IN (' . ITEM_STATUS_ACTIVE . ',' . ITEM_STATUS_NOTSUPPORTED . ')' . ' AND i.lastvalue IS NOT NULL' . ')';
     } elseif (!is_null($options['with_simple_graph_items'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM items i' . ' WHERE h.hostid=i.hostid' . ' AND i.value_type IN (' . ITEM_VALUE_TYPE_FLOAT . ',' . ITEM_VALUE_TYPE_UINT64 . ')' . ' AND i.status=' . ITEM_STATUS_ACTIVE . ' AND i.flags IN (' . ZBX_FLAG_DISCOVERY_NORMAL . ',' . ZBX_FLAG_DISCOVERY_CREATED . ')' . ')';
     }
     // with_triggers, with_monitored_triggers
     if (!is_null($options['with_triggers'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM items i,functions f,triggers t' . ' WHERE h.hostid=i.hostid' . ' AND i.itemid=f.itemid' . ' AND f.triggerid=t.triggerid' . ')';
     } elseif (!is_null($options['with_monitored_triggers'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM items i,functions f,triggers t' . ' WHERE h.hostid=i.hostid' . ' AND i.itemid=f.itemid' . ' AND f.triggerid=t.triggerid' . ' AND i.status=' . ITEM_STATUS_ACTIVE . ' AND t.status=' . TRIGGER_STATUS_ENABLED . ')';
     }
     // with_httptests, with_monitored_httptests
     if (!is_null($options['with_httptests'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM applications a,httptest ht' . ' WHERE h.hostid=a.hostid' . ' AND a.applicationid=ht.applicationid' . ')';
     } elseif (!is_null($options['with_monitored_httptests'])) {
         $sqlParts['where'][] = 'EXISTS (' . 'SELECT NULL' . ' FROM applications a,httptest ht' . ' WHERE h.hostid=a.hostid' . ' AND a.applicationid=ht.applicationid' . ' AND ht.status=' . HTTPTEST_STATUS_ACTIVE . ')';
     }
     // with_graphs
     if (!is_null($options['with_graphs'])) {
         $sqlParts['where'][] = 'EXISTS (' . ' SELECT 1' . ' FROM items i,graphs_items gi' . ' WHERE i.hostid=h.hostid' . ' AND i.itemid=gi.itemid ' . zbx_limit(1) . ')';
     }
     // with applications
     if (!is_null($options['with_applications'])) {
         $sqlParts['from']['applications'] = 'applications a';
         $sqlParts['where'][] = 'a.hostid=h.hostid';
     }
     // withInventory
     if (!is_null($options['withInventory']) && $options['withInventory']) {
         $sqlParts['where'][] = ' h.hostid IN (' . ' SELECT hin.hostid' . ' FROM host_inventory hin)';
     }
     // search
     if (is_array($options['search'])) {
         zbx_db_search('hosts h', $options, $sqlParts);
         if (zbx_db_search('interface hi', $options, $sqlParts)) {
             $sqlParts['from']['interface'] = 'interface hi';
             $sqlParts['where']['hi'] = 'h.hostid=hi.hostid';
         }
     }
     // filter
     if (is_array($options['filter'])) {
         $this->dbFilter('hosts h', $options, $sqlParts);
         if ($this->dbFilter('interface hi', $options, $sqlParts)) {
             $sqlParts['from']['interface'] = 'interface hi';
             $sqlParts['where']['hi'] = 'h.hostid=hi.hostid';
         }
     }
     // output
     if ($options['output'] == API_OUTPUT_EXTEND) {
         $sqlParts['select']['hosts'] = 'h.*';
     }
     // countOutput
     if (!is_null($options['countOutput'])) {
         $options['sortfield'] = '';
         $sqlParts['select'] = array('COUNT(DISTINCT h.hostid) AS rowscount');
         // groupCount
         if (!is_null($options['groupCount'])) {
             foreach ($sqlParts['group'] as $key => $fields) {
                 $sqlParts['select'][$key] = $fields;
             }
         }
     }
     // sorting
     zbx_db_sorting($sqlParts, $options, $sortColumns, 'h');
     // limit
     if (zbx_ctype_digit($options['limit']) && $options['limit']) {
         $sqlParts['limit'] = $options['limit'];
     }
     $hostids = array();
     $sqlParts = $this->applyQueryNodeOptions($this->tableName(), $this->tableAlias(), $options, $sqlParts);
     $res = DBselect($this->createSelectQueryFromParts($sqlParts), $sqlParts['limit']);
     while ($host = DBfetch($res)) {
         if (!is_null($options['countOutput'])) {
             if (!is_null($options['groupCount'])) {
                 $result[] = $host;
             } else {
                 $result = $host['rowscount'];
             }
         } else {
             $hostids[$host['hostid']] = $host['hostid'];
             if ($options['output'] == API_OUTPUT_SHORTEN) {
                 $result[$host['hostid']] = array('hostid' => $host['hostid']);
             } else {
                 if (!isset($result[$host['hostid']])) {
                     $result[$host['hostid']] = array();
                 }
                 if (!is_null($options['selectGroups']) && !isset($result[$host['hostid']]['groups'])) {
                     $result[$host['hostid']]['groups'] = array();
                 }
                 if (!is_null($options['selectParentTemplates']) && !isset($result[$host['hostid']]['parentTemplates'])) {
                     $result[$host['hostid']]['parentTemplates'] = array();
                 }
                 if (!is_null($options['selectItems']) && !isset($result[$host['hostid']]['items'])) {
                     $result[$host['hostid']]['items'] = array();
                 }
                 if (!is_null($options['selectDiscoveries']) && !isset($result[$host['hostid']]['discoveries'])) {
                     $result[$host['hostid']]['discoveries'] = array();
                 }
                 if (!is_null($options['selectInventory']) && !isset($result[$host['hostid']]['inventory'])) {
                     $result[$host['hostid']]['inventory'] = array();
                 }
                 if (!is_null($options['selectTriggers']) && !isset($result[$host['hostid']]['triggers'])) {
                     $result[$host['hostid']]['triggers'] = array();
                 }
                 if (!is_null($options['selectGraphs']) && !isset($result[$host['hostid']]['graphs'])) {
                     $result[$host['hostid']]['graphs'] = array();
                 }
                 if (!is_null($options['selectDHosts']) && !isset($result[$host['hostid']]['dhosts'])) {
                     $result[$host['hostid']]['dhosts'] = array();
                 }
                 if (!is_null($options['selectDServices']) && !isset($result[$host['hostid']]['dservices'])) {
                     $result[$host['hostid']]['dservices'] = array();
                 }
                 if (!is_null($options['selectApplications']) && !isset($result[$host['hostid']]['applications'])) {
                     $result[$host['hostid']]['applications'] = array();
                 }
                 if (!is_null($options['selectMacros']) && !isset($result[$host['hostid']]['macros'])) {
                     $result[$host['hostid']]['macros'] = array();
                 }
                 if (!is_null($options['selectScreens']) && !isset($result[$host['hostid']]['screens'])) {
                     $result[$host['hostid']]['screens'] = array();
                 }
                 if (!is_null($options['selectInterfaces']) && !isset($result[$host['hostid']]['interfaces'])) {
                     $result[$host['hostid']]['interfaces'] = array();
                 }
                 // groupids
                 if (isset($host['groupid']) && is_null($options['selectGroups'])) {
                     if (!isset($result[$host['hostid']]['groups'])) {
                         $result[$host['hostid']]['groups'] = array();
                     }
                     $result[$host['hostid']]['groups'][] = array('groupid' => $host['groupid']);
                     unset($host['groupid']);
                 }
                 // templateids
                 if (isset($host['templateid'])) {
                     if (!isset($result[$host['hostid']]['templates'])) {
                         $result[$host['hostid']]['templates'] = array();
                     }
                     $result[$host['hostid']]['templates'][] = array('templateid' => $host['templateid'], 'hostid' => $host['templateid']);
                     unset($host['templateid']);
                 }
                 // triggerids
                 if (isset($host['triggerid']) && is_null($options['selectTriggers'])) {
                     if (!isset($result[$host['hostid']]['triggers'])) {
                         $result[$host['hostid']]['triggers'] = array();
                     }
                     $result[$host['hostid']]['triggers'][] = array('triggerid' => $host['triggerid']);
                     unset($host['triggerid']);
                 }
                 // interfaceids
                 if (isset($host['interfaceid']) && is_null($options['selectInterfaces'])) {
                     if (!isset($result[$host['hostid']]['interfaces'])) {
                         $result[$host['hostid']]['interfaces'] = array();
                     }
                     $result[$host['hostid']]['interfaces'][] = array('interfaceid' => $host['interfaceid']);
                     unset($host['interfaceid']);
                 }
                 // itemids
                 if (isset($host['itemid']) && is_null($options['selectItems'])) {
                     if (!isset($result[$host['hostid']]['items'])) {
                         $result[$host['hostid']]['items'] = array();
                     }
                     $result[$host['hostid']]['items'][] = array('itemid' => $host['itemid']);
                     unset($host['itemid']);
                 }
                 // graphids
                 if (isset($host['graphid']) && is_null($options['selectGraphs'])) {
                     if (!isset($result[$host['hostid']]['graphs'])) {
                         $result[$host['hostid']]['graphs'] = array();
                     }
                     $result[$host['hostid']]['graphs'][] = array('graphid' => $host['graphid']);
                     unset($host['graphid']);
                 }
                 // graphids
                 if (isset($host['applicationid'])) {
                     if (!isset($result[$host['hostid']]['applications'])) {
                         $result[$host['hostid']]['applications'] = array();
                     }
                     $result[$host['hostid']]['applications'][] = array('applicationid' => $host['applicationid']);
                     unset($host['applicationid']);
                 }
                 // httptestids
                 if (isset($host['httptestid'])) {
                     if (!isset($result[$host['hostid']]['httptests'])) {
                         $result[$host['hostid']]['httptests'] = array();
                     }
                     $result[$host['hostid']]['httptests'][] = array('httptestid' => $host['httptestid']);
                     unset($host['httptestid']);
                 }
                 // dhostids
                 if (isset($host['dhostid']) && is_null($options['selectDHosts'])) {
                     if (!isset($result[$host['hostid']]['dhosts'])) {
                         $result[$host['hostid']]['dhosts'] = array();
                     }
                     $result[$host['hostid']]['dhosts'][] = array('dhostid' => $host['dhostid']);
                     unset($host['dhostid']);
                 }
                 // dserviceids
                 if (isset($host['dserviceid']) && is_null($options['selectDServices'])) {
                     if (!isset($result[$host['hostid']]['dservices'])) {
                         $result[$host['hostid']]['dservices'] = array();
                     }
                     $result[$host['hostid']]['dservices'][] = array('dserviceid' => $host['dserviceid']);
                     unset($host['dserviceid']);
                 }
                 // maintenanceids
                 if (isset($host['maintenanceid'])) {
                     if (!isset($result[$host['hostid']]['maintenances'])) {
                         $result[$host['hostid']]['maintenances'] = array();
                     }
                     if ($host['maintenanceid'] > 0) {
                         $result[$host['hostid']]['maintenances'][] = array('maintenanceid' => $host['maintenanceid']);
                     }
                 }
                 $result[$host['hostid']] += $host;
             }
         }
     }
     if (!is_null($options['countOutput'])) {
         return $result;
     }
     /*
      * adding objects
      */
     // adding groups
     if (!is_null($options['selectGroups']) && str_in_array($options['selectGroups'], $subselectsAllowedOutputs)) {
         $groups = API::HostGroup()->get(array('nodeids' => $options['nodeids'], 'output' => $options['selectGroups'], 'hostids' => $hostids, 'preservekeys' => true));
         foreach ($groups as $group) {
             $ghosts = $group['hosts'];
             unset($group['hosts']);
             foreach ($ghosts as $host) {
                 $result[$host['hostid']]['groups'][] = $group;
             }
         }
     }
     // adding inventories
     if (!is_null($options['selectInventory']) && $options['selectInventory'] !== false) {
         if (is_array($options['selectInventory'])) {
             // if we are given a list of fields that needs to be fetched
             $dbTable = DB::getSchema('host_inventory');
             $selectHIn = array('hin.hostid');
             foreach ($options['selectInventory'] as $field) {
                 if (isset($dbTable['fields'][$field])) {
                     $selectHIn[] = 'hin.' . $field;
                 }
             }
         } else {
             // all fields are needed
             $selectHIn = array('hin.*');
         }
         $dbInventory = DBselect('SELECT ' . implode(', ', $selectHIn) . ' FROM host_inventory hin' . ' WHERE ' . dbConditionInt('hin.hostid', $hostids));
         while ($inventory = DBfetch($dbInventory)) {
             $result[$inventory['hostid']]['inventory'] = $inventory;
         }
     }
     // adding templates
     if (!is_null($options['selectParentTemplates'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'preservekeys' => true);
         if (is_array($options['selectParentTemplates']) || str_in_array($options['selectParentTemplates'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectParentTemplates'];
             $templates = API::Template()->get($objParams);
             if (!is_null($options['limitSelects'])) {
                 order_result($templates, 'host');
             }
             foreach ($templates as $templateid => $template) {
                 unset($templates[$templateid]['hosts']);
                 $count = array();
                 foreach ($template['hosts'] as $host) {
                     if (!is_null($options['limitSelects'])) {
                         if (!isset($count[$host['hostid']])) {
                             $count[$host['hostid']] = 0;
                         }
                         $count[$host['hostid']]++;
                         if ($count[$host['hostid']] > $options['limitSelects']) {
                             continue;
                         }
                     }
                     $result[$host['hostid']]['parentTemplates'][] =& $templates[$templateid];
                 }
             }
         } elseif (API_OUTPUT_COUNT == $options['selectParentTemplates']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $templates = API::Template()->get($objParams);
             $templates = zbx_toHash($templates, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['templates'] = isset($templates[$hostid]) ? $templates[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding hostinterfaces
     if (!is_null($options['selectInterfaces'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'nopermissions' => true, 'preservekeys' => true);
         if (is_array($options['selectInterfaces']) || str_in_array($options['selectInterfaces'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectInterfaces'];
             $interfaces = API::HostInterface()->get($objParams);
             // we need to order interfaces for proper linkage and viewing
             order_result($interfaces, 'interfaceid', ZBX_SORT_UP);
             $count = array();
             foreach ($interfaces as $interfaceid => $interface) {
                 if (!is_null($options['limitSelects'])) {
                     if (!isset($count[$interface['hostid']])) {
                         $count[$interface['hostid']] = 0;
                     }
                     $count[$interface['hostid']]++;
                     if ($count[$interface['hostid']] > $options['limitSelects']) {
                         continue;
                     }
                 }
                 $result[$interface['hostid']]['interfaces'][$interfaceid] =& $interfaces[$interfaceid];
             }
         } elseif (API_OUTPUT_COUNT == $options['selectInterfaces']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $interfaces = API::HostInterface()->get($objParams);
             $interfaces = zbx_toHash($interfaces, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['interfaces'] = isset($interfaces[$hostid]) ? $interfaces[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding items
     if (!is_null($options['selectItems'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'nopermissions' => true, 'preservekeys' => true);
         if (is_array($options['selectItems']) || str_in_array($options['selectItems'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectItems'];
             $items = API::Item()->get($objParams);
             if (!is_null($options['limitSelects'])) {
                 order_result($items, 'name');
             }
             $count = array();
             foreach ($items as $itemid => $item) {
                 if (!is_null($options['limitSelects'])) {
                     if (!isset($count[$item['hostid']])) {
                         $count[$item['hostid']] = 0;
                     }
                     $count[$item['hostid']]++;
                     if ($count[$item['hostid']] > $options['limitSelects']) {
                         continue;
                     }
                 }
                 $result[$item['hostid']]['items'][] =& $items[$itemid];
             }
         } elseif (API_OUTPUT_COUNT == $options['selectItems']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $items = API::Item()->get($objParams);
             $items = zbx_toHash($items, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['items'] = isset($items[$hostid]) ? $items[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding discoveries
     if (!is_null($options['selectDiscoveries'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'nopermissions' => true, 'preservekeys' => true);
         if (is_array($options['selectDiscoveries']) || str_in_array($options['selectDiscoveries'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectDiscoveries'];
             $items = API::DiscoveryRule()->get($objParams);
             if (!is_null($options['limitSelects'])) {
                 order_result($items, 'name');
             }
             $count = array();
             foreach ($items as $itemid => $item) {
                 unset($items[$itemid]['hosts']);
                 foreach ($item['hosts'] as $host) {
                     if (!is_null($options['limitSelects'])) {
                         if (!isset($count[$host['hostid']])) {
                             $count[$host['hostid']] = 0;
                         }
                         $count[$host['hostid']]++;
                         if ($count[$host['hostid']] > $options['limitSelects']) {
                             continue;
                         }
                     }
                     $result[$host['hostid']]['discoveries'][] =& $items[$itemid];
                 }
             }
         } elseif (API_OUTPUT_COUNT == $options['selectDiscoveries']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $items = API::DiscoveryRule()->get($objParams);
             $items = zbx_toHash($items, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['discoveries'] = isset($items[$hostid]) ? $items[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding triggers
     if (!is_null($options['selectTriggers'])) {
         if (is_array($options['selectTriggers']) || str_in_array($options['selectTriggers'], $subselectsAllowedOutputs)) {
             $triggers = API::Trigger()->get(array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'preservekeys' => true, 'output' => $options['selectTriggers']));
             if (!is_null($options['limitSelects'])) {
                 order_result($triggers, 'description');
             }
             $count = array();
             foreach ($triggers as $triggerid => $trigger) {
                 unset($triggers[$triggerid]['hosts']);
                 foreach ($trigger['hosts'] as $host) {
                     if (!is_null($options['limitSelects'])) {
                         if (!isset($count[$host['hostid']])) {
                             $count[$host['hostid']] = 0;
                         }
                         $count[$host['hostid']]++;
                         if ($count[$host['hostid']] > $options['limitSelects']) {
                             continue;
                         }
                     }
                     $result[$host['hostid']]['triggers'][] =& $triggers[$triggerid];
                 }
             }
         } elseif (API_OUTPUT_COUNT == $options['selectTriggers']) {
             $triggers = API::Trigger()->get(array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'countOutput' => true, 'groupCount' => true));
             $triggers = zbx_toHash($triggers, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['triggers'] = isset($triggers[$hostid]) ? $triggers[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding graphs
     if (!is_null($options['selectGraphs'])) {
         if (is_array($options['selectGraphs']) || str_in_array($options['selectGraphs'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectGraphs'];
             $graphs = API::Graph()->get(array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'preservekeys' => true, 'output' => $options['selectGraphs']));
             if (!is_null($options['limitSelects'])) {
                 order_result($graphs, 'name');
             }
             $count = array();
             foreach ($graphs as $graphid => $graph) {
                 unset($graphs[$graphid]['hosts']);
                 foreach ($graph['hosts'] as $host) {
                     if (!is_null($options['limitSelects'])) {
                         if (!isset($count[$host['hostid']])) {
                             $count[$host['hostid']] = 0;
                         }
                         $count[$host['hostid']]++;
                         if ($count[$host['hostid']] > $options['limitSelects']) {
                             continue;
                         }
                     }
                     $result[$host['hostid']]['graphs'][] =& $graphs[$graphid];
                 }
             }
         } elseif (API_OUTPUT_COUNT == $options['selectGraphs']) {
             $graphs = API::Graph()->get(array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'countOutput' => true, 'groupCount' => true));
             $graphs = zbx_toHash($graphs, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['graphs'] = isset($graphs[$hostid]) ? $graphs[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding discovery hosts
     if (!is_null($options['selectDHosts'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'nopermissions' => true, 'preservekeys' => true);
         if (is_array($options['selectDHosts']) || str_in_array($options['selectDHosts'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectDHosts'];
             $dhosts = API::DHost()->get($objParams);
             if (!is_null($options['limitSelects'])) {
                 order_result($dhosts, 'dhostid');
             }
             $count = array();
             foreach ($dhosts as $dhostid => $dhost) {
                 unset($dhosts[$dhostid]['hosts']);
                 foreach ($dhost['hosts'] as $host) {
                     if (!is_null($options['limitSelects'])) {
                         if (!isset($count[$host['hostid']])) {
                             $count[$host['hostid']] = 0;
                         }
                         $count[$host['hostid']]++;
                         if ($count[$host['hostid']] > $options['limitSelects']) {
                             continue;
                         }
                     }
                     $result[$host['hostid']]['dhosts'][] =& $dhosts[$dhostid];
                 }
             }
         } elseif (API_OUTPUT_COUNT == $options['selectDHosts']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $dhosts = API::DHost()->get($objParams);
             $dhosts = zbx_toHash($dhosts, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['dhosts'] = isset($dhosts[$hostid]) ? $dhosts[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding applications
     if (!is_null($options['selectApplications'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'nopermissions' => true, 'preservekeys' => true);
         if (is_array($options['selectApplications']) || str_in_array($options['selectApplications'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectApplications'];
             $applications = API::Application()->get($objParams);
             if (!is_null($options['limitSelects'])) {
                 order_result($applications, 'name');
             }
             $count = array();
             foreach ($applications as $applicationid => $application) {
                 unset($applications[$applicationid]['hosts']);
                 foreach ($application['hosts'] as $host) {
                     if (!is_null($options['limitSelects'])) {
                         if (!isset($count[$host['hostid']])) {
                             $count[$host['hostid']] = 0;
                         }
                         $count[$host['hostid']]++;
                         if ($count[$host['hostid']] > $options['limitSelects']) {
                             continue;
                         }
                     }
                     $result[$host['hostid']]['applications'][] =& $applications[$applicationid];
                 }
             }
         } elseif (API_OUTPUT_COUNT == $options['selectApplications']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $applications = API::Application()->get($objParams);
             $applications = zbx_toHash($applications, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['applications'] = isset($applications[$hostid]) ? $applications[$hostid]['rowscount'] : 0;
             }
         }
     }
     // adding macros
     if (!is_null($options['selectMacros']) && str_in_array($options['selectMacros'], $subselectsAllowedOutputs)) {
         $objParams = array('nodeids' => $options['nodeids'], 'output' => $options['selectMacros'], 'hostids' => $hostids, 'preservekeys' => true);
         $macros = API::UserMacro()->get($objParams);
         foreach ($macros as $macroid => $macro) {
             $mhosts = $macro['hosts'];
             unset($macro['hosts']);
             foreach ($mhosts as $host) {
                 $result[$host['hostid']]['macros'][$macroid] = $macro;
             }
         }
     }
     // adding screens
     if (!is_null($options['selectScreens'])) {
         $objParams = array('nodeids' => $options['nodeids'], 'hostids' => $hostids, 'editable' => $options['editable'], 'nopermissions' => true, 'preservekeys' => true);
         if (is_array($options['selectScreens']) || str_in_array($options['selectScreens'], $subselectsAllowedOutputs)) {
             $objParams['output'] = $options['selectScreens'];
             $screens = API::TemplateScreen()->get($objParams);
             if (!is_null($options['limitSelects'])) {
                 order_result($screens, 'name');
             }
             foreach ($screens as $snum => $screen) {
                 if (!is_null($options['limitSelects'])) {
                     if (count($result[$screen['hostid']]['screens']) >= $options['limitSelects']) {
                         continue;
                     }
                 }
                 unset($screens[$snum]['hosts']);
                 $result[$screen['hostid']]['screens'][] =& $screens[$snum];
             }
         } elseif (API_OUTPUT_COUNT == $options['selectScreens']) {
             $objParams['countOutput'] = 1;
             $objParams['groupCount'] = 1;
             $screens = API::TemplateScreen()->get($objParams);
             $screens = zbx_toHash($screens, 'hostid');
             foreach ($result as $hostid => $host) {
                 $result[$hostid]['screens'] = isset($screens[$hostid]) ? $screens[$hostid]['rowscount'] : 0;
             }
         }
     }
     // removing keys (hash -> array)
     if (is_null($options['preservekeys'])) {
         $result = zbx_cleanHashes($result);
     }
     return $result;
 }
コード例 #2
0
function get_viewed_groups($perm, $options = array(), $nodeid = null, $sql = array())
{
    global $USER_DETAILS, $page;
    $def_sql = array('select' => array('g.groupid', 'g.name'), 'from' => array('groups g'), 'where' => array(), 'order' => array());
    $def_options = array('deny_all' => 0, 'allow_all' => 0, 'select_first_group' => 0, 'select_first_group_if_empty' => 0, 'do_not_select' => 0, 'do_not_select_if_empty' => 0, 'monitored_hosts' => 0, 'templated_hosts' => 0, 'real_hosts' => 0, 'not_proxy_hosts' => 0, 'with_items' => 0, 'with_monitored_items' => 0, 'with_historical_items' => 0, 'with_triggers' => 0, 'with_monitored_triggers' => 0, 'with_httptests' => 0, 'with_monitored_httptests' => 0, 'with_graphs' => 0, 'only_current_node' => 0);
    $def_options = zbx_array_merge($def_options, $options);
    $config = select_config();
    $dd_first_entry = $config['dropdown_first_entry'];
    if ($def_options['allow_all']) {
        $dd_first_entry = ZBX_DROPDOWN_FIRST_ALL;
    }
    if ($def_options['deny_all']) {
        $dd_first_entry = ZBX_DROPDOWN_FIRST_NONE;
    }
    $result = array('original' => -1, 'selected' => 0, 'groups' => array(), 'groupids' => array());
    $groups =& $result['groups'];
    $groupids =& $result['groupids'];
    $first_entry = $dd_first_entry == ZBX_DROPDOWN_FIRST_NONE ? _('not selected') : _('all');
    $groups['0'] = $first_entry;
    $_REQUEST['groupid'] = $result['original'] = get_request('groupid', -1);
    $_REQUEST['hostid'] = get_request('hostid', -1);
    if (is_null($nodeid)) {
        $nodeid = !$def_options['only_current_node'] ? get_current_nodeid() : get_current_nodeid(false);
    }
    $available_groups = get_accessible_groups_by_user($USER_DETAILS, $perm, PERM_RES_IDS_ARRAY, $nodeid, AVAILABLE_NOCACHE);
    // nodes
    if (ZBX_DISTRIBUTED) {
        $def_sql['select'][] = 'n.name as node_name';
        $def_sql['from'][] = 'nodes n';
        $def_sql['where'][] = 'n.nodeid=' . DBid2nodeid('g.groupid');
        $def_sql['order'][] = 'node_name';
    }
    // hosts
    if ($def_options['monitored_hosts']) {
        $def_sql['where'][] = 'h.status=' . HOST_STATUS_MONITORED;
    } elseif ($def_options['real_hosts']) {
        $def_sql['where'][] = 'h.status IN(' . HOST_STATUS_MONITORED . ',' . HOST_STATUS_NOT_MONITORED . ')';
    } elseif ($def_options['templated_hosts']) {
        $def_sql['where'][] = 'h.status=' . HOST_STATUS_TEMPLATE;
    } elseif ($def_options['not_proxy_hosts']) {
        $def_sql['where'][] = 'h.status<>' . HOST_STATUS_PROXY;
    } else {
        $in_hosts = false;
    }
    if (!isset($in_hosts)) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['from'][] = 'hosts h';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'h.hostid=hg.hostid';
    }
    // items
    if ($def_options['with_items']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM items i' . ' WHERE hg.hostid=i.hostid ' . zbx_limit(1) . ')';
    } elseif ($def_options['with_monitored_items']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM items i' . ' WHERE hg.hostid=i.hostid' . ' AND i.status=' . ITEM_STATUS_ACTIVE . ' ' . zbx_limit(1) . ')';
    } elseif ($def_options['with_historical_items']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM items i' . ' WHERE hg.hostid=i.hostid' . ' AND (i.status=' . ITEM_STATUS_ACTIVE . ' OR i.status=' . ITEM_STATUS_NOTSUPPORTED . ')' . ' AND i.lastvalue IS NOT NULL ' . zbx_limit(1) . ')';
    }
    // triggers
    if ($def_options['with_triggers']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM items i,functions f,triggers t' . ' WHERE i.hostid=hg.hostid' . ' AND f.itemid=i.itemid' . ' AND t.triggerid=f.triggerid ' . zbx_limit(1) . ')';
    } elseif ($def_options['with_monitored_triggers']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM items i,functions f,triggers t' . ' WHERE i.hostid=hg.hostid' . ' AND i.status=' . ITEM_STATUS_ACTIVE . ' AND i.itemid=f.itemid' . ' AND f.triggerid=t.triggerid' . ' AND t.status=' . TRIGGER_STATUS_ENABLED . ' ' . zbx_limit(1) . ')';
    }
    // httptests
    if ($def_options['with_httptests']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT a.applicationid' . ' FROM applications a,httptest ht' . ' WHERE a.hostid=hg.hostid' . ' AND ht.applicationid=a.applicationid ' . zbx_limit(1) . ')';
    } elseif ($def_options['with_monitored_httptests']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM applications a,httptest ht' . ' WHERE a.hostid=hg.hostid' . ' AND ht.applicationid=a.applicationid' . ' AND ht.status=' . HTTPTEST_STATUS_ACTIVE . ' ' . zbx_limit(1) . ')';
    }
    // graphs
    if ($def_options['with_graphs']) {
        $def_sql['from'][] = 'hosts_groups hg';
        $def_sql['where'][] = 'hg.groupid=g.groupid';
        $def_sql['where'][] = 'EXISTS (SELECT 1' . ' FROM items i,graphs_items gi' . ' WHERE i.hostid=hg.hostid' . ' AND i.itemid=gi.itemid ' . zbx_limit(1) . ')';
    }
    $def_sql['order'][] = 'g.name';
    foreach ($sql as $key => $value) {
        zbx_value2array($value);
        $def_sql[$key] = !empty($def_sql[$key]) ? zbx_array_merge($def_sql[$key], $value) : $value;
    }
    $def_sql['select'] = array_unique($def_sql['select']);
    $def_sql['from'] = array_unique($def_sql['from']);
    $def_sql['where'] = array_unique($def_sql['where']);
    $def_sql['order'] = array_unique($def_sql['order']);
    $sql_select = '';
    $sql_from = '';
    $sql_where = '';
    $sql_order = '';
    if (!empty($def_sql['select'])) {
        $sql_select .= implode(',', $def_sql['select']);
    }
    if (!empty($def_sql['from'])) {
        $sql_from .= implode(',', $def_sql['from']);
    }
    if (!empty($def_sql['where'])) {
        $sql_where .= ' AND ' . implode(' AND ', $def_sql['where']);
    }
    if (!empty($def_sql['order'])) {
        $sql_order .= implode(',', $def_sql['order']);
    }
    $res = DBselect('SELECT DISTINCT ' . $sql_select . ' FROM ' . $sql_from . ' WHERE ' . dbConditionInt('g.groupid', $available_groups) . $sql_where . ' ORDER BY ' . $sql_order);
    while ($group = DBfetch($res)) {
        $groups[$group['groupid']] = $group['name'];
        $groupids[$group['groupid']] = $group['groupid'];
        if (bccomp($_REQUEST['groupid'], $group['groupid']) == 0) {
            $result['selected'] = $group['groupid'];
        }
    }
    $profile_groupid = CProfile::get('web.' . $page['menu'] . '.groupid');
    if ($def_options['do_not_select']) {
        $result['selected'] = $_REQUEST['groupid'] = 0;
    } elseif ($def_options['do_not_select_if_empty'] && $_REQUEST['groupid'] == -1) {
        $result['selected'] = $_REQUEST['groupid'] = 0;
    } elseif ($def_options['select_first_group'] || $def_options['select_first_group_if_empty'] && $_REQUEST['groupid'] == -1 && is_null($profile_groupid)) {
        $first_groupid = next($groupids);
        reset($groupids);
        $_REQUEST['groupid'] = $first_groupid !== false ? $result['selected'] = $first_groupid : ($result['selected'] = 0);
    } else {
        if ($config['dropdown_first_remember']) {
            if ($_REQUEST['groupid'] == -1) {
                $_REQUEST['groupid'] = is_null($profile_groupid) ? '0' : $profile_groupid;
            }
            if (isset($groupids[$_REQUEST['groupid']])) {
                $result['selected'] = $_REQUEST['groupid'];
            } else {
                $_REQUEST['groupid'] = $result['selected'];
            }
        } else {
            $_REQUEST['groupid'] = $result['selected'];
        }
    }
    return $result;
}