diff -Nru icingaweb2-2.7.1/application/VERSION icingaweb2-2.7.3/application/VERSION --- icingaweb2-2.7.1/application/VERSION 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/application/VERSION 2019-10-18 05:39:24.000000000 +0000 @@ -1 +1 @@ -b0bf9c4b0637f6113adb788e78c2bcf619225dd8 2019-08-14 13:10:19 +0200 +06cabfe8ba28cf545a42c92f25484383191a4e51 2019-10-18 07:39:24 +0200 diff -Nru icingaweb2-2.7.1/CHANGELOG.md icingaweb2-2.7.3/CHANGELOG.md --- icingaweb2-2.7.1/CHANGELOG.md 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/CHANGELOG.md 2019-10-18 05:39:24.000000000 +0000 @@ -4,6 +4,40 @@ ## What's New +### What's New in Version 2.7.3 + +This is a hotfix release and fixes the following issue: + +* Servicegroups for roles with filtered objects not available [#3983](https://github.com/Icinga/icingaweb2/issues/3983) + +### What's New in Version 2.7.2 + +You can find all issues related to this release on our [Roadmap](https://github.com/Icinga/icingaweb2/milestone/57?closed=1). + +#### Less Smoky Database Servers + +The release of v2.7.1 introduced a change which revealed an inefficient part of our database queries. We made some +general optimizations on our queries and changed the way we utilize them in some views. The result are faster +response times by less work for the database server. + +* Consuming more CPU resources since upgraded to 2.7.1 [#3928](https://github.com/Icinga/icingaweb2/issues/3928) + +#### Anarchism Infested Dashboards + +Recent history already showed signs of anarchism. (Pun intended) A similar mindset now infested default dashboards +which appeared in a different way than before v2.7.0. We taught their dashlets a lesson and order has been reestablished +as previously. + +* Recently Recovered Services in dashboard "Current Incidents" seems out of order [#3931](https://github.com/Icinga/icingaweb2/issues/3931) + +#### Solitary Downtimes + +We improved the host and service distinction with v2.7.0. The downtimes list however got confused by this and didn't +knew anymore how to combine multiple downtimes. If you now instruct the list to select multiple downtimes this works +again as we removed the confusing parts. + +* Selection of multiple downtimes fails [#3920](https://github.com/Icinga/icingaweb2/issues/3920) + ### What's New in Version 2.7.1 You can find all issues related to this release on our [Roadmap](https://github.com/Icinga/icingaweb2/milestone/56?closed=1). diff -Nru icingaweb2-2.7.1/debian/changelog icingaweb2-2.7.3/debian/changelog --- icingaweb2-2.7.1/debian/changelog 2019-08-16 04:37:28.000000000 +0000 +++ icingaweb2-2.7.3/debian/changelog 2019-10-19 05:35:47.000000000 +0000 @@ -1,3 +1,11 @@ +icingaweb2 (2.7.3-1) unstable; urgency=medium + + * Team upload. + * New upstream release. + * Bump Standards-Version to 4.4.1, no changes. + + -- Bas Couwenberg Sat, 19 Oct 2019 07:35:47 +0200 + icingaweb2 (2.7.1-1) unstable; urgency=medium * Team upload. diff -Nru icingaweb2-2.7.1/debian/control icingaweb2-2.7.3/debian/control --- icingaweb2-2.7.1/debian/control 2019-07-11 16:33:57.000000000 +0000 +++ icingaweb2-2.7.3/debian/control 2019-09-30 18:07:09.000000000 +0000 @@ -8,7 +8,7 @@ php-cli, node-uglify (>= 2) | yui-compressor, node-source-map | yui-compressor -Standards-Version: 4.4.0 +Standards-Version: 4.4.1 Vcs-Browser: https://salsa.debian.org/nagios-team/pkg-icingaweb2 Vcs-Git: https://salsa.debian.org/nagios-team/pkg-icingaweb2.git Homepage: https://icinga.com diff -Nru icingaweb2-2.7.1/library/Icinga/Application/Modules/DashboardContainer.php icingaweb2-2.7.3/library/Icinga/Application/Modules/DashboardContainer.php --- icingaweb2-2.7.1/library/Icinga/Application/Modules/DashboardContainer.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/library/Icinga/Application/Modules/DashboardContainer.php 2019-10-18 05:39:24.000000000 +0000 @@ -43,12 +43,16 @@ * * @param string $name * @param string $url + * @param int $priority * * @return $this */ - public function add($name, $url) + public function add($name, $url, $priority = null) { - $this->dashlets[$name] = $url; + $this->dashlets[$name] = [ + 'url' => $url, + 'priority' => $priority + ]; return $this; } } diff -Nru icingaweb2-2.7.1/library/Icinga/Application/Modules/Module.php icingaweb2-2.7.3/library/Icinga/Application/Modules/Module.php --- icingaweb2-2.7.1/library/Icinga/Application/Modules/Module.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/library/Icinga/Application/Modules/Module.php 2019-10-18 05:39:24.000000000 +0000 @@ -315,10 +315,11 @@ foreach ($panes as $pane) { /** @var DashboardContainer $pane */ $dashlets = []; - foreach ($pane->getDashlets() as $dashletName => $dashletUrl) { + foreach ($pane->getDashlets() as $dashletName => $dashletConfig) { $dashlets[$dashletName] = [ - 'label' => $this->translate($dashletName), - 'url' => $dashletUrl + 'label' => $this->translate($dashletName), + 'url' => $dashletConfig['url'], + 'priority' => $dashletConfig['priority'] ]; } diff -Nru icingaweb2-2.7.1/library/Icinga/Application/Version.php icingaweb2-2.7.3/library/Icinga/Application/Version.php --- icingaweb2-2.7.1/library/Icinga/Application/Version.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/library/Icinga/Application/Version.php 2019-10-18 05:39:24.000000000 +0000 @@ -8,7 +8,7 @@ */ class Version { - const VERSION = '2.7.1'; + const VERSION = '2.7.3'; /** * Get the version of this instance of Icinga Web 2 diff -Nru icingaweb2-2.7.1/library/Icinga/Data/SimpleQuery.php icingaweb2-2.7.3/library/Icinga/Data/SimpleQuery.php --- icingaweb2-2.7.1/library/Icinga/Data/SimpleQuery.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/library/Icinga/Data/SimpleQuery.php 2019-10-18 05:39:24.000000000 +0000 @@ -37,6 +37,13 @@ protected $iteratorPosition; /** + * The amount of rows previously calculated + * + * @var int + */ + protected $cachedCount; + + /** * The target you are going to query * * @var mixed @@ -450,7 +457,7 @@ */ public function hasResult() { - return $this->iteratorPosition !== null || $this->fetchRow() !== false; + return $this->cachedCount > 0 || $this->iteratorPosition !== null || $this->fetchRow() !== false; } /** @@ -647,6 +654,7 @@ $query->limit(0, 0); Benchmark::measure('Counting all results started'); $count = $this->ds->count($query); + $this->cachedCount = $count; Benchmark::measure('Counting all results finished'); return $count; } diff -Nru icingaweb2-2.7.1/modules/doc/module.info icingaweb2-2.7.3/modules/doc/module.info --- icingaweb2-2.7.1/modules/doc/module.info 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/doc/module.info 2019-10-18 05:39:24.000000000 +0000 @@ -1,4 +1,4 @@ Module: doc -Version: 2.7.1 +Version: 2.7.3 Description: Documentation module Extracts, shows and exports documentation for Icinga Web 2 and its modules. diff -Nru icingaweb2-2.7.1/modules/migrate/module.info icingaweb2-2.7.3/modules/migrate/module.info --- icingaweb2-2.7.1/modules/migrate/module.info 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/migrate/module.info 2019-10-18 05:39:24.000000000 +0000 @@ -1,5 +1,5 @@ Module: migrate -Version: 2.7.1 +Version: 2.7.3 Description: Migrate module This module was introduced with the domain-aware authentication feature in version 2.5.0. It helps you migrating users and user configurations according to a given domain. diff -Nru icingaweb2-2.7.1/modules/monitoring/application/controllers/EventController.php icingaweb2-2.7.3/modules/monitoring/application/controllers/EventController.php --- icingaweb2-2.7.1/modules/monitoring/application/controllers/EventController.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/controllers/EventController.php 2019-10-18 05:39:24.000000000 +0000 @@ -339,7 +339,7 @@ case 'dt_start': case 'dt_end': $details = array(array( - array($this->translate('Entry time'), DateFormatter::formatTime($event->entry_time)), + array($this->translate('Entry time'), DateFormatter::formatDateTime($event->entry_time)), array($this->translate('Is fixed'), $this->yesOrNo($event->is_fixed)), array($this->translate('Is in effect'), $this->yesOrNo($event->is_in_effect)), array($this->translate('Was started'), $this->yesOrNo($event->was_started)) @@ -352,18 +352,18 @@ } $details[] = array( - array($this->translate('Trigger time'), DateFormatter::formatTime($event->trigger_time)), + array($this->translate('Trigger time'), DateFormatter::formatDateTime($event->trigger_time)), array( $this->translate('Scheduled start time'), - DateFormatter::formatTime($event->scheduled_start_time) + DateFormatter::formatDateTime($event->scheduled_start_time) ), array( $this->translate('Actual start time'), - DateFormatter::formatTime($event->actual_start_time) + DateFormatter::formatDateTime($event->actual_start_time) ), array( $this->translate('Scheduled end time'), - DateFormatter::formatTime($event->scheduled_end_time) + DateFormatter::formatDateTime($event->scheduled_end_time) ) ); @@ -371,7 +371,7 @@ $details[] = array( array( $this->translate('Actual end time'), - DateFormatter::formatTime($event->actual_end_time) + DateFormatter::formatDateTime($event->actual_end_time) ) ); } @@ -417,14 +417,14 @@ } return array( - array($this->translate('Time'), DateFormatter::formatTime($event->comment_time)), + array($this->translate('Time'), DateFormatter::formatDateTime($event->comment_time)), array($this->translate('Source'), $this->view->escape($commentSource)), array($this->translate('Entry type'), $this->view->escape($entryType)), array($this->translate('Author'), $this->contact($event->author_name)), array($this->translate('Is persistent'), $this->yesOrNo($event->is_persistent)), array($this->translate('Expires'), $this->yesOrNo($event->expires)), - array($this->translate('Expiration time'), DateFormatter::formatTime($event->expiration_time)), - array($this->translate('Deletion time'), DateFormatter::formatTime($event->deletion_time)), + array($this->translate('Expiration time'), DateFormatter::formatDateTime($event->expiration_time)), + array($this->translate('Deletion time'), DateFormatter::formatDateTime($event->deletion_time)), array($this->translate('Message'), $this->comment($event->comment_data)) ); case 'flapping': @@ -441,7 +441,7 @@ } return array( - array($this->translate('Event time'), DateFormatter::formatTime($event->event_time)), + array($this->translate('Event time'), DateFormatter::formatDateTime($event->event_time)), array($this->translate('Reason'), $this->view->escape($reasonType)), array($this->translate('State change'), $this->percent($event->percent_state_change)), array($this->translate('Low threshold'), $this->percent($event->low_threshold)), @@ -481,8 +481,8 @@ } $details = array( - array($this->translate('Start time'), DateFormatter::formatTime($event->start_time)), - array($this->translate('End time'), DateFormatter::formatTime($event->end_time)), + array($this->translate('Start time'), DateFormatter::formatDateTime($event->start_time)), + array($this->translate('End time'), DateFormatter::formatDateTime($event->end_time)), array($this->translate('Reason'), $this->view->escape($notificationReason)), array( $this->translate('State'), @@ -502,7 +502,7 @@ $isService = $event->service_description !== null; $details = array( - array($this->translate('State time'), DateFormatter::formatTime($event->state_time)), + array($this->translate('State time'), DateFormatter::formatDateTime($event->state_time)), array($this->translate('State'), $this->state($isService, $event->state)), array($this->translate('Check source'), $event->check_source), array($this->translate('Check attempt'), $this->view->escape(sprintf( diff -Nru icingaweb2-2.7.1/modules/monitoring/application/controllers/ListController.php icingaweb2-2.7.3/modules/monitoring/application/controllers/ListController.php --- icingaweb2-2.7.1/modules/monitoring/application/controllers/ListController.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/controllers/ListController.php 2019-10-18 05:39:24.000000000 +0000 @@ -374,7 +374,7 @@ $this->params->remove(array('objecttype', 'from', 'to', 'state', 'btn_submit')); $this->view->filter = Filter::fromQuerystring((string) $this->params); $query->applyFilter($this->view->filter); - $query->applyFilter(Filter::fromQuerystring('timestamp >= ' . $from)); + $query->applyFilter(Filter::fromQuerystring('timestamp>=' . $from)); $this->applyRestriction('monitoring/filter/objects', $query); $this->view->summary = $query; $this->view->column = $form->getValue('state'); diff -Nru icingaweb2-2.7.1/modules/monitoring/application/controllers/TimelineController.php icingaweb2-2.7.3/modules/monitoring/application/controllers/TimelineController.php --- icingaweb2-2.7.1/modules/monitoring/application/controllers/TimelineController.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/controllers/TimelineController.php 2019-10-18 05:39:24.000000000 +0000 @@ -46,10 +46,47 @@ ) ), array( - 'notify' => array( - 'class' => 'timeline-notification', - 'detailUrl' => $detailUrl, - 'label' => mt('monitoring', 'Notifications') + 'notification_ack' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' + ), + 'notification_flapping' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' + ), + 'notification_flapping_end' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' + ), + 'notification_dt_start' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' + ), + 'notification_dt_end' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' + ), + 'notification_custom' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' + ), + 'notification_state' => array( + 'class' => 'timeline-notification', + 'detailUrl' => $detailUrl, + 'label' => mt('monitoring', 'Notifications'), + 'groupBy' => 'notification_*' ), 'hard_state' => array( 'class' => 'timeline-hard-state', diff -Nru icingaweb2-2.7.1/modules/monitoring/application/forms/Command/Object/ToggleObjectFeaturesCommandForm.php icingaweb2-2.7.3/modules/monitoring/application/forms/Command/Object/ToggleObjectFeaturesCommandForm.php --- icingaweb2-2.7.1/modules/monitoring/application/forms/Command/Object/ToggleObjectFeaturesCommandForm.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/forms/Command/Object/ToggleObjectFeaturesCommandForm.php 2019-10-18 05:39:24.000000000 +0000 @@ -80,17 +80,25 @@ $options['description'] = $this->translate('changed'); } if ($formData[$feature] === 2) { - $options['multiOptions'] = array( - $this->translate('disable'), - $this->translate('enable'), - ); - $options['separator'] = ''; - $elementType = 'radio'; + $this->addElement('select', $feature, $options + [ + 'description' => $this->translate('Multiple Values'), + 'filters' => [['Null', ['type' => \Zend_Filter_Null::STRING]]], + 'multiOptions' => [ + '' => $this->translate('Leave Unchanged'), + $this->translate('Disable All'), + $this->translate('Enable All') + ], + 'decorators' => array_merge( + array_slice(static::$defaultElementDecorators, 0, 3), + [['Description', ['tag' => 'span']]], + array_slice(static::$defaultElementDecorators, 4, 1), + [['HtmlTag', ['tag' => 'div', 'class' => 'control-group indeterminate']]] + ) + ]); } else { - $elementType = 'checkbox'; $options['value'] = $formData[$feature]; + $this->addElement('checkbox', $feature, $options); } - $this->addElement($elementType, $feature, $options); } } diff -Nru icingaweb2-2.7.1/modules/monitoring/application/views/helpers/PluginOutput.php icingaweb2-2.7.3/modules/monitoring/application/views/helpers/PluginOutput.php --- icingaweb2-2.7.1/modules/monitoring/application/views/helpers/PluginOutput.php 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/views/helpers/PluginOutput.php 2019-10-18 05:39:24.000000000 +0000 @@ -3,7 +3,7 @@ use Icinga\Web\Dom\DomNodeIterator; use Icinga\Web\View; -use Icinga\Module\Monitoring\Web\Helper\PluginOutputPurifier; +use Icinga\Web\Helper\HtmlPurifier; /** * Plugin output renderer @@ -11,13 +11,6 @@ class Zend_View_Helper_PluginOutput extends Zend_View_Helper_Abstract { /** - * The return value of getPurifier() - * - * @var HTMLPurifier - */ - protected static $purifier; - - /** * Patterns to be replaced in plain text plugin output * * @var array @@ -107,7 +100,7 @@ $output = preg_replace( self::$htmlPatterns, self::$htmlReplacements, - PluginOutputPurifier::process($output) + HtmlPurifier::process($output) ); $isHtml = true; } else { diff -Nru icingaweb2-2.7.1/modules/monitoring/application/views/scripts/list/servicegrid-flipped.phtml icingaweb2-2.7.3/modules/monitoring/application/views/scripts/list/servicegrid-flipped.phtml --- icingaweb2-2.7.1/modules/monitoring/application/views/scripts/list/servicegrid-flipped.phtml 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/views/scripts/list/servicegrid-flipped.phtml 2019-10-18 05:39:24.000000000 +0000 @@ -115,7 +115,7 @@ 'data-base-target' => '_self' ) ) ?> - + diff -Nru icingaweb2-2.7.1/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml icingaweb2-2.7.3/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml --- icingaweb2-2.7.1/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/views/scripts/partials/comment/comment-detail.phtml 2019-10-18 05:39:24.000000000 +0000 @@ -15,8 +15,7 @@ $this->translate('Show detailed information for service %s on host %s'), $comment->service_display_name, $comment->host_display_name - ), - 'class' => 'rowaction' + ) ] ), $this->qlink( diff -Nru icingaweb2-2.7.1/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml icingaweb2-2.7.3/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml --- icingaweb2-2.7.1/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/views/scripts/partials/downtime/downtime-header.phtml 2019-10-18 05:39:24.000000000 +0000 @@ -25,8 +25,7 @@ $this->translate('Show detailed information for service %s on host %s'), $downtime->service_display_name, $downtime->host_display_name - ), - 'class' => 'rowaction' + ) ] ), $this->qlink( diff -Nru icingaweb2-2.7.1/modules/monitoring/application/views/scripts/partials/event-history.phtml icingaweb2-2.7.3/modules/monitoring/application/views/scripts/partials/event-history.phtml --- icingaweb2-2.7.1/modules/monitoring/application/views/scripts/partials/event-history.phtml 2019-08-14 11:10:19.000000000 +0000 +++ icingaweb2-2.7.3/modules/monitoring/application/views/scripts/partials/event-history.phtml 2019-10-18 05:39:24.000000000 +0000 @@ -29,19 +29,17 @@ $history->limit($limit * $page); ?>
-hasResult()): ?> -

translate('No historical events found matching the filter.') ?>

-
- translate('%A, %B %e, %Y', 'date.verbose'); $lastDate = null; $flappingMsg = $this->translate('Flapping with a %.2f%% state change rate'); $rowAction = Url::fromPath('monitoring/event/show'); ?> + peekAhead() as $event): ?> + - - peekAhead() as $event): + +service_description); @@ -240,8 +238,10 @@ +
+ hasMore()): ?>