function discovery_check2str($type, $key, $port) { $externalParam = ''; if ($key !== '') { switch ($type) { case SVC_SNMPv1: case SVC_SNMPv2c: case SVC_SNMPv3: case SVC_AGENT: $externalParam = ' "' . $key . '"'; break; } } $result = discovery_check_type2str($type); if ($port && (svc_default_port($type) !== $port || $type === SVC_TCP)) { $result .= ' (' . $port . ')'; } return $result . $externalParam; }
function discovery_check2str($type, $snmp_community, $key_, $ports) { $external_param = null; $port_def = svc_default_port($type); switch ($type) { case SVC_SNMPv1: case SVC_SNMPv2: case SVC_SNMPv3: case SVC_AGENT: $external_param = ' "' . $key_ . '"'; break; } return discovery_check_type2str($type) . ($port_def == $ports ? '' : ' (' . $ports . ')') . $external_param; }
$conditionFormList->addItem(new CVar('new_condition[value]', '0')); $condition = array(new CTextBox('drule', '', ZBX_TEXTBOX_STANDARD_SIZE, true), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=drules&srcfld1=druleid&srcfld2=name' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=drule", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_DCHECK: $conditionFormList->addItem(new CVar('new_condition[value]', '0')); $condition = array(new CTextBox('dcheck', '', ZBX_TEXTBOX_STANDARD_SIZE, true), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=dchecks&srcfld1=dcheckid&srcfld2=name' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=dcheck&writeonly=1", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_PROXY: $conditionFormList->addItem(new CVar('new_condition[value]', '0')); $condition = array(new CTextBox('proxy', '', ZBX_TEXTBOX_STANDARD_SIZE, true), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=proxies&srcfld1=hostid&srcfld2=host' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=proxy' . '", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_DHOST_IP: $condition = new CTextBox('new_condition[value]', '192.168.0.1-127,192.168.2.1', ZBX_TEXTBOX_STANDARD_SIZE); break; case CONDITION_TYPE_DSERVICE_TYPE: $discoveryCheckTypes = discovery_check_type2str(); order_result($discoveryCheckTypes); $condition = new CComboBox('new_condition[value]'); foreach ($discoveryCheckTypes as $key => $discoveryCheckType) { $condition->addItem($key, $discoveryCheckType); } break; case CONDITION_TYPE_DSERVICE_PORT: $condition = new CTextBox('new_condition[value]', '0-1023,1024-49151', ZBX_TEXTBOX_STANDARD_SIZE); break; case CONDITION_TYPE_DSTATUS: $condition = new CComboBox('new_condition[value]'); foreach (array(DOBJECT_STATUS_UP, DOBJECT_STATUS_DOWN, DOBJECT_STATUS_DISCOVER, DOBJECT_STATUS_LOST) as $stat) { $condition->addItem($stat, discovery_object_status2str($stat)); } break;
if (isset($_REQUEST["form"])) { /* form */ insert_drule_form(); } else { show_table_header(S_DISCOVERY_BIG); /* table */ $form = new CForm(); $form->SetName('frmdrules'); $tblDiscovery = new CTableInfo(S_NO_DISCOVERY_RULES_DEFINED); $tblDiscovery->SetHeader(array(array(new CCheckBox('all_drules', null, "CheckAll('" . $form->GetName() . "','all_drules');"), make_sorting_link(S_NAME, 'd.name')), make_sorting_link(S_IP_RANGE, 'd.iprange'), make_sorting_link(S_DELAY, 'd.delay'), S_CHECKS, S_STATUS)); $db_rules = DBselect('SELECT d.* ' . ' FROM drules d' . ' WHERE ' . DBin_node('druleid') . order_by('d.name,d.iprange,d.delay', 'd.druleid')); while ($rule_data = DBfetch($db_rules)) { $cheks = array(); $db_checks = DBselect("select * from dchecks where druleid=" . $rule_data["druleid"] . " order by type,druleid"); while ($check_data = DBfetch($db_checks)) { $cheks[] = discovery_check_type2str($check_data['type']); } $status = new CCol(new CLink(discovery_status2str($rule_data["status"]), '?g_druleid%5B%5D=' . $rule_data['druleid'] . ($rule_data["status"] == DRULE_STATUS_ACTIVE ? '&group_disable=1' : '&group_enable=1'), discovery_status2style($rule_data["status"]))); $description = array(); if ($rule_data["proxy_hostid"]) { $proxy = get_host_by_hostid($rule_data["proxy_hostid"]); array_push($description, $proxy["host"], ":"); } array_push($description, new CLink($rule_data['name'], "?form=update&druleid=" . $rule_data['druleid'], 'action')); $drule = new CCol(array(new CCheckBox('g_druleid[' . $rule_data["druleid"] . ']', null, null, $rule_data["druleid"]), SPACE, $description)); $tblDiscovery->AddRow(array($drule, $rule_data['iprange'], $rule_data['delay'], implode(',', $cheks), $status)); } $tblDiscovery->SetFooter(new CCol(array(new CButtonQMessage('group_enable', S_ENABLE_SELECTED, S_ENABLE_SELECTED_RULES_Q), SPACE, new CButtonQMessage('group_disable', S_DISABLE_SELECTED, S_DISABLE_SELECTED_RULES_Q), SPACE, new CButtonQMessage('group_delete', S_DELETE_SELECTED, S_DELETE_SELECTED_RULES_Q)))); $form->AddItem($tblDiscovery); $form->Show(); }
function get_history_of_discovery_events($start, $end) { $sql_cond = ' AND e.clock>' . $start; $sql_cond .= ' AND e.clock<' . $end; $sql = 'SELECT DISTINCT e.source,e.object,e.objectid,e.clock,e.value ' . ' FROM events e' . ' WHERE e.source=' . EVENT_SOURCE_DISCOVERY . $sql_cond . order_by('e.clock'); $db_events = DBselect($sql); $table = new CTableInfo(S_NO_EVENTS_FOUND); $table->SetHeader(array(S_TIME, S_IP, S_DESCRIPTION, S_STATUS)); $col = 0; while ($event_data = DBfetch($db_events)) { $value = new CCol(trigger_value2str($event_data['value']), get_trigger_value_style($event_data['value'])); switch ($event_data['object']) { case EVENT_OBJECT_DHOST: $object_data = DBfetch(DBselect('SELECT ip FROM dhosts WHERE dhostid=' . $event_data['objectid'])); $description = SPACE; break; case EVENT_OBJECT_DSERVICE: $object_data = DBfetch(DBselect('SELECT h.ip,s.type,s.port ' . ' FROM dhosts h,dservices s ' . ' WHERE h.dhostid=s.dhostid ' . ' AND s.dserviceid=' . $event_data['objectid'])); $description = S_SERVICE . ': ' . discovery_check_type2str($object_data['type']) . '; ' . S_PORT . ': ' . $object_data['port']; break; default: continue; } if (!$object_data) { continue; } $table->AddRow(array(date('Y.M.d H:i:s', $event_data['clock']), $object_data['ip'], $description, $value)); $col++; } return $table; }
function validate_condition($conditiontype, $value) { global $USER_DETAILS; switch ($conditiontype) { case CONDITION_TYPE_HOST_GROUP: $available_groups = get_accessible_groups_by_user($USER_DETAILS, PERM_READ_ONLY, null, get_current_nodeid(true)); if (!isset($available_groups[$value])) { error(S_INCORRECT_GROUP); return false; } break; case CONDITION_TYPE_HOST_TEMPLATE: $available_hosts = get_accessible_hosts_by_user($USER_DETAILS, PERM_READ_ONLY, null, get_current_nodeid(true)); if (!isset($available_hosts[$value])) { error(S_INCORRECT_HOST); return false; } break; case CONDITION_TYPE_TRIGGER: if (!DBfetch(DBselect('select triggerid from triggers where triggerid=' . $value)) || !check_right_on_trigger_by_triggerid(PERM_READ_ONLY, $value)) { error(S_INCORRECT_TRIGGER); return false; } break; case CONDITION_TYPE_HOST: $available_hosts = get_accessible_hosts_by_user($USER_DETAILS, PERM_READ_ONLY, null, get_current_nodeid(true)); if (!isset($available_hosts[$value])) { error(S_INCORRECT_HOST); return false; } break; case CONDITION_TYPE_TIME_PERIOD: if (!validate_period($value)) { error(S_INCORRECT_PERIOD . ' [' . $value . ']'); return false; } break; case CONDITION_TYPE_DHOST_IP: if (!validate_ip_range($value)) { error(S_INCORRECT_IP . ' [' . $value . ']'); return false; } break; case CONDITION_TYPE_DSERVICE_TYPE: if (S_UNKNOWN == discovery_check_type2str($value)) { error(S_INCORRECT_DISCOVERY_CHECK); return false; } break; case CONDITION_TYPE_DSERVICE_PORT: if (!validate_port_list($value)) { error(S_INCORRECT_PORT . ' [' . $value . ']'); return false; } break; case CONDITION_TYPE_DSTATUS: if (S_UNKNOWN == discovery_object_status2str($value)) { error(S_INCORRECT_DISCOVERY_STATUS); return false; } break; case CONDITION_TYPE_EVENT_ACKNOWLEDGED: if (S_UNKNOWN == condition_value2str($conditiontype, $value)) { error(S_INCORRECT_DISCOVERY_STATUS); return false; } break; case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_TRIGGER_VALUE: case CONDITION_TYPE_TRIGGER_SEVERITY: case CONDITION_TYPE_MAINTENANCE: case CONDITION_TYPE_DUPTIME: case CONDITION_TYPE_DVALUE: case CONDITION_TYPE_APPLICATION: break; default: error(S_INCORRECT_CONDITION_TYPE); return false; break; } return true; }
if (isset($dhosts[$event_data['objectid']])) { $event_data['object_data'] = $dhosts[$event_data['objectid']]; } else { $event_data['object_data']['ip'] = S_UNKNOWN; } $event_data['description'] = S_HOST; break; case EVENT_OBJECT_DSERVICE: if (isset($dservices[$event_data['objectid']])) { $event_data['object_data'] = $dservices[$event_data['objectid']]; } else { $event_data['object_data']['ip'] = S_UNKNOWN; $event_data['object_data']['type'] = S_UNKNOWN; $event_data['object_data']['port'] = S_UNKNOWN; } $event_data['description'] = S_SERVICE . ': ' . discovery_check_type2str($event_data['object_data']['type']) . '; ' . S_PORT . ': ' . $event_data['object_data']['port']; break; default: continue; } if (!isset($event_data['object_data'])) { continue; } $table->addRow(array(zbx_date2str(S_EVENTS_DISCOVERY_TIME_FORMAT, $event_data['clock']), $event_data['object_data']['ip'], $event_data['description'], new CCol(discovery_value($event_data['value']), discovery_value_style($event_data['value'])))); } } else { $table->setHeader(array(S_TIME, is_show_all_nodes() ? S_NODE : null, $_REQUEST['hostid'] == 0 ? S_HOST : null, S_DESCRIPTION, S_STATUS, S_SEVERITY, S_DURATION, $config['event_ack_enable'] ? S_ACK : NULL, S_ACTIONS)); $triggers = array(); if ($pageFilter->hostid > 0 || $pageFilter->groupid > 0) { $trigOpt = array('nodeids' => get_current_nodeid(), 'output' => API_OUTPUT_SHORTEN); if (isset($_REQUEST['triggerid']) && $_REQUEST['triggerid'] > 0) {
/** * Converts numerical action condition values to their corresponding string values according to action condition type. * * For action condition types such as: hosts, host groups, templates, proxies, triggers, discovery rules * and discovery checks, action condition values contain IDs. All unique IDs are first collected and then queried. * For other action condition types values are returned as they are or converted using simple string convertion * functions according to action condition type. * * @param array $actions array of actions * @param array $action['filter'] array containing arrays of action conditions and other data * @param array $action['filter']['conditions'] array of action conditions * @param array $config array containing configuration parameters for getting trigger * severity names * * @return array returns an array of actions condition string values */ function actionConditionValueToString(array $actions, array $config) { $result = []; $groupIds = []; $triggerIds = []; $hostIds = []; $templateIds = []; $proxyIds = []; $dRuleIds = []; $dCheckIds = []; foreach ($actions as $i => $action) { $result[$i] = []; foreach ($action['filter']['conditions'] as $j => $condition) { // unknown types and all of the default values for other types are 'Unknown' $result[$i][$j] = _('Unknown'); switch ($condition['conditiontype']) { case CONDITION_TYPE_HOST_GROUP: $groupIds[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_TRIGGER: $triggerIds[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_HOST: $hostIds[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_TEMPLATE: $templateIds[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_PROXY: $proxyIds[$condition['value']] = $condition['value']; break; // return values as is for following condition types // return values as is for following condition types case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_HOST_METADATA: case CONDITION_TYPE_HOST_NAME: case CONDITION_TYPE_TIME_PERIOD: case CONDITION_TYPE_DHOST_IP: case CONDITION_TYPE_DSERVICE_PORT: case CONDITION_TYPE_DUPTIME: case CONDITION_TYPE_DVALUE: case CONDITION_TYPE_APPLICATION: $result[$i][$j] = $condition['value']; break; case CONDITION_TYPE_EVENT_ACKNOWLEDGED: $result[$i][$j] = $condition['value'] ? _('Ack') : _('Not Ack'); break; case CONDITION_TYPE_MAINTENANCE: $result[$i][$j] = _('maintenance'); break; case CONDITION_TYPE_TRIGGER_VALUE: $result[$i][$j] = trigger_value2str($condition['value']); break; case CONDITION_TYPE_TRIGGER_SEVERITY: $result[$i][$j] = getSeverityName($condition['value'], $config); break; case CONDITION_TYPE_DRULE: $dRuleIds[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DCHECK: $dCheckIds[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DOBJECT: $result[$i][$j] = discovery_object2str($condition['value']); break; case CONDITION_TYPE_DSERVICE_TYPE: $result[$i][$j] = discovery_check_type2str($condition['value']); break; case CONDITION_TYPE_DSTATUS: $result[$i][$j] = discovery_object_status2str($condition['value']); break; case CONDITION_TYPE_EVENT_TYPE: $result[$i][$j] = eventType($condition['value']); break; } } } $groups = []; $triggers = []; $hosts = []; $templates = []; $proxies = []; $dRules = []; $dChecks = []; if ($groupIds) { $groups = API::HostGroup()->get(['output' => ['name'], 'groupids' => $groupIds, 'preservekeys' => true]); } if ($triggerIds) { $triggers = API::Trigger()->get(['output' => ['description'], 'triggerids' => $triggerIds, 'expandDescription' => true, 'selectHosts' => ['name'], 'preservekeys' => true]); } if ($hostIds) { $hosts = API::Host()->get(['output' => ['name'], 'hostids' => $hostIds, 'preservekeys' => true]); } if ($templateIds) { $templates = API::Template()->get(['output' => ['name'], 'templateids' => $templateIds, 'preservekeys' => true]); } if ($proxyIds) { $proxies = API::Proxy()->get(['output' => ['host'], 'proxyids' => $proxyIds, 'preservekeys' => true]); } if ($dRuleIds) { $dRules = API::DRule()->get(['output' => ['name'], 'druleids' => $dRuleIds, 'preservekeys' => true]); } if ($dCheckIds) { $dChecks = API::DCheck()->get(['output' => ['type', 'key_', 'ports'], 'dcheckids' => $dCheckIds, 'selectDRules' => ['name'], 'preservekeys' => true]); } if ($groups || $triggers || $hosts || $templates || $proxies || $dRules || $dChecks) { foreach ($actions as $i => $action) { foreach ($action['filter']['conditions'] as $j => $condition) { $id = $condition['value']; switch ($condition['conditiontype']) { case CONDITION_TYPE_HOST_GROUP: if (isset($groups[$id])) { $result[$i][$j] = $groups[$id]['name']; } break; case CONDITION_TYPE_TRIGGER: if (isset($triggers[$id])) { $host = reset($triggers[$id]['hosts']); $result[$i][$j] = $host['name'] . NAME_DELIMITER . $triggers[$id]['description']; } break; case CONDITION_TYPE_HOST: if (isset($hosts[$id])) { $result[$i][$j] = $hosts[$id]['name']; } break; case CONDITION_TYPE_TEMPLATE: if (isset($templates[$id])) { $result[$i][$j] = $templates[$id]['name']; } break; case CONDITION_TYPE_PROXY: if (isset($proxies[$id])) { $result[$i][$j] = $proxies[$id]['host']; } break; case CONDITION_TYPE_DRULE: if (isset($dRules[$id])) { $result[$i][$j] = $dRules[$id]['name']; } break; case CONDITION_TYPE_DCHECK: if (isset($dChecks[$id])) { $drule = reset($dChecks[$id]['drules']); $type = $dChecks[$id]['type']; $key_ = $dChecks[$id]['key_']; $ports = $dChecks[$id]['ports']; $dCheck = discovery_check2str($type, $key_, $ports); $result[$i][$j] = $drule['name'] . NAME_DELIMITER . $dCheck; } break; } } } } return $result; }
break; case CONDITION_TYPE_DCHECK: $conditionFormList->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('dcheck', '', ZBX_TEXTBOX_STANDARD_SIZE, 'yes'), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=dchecks&srcfld1=dcheckid&srcfld2=name' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=dcheck&writeonly=1", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_PROXY: $conditionFormList->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('proxy', '', ZBX_TEXTBOX_STANDARD_SIZE, 'yes'), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=proxies&srcfld1=hostid&srcfld2=host' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=proxy' . '", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_DHOST_IP: $rowCondition[] = new CTextBox('new_condition[value]', '192.168.0.1-127,192.168.2.1', ZBX_TEXTBOX_STANDARD_SIZE); break; case CONDITION_TYPE_DSERVICE_TYPE: $conditionValueComboBox = new CComboBox('new_condition[value]'); foreach (array(SVC_SSH, SVC_LDAP, SVC_SMTP, SVC_FTP, SVC_HTTP, SVC_POP, SVC_NNTP, SVC_IMAP, SVC_TCP, SVC_AGENT, SVC_SNMPv1, SVC_SNMPv2c, SVC_SNMPv3, SVC_ICMPPING) as $svc) { $conditionValueComboBox->addItem($svc, discovery_check_type2str($svc)); } $rowCondition[] = $conditionValueComboBox; break; case CONDITION_TYPE_DSERVICE_PORT: $rowCondition[] = new CTextBox('new_condition[value]', '0-1023,1024-49151', ZBX_TEXTBOX_STANDARD_SIZE); break; case CONDITION_TYPE_DSTATUS: $conditionValueComboBox = new CComboBox('new_condition[value]'); foreach (array(DOBJECT_STATUS_UP, DOBJECT_STATUS_DOWN, DOBJECT_STATUS_DISCOVER, DOBJECT_STATUS_LOST) as $stat) { $conditionValueComboBox->addItem($stat, discovery_object_status2str($stat)); } $rowCondition[] = $conditionValueComboBox; break; case CONDITION_TYPE_DOBJECT: $conditionValueComboBox = new CComboBox('new_condition[value]');
$class = 'enabled'; $time = 'lastup'; if (DHOST_STATUS_DISABLED == $dhost['status']) { $class = 'disabled'; $time = 'lastdown'; } $discovery_info[$dhost['ip']] = array('class' => $class, 'host' => $dhost['host'], 'time' => $dhost[$time], 'druleid' => $dhost['druleid']); $db_dservices = DBselect('SELECT type,port,key_,status,lastup,lastdown FROM dservices ' . ' WHERE dhostid=' . $dhost['dhostid'] . ' order by status,type,port'); while ($dservice = DBfetch($db_dservices)) { $class = 'active'; $time = 'lastup'; if (DSVC_STATUS_DISABLED == $dservice['status']) { $class = 'inactive'; $time = 'lastdown'; } $service_name = discovery_check_type2str($dservice['type']) . discovery_port2str($dservice['type'], $dservice['port']) . (empty($dservice['key_']) ? '' : ':' . $dservice['key_']); $discovery_info[$dhost['ip']]['services'][$service_name] = array('class' => $class, 'time' => $dservice[$time]); } } if ($druleid == 0 && !empty($discovery_info)) { $col = new CCol(array(bold($drule['name']), SPACE . '(' . count($discovery_info) . SPACE . S_ITEMS . ')')); $col->setColSpan(count($services) + 3); $table->addRow(array(get_node_name_by_elid($drule['druleid']), $col)); } foreach ($discovery_info as $ip => $h_data) { $table_row = array(get_node_name_by_elid($h_data['druleid']), new CSpan($ip, $h_data['class']), new CSpan(empty($h_data['host']) ? '-' : $h_data['host']), new CSpan($h_data['time'] == 0 ? '' : convert_units(time() - $h_data['time'], 'uptime'), $h_data['class'])); foreach ($services as $name => $foo) { $class = null; $time = SPACE; $hint = new CDiv(SPACE, $class); $hintTable = new CTableInfo();
function validate_condition($conditiontype, $value) { global $USER_DETAILS; switch ($conditiontype) { case CONDITION_TYPE_HOST_GROUP: $groups = CHostGroup::get(array('groupids' => $value, 'output' => API_OUTPUT_SHORTEN, 'nodeids' => get_current_nodeid(true))); if (empty($groups)) { error(S_INCORRECT_GROUP); return false; } break; case CONDITION_TYPE_HOST_TEMPLATE: $templates = CTemplate::get(array('templateids' => $value, 'output' => API_OUTPUT_SHORTEN, 'nodeids' => get_current_nodeid(true))); if (empty($templates)) { error(S_INCORRECT_HOST); return false; } break; case CONDITION_TYPE_TRIGGER: $triggers = CTrigger::get(array('triggerids' => $value, 'output' => API_OUTPUT_SHORTEN, 'nodeids' => get_current_nodeid(true))); if (empty($triggers)) { error(S_INCORRECT_TRIGGER); return false; } break; case CONDITION_TYPE_HOST: $hosts = CHost::get(array('hostids' => $value, 'output' => API_OUTPUT_SHORTEN, 'nodeids' => get_current_nodeid(true))); if (empty($hosts)) { error(S_INCORRECT_HOST); return false; } break; case CONDITION_TYPE_TIME_PERIOD: if (!validate_period($value)) { error(S_INCORRECT_PERIOD . ' [' . $value . ']'); return false; } break; case CONDITION_TYPE_DHOST_IP: if (!validate_ip_range($value)) { error(S_INCORRECT_IP . ' [' . $value . ']'); return false; } break; case CONDITION_TYPE_DSERVICE_TYPE: if (S_UNKNOWN == discovery_check_type2str($value)) { error(S_INCORRECT_DISCOVERY_CHECK); return false; } break; case CONDITION_TYPE_DSERVICE_PORT: if (!validate_port_list($value)) { error(S_INCORRECT_PORT . ' [' . $value . ']'); return false; } break; case CONDITION_TYPE_DSTATUS: if (S_UNKNOWN == discovery_object_status2str($value)) { error(S_INCORRECT_DISCOVERY_STATUS); return false; } break; case CONDITION_TYPE_EVENT_ACKNOWLEDGED: if (S_UNKNOWN == condition_value2str($conditiontype, $value)) { error(S_INCORRECT_DISCOVERY_STATUS); return false; } break; case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_TRIGGER_VALUE: case CONDITION_TYPE_TRIGGER_SEVERITY: case CONDITION_TYPE_MAINTENANCE: case CONDITION_TYPE_NODE: case CONDITION_TYPE_DRULE: case CONDITION_TYPE_DCHECK: case CONDITION_TYPE_DOBJECT: case CONDITION_TYPE_PROXY: case CONDITION_TYPE_DUPTIME: case CONDITION_TYPE_DVALUE: case CONDITION_TYPE_APPLICATION: case CONDITION_TYPE_HOST_NAME: break; default: error(S_INCORRECT_CONDITION_TYPE); return false; break; } return true; }
function discovery_check2str($type, $snmp_community, $key_, $port) { $external_param = ''; switch ($type) { case SVC_SNMPv1: case SVC_SNMPv2: case SVC_SNMPv3: case SVC_AGENT: $external_param = ' "' . $key_ . '"'; break; } $result = discovery_check_type2str($type); if (svc_default_port($type) != $port || $type == SVC_TCP) { $result .= ' (' . $port . ')'; } $result .= $external_param; return $result; }
/** * Validate conditions. * * @static * @param $conditions * @return bool */ public static function validateConditions($conditions) { $conditions = zbx_toArray($conditions); $hostGroupidsAll = array(); $templateidsAll = array(); $triggeridsAll = array(); $hostidsAll = array(); $discoveryRuleidsAll = array(); $discoveryCheckidsAll = array(); $proxyidsAll = array(); $discoveryCheckTypes = discovery_check_type2str(); $discoveryObjectStatuses = discovery_object_status2str(); $timePeriodValidator = new CTimePeriodValidator(); foreach ($conditions as $condition) { switch ($condition['conditiontype']) { case CONDITION_TYPE_HOST_GROUP: $hostGroupidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_HOST_TEMPLATE: $templateidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_TRIGGER: $triggeridsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_HOST: $hostidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DRULE: $discoveryRuleidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DCHECK: $discoveryCheckidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_PROXY: $proxyidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_TIME_PERIOD: if (!$timePeriodValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect action condition period "%s".', $condition['value'])); } break; case CONDITION_TYPE_DHOST_IP: if (!validate_ip_range($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect action condition ip "%s".', $condition['value'])); } break; case CONDITION_TYPE_DSERVICE_TYPE: if (!isset($discoveryCheckTypes[$condition['value']])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery check.')); } break; case CONDITION_TYPE_DSERVICE_PORT: if (!validate_port_list($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect action condition port "%s".', $condition['value'])); } break; case CONDITION_TYPE_DSTATUS: if (!isset($discoveryObjectStatuses[$condition['value']])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery status.')); } break; case CONDITION_TYPE_MAINTENANCE: // maintenance condition has no value... break; case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_TRIGGER_VALUE: case CONDITION_TYPE_TRIGGER_SEVERITY: case CONDITION_TYPE_NODE: case CONDITION_TYPE_DOBJECT: case CONDITION_TYPE_DUPTIME: case CONDITION_TYPE_DVALUE: case CONDITION_TYPE_APPLICATION: case CONDITION_TYPE_HOST_NAME: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } break; default: self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition type.')); break; } } if (!API::HostGroup()->isWritable($hostGroupidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition host group. Host group does not exist or you have no access to it.')); } if (!API::Host()->isWritable($hostidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition host. Host does not exist or you have no access to it.')); } if (!API::Template()->isWritable($templateidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition template. Template does not exist or you have no access to it.')); } if (!API::Trigger()->isWritable($triggeridsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition trigger. Trigger does not exist or you have no access to it.')); } if (!API::DRule()->isWritable($discoveryRuleidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery rule. Discovery rule does not exist or you have no access to it.')); } if (!API::DCheck()->isWritable($discoveryCheckidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery check. Discovery check does not exist or you have no access to it.')); } if (!API::Proxy()->isWritable($proxyidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition proxy. Proxy does not exist or you have no access to it.')); } return true; }
function get_history_of_discovery_events($end_time, $limit, &$last_clock = null) { $table = new CTableInfo(S_NO_EVENTS_FOUND); $table->setHeader(array(S_TIME, S_IP, S_DESCRIPTION, S_STATUS)); $col = 0; $clock = array(); $dsc_events = array(); $sql = 'SELECT DISTINCT e.source,e.object,e.objectid,e.clock,e.value ' . ' FROM events e' . ' WHERE e.source=' . EVENT_SOURCE_DISCOVERY . ' AND e.clock<' . $end_time . ' ORDER BY e.clock DESC'; $db_events = DBselect($sql, $limit); while ($event_data = DBfetch($db_events)) { switch ($event_data['object']) { case EVENT_OBJECT_DHOST: $sql = 'SELECT ip FROM dhosts WHERE dhostid=' . $event_data['objectid']; if ($object_data = DBfetch(DBselect($sql))) { $event_data['object_data'] = $object_data; } else { $event_data['object_data']['ip'] = S_UNKNOWN; } $event_data['description'] = SPACE; break; case EVENT_OBJECT_DSERVICE: $sql = 'SELECT h.ip,s.type,s.port ' . ' FROM dhosts h,dservices s ' . ' WHERE h.dhostid=s.dhostid ' . ' AND s.dserviceid=' . $event_data['objectid']; if ($object_data = DBfetch(DBselect($sql))) { $event_data['object_data'] = $object_data; } else { $event_data['object_data']['ip'] = S_UNKNOWN; $event_data['object_data']['type'] = S_UNKNOWN; $event_data['object_data']['port'] = S_UNKNOWN; } $event_data['description'] = S_SERVICE . ': ' . discovery_check_type2str($event_data['object_data']['type']) . '; ' . S_PORT . ': ' . $event_data['object_data']['port']; break; default: continue; } if (!isset($event_data['object_data'])) { continue; } $clock[] = $event_data['clock']; $dsc_events[] = $event_data; } $last_clock = !empty($clock) ? min($clock) : null; order_page_result($dsc_events, 'clock', ZBX_SORT_DOWN); foreach ($dsc_events as $num => $event_data) { $value = new CCol(trigger_value2str($event_data['value']), get_trigger_value_style($event_data['value'])); $table->addRow(array(date('Y.M.d H:i:s', $event_data['clock']), $event_data['object_data']['ip'], $event_data['description'], $value)); } return $table; }
$data['proxies'] = API::Proxy()->get(array('output' => API_OUTPUT_EXTEND)); order_result($data['proxies'], 'host'); // render view $discoveryView = new CView('configuration.discovery.edit', $data); $discoveryView->render(); $discoveryView->show(); } else { $data = array(); // get drules $data['drules'] = API::DRule()->get(array('output' => API_OUTPUT_EXTEND, 'sortfield' => getPageSortField('name'), 'selectDChecks' => API_OUTPUT_EXTEND, 'editable' => true)); if (!empty($data['drules'])) { foreach ($data['drules'] as $druleid => $drule) { // checks $checks = array(); foreach ($drule['dchecks'] as $check) { $checks[$check['type']] = discovery_check_type2str($check['type']); } order_result($checks); $data['drules'][$druleid]['checks'] = $checks; // description $data['drules'][$druleid]['description'] = array(); if (!empty($drule['proxy_hostid'])) { $proxy = get_host_by_hostid($drule['proxy_hostid']); array_push($data['drules'][$druleid]['description'], $proxy['host'] . NAME_DELIMITER); } } order_result($data['drules'], getPageSortOrder()); } // get paging $data['paging'] = getPagingLine($data['drules'], array('druleid')); // nodes
/** * Validate conditions. * * @static * * @param array $conditions * @param int $conditions['conditiontype'] * @param array $conditions['value'] * * @return bool */ public static function validateConditions($conditions, $update = false) { $conditions = zbx_toArray($conditions); $hostGroupIdsAll = array(); $templateIdsAll = array(); $triggerIdsAll = array(); $hostIdsAll = array(); $discoveryRuleIdsAll = array(); $proxyIdsAll = array(); $proxyidsAll = array(); // build validators $timePeriodValidator = new CTimePeriodValidator(); $discoveryCheckTypeValidator = new CSetValidator(array('values' => array_keys(discovery_check_type2str()))); $discoveryObjectStatusValidator = new CSetValidator(array('values' => array_keys(discovery_object_status2str()))); $triggerSeverityValidator = new CSetValidator(array('values' => array_keys(getSeverityCaption()))); $discoveryObjectValidator = new CSetValidator(array('values' => array_keys(discovery_object2str()))); $triggerValueValidator = new CSetValidator(array('values' => array_keys(trigger_value2str()))); $eventTypeValidator = new CSetValidator(array('values' => array_keys(eventType()))); foreach ($conditions as $condition) { // on create operator is mandatory and needs validation, but on update it must be validated only if it's set if (!$update || $update && isset($condition['operator'])) { $operatorValidator = new CSetValidator(array('values' => get_operators_by_conditiontype($condition['conditiontype']))); if (!$operatorValidator->validate($condition['operator'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition operator.')); } } if (!$update || $update && isset($condition['value'])) { // validate condition values depending on condition type switch ($condition['conditiontype']) { case CONDITION_TYPE_HOST_GROUP: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $hostGroupIdsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_TEMPLATE: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $templateIdsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_TRIGGER: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $triggerIdsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_HOST: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $hostIdsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DRULE: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $discoveryRuleIdsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DCHECK: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $proxyIdsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_PROXY: if (!$condition['value']) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } $proxyidsAll[$condition['value']] = $condition['value']; break; case CONDITION_TYPE_DOBJECT: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!$discoveryObjectValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery object.')); } break; case CONDITION_TYPE_TIME_PERIOD: if (!$timePeriodValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, $timePeriodValidator->getError()); } break; case CONDITION_TYPE_DHOST_IP: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } else { if (!validate_ip_range($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect action condition ip "%1$s".', $condition['value'])); } } break; case CONDITION_TYPE_DSERVICE_TYPE: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!$discoveryCheckTypeValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery check.')); } break; case CONDITION_TYPE_DSERVICE_PORT: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!validate_port_list($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Incorrect action condition port "%1$s".', $condition['value'])); } break; case CONDITION_TYPE_DSTATUS: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!$discoveryObjectStatusValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery status.')); } break; case CONDITION_TYPE_MAINTENANCE: if (!zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Maintenance action condition value must be empty.')); } break; case CONDITION_TYPE_TRIGGER_SEVERITY: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!$triggerSeverityValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition trigger severity.')); } break; case CONDITION_TYPE_TRIGGER_VALUE: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!$triggerValueValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition trigger value.')); } break; case CONDITION_TYPE_EVENT_TYPE: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } elseif (!$eventTypeValidator->validate($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition event type.')); } break; case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_NODE: case CONDITION_TYPE_DUPTIME: case CONDITION_TYPE_DVALUE: case CONDITION_TYPE_APPLICATION: case CONDITION_TYPE_HOST_NAME: case CONDITION_TYPE_HOST_METADATA: if (zbx_empty($condition['value'])) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Empty action condition.')); } break; default: self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition type.')); break; } } } if (!API::HostGroup()->isWritable($hostGroupIdsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition host group. Host group does not exist or you have no access to it.')); } if (!API::Host()->isWritable($hostIdsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition host. Host does not exist or you have no access to it.')); } if (!API::Template()->isWritable($templateIdsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition template. Template does not exist or you have no access to it.')); } if (!API::Trigger()->isWritable($triggerIdsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition trigger. Trigger does not exist or you have no access to it.')); } if (!API::DRule()->isWritable($discoveryRuleIdsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery rule. Discovery rule does not exist or you have no access to it.')); } if (!API::DCheck()->isWritable($proxyIdsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition discovery check. Discovery check does not exist or you have no access to it.')); } if (!API::Proxy()->isWritable($proxyidsAll)) { self::exception(ZBX_API_ERROR_PARAMETERS, _('Incorrect action condition proxy. Proxy does not exist or you have no access to it.')); } return true; }
function condition_value2str($conditiontype, $value) { switch ($conditiontype) { case CONDITION_TYPE_HOST_GROUP: $groups = API::HostGroup()->get(array('groupids' => $value, 'output' => array('name'), 'nodeids' => get_current_nodeid(true), 'limit' => 1)); if ($groups) { $group = reset($groups); $str_val = ''; if (id2nodeid($value) != get_current_nodeid()) { $str_val = get_node_name_by_elid($value, true, NAME_DELIMITER); } $str_val .= $group['name']; } else { return _('Unknown'); } break; case CONDITION_TYPE_TRIGGER: $trigs = API::Trigger()->get(array('triggerids' => $value, 'expandDescription' => true, 'output' => array('description'), 'selectHosts' => array('name'), 'nodeids' => get_current_nodeid(true), 'limit' => 1)); if ($trigs) { $trig = reset($trigs); $host = reset($trig['hosts']); $str_val = ''; if (id2nodeid($value) != get_current_nodeid()) { $str_val = get_node_name_by_elid($value, true, NAME_DELIMITER); } $str_val .= $host['name'] . NAME_DELIMITER . $trig['description']; } else { return _('Unknown'); } break; case CONDITION_TYPE_HOST: case CONDITION_TYPE_TEMPLATE: if ($host = get_host_by_hostid($value)) { $str_val = ''; if (id2nodeid($value) != get_current_nodeid()) { $str_val = get_node_name_by_elid($value, true, NAME_DELIMITER); } $str_val .= $host['name']; } else { return _('Unknown'); } break; case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_HOST_METADATA: case CONDITION_TYPE_HOST_NAME: $str_val = $value; break; case CONDITION_TYPE_TRIGGER_VALUE: $str_val = trigger_value2str($value); break; case CONDITION_TYPE_TRIGGER_SEVERITY: $str_val = getSeverityCaption($value); break; case CONDITION_TYPE_TIME_PERIOD: $str_val = $value; break; case CONDITION_TYPE_MAINTENANCE: $str_val = _('maintenance'); break; case CONDITION_TYPE_NODE: if ($node = get_node_by_nodeid($value)) { $str_val = $node['name']; } else { return _('Unknown'); } break; case CONDITION_TYPE_DRULE: if ($drule = get_discovery_rule_by_druleid($value)) { $str_val = $drule['name']; } else { return _('Unknown'); } break; case CONDITION_TYPE_DCHECK: $row = DBfetch(DBselect('SELECT dr.name,c.dcheckid,c.type,c.key_,c.ports' . ' FROM drules dr,dchecks c' . ' WHERE dr.druleid=c.druleid' . ' AND c.dcheckid=' . zbx_dbstr($value))); if ($row) { $str_val = $row['name'] . NAME_DELIMITER . discovery_check2str($row['type'], $row['key_'], $row['ports']); } else { return _('Unknown'); } break; case CONDITION_TYPE_DOBJECT: $str_val = discovery_object2str($value); break; case CONDITION_TYPE_PROXY: if ($host = get_host_by_hostid($value)) { $str_val = $host['host']; } else { return _('Unknown'); } break; case CONDITION_TYPE_DHOST_IP: $str_val = $value; break; case CONDITION_TYPE_DSERVICE_TYPE: $str_val = discovery_check_type2str($value); break; case CONDITION_TYPE_DSERVICE_PORT: $str_val = $value; break; case CONDITION_TYPE_DSTATUS: $str_val = discovery_object_status2str($value); break; case CONDITION_TYPE_DUPTIME: $str_val = $value; break; case CONDITION_TYPE_DVALUE: $str_val = $value; break; case CONDITION_TYPE_EVENT_ACKNOWLEDGED: $str_val = $value ? _('Ack') : _('Not Ack'); break; case CONDITION_TYPE_APPLICATION: $str_val = $value; break; case CONDITION_TYPE_EVENT_TYPE: $str_val = eventType($value); break; default: return _('Unknown'); } return $str_val; }
} else { $event_data['object_data']['ip'] = _('Unknown'); $event_data['object_data']['dns'] = _('Unknown'); } $event_data['description'] = _('Host'); break; case EVENT_OBJECT_DSERVICE: if (isset($dservices[$event_data['objectid']])) { $event_data['object_data'] = $dservices[$event_data['objectid']]; } else { $event_data['object_data']['ip'] = _('Unknown'); $event_data['object_data']['dns'] = _('Unknown'); $event_data['object_data']['type'] = _('Unknown'); $event_data['object_data']['port'] = _('Unknown'); } $event_data['description'] = _('Service') . NAME_DELIMITER . discovery_check_type2str($event_data['object_data']['type']) . discovery_port2str($event_data['object_data']['type'], $event_data['object_data']['port']); break; default: continue; } if (!isset($event_data['object_data'])) { continue; } if ($csvExport) { $csvRows[] = [zbx_date2str(DATE_TIME_FORMAT_SECONDS, $event_data['clock']), $event_data['object_data']['ip'], $event_data['object_data']['dns'], $event_data['description'], discovery_value($event_data['value'])]; } else { $table->addRow([zbx_date2str(DATE_TIME_FORMAT_SECONDS, $event_data['clock']), $event_data['object_data']['ip'], zbx_empty($event_data['object_data']['dns']) ? SPACE : $event_data['object_data']['dns'], $event_data['description'], (new CCol(discovery_value($event_data['value'])))->addClass(discovery_value_style($event_data['value']))]); } } } else { if ($csvExport || $pageFilter->hostsSelected || $triggerId != 0) {
$discovery_info[$dservice['ip']] = array('ip' => $dservice['ip'], 'dns' => $dservice['dns'], 'type' => $htype, 'class' => $hclass, 'host' => $hostName, 'time' => $htime, 'druleid' => $dhost['druleid']); } $class = 'active'; $time = 'lastup'; if ($dservice['status'] == DSVC_STATUS_DISABLED) { $class = 'inactive'; $time = 'lastdown'; } $key_ = $dservice['key_']; if (!zbx_empty($key_)) { if (isset($this->data['macros'][$key_])) { $key_ = $this->data['macros'][$key_]['value']; } $key_ = NAME_DELIMITER . $key_; } $serviceName = discovery_check_type2str($dservice['type']) . discovery_port2str($dservice['type'], $dservice['port']) . $key_; $discovery_info[$dservice['ip']]['services'][$serviceName] = array('class' => $class, 'time' => $dservice[$time]); } } if (empty($this->data['druleid']) && !empty($discovery_info)) { $col = new CCol(array(bold($drule['name']), SPACE . '(' . _n('%d device', '%d devices', count($discovery_info)) . ')')); $col->setColSpan(count($this->data['services']) + 3); $discoveryTable->addRow($col); } order_result($discovery_info, $this->data['sort'], $this->data['sortorder']); foreach ($discovery_info as $ip => $h_data) { $dns = $h_data['dns'] == '' ? '' : ' (' . $h_data['dns'] . ')'; $row = array($h_data['type'] == 'primary' ? new CSpan($ip . $dns, $h_data['class']) : new CSpan(SPACE . SPACE . $ip . $dns), new CSpan(empty($h_data['host']) ? '-' : $h_data['host']), new CSpan($h_data['time'] == 0 || $h_data['type'] === 'slave' ? '' : convert_units(array('value' => time() - $h_data['time'], 'units' => 'uptime')), $h_data['class'])); foreach ($this->data['services'] as $name => $foo) { $class = null; $time = SPACE;
function get_act_new_cond_form($action = null) { $tblCond = new CTable('', 'nowrap'); if (isset($_REQUEST['actionid']) && empty($action)) { $action = get_action_by_actionid($_REQUEST['actionid']); } if (isset($_REQUEST['actionid']) && !isset($_REQUEST['form_refresh'])) { $eventsource = $action['eventsource']; $evaltype = $action['evaltype']; } else { $evaltype = get_request('evaltype'); $eventsource = get_request('eventsource'); } $allowed_conditions = get_conditions_by_eventsource($eventsource); /* init new_condition variable */ $new_condition = get_request('new_condition', array()); if (!is_array($new_condition)) { $new_condition = array(); } if (!isset($new_condition['type'])) { $new_condition['type'] = CONDITION_TYPE_TRIGGER_NAME; } if (!isset($new_condition['operator'])) { $new_condition['operator'] = CONDITION_OPERATOR_LIKE; } if (!isset($new_condition['value'])) { $new_condition['value'] = ''; } if (!str_in_array($new_condition['type'], $allowed_conditions)) { $new_condition['type'] = $allowed_conditions[0]; } // NEW CONDITION $rowCondition = array(); // add condition type $cmbCondType = new CComboBox('new_condition[type]', $new_condition['type'], 'submit()'); foreach ($allowed_conditions as $cond) { $cmbCondType->addItem($cond, condition_type2str($cond)); } array_push($rowCondition, $cmbCondType); // add condition operation $cmbCondOp = new CComboBox('new_condition[operator]'); foreach (get_operators_by_conditiontype($new_condition['type']) as $op) { $cmbCondOp->addItem($op, condition_operator2str($op)); } array_push($rowCondition, $cmbCondOp); // add condition value switch ($new_condition['type']) { case CONDITION_TYPE_HOST_GROUP: $tblCond->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('group', '', 20, 'yes'), new CButton('btn1', S_SELECT, "return PopUp('popup.php?dstfrm=" . S_ACTION . "&dstfld1=new_condition%5Bvalue%5D&dstfld2=group&srctbl=host_group" . "&srcfld1=groupid&srcfld2=name',450,450);", 'T')); break; case CONDITION_TYPE_HOST_TEMPLATE: $tblCond->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('host', '', 20, 'yes'), new CButton('btn1', S_SELECT, "return PopUp('popup.php?dstfrm=" . S_ACTION . "&dstfld1=new_condition%5Bvalue%5D&dstfld2=host&srctbl=host_templates" . "&srcfld1=hostid&srcfld2=host',450,450);", 'T')); break; case CONDITION_TYPE_HOST: $tblCond->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('host', '', 20, 'yes'), new CButton('btn1', S_SELECT, "return PopUp('popup.php?dstfrm=" . S_ACTION . "&dstfld1=new_condition%5Bvalue%5D&dstfld2=host&srctbl=hosts" . "&srcfld1=hostid&srcfld2=host',450,450);", 'T')); break; case CONDITION_TYPE_TRIGGER: $tblCond->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('trigger', '', 20, 'yes'), new CButton('btn1', S_SELECT, "return PopUp('popup.php?dstfrm=" . S_ACTION . "&dstfld1=new_condition%5Bvalue%5D&dstfld2=trigger&srctbl=triggers" . "&srcfld1=triggerid&srcfld2=description');", 'T')); break; case CONDITION_TYPE_TRIGGER_NAME: $rowCondition[] = new CTextBox('new_condition[value]', "", 40); break; case CONDITION_TYPE_TRIGGER_VALUE: $cmbCondVal = new CComboBox('new_condition[value]'); foreach (array(TRIGGER_VALUE_FALSE, TRIGGER_VALUE_TRUE) as $tr_val) { $cmbCondVal->addItem($tr_val, trigger_value2str($tr_val)); } $rowCondition[] = $cmbCondVal; break; case CONDITION_TYPE_TIME_PERIOD: $rowCondition[] = new CTextBox('new_condition[value]', "1-7,00:00-23:59", 40); break; case CONDITION_TYPE_TRIGGER_SEVERITY: $cmbCondVal = new CComboBox('new_condition[value]'); foreach (array(TRIGGER_SEVERITY_INFORMATION, TRIGGER_SEVERITY_WARNING, TRIGGER_SEVERITY_AVERAGE, TRIGGER_SEVERITY_HIGH, TRIGGER_SEVERITY_DISASTER) as $id) { $cmbCondVal->addItem($id, get_severity_description($id)); } $rowCondition[] = $cmbCondVal; break; case CONDITION_TYPE_MAINTENANCE: $rowCondition[] = new CCol(S_MAINTENANCE_SMALL); break; case CONDITION_TYPE_DHOST_IP: $rowCondition[] = new CTextBox('new_condition[value]', '192.168.0.1-127,192.168.2.1', 50); break; case CONDITION_TYPE_DSERVICE_TYPE: $cmbCondVal = new CComboBox('new_condition[value]'); foreach (array(SVC_SSH, SVC_LDAP, SVC_SMTP, SVC_FTP, SVC_HTTP, SVC_POP, SVC_NNTP, SVC_IMAP, SVC_TCP, SVC_AGENT, SVC_SNMPv1, SVC_SNMPv2, SVC_ICMPPING) as $svc) { $cmbCondVal->addItem($svc, discovery_check_type2str($svc)); } $rowCondition[] = $cmbCondVal; break; case CONDITION_TYPE_DSERVICE_PORT: $rowCondition[] = new CTextBox('new_condition[value]', '0-1023,1024-49151', 40); break; case CONDITION_TYPE_DSTATUS: $cmbCondVal = new CComboBox('new_condition[value]'); foreach (array(DOBJECT_STATUS_UP, DOBJECT_STATUS_DOWN, DOBJECT_STATUS_DISCOVER, DOBJECT_STATUS_LOST) as $stat) { $cmbCondVal->addItem($stat, discovery_object_status2str($stat)); } $rowCondition[] = $cmbCondVal; break; case CONDITION_TYPE_DUPTIME: $rowCondition[] = new CNumericBox('new_condition[value]', '600', 15); break; case CONDITION_TYPE_DVALUE: $rowCondition[] = new CTextBox('new_condition[value]', "", 40); break; case CONDITION_TYPE_APPLICATION: $rowCondition[] = new CTextBox('new_condition[value]', "", 40); break; } $tblCond->addRow($rowCondition); $tblConditions = new CTableInfo(); $tblConditions->addRow($tblCond); $td = new CCol(array(new CButton('add_condition', S_ADD), new CButton('cancel_new_condition', S_CANCEL))); $td->addOption('colspan', '3'); $td->addOption('style', 'text-align: right;'); $tblConditions->SetFooter($td); unset($grouped_conditions, $cond_el, $cond_buttons); // end of NEW CONDITION return $tblConditions; }
break; case CONDITION_TYPE_DCHECK: $conditionFormList->addItem(new CVar('new_condition[value]', '0')); $condition = array(new CTextBox('dcheck', '', ZBX_TEXTBOX_STANDARD_SIZE, 'yes'), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=dchecks&srcfld1=dcheckid&srcfld2=name' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=dcheck&writeonly=1", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_PROXY: $conditionFormList->addItem(new CVar('new_condition[value]', '0')); $condition = array(new CTextBox('proxy', '', ZBX_TEXTBOX_STANDARD_SIZE, 'yes'), SPACE, new CButton('btn1', _('Select'), 'return PopUp("popup.php?srctbl=proxies&srcfld1=hostid&srcfld2=host' . '&dstfrm=' . $actionForm->getName() . '&dstfld1=new_condition_value&dstfld2=proxy' . '", 450, 450);', 'link_menu')); break; case CONDITION_TYPE_DHOST_IP: $condition = new CTextBox('new_condition[value]', '192.168.0.1-127,192.168.2.1', ZBX_TEXTBOX_STANDARD_SIZE); break; case CONDITION_TYPE_DSERVICE_TYPE: $condition = new CComboBox('new_condition[value]'); foreach (array(SVC_SSH, SVC_LDAP, SVC_SMTP, SVC_FTP, SVC_HTTP, SVC_HTTPS, SVC_POP, SVC_NNTP, SVC_IMAP, SVC_TCP, SVC_AGENT, SVC_SNMPv1, SVC_SNMPv2c, SVC_SNMPv3, SVC_ICMPPING, SVC_TELNET) as $svc) { $condition->addItem($svc, discovery_check_type2str($svc)); } break; case CONDITION_TYPE_DSERVICE_PORT: $condition = new CTextBox('new_condition[value]', '0-1023,1024-49151', ZBX_TEXTBOX_STANDARD_SIZE); break; case CONDITION_TYPE_DSTATUS: $condition = new CComboBox('new_condition[value]'); foreach (array(DOBJECT_STATUS_UP, DOBJECT_STATUS_DOWN, DOBJECT_STATUS_DISCOVER, DOBJECT_STATUS_LOST) as $stat) { $condition->addItem($stat, discovery_object_status2str($stat)); } break; case CONDITION_TYPE_DOBJECT: $condition = new CComboBox('new_condition[value]'); foreach (array(EVENT_OBJECT_DHOST, EVENT_OBJECT_DSERVICE) as $object) { $condition->addItem($object, discovery_object2str($object));
/** * Returns true if the given $value is valid, or set's an error and returns false otherwise. * * * @param $condition * * @return bool */ public function validate($condition) { // build validators $timePeriodValidator = new CTimePeriodValidator(); $discoveryCheckTypeValidator = new CLimitedSetValidator(array('values' => array_keys(discovery_check_type2str()))); $discoveryObjectStatusValidator = new CLimitedSetValidator(array('values' => array_keys(discovery_object_status2str()))); $triggerSeverityValidator = new CLimitedSetValidator(array('values' => array(TRIGGER_SEVERITY_NOT_CLASSIFIED, TRIGGER_SEVERITY_INFORMATION, TRIGGER_SEVERITY_WARNING, TRIGGER_SEVERITY_AVERAGE, TRIGGER_SEVERITY_HIGH, TRIGGER_SEVERITY_DISASTER))); $discoveryObjectValidator = new CLimitedSetValidator(array('values' => array_keys(discovery_object2str()))); $triggerValueValidator = new CLimitedSetValidator(array('values' => array_keys(trigger_value2str()))); $eventTypeValidator = new CLimitedSetValidator(array('values' => array_keys(eventType()))); $conditionValue = $condition['value']; // validate condition values depending on condition type switch ($condition['conditiontype']) { case CONDITION_TYPE_HOST_GROUP: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_TEMPLATE: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_TRIGGER: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_HOST: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_DRULE: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_DCHECK: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_PROXY: if (!$conditionValue) { $this->setError(_('Empty action condition.')); } break; case CONDITION_TYPE_DOBJECT: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$discoveryObjectValidator->validate($conditionValue)) { $this->setError(_('Incorrect action condition discovery object.')); } break; case CONDITION_TYPE_TIME_PERIOD: if (!$timePeriodValidator->validate($conditionValue)) { $this->setError($timePeriodValidator->getError()); } break; case CONDITION_TYPE_DHOST_IP: $ipRangeValidator = new CIPRangeValidator(); if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$ipRangeValidator->validate($conditionValue)) { $this->setError($ipRangeValidator->getError()); } break; case CONDITION_TYPE_DSERVICE_TYPE: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$discoveryCheckTypeValidator->validate($conditionValue)) { $this->setError(_('Incorrect action condition discovery check.')); } break; case CONDITION_TYPE_DSERVICE_PORT: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!validate_port_list($conditionValue)) { $this->setError(_s('Incorrect action condition port "%1$s".', $conditionValue)); } break; case CONDITION_TYPE_DSTATUS: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$discoveryObjectStatusValidator->validate($conditionValue)) { $this->setError(_('Incorrect action condition discovery status.')); } break; case CONDITION_TYPE_MAINTENANCE: if (!zbx_empty($conditionValue)) { $this->setError(_('Maintenance action condition value must be empty.')); } break; case CONDITION_TYPE_TRIGGER_SEVERITY: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$triggerSeverityValidator->validate($conditionValue)) { $this->setError(_('Incorrect action condition trigger severity.')); } break; case CONDITION_TYPE_TRIGGER_VALUE: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$triggerValueValidator->validate($conditionValue)) { $this->setError(_('Incorrect action condition trigger value.')); } break; case CONDITION_TYPE_EVENT_TYPE: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } elseif (!$eventTypeValidator->validate($conditionValue)) { $this->setError(_('Incorrect action condition event type.')); } break; case CONDITION_TYPE_TRIGGER_NAME: case CONDITION_TYPE_DUPTIME: case CONDITION_TYPE_DVALUE: case CONDITION_TYPE_APPLICATION: case CONDITION_TYPE_HOST_NAME: case CONDITION_TYPE_HOST_METADATA: if (zbx_empty($conditionValue)) { $this->setError(_('Empty action condition.')); } break; default: $this->setError(_('Incorrect action condition type.')); } // If no error is not set, return true. return !(bool) $this->getError(); }
/** * Process screen. * * @return CDiv (screen inside container) */ public function get() { $this->dataId = 'discovery'; $sort_field = $this->data['sort']; $sort_order = $this->data['sortorder']; $druleid = $this->data['druleid']; // discovery rules $options = ['output' => ['druleid', 'name'], 'selectDHosts' => ['dhostid', 'status', 'lastup', 'lastdown'], 'filter' => ['status' => DRULE_STATUS_ACTIVE]]; if ($druleid > 0) { $options['druleids'] = $druleid; // set selected discovery rule id } $drules = API::DRule()->get($options); if ($drules) { order_result($drules, 'name'); } // discovery services $options = ['selectHosts' => ['hostid', 'name', 'status'], 'output' => ['dserviceid', 'type', 'key_', 'port', 'status', 'lastup', 'lastdown', 'ip', 'dns'], 'sortfield' => $sort_field, 'sortorder' => $sort_order, 'limitSelects' => 1]; if ($druleid > 0) { $options['druleids'] = $druleid; } else { $options['druleids'] = zbx_objectValues($drules, 'druleid'); } $dservices = API::DService()->get($options); // user macros $macros = API::UserMacro()->get(['output' => ['macro', 'value'], 'globalmacro' => true]); $macros = zbx_toHash($macros, 'macro'); // services $services = []; foreach ($dservices as $dservice) { $key_ = $dservice['key_']; if ($key_ !== '') { if (array_key_exists($key_, $macros)) { $key_ = $macros[$key_]['value']; } $key_ = ': ' . $key_; } $service_name = discovery_check_type2str($dservice['type']) . discovery_port2str($dservice['type'], $dservice['port']) . $key_; $services[$service_name] = 1; } ksort($services); // discovery services to hash $dservices = zbx_toHash($dservices, 'dserviceid'); // discovery hosts $dhosts = API::DHost()->get(['druleids' => zbx_objectValues($drules, 'druleid'), 'selectDServices' => ['dserviceid', 'ip', 'dns', 'type', 'status', 'key_'], 'output' => ['dhostid', 'lastdown', 'lastup', 'druleid']]); $dhosts = zbx_toHash($dhosts, 'dhostid'); $header = [make_sorting_header(_('Discovered device'), 'ip', $sort_field, $sort_order, 'zabbix.php?action=discovery.view'), _('Monitored host'), _('Uptime') . '/' . _('Downtime')]; foreach ($services as $name => $foo) { $header[] = (new CColHeader($name))->addClass('vertical_rotation'); } // create table $table = (new CTableInfo())->makeVerticalRotation()->setHeader($header); foreach ($drules as $drule) { $discovery_info = []; foreach ($drule['dhosts'] as $dhost) { if ($dhost['status'] == DHOST_STATUS_DISABLED) { $hclass = 'disabled'; $htime = $dhost['lastdown']; } else { $hclass = 'enabled'; $htime = $dhost['lastup']; } // $primary_ip stores the primary host ip of the dhost $primary_ip = ''; foreach ($dhosts[$dhost['dhostid']]['dservices'] as $dservice) { $dservice = $dservices[$dservice['dserviceid']]; $hostName = ''; $host = reset($dservices[$dservice['dserviceid']]['hosts']); if (!is_null($host)) { $hostName = $host['name']; } if ($primary_ip !== '') { if ($primary_ip === $dservice['ip']) { $htype = 'primary'; } else { $htype = 'slave'; } } else { $primary_ip = $dservice['ip']; $htype = 'primary'; } if (!array_key_exists($dservice['ip'], $discovery_info)) { $discovery_info[$dservice['ip']] = ['ip' => $dservice['ip'], 'dns' => $dservice['dns'], 'type' => $htype, 'class' => $hclass, 'host' => $hostName, 'time' => $htime]; } if ($dservice['status'] == DSVC_STATUS_DISABLED) { $class = ZBX_STYLE_INACTIVE_BG; $time = 'lastdown'; } else { $class = ZBX_STYLE_ACTIVE_BG; $time = 'lastup'; } $key_ = $dservice['key_']; if ($key_ !== '') { if (array_key_exists($key_, $macros)) { $key_ = $macros[$key_]['value']; } $key_ = NAME_DELIMITER . $key_; } $service_name = discovery_check_type2str($dservice['type']) . discovery_port2str($dservice['type'], $dservice['port']) . $key_; $discovery_info[$dservice['ip']]['services'][$service_name] = ['class' => $class, 'time' => $dservice[$time]]; } } if ($druleid == 0 && $discovery_info) { $col = new CCol([bold($drule['name']), SPACE . '(' . _n('%d device', '%d devices', count($discovery_info)) . ')']); $col->setColSpan(count($services) + 3); $table->addRow($col); } order_result($discovery_info, $sort_field, $sort_order); foreach ($discovery_info as $ip => $h_data) { $dns = $h_data['dns'] == '' ? '' : ' (' . $h_data['dns'] . ')'; $row = [$h_data['type'] == 'primary' ? (new CSpan($ip . $dns))->addClass($h_data['class']) : new CSpan(SPACE . SPACE . $ip . $dns), new CSpan(array_key_exists('host', $h_data) ? $h_data['host'] : ''), (new CSpan($h_data['time'] == 0 || $h_data['type'] === 'slave' ? '' : convert_units(['value' => time() - $h_data['time'], 'units' => 'uptime'])))->addClass($h_data['class'])]; foreach ($services as $name => $foo) { $class = null; $time = SPACE; $hint = (new CDiv(SPACE))->addClass($class); $hint_table = null; if (array_key_exists($name, $h_data['services'])) { $class = $h_data['services'][$name]['class']; $time = $h_data['services'][$name]['time']; $hint_table = (new CTableInfo())->setAttribute('style', 'width: auto;'); if ($class == ZBX_STYLE_ACTIVE_BG) { $hint_table->setHeader(_('Uptime')); } else { $hint_table->setHeader(_('Downtime')); } $hint_table->addRow((new CCol(zbx_date2age($h_data['services'][$name]['time'])))->addClass($class)); } $column = (new CCol($hint))->addClass($class); if (!is_null($hint_table)) { $column->setHint($hint_table); } $row[] = $column; } $table->addRow($row); } } return $this->getOutput($table, true, $this->data); }
break; case CONDITION_TYPE_DCHECK: $tblNewCond->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('dcheck', '', 50, 'yes'), new CButton('btn1', S_SELECT, "return PopUp('popup.php?writeonly=1&dstfrm=" . S_ACTION . "&dstfld1=new_condition%5Bvalue%5D&dstfld2=dcheck&srctbl=dchecks" . "&srcfld1=dcheckid&srcfld2=name',450,450);", 'T')); break; case CONDITION_TYPE_PROXY: $tblNewCond->addItem(new CVar('new_condition[value]', '0')); $rowCondition[] = array(new CTextBox('proxy', '', 20, 'yes'), new CButton('btn1', S_SELECT, "return PopUp('popup.php?writeonly=1&dstfrm=" . S_ACTION . "&dstfld1=new_condition%5Bvalue%5D&dstfld2=proxy&srctbl=proxies" . "&srcfld1=hostid&srcfld2=host',450,450);", 'T')); break; case CONDITION_TYPE_DHOST_IP: $rowCondition[] = new CTextBox('new_condition[value]', '192.168.0.1-127,192.168.2.1', 50); break; case CONDITION_TYPE_DSERVICE_TYPE: $cmbCondVal = new CComboBox('new_condition[value]'); foreach (array(SVC_SSH, SVC_LDAP, SVC_SMTP, SVC_FTP, SVC_HTTP, SVC_POP, SVC_NNTP, SVC_IMAP, SVC_TCP, SVC_AGENT, SVC_SNMPv1, SVC_SNMPv2, SVC_SNMPv3, SVC_ICMPPING) as $svc) { $cmbCondVal->addItem($svc, discovery_check_type2str($svc)); } $rowCondition[] = $cmbCondVal; break; case CONDITION_TYPE_DSERVICE_PORT: $rowCondition[] = new CTextBox('new_condition[value]', '0-1023,1024-49151', 40); break; case CONDITION_TYPE_DSTATUS: $cmbCondVal = new CComboBox('new_condition[value]'); foreach (array(DOBJECT_STATUS_UP, DOBJECT_STATUS_DOWN, DOBJECT_STATUS_DISCOVER, DOBJECT_STATUS_LOST) as $stat) { $cmbCondVal->addItem($stat, discovery_object_status2str($stat)); } $rowCondition[] = $cmbCondVal; break; case CONDITION_TYPE_DOBJECT: $cmbCondVal = new CComboBox('new_condition[value]');