summaryrefslogtreecommitdiffstats
path: root/application/forms/Command/Object/ScheduleCheckForm.php
blob: bdeba53cbae079b2a9451186ee2156a57253869c (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
<?php

/* Icinga DB Web | (c) 2021 Icinga GmbH | GPLv2 */

namespace Icinga\Module\Icingadb\Forms\Command\Object;

use CallbackFilterIterator;
use DateInterval;
use DateTime;
use Icinga\Module\Icingadb\Command\Object\ScheduleCheckCommand;
use Icinga\Module\Icingadb\Forms\Command\CommandForm;
use Icinga\Module\Icingadb\Model\Host;
use Icinga\Web\Notification;
use ipl\Html\Attributes;
use ipl\Html\HtmlElement;
use ipl\Html\Text;
use ipl\Orm\Model;
use ipl\Web\FormDecorator\IcingaFormDecorator;
use ipl\Web\Widget\Icon;
use Iterator;
use Traversable;

use function ipl\Stdlib\iterable_value_first;

class ScheduleCheckForm extends CommandForm
{
    public function __construct()
    {
        $this->on(self::ON_SUCCESS, function () {
            if ($this->errorOccurred) {
                return;
            }

            $countObjects = count($this->getObjects());
            if (iterable_value_first($this->getObjects()) instanceof Host) {
                $message = sprintf(
                    tp('Scheduled check successfully', 'Scheduled check for %d hosts successfully', $countObjects),
                    $countObjects
                );
            } else {
                $message = sprintf(
                    tp('Scheduled check successfully', 'Scheduled check for %d services successfully', $countObjects),
                    $countObjects
                );
            }

            Notification::success($message);
        });
    }

    protected function assembleElements()
    {
        $this->addHtml(new HtmlElement(
            'div',
            Attributes::create(['class' => 'form-description']),
            new Icon('info-circle', ['class' => 'form-description-icon']),
            new HtmlElement(
                'ul',
                null,
                new HtmlElement(
                    'li',
                    null,
                    Text::create(t(
                        'This command is used to schedule the next check of hosts or services. Icinga'
                        . ' will re-queue the hosts or services to be checked at the time you specify.'
                    ))
                )
            )
        ));

        $decorator = new IcingaFormDecorator();

        $this->addElement(
            'localDateTime',
            'check_time',
            [
                'data-use-datetime-picker'  => true,
                'required'                  => true,
                'label'                     => t('Check Time'),
                'description'               => t('Set the date and time when the check should be scheduled.'),
                'value'                     => (new DateTime())->add(new DateInterval('PT1H'))
            ]
        );
        $decorator->decorate($this->getElement('check_time'));

        $this->addElement(
            'checkbox',
            'force_check',
            [
                'label'         => t('Force Check'),
                'description'   => t(
                    'If you select this option, Icinga will force a check regardless of both what time the'
                    . ' scheduled check occurs and whether or not checks are enabled.'
                )
            ]
        );
        $decorator->decorate($this->getElement('force_check'));
    }

    protected function assembleSubmitButton()
    {
        $this->addElement(
            'submit',
            'btn_submit',
            [
                'required'  => true,
                'label'     => tp('Schedule check', 'Schedule checks', count($this->getObjects()))
            ]
        );

        (new IcingaFormDecorator())->decorate($this->getElement('btn_submit'));
    }

    protected function getCommands(Iterator $objects): Traversable
    {
        $granted = new CallbackFilterIterator($objects, function (Model $object): bool {
            return $this->isGrantedOn('icingadb/command/schedule-check', $object)
                || (
                    $object->active_checks_enabled
                    && $this->isGrantedOn('icingadb/command/schedule-check/active-only', $object)
                );
        });

        $granted->rewind(); // Forwards the pointer to the first element
        if ($granted->valid()) {
            $command = new ScheduleCheckCommand();
            $command->setObjects($granted);
            $command->setForced($this->getElement('force_check')->isChecked());
            $command->setCheckTime($this->getValue('check_time')->getTimestamp());

            yield $command;
        }
    }
}