From ddc8dd5d4ca30098d04d09044a8f113057c538c1 Mon Sep 17 00:00:00 2001 From: Marius Hein Date: Thu, 12 Mar 2015 16:08:22 +0100 Subject: [PATCH] Add command send custom notification to monitoring module refs #8644 --- .../controllers/HostController.php | 13 ++ .../controllers/HostsController.php | 17 +++ .../controllers/ServiceController.php | 13 ++ .../controllers/ServicesController.php | 17 +++ .../SendCustomNotificationCommandForm.php | 112 ++++++++++++++++++ .../views/scripts/hosts/show.phtml | 6 + .../views/scripts/services/show.phtml | 6 + .../show/components/notifications.phtml | 74 ++++++++---- .../Object/SendCustomNotificationCommand.php | 78 ++++++++++++ 9 files changed, 311 insertions(+), 25 deletions(-) create mode 100644 modules/monitoring/application/forms/Command/Object/SendCustomNotificationCommandForm.php create mode 100644 modules/monitoring/library/Monitoring/Command/Object/SendCustomNotificationCommand.php diff --git a/modules/monitoring/application/controllers/HostController.php b/modules/monitoring/application/controllers/HostController.php index 4a29750e3e..11179c1fa6 100644 --- a/modules/monitoring/application/controllers/HostController.php +++ b/modules/monitoring/application/controllers/HostController.php @@ -6,6 +6,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\ProcessCheckResultCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleHostCheckCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleHostDowntimeCommandForm; +use Icinga\Module\Monitoring\Forms\Command\Object\SendCustomNotificationCommandForm; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Web\Controller\MonitoredObjectController; use Icinga\Web\Hook; @@ -118,4 +119,16 @@ public function processCheckResultAction() $form->setTitle($this->translate('Submit Passive Host Check Result')); $this->handleCommandForm($form); } + + /** + * Send a custom notification for host + */ + public function sendCustomNotificationAction() + { + $this->assertPermission('monitoring/command/send-custom-notification'); + + $form = new SendCustomNotificationCommandForm(); + $form->setTitle($this->translate('Send Custom Host Notification')); + $this->handleCommandForm($form); + } } diff --git a/modules/monitoring/application/controllers/HostsController.php b/modules/monitoring/application/controllers/HostsController.php index 5dc72eeb05..8d0fc1f734 100644 --- a/modules/monitoring/application/controllers/HostsController.php +++ b/modules/monitoring/application/controllers/HostsController.php @@ -10,6 +10,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\RemoveAcknowledgementCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleHostCheckCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleHostDowntimeCommandForm; +use Icinga\Module\Monitoring\Forms\Command\Object\SendCustomNotificationCommandForm; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Object\HostList; use Icinga\Web\Url; @@ -157,6 +158,10 @@ public function showAction() $this->translate('Host State'), array('#44bb77', '#FF5566', '#E066FF', '#77AAFF') ); + $this->view->sendCustomNotificationLink = + Url::fromRequest()->setPath( + 'monitoring/hosts/send-custom-notification' + ); } protected function createPieChart(array $states, $title, array $colors) @@ -215,4 +220,16 @@ public function processCheckResultAction() $form->setTitle($this->translate('Submit Passive Host Check Results')); $this->handleCommandForm($form); } + + /** + * Send a custom notification for hosts + */ + public function sendCustomNotificationAction() + { + $this->assertPermission('monitoring/command/send-custom-notification'); + + $form = new SendCustomNotificationCommandForm(); + $form->setTitle($this->translate('Send Custom Host Notification')); + $this->handleCommandForm($form); + } } diff --git a/modules/monitoring/application/controllers/ServiceController.php b/modules/monitoring/application/controllers/ServiceController.php index d717a8e1cd..3dc98c3b88 100644 --- a/modules/monitoring/application/controllers/ServiceController.php +++ b/modules/monitoring/application/controllers/ServiceController.php @@ -6,6 +6,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\ProcessCheckResultCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleServiceCheckCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleServiceDowntimeCommandForm; +use Icinga\Module\Monitoring\Forms\Command\Object\SendCustomNotificationCommandForm; use Icinga\Module\Monitoring\Object\Service; use Icinga\Module\Monitoring\Web\Controller\MonitoredObjectController; @@ -95,4 +96,16 @@ public function processCheckResultAction() $form->setTitle($this->translate('Submit Passive Service Check Result')); $this->handleCommandForm($form); } + + /** + * Send a custom notification for a service + */ + public function sendCustomNotificationAction() + { + $this->assertPermission('monitoring/command/send-custom-notification'); + + $form = new SendCustomNotificationCommandForm(); + $form->setTitle($this->translate('Send Custom Service Notification')); + $this->handleCommandForm($form); + } } diff --git a/modules/monitoring/application/controllers/ServicesController.php b/modules/monitoring/application/controllers/ServicesController.php index 1e907aab9a..efe89f4c15 100644 --- a/modules/monitoring/application/controllers/ServicesController.php +++ b/modules/monitoring/application/controllers/ServicesController.php @@ -10,6 +10,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\RemoveAcknowledgementCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleServiceCheckCommandForm; use Icinga\Module\Monitoring\Forms\Command\Object\ScheduleServiceDowntimeCommandForm; +use Icinga\Module\Monitoring\Forms\Command\Object\SendCustomNotificationCommandForm; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Object\Service; use Icinga\Module\Monitoring\Object\ServiceList; @@ -206,6 +207,10 @@ public function showAction() $this->translate('Host State'), array('#44bb77', '#FF5566', '#E066FF', '#77AAFF') ); + $this->view->sendCustomNotificationLink = + Url::fromRequest()->setPath( + 'monitoring/services/send-custom-notification' + ); } protected function createPieChart(array $states, $title, array $colors) @@ -264,4 +269,16 @@ public function processCheckResultAction() $form->setTitle($this->translate('Submit Passive Service Check Results')); $this->handleCommandForm($form); } + + /** + * Send a custom notification for services + */ + public function sendCustomNotificationAction() + { + $this->assertPermission('monitoring/command/send-custom-notification'); + + $form = new SendCustomNotificationCommandForm(); + $form->setTitle($this->translate('Send Custom Service Notification')); + $this->handleCommandForm($form); + } } diff --git a/modules/monitoring/application/forms/Command/Object/SendCustomNotificationCommandForm.php b/modules/monitoring/application/forms/Command/Object/SendCustomNotificationCommandForm.php new file mode 100644 index 0000000000..068f85e1bb --- /dev/null +++ b/modules/monitoring/application/forms/Command/Object/SendCustomNotificationCommandForm.php @@ -0,0 +1,112 @@ +addDescription( + $this->translate( + 'This command is used to send custom notifications for hosts or' + . ' services.' + ) + ); + } + + /** + * (non-PHPDoc) + * @see \Icinga\Web\Form::getSubmitLabel() For the method documentation. + */ + public function getSubmitLabel() + { + return $this->translatePlural( + 'Send custom notification', + 'Send custom notifications', + count($this->objects) + ); + } + + /** + * (non-PHPDoc) + * @see \Icinga\Web\Form::createElements() For the method documentation. + */ + public function createElements(array $formData = array()) + { + $this->addElements(array( + array( + 'textarea', + 'comment', + array( + 'required' => true, + 'label' => $this->translate('Comment'), + 'description' => $this->translate( + 'If you work with other administrators, you may find it useful to share information about the' + . ' the host or service that is having problems. Make sure you enter a brief description of' + . ' what you are doing.' + ) + ) + ), + array( + 'checkbox', + 'forced', + array( + 'label' => $this->translate('Forced'), + 'value' => false, + 'description' => $this->translate( + 'If you check this option, a notification is sent' + . 'regardless of the current time and whether' + . ' notifications are enabled.' + ) + ) + ), + array( + 'checkbox', + 'broadcast', + array( + 'label' => $this->translate('Broadcast'), + 'value' => false, + 'description' => $this->translate( + 'If you check this option, a notification is sent to' + . ' all normal and escalated contacts.' + ) + ) + ) + )); + return $this; + } + + /** + * (non-PHPDoc) + * @see \Icinga\Web\Form::onSuccess() For the method documentation. + */ + public function onSuccess() + { + foreach ($this->objects as $object) { + /** @var \Icinga\Module\Monitoring\Object\MonitoredObject $object */ + $comment = new SendCustomNotificationCommand(); + $comment->setObject($object); + $comment->setComment($this->getElement('comment')->getValue()); + $comment->setAuthor($this->request->getUser()->getUsername()); + $comment->setForced($this->getElement('forced')->isChecked()); + $comment->setBroadcast($this->getElement('broadcast')->isChecked()); + $this->getTransport($this->request)->send($comment); + } + Notification::success($this->translatePlural( + 'Send custom notification..', + 'Send custom notifications..', + count($this->objects) + )); + return true; + } +} diff --git a/modules/monitoring/application/views/scripts/hosts/show.phtml b/modules/monitoring/application/views/scripts/hosts/show.phtml index 8655a31b13..e79fb00eb3 100644 --- a/modules/monitoring/application/views/scripts/hosts/show.phtml +++ b/modules/monitoring/application/views/scripts/hosts/show.phtml @@ -31,6 +31,12 @@ null, array('icon' => 'reply') ); ?> +
qlink( + sprintf($this->translate('Send a custom notification for all %u hosts'), $hostCount), + $sendCustomNotificationLink, + null, + array('icon' => 'comment') + ); ?>
0): ?>

'reply') ); ?>

+
qlink( + sprintf($this->translate('Send a custom notification for all %u services'), $serviceCount), + $sendCustomNotificationLink, + null, + array('icon' => 'comment') + ); ?>
0): ?>

state, array(0, 99))) { - return; -} - -?> translate('Notifications') ?> + hasPermission('monitoring/command/send-custom-notification')) { + if ($object->getType() === $object::TYPE_HOST) { + $ackLink = $this->href( + 'monitoring/host/send-custom-notification', + array('host' => $object->getName()) + ); + } else { + $ackLink = $this->href( + 'monitoring/service/send-custom-notification', + array('host' => $object->getHost()->getName(), 'service' => $object->getName()) + ); + } + ?> + qlink( + $this->translate('Send Custom Notification'), + $ackLink, + null, + array( + 'icon' => 'comment', + 'data-base-target' => '_self', + 'title' => $this->translate( + 'Send a custom notification, share information about the' + . ' object to contacts.' + ) + ) + ); ?> + state, array(0, 99))) { -if ($object->current_notification_number > 0) { - if ((int) $object->current_notification_number === 1) { - $msg = sprintf( - $this->translate('A notication has been sent for this issue %s ago'), - $this->timeSince($object->last_notification) - ); + if ($object->current_notification_number > 0) { + if ((int) $object->current_notification_number === 1) { + $msg = sprintf( + $this->translate('A notication has been sent for this issue %s ago'), + $this->timeSince($object->last_notification) + ); + } else { + $msg = sprintf( + $this->translate('%s notications have been sent for this issue'), + $object->current_notification_number + ) . '
' . sprintf( + $this->translate('The last one occured %s ago'), + $this->timeSince($object->last_notification) + ); + } + echo '- ' . $msg; } else { - $msg = sprintf( - $this->translate('%s notications have been sent for this issue'), - $object->current_notification_number - ) . '
' . sprintf( - $this->translate('The last one occured %s ago'), - $this->timeSince($object->last_notification) - ); + echo '(' + . $this->translate('No notification has been sent for this issue') + . ')'; } - echo $msg; -} else { - echo $this->translate('No notification has been sent for this issue'); } ?> - + \ No newline at end of file diff --git a/modules/monitoring/library/Monitoring/Command/Object/SendCustomNotificationCommand.php b/modules/monitoring/library/Monitoring/Command/Object/SendCustomNotificationCommand.php new file mode 100644 index 0000000000..88446a5aa3 --- /dev/null +++ b/modules/monitoring/library/Monitoring/Command/Object/SendCustomNotificationCommand.php @@ -0,0 +1,78 @@ +forced; + } + + /** + * Set whether notification should be forced + * + * @param bool $forced + */ + public function setForced($forced = true) + { + $this->forced = $forced; + } + + /** + * Get notification broadcast flag + * + * @return bool + */ + public function getBroadcast() + { + return $this->broadcast; + } + + /** + * Set notification to broadcast + * + * @param bool $broadcast + */ + public function setBroadcast($broadcast = true) + { + $this->broadcast = $broadcast; + } +}