Esempio n. 1
0
     $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
Esempio n. 2
0
 /**
  * @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);
     }
 }
Esempio n. 3
0
     }
     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();