summaryrefslogtreecommitdiffstats
path: root/application/clicommands/Icinga2Command.php
diff options
context:
space:
mode:
Diffstat (limited to 'application/clicommands/Icinga2Command.php')
-rw-r--r--application/clicommands/Icinga2Command.php206
1 files changed, 206 insertions, 0 deletions
diff --git a/application/clicommands/Icinga2Command.php b/application/clicommands/Icinga2Command.php
new file mode 100644
index 0000000..816e063
--- /dev/null
+++ b/application/clicommands/Icinga2Command.php
@@ -0,0 +1,206 @@
+<?php
+
+/* Icinga Web 2 | (c) 2018 Icinga Development Team | GPLv2+ */
+
+namespace Icinga\Module\Graphite\Clicommands;
+
+use Icinga\Cli\Command;
+use Icinga\Module\Graphite\Graphing\GraphingTrait;
+use Icinga\Module\Graphite\Graphing\Template;
+use Icinga\Module\Graphite\Util\MacroTemplate;
+use Icinga\Module\Graphite\Web\Widget\Graphs;
+
+class Icinga2Command extends Command
+{
+ use GraphingTrait;
+
+ /**
+ * Generate Icinga 2 host and service config based on the present graph templates
+ *
+ * The generated (fictive) monitored objects' checks yield random perfdata to be
+ * written to Graphite as expected by the present graph templates of this module.
+ * The generated Icinga 2 config can be used to simulate graphs generated based
+ * on the graph templates.
+ *
+ * icingacli graphite icinga2 config
+ */
+ public function configAction()
+ {
+ $icinga2CfgObjPrefix = 'IW2_graphite_demo';
+ $obscuredCheckCommandCustomVar = Graphs::getObscuredCheckCommandCustomVar();
+
+ $result = [
+ <<<EOT
+object CheckCommand "$icinga2CfgObjPrefix" {
+ command = [ "/usr/bin/printf" ]
+ arguments = {
+ "%s" = {{
+ var res = " |"
+ for (label => max in macro("\$$icinga2CfgObjPrefix\$")) {
+ res += " '" + label + "'=" + (random() % max) + ";" + (max * 0.8) + ";" + (max * 0.9) + ";0;" + max
+ }
+ res
+ }}
+ }
+}
+EOT
+ ,
+ <<<EOT
+object HostGroup "$icinga2CfgObjPrefix" {
+ assign where host.vars.$icinga2CfgObjPrefix
+}
+EOT
+ ,
+ <<<EOT
+object ServiceGroup "$icinga2CfgObjPrefix" {
+ assign where service.vars.$icinga2CfgObjPrefix
+}
+EOT
+ ,
+ <<<EOT
+object Host "{$icinga2CfgObjPrefix}_doesntmatchanycheckcommand" {
+ check_command = "$icinga2CfgObjPrefix"
+ check_interval = 30s
+ vars.$obscuredCheckCommandCustomVar = "doesntmatchanycheckcommand"
+ vars.$icinga2CfgObjPrefix = {
+ "dummy1" = 100
+ "dummy2" = 100
+ "dummy3" = 100
+ "dummy4" = 100
+ }
+}
+EOT
+ ,
+ <<<EOT
+apply Service "{$icinga2CfgObjPrefix}_doesntmatchanycheckcommand" {
+ assign where host.vars.$icinga2CfgObjPrefix
+ check_command = "$icinga2CfgObjPrefix"
+ check_interval = 30s
+ vars.$obscuredCheckCommandCustomVar = "doesntmatchanycheckcommand"
+ vars.$icinga2CfgObjPrefix = {
+ "dummy1" = 100
+ "dummy2" = 100
+ "dummy3" = 100
+ "dummy4" = 100
+ }
+}
+EOT
+ ];
+
+ foreach (static::getAllTemplates()->getAllTemplates() as $checkCommand => $templates) {
+ $perfdata = [];
+
+ foreach ($templates as $templateName => $template) {
+ /** @var Template $template */
+
+ $urlParams = $template->getUrlParams();
+
+ switch (isset($urlParams['yUnitSystem']) ? $urlParams['yUnitSystem']->resolve([]) : 'none') {
+ case 'si':
+ case 'binary':
+ $max = 42000000;
+ break;
+
+ case 'sec':
+ case 'msec':
+ $max = 82800;
+ break;
+
+ default:
+ $max = 100;
+ }
+
+ foreach ($template->getCurves() as $curveName => $curve) {
+ /** @var MacroTemplate $metricFilter */
+ $metricFilter = $curve[0];
+
+ $macros = array_flip($metricFilter->getMacros());
+ $service = isset($macros['service_name_template']);
+
+ foreach ($macros as & $macro) {
+ $macro = ['dummy1', 'dummy2', 'dummy3', 'dummy4'];
+ }
+
+ $macros['host_name_template'] = [''];
+ $macros['service_name_template'] = [''];
+
+ foreach ($this->cartesianProduct($macros) as $macroValues) {
+ if (
+ preg_match(
+ '/\A\.[^.]+\.(.+)\.[^.]+\z/',
+ $metricFilter->resolve($macroValues),
+ $match
+ )
+ ) {
+ $perfdata[$match[1]] = $max;
+ }
+ }
+ }
+ }
+
+ $monObj = $service
+ ? [
+ "apply Service \"{$icinga2CfgObjPrefix}_{$checkCommand}\" {",
+ " assign where host.vars.$icinga2CfgObjPrefix"
+ ]
+ : ["object Host \"{$icinga2CfgObjPrefix}_{$checkCommand}\" {"];
+
+ $monObj[] = " check_command = \"$icinga2CfgObjPrefix\"";
+ $monObj[] = ' check_interval = 30s';
+ $monObj[] = " vars.$obscuredCheckCommandCustomVar = \"$checkCommand\"";
+ $monObj[] = " vars.$icinga2CfgObjPrefix = {";
+
+ foreach ($perfdata as $label => $max) {
+ $monObj[] = " \"$label\" = $max";
+ }
+
+ $monObj[] = ' }';
+ $monObj[] = '}';
+
+ $result[] = implode("\n", $monObj);
+ }
+
+ echo implode("\n\n", $result) . "\n";
+ }
+
+ /**
+ * Generate the cartesian product of the given array
+ *
+ * [
+ * 'a' => ['b', 'c'],
+ * 'd' => ['e', 'f']
+ * ]
+ *
+ * [
+ * ['a' => 'b', 'd' => 'e'],
+ * ['a' => 'b', 'd' => 'f'],
+ * ['a' => 'c', 'd' => 'e'],
+ * ['a' => 'c', 'd' => 'f']
+ * ]
+ *
+ * @param array[] $input
+ *
+ * @return array[]
+ */
+ protected function cartesianProduct(array &$input)
+ {
+ $results = [[]];
+
+ foreach ($input as $key => & $values) {
+ $nextStep = [];
+
+ foreach ($results as & $result) {
+ foreach ($values as $value) {
+ $nextStep[] = array_merge($result, [$key => $value]);
+ }
+ }
+ unset($result);
+
+ $results = & $nextStep;
+ unset($nextStep);
+ }
+ unset($values);
+
+ return $results;
+ }
+}