summaryrefslogtreecommitdiffstats
path: root/application/forms/RestoreObjectForm.php
diff options
context:
space:
mode:
Diffstat (limited to 'application/forms/RestoreObjectForm.php')
-rw-r--r--application/forms/RestoreObjectForm.php92
1 files changed, 92 insertions, 0 deletions
diff --git a/application/forms/RestoreObjectForm.php b/application/forms/RestoreObjectForm.php
new file mode 100644
index 0000000..e665d65
--- /dev/null
+++ b/application/forms/RestoreObjectForm.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Icinga\Module\Director\Forms;
+
+use Icinga\Exception\NotFoundError;
+use Icinga\Exception\NotImplementedError;
+use Icinga\Module\Director\Objects\IcingaObject;
+use Icinga\Module\Director\Web\Form\DirectorForm;
+
+class RestoreObjectForm extends DirectorForm
+{
+ /** @var IcingaObject */
+ protected $object;
+
+ public function setup()
+ {
+ $this->addSubmitButton($this->translate('Restore former object'));
+ }
+
+ public function onSuccess()
+ {
+ $object = $this->object;
+ $name = $object->getObjectName();
+ $db = $this->db;
+
+ $keyParams = $object->getKeyParams();
+
+ if ($object->supportsApplyRules() && $object->get('object_type') === 'apply') {
+ // TODO: not all apply should be considered unique by name + object_type
+ $query = $db->getDbAdapter()
+ ->select()
+ ->from($object->getTableName())
+ ->where('object_type = ?', 'apply')
+ ->where('object_name = ?', $name);
+
+ $rules = $object::loadAll($db, $query);
+
+ if (empty($rules)) {
+ $existing = null;
+ } elseif (count($rules) === 1) {
+ $existing = current($rules);
+ } else {
+ // TODO: offer drop down?
+ throw new NotImplementedError(
+ "Found multiple apply rule matching name '%s', can not restore!",
+ $name
+ );
+ }
+ } else {
+ try {
+ $existing = $object::load($keyParams, $db);
+ } catch (NotFoundError $e) {
+ $existing = null;
+ }
+ }
+
+ if ($existing !== null) {
+ $typeExisting = $existing->get('object_type');
+ $typeObject = $object->get('object_type');
+ if ($typeExisting !== $typeObject) {
+ // Not sure when that may occur
+ throw new NotImplementedError(
+ 'Found existing object has a mismatching object_type: %s != %s',
+ $typeExisting,
+ $typeObject
+ );
+ }
+
+ $existing->replaceWith($object);
+
+ if ($existing->hasBeenModified()) {
+ $msg = $this->translate('Object has been restored');
+ $existing->store();
+ } else {
+ $msg = $this->translate(
+ 'Nothing to do, restore would not modify the current object'
+ );
+ }
+ } else {
+ $msg = $this->translate('Object has been re-created');
+ $object->store($db);
+ }
+
+ $this->redirectOnSuccess($msg);
+ }
+
+ public function setObject(IcingaObject $object)
+ {
+ $this->object = $object;
+ return $this;
+ }
+}