/** * Import triggers. */ protected function processTriggers() { if (!$this->options['triggers']['createMissing'] && !$this->options['triggers']['updateExisting']) { return; } $allTriggers = $this->getFormattedTriggers(); if (!$allTriggers) { return; } $triggersToCreate = []; $triggersToUpdate = []; // the list of triggers to process dependencies $triggers = []; foreach ($allTriggers as $trigger) { // search for existing items in trigger expressions foreach ($trigger['parsedExpressions'] as $expression) { $hostId = $this->referencer->resolveHostOrTemplate($expression['host']); $itemId = $hostId ? $this->referencer->resolveItem($hostId, $expression['item']) : false; if (!$itemId) { throw new Exception(_s('Cannot find item "%1$s" on "%2$s" used in trigger "%3$s".', $expression['item'], $expression['host'], $trigger['description'])); } } $triggerId = $this->referencer->resolveTrigger($trigger['description'], $trigger['expression']); if ($triggerId) { if ($this->options['triggers']['updateExisting']) { $triggers[] = $trigger; $trigger['triggerid'] = $triggerId; unset($trigger['dependencies']); $triggersToUpdate[] = $trigger; } } else { if ($this->options['triggers']['createMissing']) { $triggers[] = $trigger; unset($trigger['dependencies']); $triggersToCreate[] = $trigger; } } } if ($triggersToCreate) { $result = API::Trigger()->create($triggersToCreate); foreach ($result['triggerids'] as $tnum => $triggerid) { $trigger = $triggersToCreate[$tnum]; $this->referencer->addTriggerRef($trigger['description'], $trigger['expression'], $triggerid); } } if ($triggersToUpdate) { API::Trigger()->update($triggersToUpdate); } // refresh triggers because template triggers can be inherited to host and used in maps $this->referencer->refreshTriggers(); $this->processTriggerDependencies($triggers); }
/** * 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(); }