Example #1
0
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']);
        }
    }
}
Example #2
0
 /**
  * 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;
 }
Example #3
0
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;
}
Example #4
0
 /**
  * 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;
}