diff --git a/library/Director/Import/Sync.php b/library/Director/Import/Sync.php index 28fc4828..a8fe247e 100644 --- a/library/Director/Import/Sync.php +++ b/library/Director/Import/Sync.php @@ -4,7 +4,7 @@ namespace Icinga\Module\Director\Import; use Exception; use Icinga\Data\Filter\Filter; -use Icinga\Module\Director\Import\SyncUtils; +use Icinga\Module\Director\Db; use Icinga\Module\Director\Objects\IcingaObject; use Icinga\Module\Director\Objects\ImportSource; use Icinga\Module\Director\Objects\IcingaService; @@ -20,6 +20,11 @@ class Sync */ protected $rule; + /** + * @var Db + */ + protected $db; + /** * Related ImportSource objects * @@ -63,6 +68,9 @@ class Sync protected $syncProperties; + /** + * @var SyncRun + */ protected $run; protected $runStartTime; @@ -72,6 +80,8 @@ class Sync /** * Constructor. No direct initialization allowed right now. Please use one * of the available static factory methods + * + * @param SyncRule $rule */ public function __construct(SyncRule $rule) { @@ -240,6 +250,7 @@ class Sync $combinedKey = $this->rule->hasCombinedKey(); foreach ($this->sources as $source) { + /** @var ImportSource $source */ $sourceId = $source->id; // Provide an alias column for our key. TODO: double-check this! @@ -544,6 +555,8 @@ class Sync $dba = $db->getDbAdapter(); $dba->beginTransaction(); + $object = null; + try { $formerActivityChecksum = Util::hex2binary( $db->getLastActivityChecksum() @@ -604,7 +617,15 @@ class Sync } catch (Exception $e) { $dba->rollBack(); - throw $e; + if ($object !== null && $object instanceof IcingaObject) { + throw new IcingaException( + 'Exception while syncing %s %s: %s', + get_class($object), $object->get('object_name'), $e->getMessage(), $e + ); + } + else { + throw $e; + } } return $this->run->id; diff --git a/library/Director/Objects/IcingaObject.php b/library/Director/Objects/IcingaObject.php index 0f6d4556..aec05378 100644 --- a/library/Director/Objects/IcingaObject.php +++ b/library/Director/Objects/IcingaObject.php @@ -401,7 +401,7 @@ abstract class IcingaObject extends DbObject implements IcingaConfigRenderer */ public function setAssign_filter($filter) { - if (! $this->supportsAssignments()) { + if (! $this->supportsAssignments() && $filter !== null) { if ($this->hasProperty('object_type')) { $type = $this->object_type; } else { diff --git a/library/Director/PlainObjectRenderer.php b/library/Director/PlainObjectRenderer.php index 8267bd4b..11d0eead 100644 --- a/library/Director/PlainObjectRenderer.php +++ b/library/Director/PlainObjectRenderer.php @@ -98,14 +98,28 @@ class PlainObjectRenderer return self::renderInteger($object); } elseif (is_float($object)) { return self::renderFloat($object); + } elseif (is_object($object) || static::isAssocArray($object)) { + return self::renderHash($object, $prefix); } elseif (is_array($object)) { return self::renderArray($object, $prefix); - } elseif (is_object($object)) { - return self::renderHash($object, $prefix); } elseif (is_string($object)) { return self::renderString($object); } else { return '(UNKNOWN TYPE) ' . var_export($object, 1); } } + + /** + * Check if an array contains assoc keys + * + * @from https://stackoverflow.com/questions/173400/how-to-check-if-php-array-is-associative-or-sequential + * @param $arr + * @return bool + */ + protected static function isAssocArray($arr) + { + if (! is_array($arr)) return false; + if (array() === $arr) return false; + return array_keys($arr) !== range(0, count($arr) - 1); + } }