/** * remove Hosts from HostGroups. All Hosts are removed from all HostGroups. * * @param array $data * @param array $data['hostids'] * @param array $data['groupids'] * @param array $data['templateids'] * @param array $data['macroids'] * @return array */ public static function massRemove($data) { $hostids = zbx_toArray($data['hostids']); try { self::BeginTransaction(__METHOD__); $options = array('hostids' => $hostids, 'editable' => 1, 'preservekeys' => 1, 'output' => API_OUTPUT_SHORTEN); $upd_hosts = self::get($options); foreach ($hostids as $hostid) { if (!isset($upd_hosts[$hostid])) { self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSION); } } if (isset($data['groupids'])) { $options = array('hostids' => $hostids, 'groupids' => zbx_toArray($data['groupids'])); $result = CHostGroup::massRemove($options); if (!$result) { self::exception(); } } if (isset($data['templateids'])) { $options = array('hostids' => $hostids, 'templateids' => zbx_toArray($data['templateids'])); $result = CTemplate::massRemove($options); if (!$result) { self::exception(); } } if (isset($data['macros'])) { $options = array('hostids' => $hostids, 'macros' => zbx_toArray($data['macros'])); $result = CUserMacro::massRemove($options); if (!$result) { self::exception(); } } self::EndTransaction(true, __METHOD__); return array('hostids' => $hostids); } catch (APIException $e) { self::EndTransaction(false, __METHOD__); $error = $e->getErrors(); $error = reset($error); self::setError(__METHOD__, $e->getCode(), $error); return false; } }
protected function calcTriggers() { $this->triggers = array(); if ($this->m_showTriggers != 1) { return; } $max = 3; $cnt = 0; foreach ($this->items as $inum => $item) { $sql = 'SELECT DISTINCT h.host, tr.description, tr.triggerid, tr.expression, tr.priority, tr.value ' . ' FROM triggers tr,functions f,items i, hosts h ' . ' WHERE tr.triggerid=f.triggerid ' . " AND f.function IN ('last','min','avg','max') " . ' AND tr.status=' . TRIGGER_STATUS_ENABLED . ' AND i.itemid=f.itemid ' . ' AND h.hostid=i.hostid ' . ' AND f.itemid=' . $item['itemid'] . ' ORDER BY tr.priority'; $db_triggers = DBselect($sql); while (($trigger = DBfetch($db_triggers)) && $cnt < $max) { $db_fnc_cnt = DBselect('SELECT count(*) as cnt FROM functions f WHERE f.triggerid=' . $trigger['triggerid']); $fnc_cnt = DBfetch($db_fnc_cnt); if ($fnc_cnt['cnt'] != 1) { continue; } CUserMacro::resolveTrigger($trigger); if (!preg_match('/\\{([0-9]{1,})\\}([\\<\\>\\=]{1})([0-9\\.]{1,})([K|M|G]{0,1})/i', $trigger['expression'], $arr)) { continue; } $val = $arr[3]; if (strcasecmp($arr[4], 'K') == 0) { $val *= 1024; } else { if (strcasecmp($arr[4], 'M') == 0) { $val *= 1048576; } else { if (strcasecmp($arr[4], 'G') == 0) { $val *= 1073741824; } } } //1024*1024*1024; $minY = $this->m_minY[$this->items[$inum]['axisside']]; $maxY = $this->m_maxY[$this->items[$inum]['axisside']]; switch ($trigger['priority']) { case TRIGGER_SEVERITY_DISASTER: $color = 'Priority Disaster'; break; case TRIGGER_SEVERITY_HIGH: $color = 'Priority High'; break; case TRIGGER_SEVERITY_AVERAGE: $color = 'Priority Average'; break; case TRIGGER_SEVERITY_WARNING: $color = 'Priority Warning'; break; case TRIGGER_SEVERITY_INFORMATION: $color = 'Priority Information'; break; default: $color = 'Priority'; } array_push($this->triggers, array('skipdraw' => $val <= $minY || $val >= $maxY, 'y' => $this->sizeY - ($val - $minY) / ($maxY - $minY) * $this->sizeY + $this->shiftY, 'color' => $color, 'description' => S_TRIGGER . ': ' . expand_trigger_description_by_data($trigger), 'constant' => '[' . $arr[2] . ' ' . $arr[3] . $arr[4] . ']')); ++$cnt; } } }
private static function usermacro($action, $params) { CUserMacro::$error = array(); switch ($action) { default: $result = call_user_func(array('CUserMacro', $action), $params); } self::$result = $result; }
// $dscvry_wdgt->addHeader(array(S_FOUND.': ',$numrows), $r_form); $numrows = new CDiv(); $numrows->setAttribute('name', 'numrows'); $dscvry_wdgt->addHeader(S_DISCOVERY_RULES_BIG, $r_form); // $dscvry_wdgt->addHeader($numrows); //------------- $sortfield = getPageSortField('ip'); $sortorder = getPageSortOrder(); $options = array('selectHosts' => array('hostid', 'host', 'status'), 'output' => API_OUTPUT_EXTEND, 'sortfield' => $sortfield, 'sortorder' => $sortorder, 'limitSelects' => 1); if ($druleid > 0) { $options['druleids'] = $druleid; } else { $options['druleids'] = zbx_objectValues($drules, 'druleid'); } $dservices = CDService::get($options); $gMacros = CUserMacro::get(array('output' => API_OUTPUT_EXTEND, 'globalmacro' => 1)); $gMacros = zbx_toHash($gMacros, 'macro'); $services = array(); foreach ($dservices as $dsnum => $dservice) { $key_ = $dservice['key_']; if (!zbx_empty($key_)) { if (isset($gMacros[$key_])) { $key_ = $gMacros[$key_]['value']; } $key_ = ': ' . $key_; } $service_name = discovery_check_type2str($dservice['type']) . discovery_port2str($dservice['type'], $dservice['port']) . $key_; $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'));
function expand_item_key_by_data($item) { $key =& $item['key_']; $macStack = array(); $macroses = array('{HOSTNAME}', '{IPADDRESS}', '{HOST.DNS}', '{HOST.CONN}'); foreach ($macroses as $macro) { $pos = 0; while ($pos = zbx_strpos($key, $macro, $pos)) { $pos++; $macStack[] = $macro; } } if (!empty($macStack)) { $host = get_host_by_itemid($item['itemid']); foreach ($macStack as $macro) { switch ($macro) { case '{HOSTNAME}': $key = str_replace('{HOSTNAME}', $host['host'], $key); break; case '{IPADDRESS}': $key = str_replace('{IPADDRESS}', $host['ip'], $key); break; case '{HOST.DNS}': $key = str_replace('{HOST.DNS}', $host['dns'], $key); break; case '{HOST.CONN}': $key = str_replace('{HOST.CONN}', $host['useip'] ? $host['ip'] : $host['dns'], $key); break; } } } CUserMacro::resolveItem($item); return $item['key_']; }
function get_macros_widget($hostid = null) { if (isset($_REQUEST['form_refresh'])) { $macros = get_request('macros', array()); } else { if ($hostid > 0) { $macros = CUserMacro::get(array('output' => API_OUTPUT_EXTEND, 'hostids' => $hostid)); order_result($macros, 'macro'); } else { if ($hostid === null) { $macros = CUserMacro::get(array('output' => API_OUTPUT_EXTEND, 'globalmacro' => 1)); order_result($macros, 'macro'); } else { $macros = array(); } } } if (empty($macros)) { $macros = array(0 => array('macro' => '', 'value' => '')); } $macros_tbl = new CTable(SPACE, 'formElementTable'); $macros_tbl->setAttribute('id', 'tbl_macros'); $macros_tbl->addRow(array(SPACE, S_MACRO, SPACE, S_VALUE)); insert_js(' function addMacroRow(){ if(typeof(addMacroRow.macro_count) == "undefined"){ addMacroRow.macro_count = ' . count($macros) . '; } var tr = document.createElement("tr"); tr.className = (addMacroRow.macro_count % 2) ? "form_even_row" : "form_odd_row"; var td1 = document.createElement("td"); tr.appendChild(td1); var cb = document.createElement("input"); cb.setAttribute("type", "checkbox"); cb.className = "checkbox"; td1.appendChild(cb); td1.appendChild(document.createTextNode(" ")); var td2 = document.createElement("td"); tr.appendChild(td2); var text1 = document.createElement("input"); text1.setAttribute("type", "text"); text1.setAttribute("name", "macros["+addMacroRow.macro_count+"][macro]"); text1.className = "biginput"; text1.setAttribute("size",30); text1.setAttribute("placeholder","{$MACRO}"); td2.appendChild(text1); td2.appendChild(document.createTextNode(" ")); var td3 = document.createElement("td"); tr.appendChild(td3); var span = document.createElement("span"); span.innerHTML = "⇒"; span.setAttribute("style", "vertical-align:top;"); td3.appendChild(span); var td4 = document.createElement("td"); tr.appendChild(td4); var text2 = document.createElement("input"); text2.setAttribute("type", "text"); text2.setAttribute("placeholder","<' . S_VALUE . '>"); text2.setAttribute("name","macros["+addMacroRow.macro_count+"][value]"); text2.className = "biginput"; text2.setAttribute("size",40); td4.appendChild(text2); var sd = $("row_new_macro").insert({before : tr}); addMacroRow.macro_count++; } '); $macros = array_values($macros); foreach ($macros as $macroid => $macro) { $text1 = new CTextBox('macros[' . $macroid . '][macro]', $macro['macro'], 30); $text1->setAttribute('placeholder', '{$MACRO}'); $text2 = new CTextBox('macros[' . $macroid . '][value]', $macro['value'], 40); $text2->setAttribute('placeholder', '<' . S_VALUE . '>'); $span = new CSpan(RARR); $span->addStyle('vertical-align:top;'); $macros_tbl->addRow(array(new CCheckBox(), $text1, $span, $text2)); } $script = '$$("#tbl_macros input:checked").each(function(obj){ $(obj.parentNode.parentNode).remove(); if (typeof(deleted_macro_cnt) == \'undefined\') deleted_macro_cnt=1; else deleted_macro_cnt++; });'; $delete_btn = new CButton('macros_del', S_DELETE_SELECTED, $script); $delete_btn->setType('button'); $add_button = new CButton('macro_add', S_ADD, 'javascript: addMacroRow()'); $add_button->setType('button'); $buttonRow = new CRow(); $buttonRow->setAttribute('id', 'row_new_macro'); $col = new CCol(array($add_button, SPACE, $delete_btn)); $col->setAttribute('colspan', 4); $buttonRow->addItem($col); $macros_tbl->addRow($buttonRow); $footer = null; if ($hostid === null) { $footer = array(new CButton('save', S_SAVE, "if (deleted_macro_cnt > 0) return confirm('" . S_ARE_YOU_SURE_YOU_WANT_TO_DELETE . " '+deleted_macro_cnt+' " . S_MACROS_ES . "?');")); } return new CFormElement(S_MACROS, $macros_tbl, $footer); }
// SELECT GRAPHS $params = array('hostids' => $hostids, 'preservekeys' => 1, 'output' => API_OUTPUT_EXTEND); $graphs = CGraph::get($params); // SELECT GRAPH ITEMS $graphids = zbx_objectValues($graphs, 'graphid'); $params = array('graphids' => $graphids, 'output' => API_OUTPUT_EXTEND, 'preservekeys' => 1, 'expandData' => 1); $gitems = CGraphItem::get($params); foreach ($gitems as $gnum => $gitem) { $gitems[$gitem['gitemid']]['host_key_'] = $gitem['host'] . ':' . $gitem['key_']; } // SELECT TEMPLATES $params = array('hostids' => $hostids, 'preservekeys' => 1, 'output' => API_OUTPUT_EXTEND); $templates = CTemplate::get($params); // SELECT MACROS $params = array('hostids' => $hostids, 'preservekeys' => 1, 'output' => API_OUTPUT_EXTEND); $macros = CUserMacro::get($params); // SELECT ITEMS $params = array('hostids' => $hostids, 'preservekeys' => 1, 'output' => API_OUTPUT_EXTEND); $items = CItem::get($params); // SELECT APPLICATIONS $itemids = zbx_objectValues($items, 'itemid'); //sdii($itemids); $params = array('itemids' => $itemids, 'preservekeys' => 1, 'output' => API_OUTPUT_EXTEND); $applications = Capplication::get($params); //sdii($applications); // SELECT TRIGGERS $params = array('hostids' => $hostids, 'output' => API_OUTPUT_EXTEND, 'preservekeys' => 1, 'select_dependencies' => API_OUTPUT_EXTEND, 'expandData' => 1); $triggers = CTrigger::get($params); foreach ($triggers as $tnum => $trigger) { $triggers[$trigger['triggerid']]['expression'] = explode_exp($trigger['expression'], false); }
/** * remove Hosts to HostGroups. All Hosts are added to all HostGroups. * * @param array $data * @param array $data['templateids'] * @param array $data['groupids'] * @param array $data['hostids'] * @param array $data['macroids'] * @return boolean */ public static function massRemove($data) { $templateids = zbx_toArray($data['templateids']); try { self::BeginTransaction(__METHOD__); $upd_templates = self::get(array('templateids' => $templateids, 'editable' => 1, 'preservekeys' => 1)); foreach ($templateids as $templateid) { if (!isset($upd_templates[$templateid])) { self::exception(ZBX_API_ERROR_PERMISSIONS, S_NO_PERMISSION); } } if (isset($data['groupids'])) { $options = array('groupids' => zbx_toArray($data['groupids']), 'templateids' => $templateids); $result = CHostGroup::massRemove($options); if (!$result) { self::exception(ZBX_API_ERROR_PARAMETERS, 'Can\'t unlink groups'); } } if (isset($data['hostids'])) { $hostids = zbx_toArray($data['hostids']); foreach ($hostids as $hostid) { foreach ($templateids as $templateid) { $result = unlink_template($hostid, $templateid, true); if (!$result) { self::exception(ZBX_API_ERROR_PARAMETERS, 'Can\'t unlink hosts'); } } } } if (isset($data['templateids_link'])) { $templateids_link = zbx_toArray($data['templateids_link']); foreach ($templateids_link as $templateid_link) { foreach ($templateids as $templateid) { $result = unlink_template($templateid, $templateid_link, true); if (!$result) { self::exception(ZBX_API_ERROR_PARAMETERS, 'Can\'t unlink templates'); } } } } if (isset($data['macros'])) { $options = array('templateids' => $templateids, 'macros' => zbx_toArray($data['macros'])); $result = CUserMacro::massRemove($options); if (!$result) { self::exception(ZBX_API_ERROR_PARAMETERS, 'Can\'t remove macros'); } } self::EndTransaction(true, __METHOD__); return array('templateids' => $templateids); } catch (APIException $e) { self::EndTransaction(false, __METHOD__); $error = $e->getErrors(); $error = reset($error); self::setError(__METHOD__, $e->getCode(), $error); return false; } }
/** * Get Triggers data * * @param _array $options * @param array $options['itemids'] * @param array $options['hostids'] * @param array $options['groupids'] * @param array $options['triggerids'] * @param array $options['applicationids'] * @param array $options['status'] * @param array $options['editable'] * @param array $options['extendoutput'] * @param array $options['count'] * @param array $options['pattern'] * @param array $options['limit'] * @param array $options['order'] * @return array|int item data as array or false if error */ public static function get($options = array()) { global $USER_DETAILS; $result = array(); $user_type = $USER_DETAILS['type']; $userid = $USER_DETAILS['userid']; $sort_columns = array('triggerid', 'description', 'status', 'priority', 'lastchange'); // allowed columns for sorting $subselects_allowed_outputs = array(API_OUTPUT_REFER, API_OUTPUT_EXTEND); // allowed output options for [ select_* ] params $sql_parts = array('select' => array('triggers' => 't.triggerid'), 'from' => array('t' => 'triggers t'), 'where' => array(), 'group' => array(), 'order' => array(), 'limit' => null); $def_options = array('nodeids' => null, 'groupids' => null, 'templateids' => null, 'hostids' => null, 'triggerids' => null, 'itemids' => null, 'applicationids' => null, 'functions' => null, 'inherited' => null, 'templated' => null, 'monitored' => null, 'active' => null, 'maintenance' => null, 'withUnacknowledgedEvents' => null, 'withAcknowledgedEvents' => null, 'withLastEventUnacknowledged' => null, 'skipDependent' => null, 'nopermissions' => null, 'editable' => null, 'lastChangeSince' => null, 'lastChangeTill' => null, 'group' => null, 'host' => null, 'only_true' => null, 'min_severity' => null, 'filter' => null, 'search' => null, 'startSearch' => null, 'excludeSearch' => null, 'expandData' => null, 'expandDescription' => null, 'output' => API_OUTPUT_REFER, 'extendoutput' => null, 'select_groups' => null, 'select_hosts' => null, 'select_items' => null, 'select_functions' => null, 'select_dependencies' => null, 'countOutput' => null, 'groupCount' => null, 'preservekeys' => null, 'sortfield' => '', 'sortorder' => '', 'limit' => null, 'limitSelects' => null); $options = zbx_array_merge($def_options, $options); if (!is_null($options['extendoutput'])) { $options['output'] = API_OUTPUT_EXTEND; if (!is_null($options['select_hosts'])) { $options['select_hosts'] = API_OUTPUT_EXTEND; } if (!is_null($options['select_items'])) { $options['select_items'] = API_OUTPUT_EXTEND; } if (!is_null($options['select_dependencies'])) { $options['select_dependencies'] = API_OUTPUT_EXTEND; } } if (is_array($options['output'])) { unset($sql_parts['select']['triggers']); foreach ($options['output'] as $key => $field) { $sql_parts['select'][$field] = ' t.' . $field; } $options['output'] = API_OUTPUT_CUSTOM; } // editable + PERMISSION CHECK if (USER_TYPE_SUPER_ADMIN == $user_type || $options['nopermissions']) { } else { $permission = $options['editable'] ? PERM_READ_WRITE : PERM_READ_ONLY; /*/ $sql_parts['where'][] = ' EXISTS( '. ' SELECT tt.triggerid '. ' FROM triggers tt,functions ff,items ii,hosts_groups hgg,rights rr,users_groups ugg '. ' WHERE t.triggerid=tt.triggerid '. ' AND ff.triggerid=tt.triggerid '. ' AND ff.itemid=ii.itemid '. ' AND hgg.hostid=ii.hostid '. ' AND rr.id=hgg.groupid '. ' AND rr.groupid=ugg.usrgrpid '. ' AND ugg.userid='.$userid. ' AND rr.permission>='.$permission. ' AND NOT EXISTS( '. ' SELECT fff.triggerid '. ' FROM functions fff, items iii '. ' WHERE fff.triggerid=tt.triggerid '. ' AND fff.itemid=iii.itemid '. ' '. ' AND EXISTS( '. ' SELECT hggg.groupid '. ' FROM hosts_groups hggg, rights rrr, users_groups uggg '. ' WHERE hggg.hostid=iii.hostid '. ' AND rrr.id=hggg.groupid '. ' AND rrr.groupid=uggg.usrgrpid '. ' AND uggg.userid='.$userid. ' AND rrr.permission<'.$permission. ' ) '. ' ) '. ' ) '; //*/ //*/ $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['hosts_groups'] = 'hosts_groups hg'; $sql_parts['from']['rights'] = 'rights r'; $sql_parts['from']['users_groups'] = 'users_groups ug'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['hgi'] = 'hg.hostid=i.hostid'; $sql_parts['where'][] = 'r.id=hg.groupid '; $sql_parts['where'][] = 'r.groupid=ug.usrgrpid'; $sql_parts['where'][] = 'ug.userid=' . $userid; $sql_parts['where'][] = 'r.permission>=' . $permission; $sql_parts['where'][] = 'NOT EXISTS( ' . ' SELECT ff.triggerid ' . ' FROM functions ff, items ii ' . ' WHERE ff.triggerid=t.triggerid ' . ' AND ff.itemid=ii.itemid ' . ' AND EXISTS( ' . ' SELECT hgg.groupid ' . ' FROM hosts_groups hgg, rights rr, users_groups gg ' . ' WHERE hgg.hostid=ii.hostid ' . ' AND rr.id=hgg.groupid ' . ' AND rr.groupid=gg.usrgrpid ' . ' AND gg.userid=' . $userid . ' AND rr.permission<' . $permission . '))'; //*/ } // nodeids $nodeids = !is_null($options['nodeids']) ? $options['nodeids'] : get_current_nodeid(); // groupids if (!is_null($options['groupids'])) { zbx_value2array($options['groupids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['groupid'] = 'hg.groupid'; } $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['hosts_groups'] = 'hosts_groups hg'; $sql_parts['where']['hgi'] = 'hg.hostid=i.hostid'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['groupid'] = DBcondition('hg.groupid', $options['groupids']); if (!is_null($options['groupCount'])) { $sql_parts['group']['hg'] = 'hg.groupid'; } } // templateids if (!is_null($options['templateids'])) { zbx_value2array($options['templateids']); if (!is_null($options['hostids'])) { zbx_value2array($options['hostids']); $options['hostids'] = array_merge($options['hostids'], $options['templateids']); } else { $options['hostids'] = $options['templateids']; } } // hostids if (!is_null($options['hostids'])) { zbx_value2array($options['hostids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['hostid'] = 'i.hostid'; } $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['where']['hostid'] = DBcondition('i.hostid', $options['hostids']); $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; if (!is_null($options['groupCount'])) { $sql_parts['group']['i'] = 'i.hostid'; } } // triggerids if (!is_null($options['triggerids'])) { zbx_value2array($options['triggerids']); $sql_parts['where']['triggerid'] = DBcondition('t.triggerid', $options['triggerids']); } // itemids if (!is_null($options['itemids'])) { zbx_value2array($options['itemids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['itemid'] = 'f.itemid'; } $sql_parts['from']['functions'] = 'functions f'; $sql_parts['where']['itemid'] = DBcondition('f.itemid', $options['itemids']); $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; } // applicationids if (!is_null($options['applicationids'])) { zbx_value2array($options['applicationids']); if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['applicationid'] = 'a.applicationid'; } $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['applications'] = 'applications a'; $sql_parts['where']['a'] = DBcondition('a.applicationid', $options['applicationids']); $sql_parts['where']['ia'] = 'i.hostid=a.hostid'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; } // functions if (!is_null($options['functions'])) { zbx_value2array($options['functions']); $sql_parts['from']['functions'] = 'functions f'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where'][] = DBcondition('f.function', $options['functions'], false, true); } // monitored if (!is_null($options['monitored'])) { $sql_parts['where']['monitored'] = '' . ' NOT EXISTS (' . ' SELECT ff.functionid' . ' FROM functions ff' . ' WHERE ff.triggerid=t.triggerid' . ' AND EXISTS (' . ' SELECT ii.itemid' . ' FROM items ii, hosts hh' . ' WHERE ff.itemid=ii.itemid' . ' AND hh.hostid=ii.hostid' . ' AND (' . ' ii.status<>' . ITEM_STATUS_ACTIVE . ' OR hh.status<>' . HOST_STATUS_MONITORED . ' )' . ' )' . ' )'; $sql_parts['where']['status'] = 't.status=' . TRIGGER_STATUS_ENABLED; } // active if (!is_null($options['active'])) { $sql_parts['where']['active'] = '' . ' NOT EXISTS (' . ' SELECT ff.functionid' . ' FROM functions ff' . ' WHERE ff.triggerid=t.triggerid' . ' AND EXISTS (' . ' SELECT ii.itemid' . ' FROM items ii, hosts hh' . ' WHERE ff.itemid=ii.itemid' . ' AND hh.hostid=ii.hostid' . ' AND hh.status<>' . HOST_STATUS_MONITORED . ' )' . ' )'; $sql_parts['where']['status'] = 't.status=' . TRIGGER_STATUS_ENABLED; } // maintenance if (!is_null($options['maintenance'])) { $sql_parts['where'][] = ($options['maintenance'] == 0 ? ' NOT ' : '') . ' EXISTS (' . ' SELECT ff.functionid' . ' FROM functions ff' . ' WHERE ff.triggerid=t.triggerid' . ' AND EXISTS (' . ' SELECT ii.itemid' . ' FROM items ii, hosts hh' . ' WHERE ff.itemid=ii.itemid' . ' AND hh.hostid=ii.hostid' . ' AND hh.maintenance_status=1' . ' )' . ' )'; $sql_parts['where'][] = 't.status=' . TRIGGER_STATUS_ENABLED; } // lastChangeSince if (!is_null($options['lastChangeSince'])) { $sql_parts['where']['lastchangesince'] = 't.lastchange>' . $options['lastChangeSince']; } // lastChangeTill if (!is_null($options['lastChangeTill'])) { $sql_parts['where']['lastchangetill'] = 't.lastchange<' . $options['lastChangeTill']; } // withUnacknowledgedEvents if (!is_null($options['withUnacknowledgedEvents'])) { $sql_parts['where']['unack'] = ' EXISTS(' . ' SELECT e.eventid' . ' FROM events e' . ' WHERE e.objectid=t.triggerid' . ' AND e.object=0' . ' AND e.value=' . TRIGGER_VALUE_TRUE . ' AND e.acknowledged=0)'; } // withAcknowledgedEvents if (!is_null($options['withAcknowledgedEvents'])) { $sql_parts['where']['ack'] = 'NOT EXISTS(' . ' SELECT e.eventid' . ' FROM events e' . ' WHERE e.objectid=t.triggerid' . ' AND e.object=0' . ' AND e.value=' . TRIGGER_VALUE_TRUE . ' AND e.acknowledged=0)'; } // templated if (!is_null($options['templated'])) { $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['hosts'] = 'hosts h'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['hi'] = 'h.hostid=i.hostid'; if ($options['templated']) { $sql_parts['where'][] = 'h.status=' . HOST_STATUS_TEMPLATE; } else { $sql_parts['where'][] = 'h.status<>' . HOST_STATUS_TEMPLATE; } } // inherited if (!is_null($options['inherited'])) { if ($options['inherited']) { $sql_parts['where'][] = 't.templateid<>0'; } else { $sql_parts['where'][] = 't.templateid=0'; } } // search if (is_array($options['search'])) { zbx_db_search('triggers t', $options, $sql_parts); } // --- FILTER --- if (is_array($options['filter'])) { zbx_db_filter('triggers t', $options, $sql_parts); if (isset($options['filter']['host']) && !is_null($options['filter']['host'])) { zbx_value2array($options['filter']['host']); $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['from']['hosts'] = 'hosts h'; $sql_parts['where']['hi'] = 'h.hostid=i.hostid'; $sql_parts['where']['host'] = DBcondition('h.host', $options['filter']['host'], false, true); } if (isset($options['filter']['hostid']) && !is_null($options['filter']['hostid'])) { zbx_value2array($options['filter']['hostid']); $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['hostid'] = DBcondition('i.hostid', $options['filter']['hostid']); } } // group if (!is_null($options['group'])) { if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['name'] = 'g.name'; } $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['hosts_groups'] = 'hosts_groups hg'; $sql_parts['from']['groups'] = 'groups g'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['hgi'] = 'hg.hostid=i.hostid'; $sql_parts['where']['ghg'] = 'g.groupid = hg.groupid'; $sql_parts['where']['group'] = ' UPPER(g.name)=' . zbx_dbstr(zbx_strtoupper($options['group'])); } // host if (!is_null($options['host'])) { if ($options['output'] != API_OUTPUT_SHORTEN) { $sql_parts['select']['host'] = 'h.host'; } $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['hosts'] = 'hosts h'; $sql_parts['where']['i'] = DBcondition('i.hostid', $options['hostids']); $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['hi'] = 'h.hostid=i.hostid'; $sql_parts['where']['host'] = ' UPPER(h.host)=' . zbx_dbstr(zbx_strtoupper($options['host'])); } // only_true if (!is_null($options['only_true'])) { $sql_parts['where']['ot'] = '((t.value=' . TRIGGER_VALUE_TRUE . ')' . ' OR ' . '((t.value=' . TRIGGER_VALUE_FALSE . ') AND (t.lastchange>' . (time() - TRIGGER_FALSE_PERIOD) . ')))'; } // min_severity if (!is_null($options['min_severity'])) { $sql_parts['where'][] = 't.priority>=' . $options['min_severity']; } // output if ($options['output'] == API_OUTPUT_EXTEND) { $sql_parts['select']['triggers'] = 't.*'; } // expandData if (!is_null($options['expandData'])) { $sql_parts['select']['host'] = 'h.host'; $sql_parts['select']['hostid'] = 'h.hostid'; $sql_parts['from']['functions'] = 'functions f'; $sql_parts['from']['items'] = 'items i'; $sql_parts['from']['hosts'] = 'hosts h'; $sql_parts['where']['ft'] = 'f.triggerid=t.triggerid'; $sql_parts['where']['fi'] = 'f.itemid=i.itemid'; $sql_parts['where']['hi'] = 'h.hostid=i.hostid'; } // countOutput if (!is_null($options['countOutput'])) { $options['sortfield'] = ''; $sql_parts['select'] = array('COUNT(DISTINCT t.triggerid) as rowscount'); // groupCount if (!is_null($options['groupCount'])) { foreach ($sql_parts['group'] as $key => $fields) { $sql_parts['select'][$key] = $fields; } } } // 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'][] = 't.' . $options['sortfield'] . ' ' . $sortorder; if (!str_in_array('t.' . $options['sortfield'], $sql_parts['select']) && !str_in_array('t.*', $sql_parts['select'])) { $sql_parts['select'][] = 't.' . $options['sortfield']; } } // limit if (zbx_ctype_digit($options['limit']) && $options['limit']) { $sql_parts['limit'] = $options['limit']; } //--------------- $triggerids = array(); $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 .= ' AND ' . 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 ' . DBin_node('t.triggerid', $nodeids) . $sql_where . $sql_group . $sql_order; //SDI($sql); $db_res = DBselect($sql, $sql_limit); while ($trigger = DBfetch($db_res)) { if (!is_null($options['countOutput'])) { if (!is_null($options['groupCount'])) { $result[] = $trigger; } else { $result = $trigger['rowscount']; } } else { $triggerids[$trigger['triggerid']] = $trigger['triggerid']; if ($options['output'] == API_OUTPUT_SHORTEN) { $result[$trigger['triggerid']] = array('triggerid' => $trigger['triggerid']); } else { if (!isset($result[$trigger['triggerid']])) { $result[$trigger['triggerid']] = array(); } if (!is_null($options['select_hosts']) && !isset($result[$trigger['triggerid']]['hosts'])) { $result[$trigger['triggerid']]['hosts'] = array(); } if (!is_null($options['select_items']) && !isset($result[$trigger['triggerid']]['items'])) { $result[$trigger['triggerid']]['items'] = array(); } if (!is_null($options['select_functions']) && !isset($result[$trigger['triggerid']]['functions'])) { $result[$trigger['triggerid']]['functions'] = array(); } if (!is_null($options['select_dependencies']) && !isset($result[$trigger['triggerid']]['dependencies'])) { $result[$trigger['triggerid']]['dependencies'] = array(); } // groups if (isset($trigger['groupid']) && is_null($options['select_groups'])) { if (!isset($result[$trigger['triggerid']]['groups'])) { $result[$trigger['triggerid']]['groups'] = array(); } $result[$trigger['triggerid']]['groups'][] = array('groupid' => $trigger['groupid']); unset($trigger['groupid']); } // hostids if (isset($trigger['hostid']) && is_null($options['select_hosts'])) { if (!isset($result[$trigger['triggerid']]['hosts'])) { $result[$trigger['triggerid']]['hosts'] = array(); } $result[$trigger['triggerid']]['hosts'][] = array('hostid' => $trigger['hostid']); if (is_null($options['expandData'])) { unset($trigger['hostid']); } } // itemids if (isset($trigger['itemid']) && is_null($options['select_items'])) { if (!isset($result[$trigger['triggerid']]['items'])) { $result[$trigger['triggerid']]['items'] = array(); } $result[$trigger['triggerid']]['items'][] = array('itemid' => $trigger['itemid']); unset($trigger['itemid']); } $result[$trigger['triggerid']] += $trigger; } } } Copt::memoryPick(); if (!is_null($options['countOutput'])) { if (is_null($options['preservekeys'])) { $result = zbx_cleanHashes($result); } return $result; } // skipDependent if (!is_null($options['skipDependent'])) { $tids = $triggerids; $map = array(); do { $sql = 'SELECT d.triggerid_down, d.triggerid_up, t.value ' . ' FROM trigger_depends d, triggers t ' . ' WHERE ' . DBcondition('d.triggerid_down', $tids) . ' AND d.triggerid_up=t.triggerid'; $db_result = DBselect($sql); $tids = array(); while ($row = DBfetch($db_result)) { if (TRIGGER_VALUE_TRUE == $row['value']) { if (isset($map[$row['triggerid_down']])) { foreach ($map[$row['triggerid_down']] as $triggerid => $state) { unset($result[$triggerid]); unset($triggerids[$triggerid]); } } else { unset($result[$row['triggerid_down']]); unset($triggerids[$row['triggerid_down']]); } } else { if (isset($map[$row['triggerid_down']])) { if (!isset($map[$row['triggerid_up']])) { $map[$row['triggerid_up']] = array(); } $map[$row['triggerid_up']] += $map[$row['triggerid_down']]; } else { if (!isset($map[$row['triggerid_up']])) { $map[$row['triggerid_up']] = array(); } $map[$row['triggerid_up']][$row['triggerid_down']] = 1; } $tids[] = $row['triggerid_up']; } } } while (!empty($tids)); } // withLastEventUnacknowledged if (!is_null($options['withLastEventUnacknowledged'])) { $eventids = array(); $sql = 'SELECT max(e.eventid) as eventid, e.objectid' . ' FROM events e ' . ' WHERE e.object=' . EVENT_OBJECT_TRIGGER . ' AND ' . DBcondition('e.objectid', $triggerids) . ' AND ' . DBcondition('e.value', array(TRIGGER_VALUE_TRUE)) . ' GROUP BY e.objectid'; $events_db = DBselect($sql); while ($event = DBfetch($events_db)) { $eventids[] = $event['eventid']; } $correct_triggerids = array(); $sql = 'SELECT e.objectid' . ' FROM events e ' . ' WHERE ' . DBcondition('e.eventid', $eventids) . ' AND e.acknowledged=0'; $triggers_db = DBselect($sql); while ($trigger = DBfetch($triggers_db)) { $correct_triggerids[$trigger['objectid']] = $trigger['objectid']; } foreach ($result as $triggerid => $trigger) { if (!isset($correct_triggerids[$triggerid])) { unset($result[$triggerid]); unset($triggerids[$triggerid]); } } } // Adding Objects // Adding trigger dependencies if (!is_null($options['select_dependencies']) && str_in_array($options['select_dependencies'], $subselects_allowed_outputs)) { $deps = array(); $depids = array(); $sql = 'SELECT triggerid_up, triggerid_down ' . ' FROM trigger_depends ' . ' WHERE ' . DBcondition('triggerid_down', $triggerids); $db_deps = DBselect($sql); while ($db_dep = DBfetch($db_deps)) { if (!isset($deps[$db_dep['triggerid_down']])) { $deps[$db_dep['triggerid_down']] = array(); } $deps[$db_dep['triggerid_down']][$db_dep['triggerid_up']] = $db_dep['triggerid_up']; $depids[] = $db_dep['triggerid_up']; } $obj_params = array('triggerids' => $depids, 'output' => $options['select_dependencies'], 'expandData' => 1, 'preservekeys' => 1); $allowed = self::get($obj_params); //allowed triggerids foreach ($deps as $triggerid => $deptriggers) { foreach ($deptriggers as $num => $deptriggerid) { if (isset($allowed[$deptriggerid])) { $result[$triggerid]['dependencies'][] = $allowed[$deptriggerid]; } } } } // Adding groups if (!is_null($options['select_groups']) && str_in_array($options['select_groups'], $subselects_allowed_outputs)) { $obj_params = array('nodeids' => $nodeids, 'output' => $options['select_groups'], 'triggerids' => $triggerids, 'preservekeys' => 1); $groups = CHostgroup::get($obj_params); foreach ($groups as $groupid => $group) { $gtriggers = $group['triggers']; unset($group['triggers']); foreach ($gtriggers as $num => $trigger) { $result[$trigger['triggerid']]['groups'][] = $group; } } } // Adding hosts if (!is_null($options['select_hosts'])) { $obj_params = array('nodeids' => $nodeids, 'triggerids' => $triggerids, 'templated_hosts' => 1, 'nopermissions' => 1, 'preservekeys' => 1); if (is_array($options['select_hosts']) || str_in_array($options['select_hosts'], $subselects_allowed_outputs)) { $obj_params['output'] = $options['select_hosts']; $hosts = CHost::get($obj_params); if (!is_null($options['limitSelects'])) { order_result($hosts, 'host'); } foreach ($hosts as $hostid => $host) { unset($hosts[$hostid]['triggers']); $count = array(); foreach ($host['triggers'] as $tnum => $trigger) { if (!is_null($options['limitSelects'])) { if (!isset($count[$trigger['triggerid']])) { $count[$trigger['triggerid']] = 0; } $count[$trigger['triggerid']]++; if ($count[$trigger['triggerid']] > $options['limitSelects']) { continue; } } $result[$trigger['triggerid']]['hosts'][] =& $hosts[$hostid]; } } } else { if (API_OUTPUT_COUNT == $options['select_hosts']) { $obj_params['countOutput'] = 1; $obj_params['groupCount'] = 1; $hosts = CHost::get($obj_params); $hosts = zbx_toHash($hosts, 'hostid'); foreach ($result as $triggerid => $trigger) { if (isset($hosts[$triggerid])) { $result[$triggerid]['hosts'] = $hosts[$triggerid]['rowscount']; } else { $result[$triggerid]['hosts'] = 0; } } } } } // Adding Functions if (!is_null($options['select_functions']) && str_in_array($options['select_functions'], $subselects_allowed_outputs)) { if ($options['select_functions'] == API_OUTPUT_EXTEND) { $sql_select = 'f.*'; } else { $sql_select = 'f.functionid, f.triggerid'; } $sql = 'SELECT ' . $sql_select . ' FROM functions f ' . ' WHERE ' . DBcondition('f.triggerid', $triggerids); $res = DBselect($sql); while ($function = DBfetch($res)) { $triggerid = $function['triggerid']; unset($function['triggerid']); $result[$triggerid]['functions'][] = $function; } } // Adding Items if (!is_null($options['select_items']) && str_in_array($options['select_items'], $subselects_allowed_outputs)) { $obj_params = array('nodeids' => $nodeids, 'output' => $options['select_items'], 'triggerids' => $triggerids, 'webitems' => 1, 'nopermissions' => 1, 'preservekeys' => 1); $items = CItem::get($obj_params); foreach ($items as $itemid => $item) { $itriggers = $item['triggers']; unset($item['triggers']); foreach ($itriggers as $num => $trigger) { $result[$trigger['triggerid']]['items'][] = $item; } } } // expandDescription if (!is_null($options['expandDescription'])) { // Function compare values {{{ foreach ($result as $tnum => $trigger) { preg_match_all('/\\$([1-9])/u', $trigger['description'], $numbers); preg_match_all('~{[0-9]+}[+\\-\\*/<>=#]?[\\(]*(?P<val>[+\\-0-9]+)[\\)]*~u', $trigger['expression'], $matches); foreach ($numbers[1] as $i) { $rep = isset($matches['val'][$i - 1]) ? $matches['val'][$i - 1] : ''; $result[$tnum]['description'] = str_replace('$' . $i, $rep, $result[$tnum]['description']); } } // }}} $functionids = array(); $triggers_to_expand_hosts = array(); $triggers_to_expand_items = array(); $triggers_to_expand_items2 = array(); foreach ($result as $tnum => $trigger) { preg_match_all('/{HOSTNAME([1-9]?)}/u', $trigger['description'], $hnums); if (!empty($hnums[1])) { preg_match_all('/{([0-9]+)}/u', $trigger['expression'], $funcs); $funcs = $funcs[1]; foreach ($hnums[1] as $fnum) { $fnum = $fnum ? $fnum : 1; if (isset($funcs[$fnum - 1])) { $functionid = $funcs[$fnum - 1]; $functionids[$functionid] = $functionid; $triggers_to_expand_hosts[$trigger['triggerid']][$functionid] = $fnum; } } } preg_match_all('/{ITEM.LASTVALUE([1-9]?)}/u', $trigger['description'], $inums); if (!empty($inums[1])) { preg_match_all('/{([0-9]+)}/u', $trigger['expression'], $funcs); $funcs = $funcs[1]; foreach ($inums[1] as $fnum) { $fnum = $fnum ? $fnum : 1; if (isset($funcs[$fnum - 1])) { $functionid = $funcs[$fnum - 1]; $functionids[$functionid] = $functionid; $triggers_to_expand_items[$trigger['triggerid']][$functionid] = $fnum; } } } preg_match_all('/{ITEM.VALUE([1-9]?)}/u', $trigger['description'], $inums); if (!empty($inums[1])) { preg_match_all('/{([0-9]+)}/u', $trigger['expression'], $funcs); $funcs = $funcs[1]; foreach ($inums[1] as $fnum) { $fnum = $fnum ? $fnum : 1; if (isset($funcs[$fnum - 1])) { $functionid = $funcs[$fnum - 1]; $functionids[$functionid] = $functionid; $triggers_to_expand_items2[$trigger['triggerid']][$functionid] = $fnum; } } } } if (!empty($functionids)) { $sql = 'SELECT DISTINCT f.triggerid, f.functionid, h.host, i.lastvalue' . ' FROM functions f,items i,hosts h' . ' WHERE f.itemid=i.itemid' . ' AND i.hostid=h.hostid' . ' AND h.status<>' . HOST_STATUS_TEMPLATE . ' AND ' . DBcondition('f.functionid', $functionids); $db_funcs = DBselect($sql); while ($func = DBfetch($db_funcs)) { if (isset($triggers_to_expand_hosts[$func['triggerid']][$func['functionid']])) { $fnum = $triggers_to_expand_hosts[$func['triggerid']][$func['functionid']]; if ($fnum == 1) { $result[$func['triggerid']]['description'] = str_replace('{HOSTNAME}', $func['host'], $result[$func['triggerid']]['description']); } $result[$func['triggerid']]['description'] = str_replace('{HOSTNAME' . $fnum . '}', $func['host'], $result[$func['triggerid']]['description']); } if (isset($triggers_to_expand_items[$func['triggerid']][$func['functionid']])) { $fnum = $triggers_to_expand_items[$func['triggerid']][$func['functionid']]; if ($fnum == 1) { $result[$func['triggerid']]['description'] = str_replace('{ITEM.LASTVALUE}', $func['lastvalue'], $result[$func['triggerid']]['description']); } $result[$func['triggerid']]['description'] = str_replace('{ITEM.LASTVALUE' . $fnum . '}', $func['lastvalue'], $result[$func['triggerid']]['description']); } if (isset($triggers_to_expand_items2[$func['triggerid']][$func['functionid']])) { $fnum = $triggers_to_expand_items2[$func['triggerid']][$func['functionid']]; if ($fnum == 1) { $result[$func['triggerid']]['description'] = str_replace('{ITEM.VALUE}', $func['lastvalue'], $result[$func['triggerid']]['description']); } $result[$func['triggerid']]['description'] = str_replace('{ITEM.VALUE' . $fnum . '}', $func['lastvalue'], $result[$func['triggerid']]['description']); } } } foreach ($result as $tnum => $trigger) { if ($res = preg_match_all('/' . ZBX_PREG_EXPRESSION_USER_MACROS . '/', $trigger['description'], $arr)) { $macros = CUserMacro::getMacros($arr[1], array('triggerid' => $trigger['triggerid'])); $search = array_keys($macros); $values = array_values($macros); $result[$tnum]['description'] = str_replace($search, $values, $trigger['description']); } } } COpt::memoryPick(); // removing keys (hash -> array) if (is_null($options['preservekeys'])) { $result = zbx_cleanHashes($result); } return $result; }
} } if (!empty($macrosToUpdate)) { if (!CUsermacro::updateGlobal($macrosToUpdate)) { throw new Exception(S_CANNOT_UPDATE_MACRO); } } if (!empty($newMacros)) { $macrosToAdd = array_values($newMacros); $new_macroids = CUsermacro::createGlobal($macrosToAdd); if (!$new_macroids) { throw new Exception(S_CANNOT_ADD_MACRO); } } if (!empty($macrosToAdd)) { $new_macros = CUserMacro::get(array('globalmacroids' => $new_macroids['globalmacroids'], 'globalmacro' => 1, 'output' => API_OUTPUT_EXTEND)); $new_macros = zbx_toHash($new_macros, 'globalmacroid'); foreach ($macrosToDelete as $delm) { add_audit_ext(AUDIT_ACTION_DELETE, AUDIT_RESOURCE_MACRO, $delm['globalmacroid'], $global_macros[$delm['globalmacroid']]['macro'], null, null, null); } foreach ($new_macroids['globalmacroids'] as $newid) { add_audit_ext(AUDIT_ACTION_ADD, AUDIT_RESOURCE_MACRO, $newid, $new_macros[$newid]['macro'], null, null, null); } } DBend(true); show_messages(true, S_MACROS_UPDATED, S_CANNOT_UPDATE_MACROS); } catch (Exception $e) { DBend(false); error($e->getMessage()); show_messages(false, S_MACROS_UPDATED, S_CANNOT_UPDATE_MACROS); }
function expand_trigger_description_by_data($row, $flag = ZBX_FLAG_TRIGGER) { if ($row) { $description = expand_trigger_description_constants($row['description'], $row); for ($i = 0; $i < 10; $i++) { $macro = '{HOSTNAME' . ($i ? $i : '') . '}'; if (zbx_strstr($description, $macro)) { $functionid = trigger_get_N_functionid($row['expression'], $i ? $i : 1); if (isset($functionid)) { $sql = 'SELECT DISTINCT h.host' . ' FROM functions f,items i,hosts h' . ' WHERE f.itemid=i.itemid' . ' AND i.hostid=h.hostid' . ' AND f.functionid=' . $functionid; $host = DBfetch(DBselect($sql)); if (is_null($host['host'])) { $host['host'] = $macro; } $description = str_replace($macro, $host['host'], $description); } } } for ($i = 0; $i < 10; $i++) { $macro = '{ITEM.LASTVALUE' . ($i ? $i : '') . '}'; if (zbx_strstr($description, $macro)) { $functionid = trigger_get_N_functionid($row['expression'], $i ? $i : 1); if (isset($functionid)) { $sql = 'SELECT i.lastvalue, i.value_type, i.itemid, i.valuemapid, i.units ' . ' FROM items i, functions f ' . ' WHERE i.itemid=f.itemid ' . ' AND f.functionid=' . $functionid; $row2 = DBfetch(DBselect($sql)); $description = str_replace($macro, format_lastvalue($row2), $description); } } } for ($i = 0; $i < 10; $i++) { $macro = '{ITEM.VALUE' . ($i ? $i : '') . '}'; if (zbx_strstr($description, $macro)) { $value = $flag == ZBX_FLAG_TRIGGER ? trigger_get_func_value($row['expression'], ZBX_FLAG_TRIGGER, $i ? $i : 1, 1) : trigger_get_func_value($row['expression'], ZBX_FLAG_EVENT, $i ? $i : 1, $row['clock']); $description = str_replace($macro, $value, $description); } } if ($res = preg_match_all('/' . ZBX_PREG_EXPRESSION_USER_MACROS . '/', $description, $arr)) { $macros = CUserMacro::getMacros($arr[1], array('triggerid' => $row['triggerid'])); $search = array_keys($macros); $values = array_values($macros); $description = str_replace($search, $values, $description); } } else { $description = '*ERROR*'; } return $description; }