/** * Deletes triggers from DB that are missing in XML. * * @return null */ protected function deleteMissingTriggers() { if (!$this->options['triggers']['deleteMissing']) { return; } $processedHostIds = $this->importedObjectContainer->getHostIds(); $processedTemplateIds = $this->importedObjectContainer->getTemplateIds(); $processedHostIds = array_merge($processedHostIds, $processedTemplateIds); // no hosts or templates have been processed if (!$processedHostIds) { return; } $triggersXML = array(); $allTriggers = $this->getFormattedTriggers(); if ($allTriggers) { foreach ($allTriggers as $trigger) { $triggerId = $this->referencer->resolveTrigger($trigger['description'], $trigger['expression']); if ($triggerId) { $triggersXML[$triggerId] = $triggerId; } } } $dbTriggerIds = API::Trigger()->get(array('output' => array('triggerid'), 'hostids' => $processedHostIds, 'selectHosts' => array('hostid'), 'preservekeys' => true, 'nopermissions' => true, 'inherited' => false, 'filter' => array('flags' => ZBX_FLAG_DISCOVERY_NORMAL))); // check that potentially deletable trigger belongs to same hosts that are in XML // if some triggers belong to more hosts than current XML contains, don't delete them $triggersToDelete = array_diff_key($dbTriggerIds, $triggersXML); $triggerIdsToDelete = array(); $processedHostIds = array_flip($processedHostIds); foreach ($triggersToDelete as $triggerId => $trigger) { $triggerHostIds = array_flip(zbx_objectValues($trigger['hosts'], 'hostid')); if (!array_diff_key($triggerHostIds, $processedHostIds)) { $triggerIdsToDelete[] = $triggerId; } } if ($triggerIdsToDelete) { API::Trigger()->delete($triggerIdsToDelete); } // refresh triggers because template triggers can be inherited to host and used in maps $this->referencer->refreshTriggers(); }
/** * Import triggers. */ protected function processTriggers() { $allTriggers = $this->getFormattedTriggers(); if (empty($allTriggers)) { return; } $triggersToCreate = array(); $triggersToUpdate = array(); $triggersToCreateDependencies = array(); foreach ($allTriggers as $trigger) { $triggerId = $this->referencer->resolveTrigger($trigger['description'], $trigger['expression']); if ($triggerId) { $deps = array(); foreach ($trigger['dependencies'] as $dependency) { $depTriggerId = $this->referencer->resolveTrigger($dependency['name'], $dependency['expression']); if (!$depTriggerId) { throw new Exception(_s('Trigger "%1$s" depends on trigger "%2$s", which does not exist.', $trigger['description'], $dependency['name'])); } $deps[] = array('triggerid' => $depTriggerId); } $trigger['dependencies'] = $deps; $trigger['triggerid'] = $triggerId; $triggersToUpdate[] = $trigger; } else { $triggersToCreateDependencies[] = $trigger['dependencies']; unset($trigger['dependencies']); $triggersToCreate[] = $trigger; } } $triggerDependencies = array(); $newTriggers = array(); if ($this->options['triggers']['createMissing'] && $triggersToCreate) { $newTriggerIds = API::Trigger()->create($triggersToCreate); foreach ($newTriggerIds['triggerids'] as $tnum => $triggerId) { $trigger = $triggersToCreate[$tnum]; $this->referencer->addTriggerRef($trigger['description'], $trigger['expression'], $triggerId); $newTriggers[$triggerId] = $trigger; } } // if we have new triggers with dependencies and they were created, create their dependencies if ($triggersToCreateDependencies && isset($newTriggerIds)) { foreach ($newTriggerIds['triggerids'] as $tnum => $triggerId) { $deps = array(); foreach ($triggersToCreateDependencies[$tnum] as $dependency) { $depTriggerId = $this->referencer->resolveTrigger($dependency['name'], $dependency['expression']); if (!$depTriggerId) { $trigger = $newTriggers[$triggerId]; throw new Exception(_s('Trigger "%1$s" depends on trigger "%2$s", which does not exist.', $trigger['description'], $dependency['name'])); } $deps[] = array('triggerid' => $depTriggerId); } if (!empty($deps)) { $triggerDependencies[] = array('triggerid' => $triggerId, 'dependencies' => $deps); } } } if ($this->options['triggers']['updateExisting'] && $triggersToUpdate) { API::Trigger()->update($triggersToUpdate); } if ($triggerDependencies) { API::Trigger()->update($triggerDependencies); } // refresh triggers because template triggers can be inherited to host and used in maps $this->referencer->refreshTriggers(); }