summaryrefslogtreecommitdiffstats
path: root/application/forms/IcingaCommandForm.php
blob: ba1386b96e1065f42dbe34afb3768904a838eab4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php

namespace Icinga\Module\Director\Forms;

use Icinga\Module\Director\Web\Form\DirectorObjectForm;

class IcingaCommandForm extends DirectorObjectForm
{
    public function setup()
    {
        $this->addObjectTypeElement();
        if (! $this->hasObjectType()) {
            return;
        }

        $this->addElement('select', 'methods_execute', array(
            'label' => $this->translate('Command type'),
            'multiOptions' => array(
                null                 => '- please choose -',
                $this->translate('Plugin commands') => array(
                    'PluginCheck'        => 'Plugin Check Command',
                    'PluginNotification' => 'Notification Plugin Command',
                    'PluginEvent'        => 'Event Plugin Command',
                ),
                $this->translate('Internal commands') => array(
                    'IcingaCheck'        => 'Icinga Check Command',
                    'ClusterCheck'       => 'Icinga Cluster Check Command',
                    'ClusterZoneCheck'   => 'Icinga Cluster Zone Check Command',
                    'IdoCheck'           => 'Ido Check Command',
                    'RandomCheck'        => 'Random Check Command',
                )
            ),
            'required'    => ! $this->isTemplate(),
            'description' => $this->translate(
                'Plugin Check commands are what you need when running checks agains'
                . ' your infrastructure. Notification commands will be used when it'
                . ' comes to notify your users. Event commands allow you to trigger'
                . ' specific actions when problems occur. Some people use them for'
                . ' auto-healing mechanisms, like restarting services or rebooting'
                . ' systems at specific thresholds'
            ),
            'class'       => 'autosubmit'
        ));

        $nameLabel = $this->isTemplate()
            ? $this->translate('Name')
            : $this->translate('Command name');

        $this->addElement('text', 'object_name', array(
            'label'       => $nameLabel,
            'required'    => true,
            'description' => $this->translate('Identifier for the Icinga command you are going to create')
        ));

        $this->addImportsElement(false);

        $this->addElement('text', 'command', array(
            'label'       => $this->translate('Command'),
            'required'    => ! $this->isTemplate(),
            'description' => $this->translate(
                'The command Icinga should run. Absolute paths are accepted as provided,'
                . ' relative paths are prefixed with "PluginDir + ", similar Constant prefixes are allowed.'
                . ' Spaces will lead to separation of command path and standalone arguments. Please note that'
                . ' this means that we do not support spaces in plugin names and paths right now.'
            )
        ));

        $this->addElement('text', 'timeout', array(
            'label' => $this->translate('Timeout'),
            'description' => $this->translate(
                'Optional command timeout. Allowed values are seconds or durations postfixed with a'
                . ' specific unit (e.g. 1m or also 3m 30s).'
            )
        ));

        $descIsString = [
            $this->translate('Render the command as a plain string instead of an array.'),
            $this->translate('If enabled you can not define arguments.'),
            $this->translate('Disabled by default, and should only be used in rare cases.'),
            $this->translate('WARNING, this can allow shell script injection via custom variables used in command.'),
        ];

        $this->addBoolean(
            'is_string',
            array(
                'label'       => $this->translate('Render as string'),
                'description' => join(' ', $descIsString),
            )
        );

        $this->addDisabledElement();
        $this->addZoneSection();
        $this->setButtons();
    }

    protected function addZoneSection()
    {
        $this->addZoneElement(true);

        $elements = array(
            'zone_id',
        );
        $this->addDisplayGroup($elements, 'clustering', array(
            'decorators' => array(
                'FormElements',
                array('HtmlTag', array('tag' => 'dl')),
                'Fieldset',
            ),
            'order' => self::GROUP_ORDER_CLUSTERING,
            'legend' => $this->translate('Zone settings')
        ));

        return $this;
    }

    protected function enumAllowedTemplates()
    {
        $object = $this->object();
        $tpl = $this->db->enum($object->getTableName());
        if (empty($tpl)) {
            return array();
        }

        $id = $object->get('id');

        if (array_key_exists($id, $tpl)) {
            unset($tpl[$id]);
        }

        if (empty($tpl)) {
            return array();
        }

        $tpl = array_combine($tpl, $tpl);
        return $tpl;
    }
}