$triggerids = zbx_objectValues($triggers, 'triggerid'); if ($_REQUEST['go'] == 'activate') { $status = TRIGGER_STATUS_ENABLED; $status_old = array('status' => 1); $status_new = array('status' => 0); } else { $status = TRIGGER_STATUS_DISABLED; $status_old = array('status' => 0); $status_new = array('status' => 1); } DBstart(); $go_result = update_trigger_status($triggerids, $status); if ($go_result) { foreach ($triggers as $tnum => $trigger) { $serv_status = isset($_REQUEST['group_enable']) ? get_service_status_of_trigger($trigger['triggerid']) : 0; update_services($trigger['triggerid'], $serv_status); // updating status to all services by the dependency $host = reset($trigger['hosts']); add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_TRIGGER, $trigger['triggerid'], $host['host'] . ':' . $trigger['description'], 'triggers', $status_old, $status_new); } } $go_result = DBend($go_result); show_messages($go_result, S_STATUS_UPDATED, S_CANNOT_UPDATE_STATUS); } else { if ($_REQUEST['go'] == 'copy_to' && isset($_REQUEST['copy']) && isset($_REQUEST['g_triggerid'])) { if (isset($_REQUEST['copy_targetid']) && $_REQUEST['copy_targetid'] > 0 && isset($_REQUEST['copy_type'])) { if (0 == $_REQUEST['copy_type']) { /* hosts */ $hosts_ids = $_REQUEST['copy_targetid']; } else { // groups
/** * @param $triggers */ protected function updateReal(array $triggers) { $triggers = zbx_toArray($triggers); $infos = array(); $dbTriggers = $this->get(array('triggerids' => zbx_objectValues($triggers, 'triggerid'), 'output' => API_OUTPUT_EXTEND, 'selectHosts' => array('name'), 'selectDependencies' => API_OUTPUT_REFER, 'preservekeys' => true, 'nopermissions' => true)); $descriptionChanged = $expressionChanged = false; foreach ($triggers as &$trigger) { $dbTrigger = $dbTriggers[$trigger['triggerid']]; $hosts = zbx_objectValues($dbTrigger['hosts'], 'name'); if (isset($trigger['description']) && strcmp($dbTrigger['description'], $trigger['description']) != 0) { $descriptionChanged = true; } else { $trigger['description'] = $dbTrigger['description']; } $oldExpression = explode_exp($dbTrigger['expression']); if (isset($trigger['expression']) && strcmp($oldExpression, $trigger['expression']) != 0) { $this->validateItems($trigger); $expressionChanged = true; $expressionFull = $trigger['expression']; } if ($expressionChanged) { // check the expression $expressionData = new CTriggerExpression(); if (!$expressionData->parse($expressionFull)) { self::exception(ZBX_API_ERROR_PARAMETERS, $expressionData->error); } // remove triggers if expression is changed in a way that trigger will not appear in current host $oldExpressionData = new CTriggerExpression(); $oldExpressionData->parse($oldExpression); // chech if at least one template has stayed in expression, this means that child trigger will stay in host $oldTemplates = $oldExpressionData->getHosts(); $newTemplates = zbx_toHash($expressionData->getHosts()); $proceed = true; foreach ($oldTemplates as $oldTemplate) { if (isset($newTemplates[$oldTemplate])) { $proceed = false; break; } } // proceed if there is possibility that child triggers should be deleted if ($proceed) { $sql = 'SELECT t.triggerid' . ' FROM triggers t' . ' WHERE t.templateid=' . zbx_dbstr($trigger['triggerid']); $cTrigCursor = DBselect($sql); $cTrigIds = array(); while ($cTrig = DBfetch($cTrigCursor)) { // get templates linked to templated trigger host $templateNames = DBfetchArrayAssoc(DBselect('SELECT h.name' . ' FROM hosts h, hosts_templates ht, items i, functions f' . ' WHERE h.hostid = ht.templateid AND ht.hostid = i.hostid AND i.itemid = f.itemid AND' . ' f.triggerid=' . zbx_dbstr($cTrig['triggerid'])), 'name'); // if we have at least one template linked to trigger host inside trigger expression, // then we don't delete this trigger $expressionHosts = $expressionData->getHosts(); foreach ($expressionHosts as $templateName) { if (isset($templateNames[$templateName])) { continue 2; } } $cTrigIds[] = $cTrig['triggerid']; } $this->deleteByPks($cTrigIds); } // if the trigger contains templates, delete any events that may exist if ($this->expressionHasTemplates($expressionData)) { DB::delete('events', array('source' => array(EVENT_SOURCE_INTERNAL, EVENT_SOURCE_TRIGGERS), 'object' => EVENT_OBJECT_TRIGGER, 'objectid' => $trigger['triggerid'])); } DB::delete('functions', array('triggerid' => $trigger['triggerid'])); try { $trigger['expression'] = implode_exp($expressionFull, $trigger['triggerid'], $hosts); } catch (Exception $e) { self::exception(ZBX_API_ERROR_PARAMETERS, _s('Cannot implode expression "%s".', $expressionFull) . ' ' . $e->getMessage()); } // if the expression has changed, we must revalidate the existing dependencies if (!isset($trigger['dependencies'])) { $trigger['dependencies'] = zbx_objectValues($dbTrigger['dependencies'], 'triggerid'); } } $triggerUpdate = $trigger; if (!$descriptionChanged) { unset($triggerUpdate['description']); } if (!$expressionChanged) { unset($triggerUpdate['expression']); } // skip updating read only values unset($triggerUpdate['state'], $triggerUpdate['value'], $triggerUpdate['lastchange'], $triggerUpdate['error']); DB::update('triggers', array('values' => $triggerUpdate, 'where' => array('triggerid' => $trigger['triggerid']))); // update service status if (isset($trigger['priority']) && $trigger['priority'] != $dbTrigger['priority']) { $serviceStatus = $dbTrigger['value'] == TRIGGER_VALUE_TRUE ? $trigger['priority'] : 0; update_services($trigger['triggerid'], $serviceStatus); } // restore the full expression to properly validate dependencies $trigger['expression'] = $expressionChanged ? explode_exp($trigger['expression']) : $oldExpression; $infos[] = _s('Updated: Trigger "%1$s" on "%2$s".', $trigger['description'], implode(', ', $hosts)); add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_TRIGGER, $dbTrigger['triggerid'], $dbTrigger['description'], null, $dbTrigger, $triggerUpdate); } unset($trigger); foreach ($infos as $info) { info($info); } }
} if ($_REQUEST['go'] == 'activate') { $status = TRIGGER_STATUS_ENABLED; $status_old = array('status' => 0); $status_new = array('status' => 1); } else { $status = TRIGGER_STATUS_DISABLED; $status_old = array('status' => 1); $status_new = array('status' => 0); } DBstart(); $result = update_trigger_status($_REQUEST['g_triggerid'], $status); if ($result) { foreach ($_REQUEST['g_triggerid'] as $id => $triggerid) { $serv_status = isset($_REQUEST['group_enable']) ? get_service_status_of_trigger($triggerid) : 0; update_services($triggerid, $serv_status); // updating status to all services by the dependency add_audit_ext(AUDIT_ACTION_UPDATE, AUDIT_RESOURCE_TRIGGER, $triggerid, $triggers[$triggerid]['description'], 'triggers', $status_old, $status_new); } } $result = DBend($result); show_messages($result, S_STATUS_UPDATED, S_CANNOT_UPDATE_STATUS); } else { if (isset($_REQUEST['copy']) && isset($_REQUEST['g_triggerid']) && $_REQUEST['go'] == 'copy_to') { if (isset($_REQUEST['copy_targetid']) && $_REQUEST['copy_targetid'] > 0 && isset($_REQUEST['copy_type'])) { if (0 == $_REQUEST['copy_type']) { /* hosts */ $hosts_ids = $_REQUEST['copy_targetid']; } else { /* groups */ $hosts_ids = array();