summaryrefslogtreecommitdiffstats
path: root/library/Director/Web/Table/CustomvarVariantsTable.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/Director/Web/Table/CustomvarVariantsTable.php')
-rw-r--r--library/Director/Web/Table/CustomvarVariantsTable.php125
1 files changed, 125 insertions, 0 deletions
diff --git a/library/Director/Web/Table/CustomvarVariantsTable.php b/library/Director/Web/Table/CustomvarVariantsTable.php
new file mode 100644
index 0000000..80fca70
--- /dev/null
+++ b/library/Director/Web/Table/CustomvarVariantsTable.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace Icinga\Module\Director\Web\Table;
+
+use Icinga\Module\Director\Db;
+use Icinga\Module\Director\PlainObjectRenderer;
+use gipfl\IcingaWeb2\Link;
+use gipfl\IcingaWeb2\Table\ZfQueryBasedTable;
+use Zend_Db_Adapter_Abstract as ZfDbAdapter;
+use Zend_Db_Select as ZfDbSelect;
+
+class CustomvarVariantsTable extends ZfQueryBasedTable
+{
+ protected $searchColumns = ['varvalue'];
+
+ protected $varName;
+
+ public static function create(Db $db, $varName)
+ {
+ $table = new static($db);
+ $table->varName = $varName;
+ $table->getAttributes()->set('class', 'common-table');
+ return $table;
+ }
+
+ public function renderRow($row)
+ {
+ if ($row->format === 'json') {
+ $value = PlainObjectRenderer::render(json_decode($row->varvalue));
+ } else {
+ $value = $row->varvalue;
+ }
+ $tr = $this::row([
+ /* new Link(
+ $value,
+ 'director/customvar/value',
+ ['name' => $row->varvalue]
+ )*/
+ $value
+ ]);
+
+ foreach ($this->getObjectTypes() as $type) {
+ $cnt = (int) $row->{"cnt_$type"};
+ if ($cnt === 0) {
+ $cnt = '-';
+ }
+ $tr->add($this::td($cnt));
+ }
+
+ return $tr;
+ }
+
+ public function getColumnsToBeRendered()
+ {
+ return array(
+ $this->translate('Variable Value'),
+ $this->translate('Commands'),
+ $this->translate('Hosts'),
+ $this->translate('Services'),
+ $this->translate('Service Sets'),
+ $this->translate('Notifications'),
+ $this->translate('Users'),
+ );
+ }
+
+ protected function getObjectTypes()
+ {
+ return ['command', 'host', 'service', 'service_set', 'notification', 'user'];
+ }
+
+ public function prepareQuery()
+ {
+ $db = $this->db();
+ $varsColumns = ['varvalue' => 'v.varvalue'];
+ $varsTypes = $this->getObjectTypes();
+ foreach ($varsTypes as $type) {
+ $varsColumns["cnt_$type"] = '(0)';
+ }
+ $varsQueries = [];
+ foreach ($varsTypes as $type) {
+ $varsQueries[] = $this->makeVarSub($type, $varsColumns, $db);
+ }
+
+ $union = $db->select()->union($varsQueries, ZfDbSelect::SQL_UNION_ALL);
+
+ $columns = [
+ 'varvalue' => 'u.varvalue',
+ 'format' => 'u.format',
+ ];
+ foreach ($varsTypes as $column) {
+ $columns["cnt_$column"] = "SUM(u.cnt_$column)";
+ }
+ return $db->select()->from(['u' => $union], $columns)
+ ->group('u.varvalue')->group('u.format')
+ ->order('u.varvalue ASC')
+ ->order('u.format ASC')
+ ->limit(100);
+ }
+
+ /**
+ * @param string $type
+ * @param array $columns
+ * @param ZfDbAdapter $db
+ * @return ZfDbSelect
+ */
+ protected function makeVarSub($type, array $columns, ZfDbAdapter $db)
+ {
+ $columns["cnt_$type"] = 'COUNT(*)';
+ $columns['format'] = 'v.format';
+ return $db->select()->from(
+ ['v' => "icinga_${type}_var"],
+ $columns
+ )->join(
+ ['o' => "icinga_${type}"],
+ "o.id = v.${type}_id",
+ []
+ )->where(
+ 'v.varname = ?',
+ $this->varName
+ )->where(
+ 'o.object_type != ?',
+ 'external_object'
+ )->group('varvalue')->group('v.format');
+ }
+}