$services[$service_name] = 1; } ksort($services); $header = array(is_show_all_nodes() ? new CCol(S_NODE, 'left') : null, make_sorting_header(S_DISCOVERED_DEVICE, 'ip'), new CCol(S_MONITORED_HOST, 'left'), new CCol(array(S_UPTIME . '/', S_DOWNTIME), 'left')); $css = getUserTheme($USER_DETAILS); $vTextColor = $css == 'css_od.css' ? '&color=white' : ''; foreach ($services as $name => $foo) { $header[] = new CImg('vtext.php?text=' . $name . $vTextColor); } $table = new CTableInfo(); $table->setHeader($header, 'vertical_header'); $options = array('filter' => array('status' => DRULE_STATUS_ACTIVE), 'selectDHosts' => API_OUTPUT_EXTEND, 'output' => API_OUTPUT_EXTEND); if ($druleid > 0) { $options['druleids'] = $druleid; } $drules = CDRule::get($options); order_result($drules, 'name'); $options = array('druleids' => zbx_objectValues($drules, 'druleid'), 'selectDServices' => API_OUTPUT_REFER, 'output' => API_OUTPUT_REFER); $db_dhosts = CDHost::get($options); $db_dhosts = zbx_toHash($db_dhosts, 'dhostid'); $db_dservices = zbx_toHash($dservices, 'dserviceid'); //SDII($db_dservices); foreach ($drules as $dnum => $drule) { $discovery_info = array(); $dhosts = $drule['dhosts']; foreach ($dhosts as $dhnum => $dhost) { if (DHOST_STATUS_DISABLED == $dhost['status']) { $hclass = 'disabled'; $htime = $dhost['lastdown']; } else { $hclass = 'enabled';
function make_discovery_status() { $options = array('filter' => array('status' => DHOST_STATUS_ACTIVE), 'selectDHosts' => API_OUTPUT_EXTEND, 'output' => API_OUTPUT_EXTEND); $drules = CDRule::get($options); order_result($drules, 'name'); foreach ($drules as $drnum => $drule) { $drules[$drnum]['up'] = 0; $drules[$drnum]['down'] = 0; foreach ($drule['dhosts'] as $dhnum => $dhost) { if (DRULE_STATUS_DISABLED == $dhost['status']) { $drules[$drnum]['down']++; } else { $drules[$drnum]['up']++; } } } $header = array(is_show_all_nodes() ? new CCol(S_NODE, 'center') : null, new CCol(S_DISCOVERY_RULE, 'center'), new CCol(S_UP), new CCol(S_DOWN)); $table = new CTableInfo(); $table->setHeader($header, 'header'); foreach ($drules as $drnum => $drule) { $table->addRow(array(get_node_name_by_elid($drule['druleid']), new CLink(get_node_name_by_elid($drule['druleid'], null, ': ') . $drule['name'], 'discovery.php?druleid=' . $drule['druleid']), new CSpan($drule['up'], 'green'), new CSpan($drule['down'], $drule['down'] > 0 ? 'red' : 'green'))); } $table->setFooter(new CCol(S_UPDATED . ': ' . zbx_date2str(S_BLOCKS_DISCOVERY_STATUS_TIME_FORMAT))); return $table; }
public static function get($options) { global $USER_DETAILS; $result = array(); $nodeCheck = false; $user_type = $USER_DETAILS['type']; $sort_columns = array('dcheckid', 'druleid'); // allowed columns for sorting $subselects_allowed_outputs = array(API_OUTPUT_REFER, API_OUTPUT_EXTEND, API_OUTPUT_CUSTOM); // allowed output options for [ select_* ] params $sql_parts = array('select' => array('dchecks' => 'dc.dcheckid'), 'from' => array('dchecks' => 'dchecks dc'), 'where' => array(), 'group' => array(), 'order' => array(), 'limit' => null); $def_options = array('nodeids' => null, 'dcheckids' => null, 'druleids' => null, 'dhostids' => null, 'editable' => null, 'nopermissions' => null, 'filter' => null, 'search' => null, 'startSearch' => null, 'excludeSearch' => null, 'output' => API_OUTPUT_REFER, 'selectDRules' => null, 'selectDHosts' => null, 'countOutput' => null, 'groupCount' => null, 'preservekeys' => null, 'sortfield' => '', 'sortorder' => '', 'limit' => null, 'limitSelects' => null); $options = zbx_array_merge($def_options, $options); if (is_array($options['output'])) { unset($sql_parts['select']['dchecks']); foreach ($options['output'] as $key => $field) { $sql_parts['select'][$field] = ' dc.' . $field; } $options['output'] = API_OUTPUT_CUSTOM; } // editable + PERMISSION CHECK if (USER_TYPE_SUPER_ADMIN == $user_type) { } else { if (is_null($options['editable']) && $USER_DETAILS['type'] == USER_TYPE_ZABBIX_ADMIN) { } else { if (!is_null($options['editable']) && $USER_DETAILS['type'] != USER_TYPE_SUPER_ADMIN) { return array(); } } } // nodeids $nodeids = !is_null($options['nodeids']) ? $options['nodeids'] : get_current_nodeid(); // dcheckids if (!is_null($options['dcheckids'])) { zbx_value2array($options['dcheckids']); $sql_parts['where']['dcheckid'] = DBcondition('dc.dcheckid', $options['dcheckids']); if (!$nodeCheck) { $nodeCheck = true; $sql_parts['where'][] = DBin_node('ds.dcheckid', $nodeids); } } // druleids if (!is_null($options['druleids'])) { zbx_value2array($options['druleids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['druleid'] = 'dc.druleid'; } $sql_parts['where'][] = DBcondition('dc.druleid', $options['druleids']); if (!is_null($options['groupCount'])) { $sql_parts['group']['druleid'] = 'dc.druleid'; } if (!$nodeCheck) { $nodeCheck = true; $sql_parts['where'][] = DBin_node('dc.druleid', $nodeids); } } // dhostids if (!is_null($options['dhostids'])) { zbx_value2array($options['dhostids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['dservices'] = 'dh.dhostid'; } $sql_parts['from']['dhosts'] = 'dhosts dh'; $sql_parts['where']['dh'] = DBcondition('dh.dhostid', $options['dhostids']); $sql_parts['where']['dcdh'] = 'dc.druleid=dh.druleid'; if (!is_null($options['groupCount'])) { $sql_parts['group']['dhostid'] = 'dh.dhostid'; } } // dserviceids if (!is_null($options['dserviceids'])) { zbx_value2array($options['dserviceids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['dserviceid'] = 'ds.dserviceid'; } $sql_parts['from']['dhosts'] = 'dhosts dh'; $sql_parts['from']['dservices'] = 'dservices ds'; $sql_parts['where']['ds'] = DBcondition('ds.dserviceid', $options['dserviceids']); $sql_parts['where']['dcdh'] = 'dc.druleid=dh.druleid'; $sql_parts['where']['dhds'] = 'dh.hostid=ds.hostid'; if (!is_null($options['groupCount'])) { $sql_parts['group']['dserviceid'] = 'ds.dserviceid'; } } // node check !!!!! // should last, after all ****IDS checks if (!$nodeCheck) { $nodeCheck = true; $sql_parts['where'][] = DBin_node('dc.dcheckid', $nodeids); } // output if ($options['output'] == API_OUTPUT_EXTEND) { $sql_parts['select']['dchecks'] = 'dc.*'; } // countOutput if (!is_null($options['countOutput'])) { $options['sortfield'] = ''; $sql_parts['select'] = array('count(DISTINCT dc.dcheckid) as rowscount'); //groupCount if (!is_null($options['groupCount'])) { foreach ($sql_parts['group'] as $key => $fields) { $sql_parts['select'][$key] = $fields; } } } // filter if (is_array($options['filter'])) { zbx_db_filter('dchecks dc', $options, $sql_parts); } // search if (is_array($options['search'])) { zbx_db_search('dchecks dc', $options, $sql_parts); } // order // restrict not allowed columns for sorting $options['sortfield'] = str_in_array($options['sortfield'], $sort_columns) ? $options['sortfield'] : ''; if (!zbx_empty($options['sortfield'])) { $sortorder = $options['sortorder'] == ZBX_SORT_DOWN ? ZBX_SORT_DOWN : ZBX_SORT_UP; $sql_parts['order'][$options['sortfield']] = 'dc.' . $options['sortfield'] . ' ' . $sortorder; if (!str_in_array('dc.' . $options['sortfield'], $sql_parts['select']) && !str_in_array('dc.*', $sql_parts['select'])) { $sql_parts['select'][$options['sortfield']] = 'dc.' . $options['sortfield']; } } // limit if (zbx_ctype_digit($options['limit']) && $options['limit']) { $sql_parts['limit'] = $options['limit']; } //------- $sql_parts['select'] = array_unique($sql_parts['select']); $sql_parts['from'] = array_unique($sql_parts['from']); $sql_parts['where'] = array_unique($sql_parts['where']); $sql_parts['group'] = array_unique($sql_parts['group']); $sql_parts['order'] = array_unique($sql_parts['order']); $sql_select = ''; $sql_from = ''; $sql_where = ''; $sql_group = ''; $sql_order = ''; if (!empty($sql_parts['select'])) { $sql_select .= implode(',', $sql_parts['select']); } if (!empty($sql_parts['from'])) { $sql_from .= implode(',', $sql_parts['from']); } if (!empty($sql_parts['where'])) { $sql_where .= implode(' AND ', $sql_parts['where']); } if (!empty($sql_parts['group'])) { $sql_where .= ' GROUP BY ' . implode(',', $sql_parts['group']); } if (!empty($sql_parts['order'])) { $sql_order .= ' ORDER BY ' . implode(',', $sql_parts['order']); } $sql_limit = $sql_parts['limit']; $sql = 'SELECT ' . zbx_db_distinct($sql_parts) . ' ' . $sql_select . ' FROM ' . $sql_from . ' WHERE ' . $sql_where . $sql_group . $sql_order; //SDI($sql); $res = DBselect($sql, $sql_limit); while ($dcheck = DBfetch($res)) { if (!is_null($options['countOutput'])) { if (!is_null($options['groupCount'])) { $result[] = $dcheck; } else { $result = $dcheck['rowscount']; } } else { $dcheckids[$dcheck['dcheckid']] = $dcheck['dcheckid']; if ($options['output'] == API_OUTPUT_SHORTEN) { $result[$dcheck['dcheckid']] = array('dcheckid' => $dcheck['dcheckid']); } else { if (!isset($result[$dcheck['dcheckid']])) { $result[$dcheck['dcheckid']] = array(); } if (!is_null($options['selectDRules']) && !isset($result[$dcheck['dcheckid']]['drules'])) { $result[$dcheck['dcheckid']]['drules'] = array(); } if (!is_null($options['selectDHosts']) && !isset($result[$dcheck['dcheckid']]['dhosts'])) { $result[$dcheck['dcheckid']]['dhosts'] = array(); } if (!is_null($options['selectHosts']) && !isset($result[$dcheck['dcheckid']]['hosts'])) { $result[$dcheck['dcheckid']]['hosts'] = array(); } // druleids if (isset($dcheck['druleid']) && is_null($options['selectDRules'])) { if (!isset($result[$dcheck['dcheckid']]['drules'])) { $result[$dcheck['dcheckid']]['drules'] = array(); } $result[$dcheck['dcheckid']]['drules'][] = array('druleid' => $dcheck['druleid']); } // dhostids if (isset($dcheck['dhostid']) && is_null($options['selectDHosts'])) { if (!isset($result[$dcheck['dcheckid']]['dhosts'])) { $result[$dcheck['dcheckid']]['dhosts'] = array(); } $result[$dcheck['dcheckid']]['dhosts'][] = array('dhostid' => $dcheck['dhostid']); } $result[$dcheck['dcheckid']] += $dcheck; } } } Copt::memoryPick(); if (!is_null($options['countOutput'])) { if (is_null($options['preservekeys'])) { $result = zbx_cleanHashes($result); } return $result; } // Adding Objects // select_drules if (!is_null($options['selectDRules'])) { $obj_params = array('nodeids' => $nodeids, 'dcheckids' => $dcheckids, 'preservekeys' => 1); if (is_array($options['selectDRules']) || str_in_array($options['selectDRules'], $subselects_allowed_outputs)) { $obj_params['output'] = $options['selectDRules']; $drules = CDRule::get($obj_params); if (!is_null($options['limitSelects'])) { order_result($drules, 'name'); } foreach ($drules as $druleid => $drule) { unset($drules[$druleid]['dchecks']); $count = array(); foreach ($drule['dchecks'] as $dnum => $dcheck) { if (!is_null($options['limitSelects'])) { if (!isset($count[$dcheck['dcheckid']])) { $count[$dcheck['dcheckid']] = 0; } $count[$dcheck['dcheckid']]++; if ($count[$dcheck['dcheckid']] > $options['limitSelects']) { continue; } } $result[$dcheck['dcheckid']]['drules'][] =& $drules[$druleid]; } } } else { if (API_OUTPUT_COUNT == $options['selectDRules']) { $obj_params['countOutput'] = 1; $obj_params['groupCount'] = 1; $drules = CDRule::get($obj_params); $drules = zbx_toHash($drules, 'dcheckid'); foreach ($result as $dcheckid => $dcheck) { if (isset($drules[$dcheckid])) { $result[$dcheckid]['drules'] = $drules[$dcheckid]['rowscount']; } else { $result[$dcheckid]['drules'] = 0; } } } } } // selectDHosts if (!is_null($options['selectDHosts'])) { $obj_params = array('nodeids' => $nodeids, 'dcheckids' => $dcheckids, 'preservekeys' => 1); if (is_array($options['selectDHosts']) || str_in_array($options['selectDHosts'], $subselects_allowed_outputs)) { $obj_params['output'] = $options['selectDHosts']; $dhosts = CDHost::get($obj_params); if (!is_null($options['limitSelects'])) { order_result($dhosts, 'dhostid'); } foreach ($dhosts as $dhostid => $dhost) { unset($dhosts[$dhostid]['dchecks']); foreach ($dhost['dchecks'] as $snum => $dcheck) { if (!is_null($options['limitSelects'])) { if (!isset($count[$dcheck['dcheckid']])) { $count[$dcheck['dcheckid']] = 0; } $count[$dcheck['dcheckid']]++; if ($count[$dcheck['dcheckid']] > $options['limitSelects']) { continue; } } $result[$dcheck['dcheckid']]['dhosts'][] =& $dhosts[$dhostid]; } } } else { if (API_OUTPUT_COUNT == $options['selectDHosts']) { $obj_params['countOutput'] = 1; $obj_params['groupCount'] = 1; $dhosts = CDHost::get($obj_params); $dhosts = zbx_toHash($dhosts, 'dhostid'); foreach ($result as $dcheckid => $dcheck) { if (isset($dhosts[$dcheckid])) { $result[$dcheckid]['dhosts'] = $dhosts[$dcheckid]['rowscount']; } else { $result[$dcheckid]['dhosts'] = 0; } } } } } // select_hosts if (!is_null($options['selectHosts'])) { $obj_params = array('nodeids' => $nodeids, 'dcheckids' => $dcheckids, 'preservekeys' => 1, 'sortfield' => 'status'); if (is_array($options['selectHosts']) || str_in_array($options['selectHosts'], $subselects_allowed_outputs)) { $obj_params['output'] = $options['selectHosts']; $hosts = CHost::get($obj_params); if (!is_null($options['limitSelects'])) { order_result($hosts, 'hostid'); } foreach ($hosts as $hostid => $host) { unset($hosts[$hostid]['dchecks']); foreach ($host['dchecks'] as $dnum => $dcheck) { if (!is_null($options['limitSelects'])) { if (!isset($count[$dcheck['dcheckid']])) { $count[$dcheck['dcheckid']] = 0; } $count[$dcheck['dcheckid']]++; if ($count[$dcheck['dcheckid']] > $options['limitSelects']) { continue; } } $result[$dcheck['dcheckid']]['hosts'][] =& $hosts[$hostid]; } } } else { if (API_OUTPUT_COUNT == $options['selectHosts']) { $obj_params['countOutput'] = 1; $obj_params['groupCount'] = 1; $hosts = CHost::get($obj_params); $hosts = zbx_toHash($hosts, 'hostid'); foreach ($result as $dcheckid => $dcheck) { if (isset($hosts[$dcheckid])) { $result[$dcheckid]['hosts'] = $hosts[$dcheckid]['rowscount']; } else { $result[$dcheckid]['hosts'] = 0; } } } } } Copt::memoryPick(); // removing keys (hash -> array) if (is_null($options['preservekeys'])) { $result = zbx_cleanHashes($result); } return $result; }
private static function drule($action, $params) { CDRule::$error = array(); switch ($action) { default: $result = call_user_func(array('CDRule', $action), $params); } self::$result = $result; }