/** * 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(); }
/** * Deletes discovery rules and prototypes from DB that are missing in XML. * * @return null */ protected function deleteMissingDiscoveryRules() { if (!$this->options['discoveryRules']['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; } $discoveryRuleIdsXML = array(); $allDiscoveryRules = $this->getFormattedDiscoveryRules(); if ($allDiscoveryRules) { foreach ($allDiscoveryRules as $host => $discoveryRules) { $hostId = $this->referencer->resolveHostOrTemplate($host); foreach ($discoveryRules as $discoveryRule) { $discoveryRuleId = $this->referencer->resolveItem($hostId, $discoveryRule['key_']); if ($discoveryRuleId) { $discoveryRuleIdsXML[$discoveryRuleId] = $discoveryRuleId; } } } } $dbDiscoveryRuleIds = API::DiscoveryRule()->get(array('output' => array('itemid'), 'hostids' => $processedHostIds, 'preservekeys' => true, 'nopermissions' => true, 'inherited' => false)); $discoveryRulesToDelete = array_diff_key($dbDiscoveryRuleIds, $discoveryRuleIdsXML); if ($discoveryRulesToDelete) { API::DiscoveryRule()->delete(array_keys($discoveryRulesToDelete)); } // refresh discovery rules because templated ones can be inherited to host and used for prototypes $this->referencer->refreshItems(); $hostPrototypeIdsXML = array(); $triggerPrototypeIdsXML = array(); $itemPrototypeIdsXML = array(); $graphPrototypeIdsXML = array(); foreach ($allDiscoveryRules as $host => $discoveryRules) { $hostId = $this->referencer->resolveHostOrTemplate($host); foreach ($discoveryRules as $discoveryRule) { $discoveryRuleId = $this->referencer->resolveItem($hostId, $discoveryRule['key_']); if ($discoveryRuleId) { // gather host prototype IDs to delete foreach ($discoveryRule['host_prototypes'] as $hostPrototype) { $hostPrototypeId = $this->referencer->resolveHostPrototype($hostId, $discoveryRuleId, $hostPrototype['host']); if ($hostPrototypeId) { $hostPrototypeIdsXML[$hostPrototypeId] = $hostPrototypeId; } } // gather trigger prototype IDs to delete foreach ($discoveryRule['trigger_prototypes'] as $triggerPrototype) { $triggerPrototypeId = $this->referencer->resolveTrigger($triggerPrototype['description'], $triggerPrototype['expression']); if ($triggerPrototypeId) { $triggerPrototypeIdsXML[$triggerPrototypeId] = $triggerPrototypeId; } } // gather graph prototype IDs to delete foreach ($discoveryRule['graph_prototypes'] as $graphPrototype) { $graphPrototypeId = $this->referencer->resolveGraph($hostId, $graphPrototype['name']); if ($graphPrototypeId) { $graphPrototypeIdsXML[$graphPrototypeId] = $graphPrototypeId; } } // gather item prototype IDs to delete foreach ($discoveryRule['item_prototypes'] as $itemPrototype) { $itemPrototypeId = $this->referencer->resolveItem($hostId, $itemPrototype['key_']); if ($itemPrototypeId) { $itemPrototypeIdsXML[$itemPrototypeId] = $itemPrototypeId; } } } } } // delete missing host prototypes $dbHostPrototypeIds = API::HostPrototype()->get(array('output' => array('hostid'), 'discoveryids' => $discoveryRuleIdsXML, 'preservekeys' => true, 'nopermissions' => true, 'inherited' => false)); $hostPrototypesToDelete = array_diff_key($dbHostPrototypeIds, $hostPrototypeIdsXML); if ($hostPrototypesToDelete) { API::HostPrototype()->delete(array_keys($hostPrototypesToDelete)); } // delete missing trigger prototypes $dbTriggerPrototypeIds = API::TriggerPrototype()->get(array('output' => array('triggerid'), 'hostids' => $processedHostIds, 'preservekeys' => true, 'nopermissions' => true, 'inherited' => false)); $triggerPrototypesToDelete = array_diff_key($dbTriggerPrototypeIds, $triggerPrototypeIdsXML); // unlike triggers that belong to multiple hosts, trigger prototypes do not, so we just delete them if ($triggerPrototypesToDelete) { API::TriggerPrototype()->delete(array_keys($triggerPrototypesToDelete)); } // delete missing graph prototypes $dbGraphPrototypeIds = API::GraphPrototype()->get(array('output' => array('graphid'), 'hostids' => $processedHostIds, 'preservekeys' => true, 'nopermissions' => true, 'inherited' => false)); $graphPrototypesToDelete = array_diff_key($dbGraphPrototypeIds, $graphPrototypeIdsXML); // unlike graphs that belong to multiple hosts, graph prototypes do not, so we just delete them if ($graphPrototypesToDelete) { API::GraphPrototype()->delete(array_keys($graphPrototypesToDelete)); } // delete missing item prototypes $dbItemPrototypeIds = API::ItemPrototype()->get(array('output' => array('itemid'), 'hostids' => $processedHostIds, 'preservekeys' => true, 'nopermissions' => true, 'inherited' => false)); $itemPrototypesToDelete = array_diff_key($dbItemPrototypeIds, $itemPrototypeIdsXML); if ($itemPrototypesToDelete) { API::ItemPrototype()->delete(array_keys($itemPrototypesToDelete)); } }