summaryrefslogtreecommitdiffstats
path: root/application/clicommands/BasketCommand.php
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--application/clicommands/BasketCommand.php127
1 files changed, 127 insertions, 0 deletions
diff --git a/application/clicommands/BasketCommand.php b/application/clicommands/BasketCommand.php
new file mode 100644
index 0000000..dd2434f
--- /dev/null
+++ b/application/clicommands/BasketCommand.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Icinga\Module\Director\Clicommands;
+
+use Icinga\Date\DateFormatter;
+use Icinga\Module\Director\Cli\Command;
+use Icinga\Module\Director\Core\Json;
+use Icinga\Module\Director\DirectorObject\Automation\Basket;
+use Icinga\Module\Director\DirectorObject\Automation\BasketSnapshot;
+use Icinga\Module\Director\DirectorObject\ObjectPurgeHelper;
+
+/**
+ * Export Director Config Objects
+ */
+class BasketCommand extends Command
+{
+ /**
+ * List configured Baskets
+ *
+ * USAGE
+ *
+ * icingacli director basket list
+ *
+ * OPTIONS
+ */
+ public function listAction()
+ {
+ $db = $this->db()->getDbAdapter();
+ $query = $db->select()
+ ->from('director_basket', 'basket_name')
+ ->order('basket_name');
+ foreach ($db->fetchCol($query) as $name) {
+ echo "$name\n";
+ }
+ }
+
+ /**
+ * JSON-dump for objects related to the given Basket
+ *
+ * USAGE
+ *
+ * icingacli director basket dump --name <basket>
+ *
+ * OPTIONS
+ */
+ public function dumpAction()
+ {
+ $basket = $this->requireBasket();
+ $snapshot = BasketSnapshot::createForBasket($basket, $this->db());
+ echo $snapshot->getJsonDump() . "\n";
+ }
+
+ /**
+ * Take a snapshot for the given Basket
+ *
+ * USAGE
+ *
+ * icingacli director basket snapshot --name <basket>
+ *
+ * OPTIONS
+ */
+ public function snapshotAction()
+ {
+ $basket = $this->requireBasket();
+ $snapshot = BasketSnapshot::createForBasket($basket, $this->db());
+ $snapshot->store();
+ $hexSum = bin2hex($snapshot->get('content_checksum'));
+ printf(
+ "Snapshot '%s' taken for Basket '%s' at %s\n",
+ substr($hexSum, 0, 7),
+ $basket->get('basket_name'),
+ DateFormatter::formatDateTime($snapshot->get('ts_create') / 1000)
+ );
+ }
+
+ /**
+ * Restore a Basket from JSON dump provided on STDIN
+ *
+ * USAGE
+ *
+ * icingacli director basket restore < basket-dump.json
+ *
+ * OPTIONS
+ * --purge <ObjectType>[,<ObjectType] Purge objects of the
+ * Given types. WARNING: this removes ALL objects that are
+ * not shipped with the given basket
+ * --force Purge refuses to purge Objects in case there are
+ * no Objects of a given ObjectType in the provided basket
+ * unless forced to do so
+ */
+ public function restoreAction()
+ {
+ if ($purge = $this->params->get('purge')) {
+ $purge = explode(',', $purge);
+ ObjectPurgeHelper::assertObjectTypesAreEligibleForPurge($purge);
+ }
+ $json = file_get_contents('php://stdin');
+ BasketSnapshot::restoreJson($json, $this->db());
+ if ($purge) {
+ $this->purgeObjectTypes(Json::decode($json), $purge, $this->params->get('force'));
+ }
+ echo "Objects from Basket Snapshot have been restored\n";
+ }
+
+ protected function purgeObjectTypes($objects, array $types, $force = false)
+ {
+ $helper = new ObjectPurgeHelper($this->db());
+ if ($force) {
+ $helper->force();
+ }
+ foreach ($types as $type) {
+ list($className, $typeFilter) = BasketSnapshot::getClassAndObjectTypeForType($type);
+ $helper->purge(
+ isset($objects->$type) ? (array) $objects->$type : [],
+ $className,
+ $typeFilter
+ );
+ }
+ }
+
+ /**
+ */
+ protected function requireBasket()
+ {
+ return Basket::load($this->params->getRequired('name'), $this->db());
+ }
+}