Merge branch 'feature/custom-notification-command-8644'

resolves #8644
This commit is contained in:
Marius Hein 2015-03-12 16:46:10 +01:00
commit 31d0641658
10 changed files with 319 additions and 25 deletions

View File

@ -6,6 +6,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\AddCommentCommandForm;
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 @@ class Monitoring_HostController extends MonitoredObjectController
$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);
}
}

View File

@ -10,6 +10,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\ProcessCheckResultCommandForm;
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 @@ class Monitoring_HostsController extends Controller
$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 @@ class Monitoring_HostsController extends Controller
$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);
}
}

View File

@ -6,6 +6,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\AddCommentCommandForm;
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 @@ class Monitoring_ServiceController extends MonitoredObjectController
$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);
}
}

View File

@ -10,6 +10,7 @@ use Icinga\Module\Monitoring\Forms\Command\Object\ProcessCheckResultCommandForm;
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 @@ class Monitoring_ServicesController extends Controller
$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 @@ class Monitoring_ServicesController extends Controller
$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);
}
}

View File

@ -0,0 +1,112 @@
<?php
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
namespace Icinga\Module\Monitoring\Forms\Command\Object;
use Icinga\Module\Monitoring\Command\Object\SendCustomNotificationCommand;
use Icinga\Web\Notification;
/**
* Form to send custom notifications
*/
class SendCustomNotificationCommandForm extends ObjectsCommandForm
{
/**
* Initialize this form
*/
public function init()
{
$this->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;
}
}

View File

@ -31,6 +31,14 @@
null,
array('icon' => 'reply')
); ?></div>
<?php if ($this->hasPermission('monitoring/command/send-custom-notification')): ?>
<div><?= $this->qlink(
sprintf($this->translate('Send a custom notification for all %u hosts'), $hostCount),
$sendCustomNotificationLink,
null,
array('icon' => 'comment')
); ?></div>
<?php endif; ?>
<?php if (($unhandledCount = count($unhandledObjects)) > 0): ?>
<div>
<h3><?= sprintf(

View File

@ -31,6 +31,14 @@
null,
array('icon' => 'reply')
); ?></div>
<?php if ($this->hasPermission('monitoring/command/send-custom-notification')): ?>
<div><?= $this->qlink(
sprintf($this->translate('Send a custom notification for all %u services'), $serviceCount),
$sendCustomNotificationLink,
null,
array('icon' => 'comment')
); ?></div>
<?php endif; ?>
<?php if (($unhandledCount = count($unhandledObjects)) > 0): ?>
<div>
<h3><?= sprintf(

View File

@ -1,35 +1,59 @@
<?php
// We are not interested in notifications for OK or pending objects
if (in_array((int) $object->state, array(0, 99))) {
return;
}
?>
<tr>
<th><?= $this->translate('Notifications') ?></th>
<td>
<?php if ($this->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())
);
}
?>
<?= $this->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.'
)
)
); ?>
<?php } ?>
<?php
// We are not interested in notifications for OK or pending objects
if (! in_array((int) $object->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
) . '<br />' . 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
) . '<br />' . 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');
}
?>
</td>
</tr>
</tr>

View File

@ -55,6 +55,10 @@ $this->providePermission(
'monitoring/command/feature/object',
$this->translate('Allow processing commands for toggling features on host and service objects')
);
$this->providesPermission(
'monitoring/command/send-custom-notification',
$this->translate('Allow sending custom notifications for hosts and services');
);
$this->provideRestriction(
'monitoring/hosts/filter',

View File

@ -0,0 +1,78 @@
<?php
/* Icinga Web 2 | (c) 2013-2015 Icinga Development Team | GPLv2+ */
namespace Icinga\Module\Monitoring\Command\Object;
/**
* Send custom notifications for a host or service
*/
class SendCustomNotificationCommand extends WithCommentCommand
{
/**
* {@inheritdoc}
*/
protected $allowedObjects = array(
self::TYPE_HOST,
self::TYPE_SERVICE
);
/**
* Whether a notification is forced to send
*
* Forced notifications are send regardless of time and if notifications
* are enabled.
*
* @var bool
*/
protected $forced;
/**
* Broadcast the notification
*
* If broadcast is true, the notification is send to all normal and
* escalated contacts for the object
*
* @var bool
*/
protected $broadcast;
/**
* Get notification force flag
*
* @return bool
*/
public function getForced()
{
return $this->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;
}
}