function update_template_dependencies_for_host($hostid) { $db_triggers = get_triggers_by_hostid($hostid); while ($trigger_data = DBfetch($db_triggers)) { $db_chd_triggers = get_triggers_by_templateid($trigger_data['triggerid']); while ($chd_trigger_data = DBfetch($db_chd_triggers)) { update_trigger($chd_trigger_data['triggerid'], NULL, NULL, NULL, NULL, NULL, NULL, NULL, replace_template_dependencies(get_trigger_dependencies_by_triggerid($trigger_data['triggerid']), $hostid), $trigger_data['triggerid']); } } }
/** * Updates the child of the templated trigger on the given host. Trigger inheritance will not propagate to * child hosts. * * @param array $trigger a templated trigger * @param array $chdHost the target host * @param array $triggerTemplates the templates, to which the templated trigger belongs * * @return array|mixed the updated child trigger */ protected function inheritOnHost(array $trigger, array $chdHost, array $triggerTemplates) { $newTrigger = $trigger; $newTrigger['templateid'] = $trigger['triggerid']; unset($newTrigger['triggerid']); if (isset($trigger['dependencies'])) { $deps = zbx_objectValues($trigger['dependencies'], 'triggerid'); $newTrigger['dependencies'] = replace_template_dependencies($deps, $chdHost['hostid']); } $expressionData = new CTriggerExpression(); $expressionData->parse($trigger['expression']); $newTrigger['expression'] = $trigger['expression']; // replace template separately in each expression, only in beginning (host part) $exprPart = end($expressionData->expressions); do { foreach ($triggerTemplates as $triggerTemplate) { if ($triggerTemplate['host'] == $exprPart['host']) { $exprPart['host'] = $chdHost['host']; break; } } $newTrigger['expression'] = substr_replace($newTrigger['expression'], '{' . $exprPart['host'] . ':' . $exprPart['item'] . '.' . $exprPart['function'] . '}', $exprPart['pos'], strlen($exprPart['expression'])); } while ($exprPart = prev($expressionData->expressions)); // check if a child trigger already exists on the host $childTriggers = $this->get(array('filter' => array('templateid' => $newTrigger['templateid']), 'output' => array('triggerid'), 'hostids' => $chdHost['hostid'])); // yes we have a child trigger, just update it if ($childTrigger = reset($childTriggers)) { $newTrigger['triggerid'] = $childTrigger['triggerid']; } else { // look for a trigger with the same description and expression $childTriggers = $this->get(array('filter' => array('description' => $newTrigger['description'], 'flags' => null), 'output' => array('triggerid', 'expression'), 'nopermissions' => true, 'hostids' => $chdHost['hostid'])); foreach ($childTriggers as $childTrigger) { $tmpExp = explode_exp($childTrigger['expression']); if (strcmp($tmpExp, $newTrigger['expression']) == 0) { // we have a trigger with the same description and expression as the parent // convert it to a template trigger $newTrigger['triggerid'] = $childTrigger['triggerid']; break; } } } $this->checkIfExistsOnHost($newTrigger, $chdHost['hostid']); if (isset($newTrigger['triggerid'])) { $this->updateReal($newTrigger); } else { $oldTrigger = $this->get(array('triggerids' => $trigger['triggerid'], 'output' => API_OUTPUT_EXTEND, 'preservekeys' => true)); $oldTrigger = reset($oldTrigger); unset($oldTrigger['triggerid']); foreach ($oldTrigger as $key => $value) { if (!isset($newTrigger[$key])) { $newTrigger[$key] = $oldTrigger[$key]; } } $this->createReal($newTrigger); $newTrigger = reset($newTrigger); } return $newTrigger; }
function update_trigger($triggerid, $expression = NULL, $description = NULL, $type = NULL, $priority = NULL, $status = NULL, $comments = NULL, $url = NULL, $deps = array(), $templateid = 0) { $trigger = get_trigger_by_triggerid($triggerid); $trig_hosts = get_hosts_by_triggerid($triggerid); $trig_host = DBfetch($trig_hosts); $event_to_unknown = false; if (is_null($expression)) { /* Restore expression */ $expression = explode_exp($trigger['expression'], 0); } else { if ($expression != explode_exp($trigger['expression'], 0)) { $event_to_unknown = true; } } if (!validate_expression($expression)) { return false; } if (!validate_trigger_dependency($expression, $deps)) { return false; } $exp_hosts = get_hosts_by_expression($expression); if ($exp_hosts) { $chd_hosts = get_hosts_by_templateid($trig_host['hostid']); if (DBfetch($chd_hosts)) { $exp_host = DBfetch($exp_hosts); $db_chd_triggers = get_triggers_by_templateid($triggerid); while ($db_chd_trigger = DBfetch($db_chd_triggers)) { $chd_trig_hosts = get_hosts_by_triggerid($db_chd_trigger['triggerid']); $chd_trig_host = DBfetch($chd_trig_hosts); $newexpression = str_replace('{' . $exp_host['host'] . ':', '{' . $chd_trig_host['host'] . ':', $expression); // recursion update_trigger($db_chd_trigger['triggerid'], $newexpression, $description, $type, $priority, NULL, $comments, $url, replace_template_dependencies($deps, $chd_trig_host['hostid']), $triggerid); } } } $result = delete_function_by_triggerid($triggerid); if (!$result) { return $result; } $expression = implode_exp($expression, $triggerid); /* errors can be ignored cose function must return NULL */ if ($event_to_unknown) { add_event($triggerid, TRIGGER_VALUE_UNKNOWN); } reset_items_nextcheck($triggerid); $sql = 'UPDATE triggers SET '; if (!is_null($expression)) { $sql .= ' expression=' . zbx_dbstr($expression) . ','; } if (!is_null($description)) { $sql .= ' description=' . zbx_dbstr($description) . ','; } if (!is_null($type)) { $sql .= ' type=' . $type . ','; } if (!is_null($priority)) { $sql .= ' priority=' . $priority . ','; } if (!is_null($status)) { $sql .= ' status=' . $status . ','; } if (!is_null($comments)) { $sql .= ' comments=' . zbx_dbstr($comments) . ','; } if (!is_null($url)) { $sql .= ' url=' . zbx_dbstr($url) . ','; } if (!is_null($templateid)) { $sql .= ' templateid=' . $templateid . ','; } $sql .= ' value=2 WHERE triggerid=' . $triggerid; $result = DBexecute($sql); delete_dependencies_by_triggerid($triggerid); foreach ($deps as $id => $triggerid_up) { if (!($result2 = add_trigger_dependency($triggerid, $triggerid_up))) { error(S_INCORRECT_DEPENDENCY . ' [' . expand_trigger_description($triggerid_up) . ']'); } $result &= $result2; } if ($result) { $trig_hosts = get_hosts_by_triggerid($triggerid); $msg = 'Trigger "' . $trigger['description'] . '" updated'; $trig_host = DBfetch($trig_hosts); if ($trig_host) { $msg .= ' for host "' . $trig_host['host'] . '"'; } info($msg); } if ($result) { $trigger_new = get_trigger_by_triggerid($triggerid); add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_TRIGGER, $triggerid, $trigger['description'], 'triggers', $trigger, $trigger_new); } $result = $result ? $triggerid : $result; return $result; }
/** * Synchronizes the templated trigger dependencies on the given hosts inherited from the given * templates. * Update dependencies, do it after all triggers that can be dependent were created/updated on * all child hosts/templates. Starting from highest level template triggers select triggers from * one level lower, then for each lower trigger look if it's parent has dependencies, if so * find this dependency trigger child on dependent trigger host and add new dependency. * * @param array $data * * @return void */ public function syncTemplateDependencies(array $data) { $templateIds = zbx_toArray($data['templateids']); $hostIds = zbx_toArray($data['hostids']); $parentTriggers = $this->get(['output' => ['triggerid'], 'hostids' => $templateIds, 'preservekeys' => true, 'selectDependencies' => ['triggerid']]); if ($parentTriggers) { $childTriggers = $this->get(['output' => ['triggerid', 'templateid'], 'hostids' => $hostIds ? $hostIds : null, 'filter' => ['templateid' => array_keys($parentTriggers)], 'nopermissions' => true, 'preservekeys' => true, 'selectHosts' => ['hostid']]); if ($childTriggers) { $newDependencies = []; foreach ($childTriggers as $childTrigger) { $parentDependencies = $parentTriggers[$childTrigger['templateid']]['dependencies']; if ($parentDependencies) { $dependencies = []; foreach ($parentDependencies as $depTrigger) { $dependencies[] = $depTrigger['triggerid']; } $host = reset($childTrigger['hosts']); $dependencies = replace_template_dependencies($dependencies, $host['hostid']); foreach ($dependencies as $depTriggerId) { $newDependencies[] = ['triggerid' => $childTrigger['triggerid'], 'dependsOnTriggerid' => $depTriggerId]; } } } $this->deleteDependencies($childTriggers); if ($newDependencies) { $this->addDependencies($newDependencies); } } } }
function update_trigger($triggerid, $expression = NULL, $description = NULL, $type = NULL, $priority = NULL, $status = NULL, $comments = NULL, $url = NULL, $deps = array(), $templateid = 0) { $trigger = get_trigger_by_triggerid($triggerid); $trig_hosts = get_hosts_by_triggerid($triggerid); $trig_host = DBfetch($trig_hosts); $event_to_unknown = false; // Restore expression if (is_null($expression)) { $expression = explode_exp($trigger['expression'], 0); $expr = new CTriggerExpression(array('expression' => $expression)); } else { $expr = new CTriggerExpression(array('expression' => $expression)); $event_to_unknown = empty($expr->errors) && $expression != explode_exp($trigger['expression'], 0); } if (!empty($expr->errors)) { foreach ($expr->errors as $error) { error($error); } return false; } if (!is_null($deps) && !validate_trigger_dependency($expression, $deps)) { error(S_WRONG_DEPENDENCY_ERROR); return false; } if (is_null($description)) { $description = $trigger['description']; } if (CTrigger::exists(array('description' => $description, 'expression' => $expression))) { $host = reset($expr->data['hosts']); $options = array('filter' => array('description' => $description, 'host' => $host), 'output' => API_OUTPUT_EXTEND, 'editable' => 1); $triggers_exist = CTrigger::get($options); $trigger_exist = false; foreach ($triggers_exist as $tnum => $tr) { $tmp_exp = explode_exp($tr['expression'], false); if (strcmp($tmp_exp, $expression) == 0) { $trigger_exist = $tr; break; } } if ($trigger_exist && $trigger_exist['triggerid'] != $trigger['triggerid']) { error('Trigger with name "' . $trigger['description'] . '" and expression "' . $expression . '" already exists.'); return false; } else { if (!$trigger_exist) { error('No Permissions'); return false; } } } $exp_hosts = $expr->data['hosts']; if (!empty($exp_hosts)) { $chd_hosts = get_hosts_by_templateid($trig_host['hostid']); if (DBfetch($chd_hosts)) { $expHostName = reset($exp_hosts); $db_chd_triggers = get_triggers_by_templateid($triggerid); while ($db_chd_trigger = DBfetch($db_chd_triggers)) { $chd_trig_hosts = get_hosts_by_triggerid($db_chd_trigger['triggerid']); $chd_trig_host = DBfetch($chd_trig_hosts); $newexpression = str_replace('{' . $expHostName . ':', '{' . $chd_trig_host['host'] . ':', $expression); // recursion update_trigger($db_chd_trigger['triggerid'], $newexpression, $description, $type, $priority, $status, $comments, $url, is_null($deps) ? null : replace_template_dependencies($deps, $chd_trig_host['hostid']), $triggerid); } } } $result = delete_function_by_triggerid($triggerid); if (!$result) { return $result; } $expression = implode_exp($expression, $triggerid); if (is_null($expression)) { return false; } $update_values = array(); if (!is_null($expression)) { $update_values['expression'] = $expression; } if (!is_null($description)) { $update_values['description'] = $description; } if (!is_null($type)) { $update_values['type'] = $type; } if (!is_null($priority)) { $update_values['priority'] = $priority; } if (!is_null($status)) { $update_values['status'] = $status; } if (!is_null($comments)) { $update_values['comments'] = $comments; } if (!is_null($url)) { $update_values['url'] = $url; } if (!is_null($templateid)) { $update_values['templateid'] = $templateid; } if ($event_to_unknown || !is_null($status) && $status != TRIGGER_STATUS_ENABLED) { if ($trigger['value'] != TRIGGER_VALUE_UNKNOWN) { addEvent($triggerid, TRIGGER_VALUE_UNKNOWN); $update_values['value'] = TRIGGER_VALUE_UNKNOWN; $update_values['lastchange'] = time(); } } DB::update('triggers', array('values' => $update_values, 'where' => array('triggerid=' . $triggerid))); if (!is_null($deps)) { delete_dependencies_by_triggerid($triggerid); foreach ($deps as $id => $triggerid_up) { if (!($result2 = add_trigger_dependency($triggerid, $triggerid_up))) { error(S_INCORRECT_DEPENDENCY . ' [' . expand_trigger_description($triggerid_up) . ']'); } $result &= $result2; } } if ($result) { $trig_hosts = get_hosts_by_triggerid($triggerid); $msg = S_TRIGGER . SPACE . '"' . $trigger['description'] . '"' . SPACE . S_UPDATED_SMALL; $trig_host = DBfetch($trig_hosts); if ($trig_host) { $msg .= SPACE . S_FOR_HOST_SMALL . SPACE . '"' . $trig_host['host'] . '"'; } info($msg); } if ($result) { $trigger_new = get_trigger_by_triggerid($triggerid); add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_TRIGGER, $triggerid, $trig_host['host'] . ':' . $trigger['description'], 'triggers', $trigger, $trigger_new); } $result = $result ? $triggerid : $result; return $result; }