diff --git a/application/forms/Authentication/LoginForm.php b/application/forms/Authentication/LoginForm.php
index 41107be18..a6d69d15a 100644
--- a/application/forms/Authentication/LoginForm.php
+++ b/application/forms/Authentication/LoginForm.php
@@ -32,7 +32,7 @@ class LoginForm extends Form
array(
'required' => true,
'label' => t('Username'),
- 'placeholder' => t(''),
+ 'placeholder' => t('Please enter your username...'),
'class' => false === isset($formData['username']) ? 'autofocus' : ''
)
);
@@ -42,7 +42,7 @@ class LoginForm extends Form
array(
'required' => true,
'label' => t('Password'),
- 'placeholder' => t(''),
+ 'placeholder' => t('...and your password'),
'class' => isset($formData['username']) ? 'autofocus' : ''
)
);
diff --git a/doc/installation.md b/doc/installation.md
index 60a5a3ce5..11f644ef7 100644
--- a/doc/installation.md
+++ b/doc/installation.md
@@ -1,117 +1,62 @@
+# Installation
-# Installation
+The preferred way of installing Icinga Web 2 is to use the official package repositories depending on which operating
+system and distribution you are running. But it is also possible to install Icinga Web 2 directly from source.
-## Requirements
+## Installing Requirements
-* Apache2 with PHP >= 5.3.0 enabled
-* PHP Zend Framework
-* PHP with MySQL or PostgreSQL libraries
-* MySQL or PostgreSQL server and client software
-* Icinga 1.x or Icinga 2 as backend providers
+* A web server, e.g. Apache or nginx
+* PHP >= 5.3.0
+* MySQL or PostgreSQL PHP libraries when using a database for authentication or storing user preferences into a database
+* LDAP PHP library when using Active Directory or LDAP for authentication
+* Icinga 1.x w/ Livestatus or IDO, Icinga 2 w/ Livestatus or IDO feature enabled
-RHEL/CentOS requires the EPEL repository enabled (which provides the `php-ZendFramework`
-package). OpenSUSE requires the [server monitoring](https://build.opensuse.org/project/show/server:monitoring) repository (which provides the `php5-ZendFramework` package) enabled.
+## Installing Icinga Web 2 from Package
-## configure && make
+A guide on how to install Icinga Web 2 from package will follow shortly.
-### Basic installation
+## Installing Icinga Web 2 from Source
-If you like to configurea and install icinga2-web from the command line or
-if you want to create packages, configure and make is the best choice for installation.
+**Step 1: Getting the Source**
- ./configure && make install && make install-apache2-config
+First of all, you need to download the sources. Icinga Web 2 is available through a Git repository. You can clone this
+repository either via git or http protocol using the following URLs:
-will install the application to the default target (/usr/local/icinga2-web). Also
-an apache configuration entry is added to your apache server, so you should restart
-your web server according to your systems configuration.
+ * git://git.icinga.org/icingaweb2.git
+ * http://git.icinga.org/icingaweb2.git
-### Installation directory
+There is also a browsable version available at
+[gi.icinga.org](https://git.icinga.org/?p=icingaweb2.git;a=summary "Icinga Web 2 Git Repository").
+This version also offers snapshots for easy download which you can use if you do not have git present on your system.
-If you want to install the application to a different directory, use the --prefix flag in your
-configure call:
+````
+git clone git://git.icinga.org/icingaweb2.git
+````
- ./configure --prefix=/my/target/directory
+**Step 2: Install the Source**
+Choose a target directory and move Icinga Web 2 there.
-### Authentication
+````
+mv icingaweb2 /usr/share/icingaweb2
+````
-By default, icinga2-web will be installed to authenticate againts its internal database,
-but you can configure it to use ldap-authentication by adding the `--with-ldap-authentication`
-flag. You must provide the authentication details for your ldap server by using the --with-ldap-* flags.
-To see a full list of the flags, call `./configure --help`
+**Step 3: Configuring the Web Server**
-### Icinga backend
+Use `icingacli` to generate web server configuration for either Apache or nginx.
-The default option for icinga2web is to configure all icinga backends with the default settings (for example
-/usr/local/icinga/ as the icinga directory) but only enable statusdat. To use a different backend,
-call `--with-icinga-backend=` and provide ido, livestatus or statusdat as an option. To further configure
-your backend, take a look at the various options described in `./configure --help`
+*Apache*
-### Databases
+````
+./bin/icingacli setup config webserver apache
+````
-It is required to set up all used Databases correctly, which basically means to create all needed user accounts and to
-create all database tables. You will find the installation guides for the different databases in the sections below:
+*nginx*
-*IMPORTANT*: Select a secure password instead of "icingaweb" and alter the config/authentication.ini accordingly.
+````
+./bin/icingacli setup config webserver nginx
+````
+**Step 4: Web Setup**
-#### MySQL
-
-1. Create the user and the database
-
-
- mysql -u root -p
- mysql> CREATE USER `icingaweb`@`localhost` IDENTIFIED BY 'icingaweb';
- mysql> CREATE DATABASE `icingaweb`;
- mysql> GRANT ALL PRIVILEGES ON `icingaweb`.* TO `icingaweb`@`localhost`;
- mysql> FLUSH PRIVILEGES;
- mysql> quit
-
-
-2. Create all tables (You need to be in the icinga2-web folder)
-
-> **Note**
->
-> RPM packages install the schema into /usr/share/doc/icingaweb-<version>/schema
-
- bash$ mysql -u root -p icingaweb < etc/schema/mysql.sql
-
-
-#### PostgreSQL
-
-1. Create the user and the database
-
-
- sudo su postgres
- psql
- postgres=# CREATE USER icingaweb WITH PASSWORD 'icingaweb';
- postgres=# CREATE DATABASE icingaweb;
- postgres=# \q
-
-
-2. Enable trust authentication on localhost
-
-Add the following lines to your pg_hba.conf (etc/postgresql/X.x/main/pg_hba.conf under debian, /var/lib/pgsql/data/pg_hba.conf for Redhat/Fedora)
-to enable trust authentication for the icingaweb user when connecting from the localhost.
-
- local icingaweb icingaweb trust
- host icingaweb icingaweb 127.0.0.1/32 trust
- host icingaweb icingaweb ::1/128 trust
-
-And restart your database ('service postgresql restart' or '/etc/init.d/postgresql-X.x reload' while being root)
-
-
-3. Create all tables (You need to be in the icinga2-web folder)
-
-> **Note**
->
-> RPM packages install the schema into /usr/share/doc/icingaweb-<version>/schema
-
- bash$ psql -U icingaweb -a -f etc/schema/pgsql.sql
-
-
-
-Quick and Dirty
-----------------
-
-tdb.
+Visit Icinga Web 2 in your browser and complete installation using the web setup.
diff --git a/modules/monitoring/application/controllers/ListController.php b/modules/monitoring/application/controllers/ListController.php
index 821b6df79..a58304cd6 100644
--- a/modules/monitoring/application/controllers/ListController.php
+++ b/modules/monitoring/application/controllers/ListController.php
@@ -537,6 +537,24 @@ class Monitoring_ListController extends Controller
}
$this->addTitleTab('eventhistory', $this->translate('Event Overview'));
+ $form = new EventOverviewForm();
+ $form->handleRequest($this->getRequest());
+ $this->view->form = $form;
+
+ if ($this->getRequest()->isPost() && !$this->getParam('modifyFilter')) {
+ // update filter string
+ $filters = $form->getFilter();
+ $url = $this->_request->getUrl();
+ $url->setQueryString($filters->toQueryString());
+ if ($this->getParam('sort') !== null) {
+ $url->setParam('sort', $this->getParam('sort'));
+ }
+ if ($this->getParam('dir') !== null) {
+ $url->setParam('dir', $this->getParam('dir'));
+ }
+ return $this->redirectNow($url);
+ }
+
$query = $this->backend->select()->from('eventHistory', array(
'host_name',
'service_description',
@@ -550,6 +568,9 @@ class Monitoring_ListController extends Controller
'host',
'service'
));
+ if ($this->getParam('state')) {
+ $query->applyFilter(Filter::expression('state', '=', $this->getParam('state')));
+ }
$this->setupSortControl(array(
'timestamp' => 'Occurence'
diff --git a/modules/monitoring/application/controllers/ProcessController.php b/modules/monitoring/application/controllers/ProcessController.php
index e843d8ecd..ca879cbaa 100644
--- a/modules/monitoring/application/controllers/ProcessController.php
+++ b/modules/monitoring/application/controllers/ProcessController.php
@@ -23,16 +23,9 @@ class Monitoring_ProcessController extends Controller
->add(
'info',
array(
- 'title' => $this->translate('Process Info'),
+ 'title' => $this->translate('Monitoring Health'),
'url' =>'monitoring/process/info'
)
- )
- ->add(
- 'performance',
- array(
- 'title' => $this->translate('Performance Info'),
- 'url' => 'monitoring/process/performance'
- )
);
}
@@ -41,7 +34,7 @@ class Monitoring_ProcessController extends Controller
*/
public function infoAction()
{
- $this->view->title = $this->translate('Process Info');
+ $this->view->title = $this->translate('Monitoring Health');
$this->getTabs()->activate('info');
$this->setAutorefreshInterval(10);
$this->view->backendName = $this->backend->getName();
@@ -80,6 +73,14 @@ class Monitoring_ProcessController extends Controller
->load($programStatus)
->handleRequest();
$this->view->toggleFeaturesForm = $toggleFeaturesForm;
+
+ $this->view->runtimevariables = (object) $this->backend->select()
+ ->from('runtimevariables', array('varname', 'varvalue'))
+ ->getQuery()->fetchPairs();
+
+ $this->view->checkperformance = $this->backend->select()
+ ->from('runtimesummary')
+ ->getQuery()->fetchAll();
}
/**
@@ -111,6 +112,9 @@ class Monitoring_ProcessController extends Controller
}
}
+ /**
+ * @todo should be dropped later
+ */
public function performanceAction()
{
$this->getTabs()->activate('performance');
diff --git a/modules/monitoring/application/forms/Config/BackendConfigForm.php b/modules/monitoring/application/forms/Config/BackendConfigForm.php
index f467b8f59..4b1aa65b6 100644
--- a/modules/monitoring/application/forms/Config/BackendConfigForm.php
+++ b/modules/monitoring/application/forms/Config/BackendConfigForm.php
@@ -237,18 +237,28 @@ class BackendConfigForm extends ConfigForm
)
);
- $resourceName = (isset($formData['resource'])) ? $formData['resource'] : $this->getValue('resource');
- if ($resourceElement) {
- $resourceElement->getDecorator('Description')->setEscape(false);
- $link = sprintf(
- '%s',
- $this->getView()->href('/icingaweb/config/editresource', array('resource' => $resourceName)),
- mt('monitoring', 'Show resource configuration')
- );
- $resourceElement->setDescription($resourceElement->getDescription() . ' (' . $link . ')');
+ if (empty($formData)) {
+ $options = $resourceElement->options;
+ $resourceName = array_shift($options);
+ } else {
+ $resourceName = (isset($formData['resource'])) ? $formData['resource'] : $this->getValue('resource');
}
$this->addElement($resourceElement);
+ if ($resourceElement) {
+ $this->addElement(
+ 'note',
+ 'resource_note',
+ array(
+ 'value' => sprintf(
+ '%s',
+ $this->getView()->href('/icingaweb/config/editresource', array('resource' => $resourceName)),
+ mt('monitoring', 'Show resource configuration')
+ ),
+ 'escape' => false
+ )
+ );
+ }
}
}
diff --git a/modules/monitoring/application/forms/EventOverviewForm.php b/modules/monitoring/application/forms/EventOverviewForm.php
new file mode 100644
index 000000000..25d268f76
--- /dev/null
+++ b/modules/monitoring/application/forms/EventOverviewForm.php
@@ -0,0 +1,160 @@
+setName('form_event_overview');
+ $this->setDecorators(array(
+ 'FormElements',
+ array('HtmlTag', array('tag' => 'div', 'class' => 'hbox')),
+ 'Form'
+ ));
+ }
+
+ /**
+ * @see Form::createElements()
+ */
+ public function createElements(array $formData)
+ {
+ $decorators = array(
+ array('Label', array('class' => 'optional')),
+ 'ViewHelper',
+ array('HtmlTag', array('tag' => 'div', 'class' => 'hbox-item optionbox')),
+ );
+
+ $url = Url::fromRequest()->getAbsoluteUrl();
+ $this->addElement(
+ 'checkbox',
+ 'statechange',
+ array(
+ 'label' => t('State Changes'),
+ 'class' => 'autosubmit',
+ 'decorators' => $decorators,
+ 'value' => strpos($url, $this->stateChangeFilter()->toQueryString()) === false ? 0 : 1
+ )
+ );
+ $this->addElement(
+ 'checkbox',
+ 'downtime',
+ array(
+ 'label' => t('Downtimes'),
+ 'class' => 'autosubmit',
+ 'decorators' => $decorators,
+ 'value' => strpos($url, $this->downtimeFilter()->toQueryString()) === false ? 0 : 1
+ )
+ );
+ $this->addElement(
+ 'checkbox',
+ 'comment',
+ array(
+ 'label' => t('Comments'),
+ 'class' => 'autosubmit',
+ 'decorators' => $decorators,
+ 'value' => strpos($url, $this->commentFilter()->toQueryString()) === false ? 0 : 1
+ )
+ );
+ $this->addElement(
+ 'checkbox',
+ 'notification',
+ array(
+ 'label' => t('Notifications'),
+ 'class' => 'autosubmit',
+ 'decorators' => $decorators,
+ 'value' => strpos($url, $this->notificationFilter()->toQueryString()) === false ? 0 : 1
+ )
+ );
+ $this->addElement(
+ 'checkbox',
+ 'flapping',
+ array(
+ 'label' => t('Flapping'),
+ 'class' => 'autosubmit',
+ 'decorators' => $decorators,
+ 'value' => strpos($url, $this->flappingFilter()->toQueryString()) === false ? 0 : 1
+ )
+ );
+ }
+
+ /**
+ * Return the corresponding filter-object
+ *
+ * @returns Filter
+ */
+ public function getFilter()
+ {
+ $filters = array();
+ if ($this->getValue('statechange', 1)) {
+ $filters[] = $this->stateChangeFilter();
+ }
+ if ($this->getValue('comment', 1)) {
+ $filters[] = $this->commentFilter();
+ }
+ if ($this->getValue('notification', 1)) {
+ $filters[] = $this->notificationFilter();
+ }
+ if ($this->getValue('downtime', 1)) {
+ $filters[] = $this->downtimeFilter();
+ }
+ if ($this->getValue('flapping', 1)) {
+ $filters[] = $this->flappingFilter();
+ }
+ return Filter::matchAny($filters);
+ }
+
+ public function stateChangeFilter()
+ {
+ return Filter::matchAny(
+ Filter::expression('type', '=', 'hard_state'),
+ Filter::expression('type', '=', 'soft_state')
+ );
+ }
+
+ public function commentFilter()
+ {
+ return Filter::matchAny(
+ Filter::expression('type', '=', 'comment'),
+ Filter::expression('type', '=', 'comment_deleted'),
+ Filter::expression('type', '=', 'dt_comment'),
+ Filter::expression('type', '=', 'dt_comment_deleted'),
+ Filter::expression('type', '=', 'ack')
+ );
+ }
+
+ public function notificationFilter()
+ {
+ return Filter::expression('type', '=', 'notify');
+ }
+
+ public function downtimeFilter()
+ {
+ return Filter::matchAny(
+ Filter::expression('type', '=', 'downtime_start'),
+ Filter::expression('type', '=', 'downtime_end')
+ );
+ }
+
+ public function flappingFilter()
+ {
+ return Filter::matchAny(
+ Filter::expression('type', '=', 'flapping'),
+ Filter::expression('type', '=', 'flapping_deleted')
+ );
+ }
+}
diff --git a/modules/monitoring/application/views/scripts/list/eventhistory.phtml b/modules/monitoring/application/views/scripts/list/eventhistory.phtml
index 97eda5354..6bc06e2c9 100644
--- a/modules/monitoring/application/views/scripts/list/eventhistory.phtml
+++ b/modules/monitoring/application/views/scripts/list/eventhistory.phtml
@@ -4,9 +4,16 @@
= $this->translate('Sort by'); ?> = $this->sortControl->render($this); ?>
+
= $this->widget('limiter', array('url' => $this->url, 'max' => $this->history->count())); ?>
= $this->paginationControl($history, null, null, array('preserve' => $this->preserve)); ?>
-
+
+
+ = $form ?>
+
+
+ = $this->filterEditor ?>
+
diff --git a/modules/monitoring/application/views/scripts/process/info.phtml b/modules/monitoring/application/views/scripts/process/info.phtml
index c659544c2..02b8eeb80 100644
--- a/modules/monitoring/application/views/scripts/process/info.phtml
+++ b/modules/monitoring/application/views/scripts/process/info.phtml
@@ -1,55 +1,171 @@
+runtimeVariables()->create($this->runtimevariables);
+$cp = $this->checkPerformance()->create($this->checkperformance);
+
+?>
= $this->tabs ?>
- programStatus->is_currently_running === true): ?>
-
- = sprintf(
- $this->translate('%s has been up and running with PID %d since %s'),
- $this->backendName,
- $this->programStatus->process_id,
- $this->timeSince($this->programStatus->program_start_time)) ?>
+
+
+
+
= $this->translate('Feature Commands') ?>
+ = $this->toggleFeaturesForm ?>
+
+
+
+
= $this->translate('Process Info') ?>
+
+
+
+ = $this->translate('Program Start Time') ?> |
+ = $this->dateFormat()->formatDateTime($this->programStatus->program_start_time) ?> |
+
+
+ = $this->translate('Last Status Update'); ?> |
+ = $this->timeSince($this->programStatus->status_update_time) ?> ago |
+
+
+ = $this->translate('Last External Command Check'); ?> |
+ = $this->timeSince($this->programStatus->last_command_check) ?> ago |
+
+
+ = $this->translate('Last Log File Rotation'); ?> |
+ = $this->programStatus->last_log_rotation
+ ? $this->timeSince($this->programStatus->last_log_rotation)
+ : $this->translate('N/A') ?> |
+
+
+ = $this->translate('Global Service Event Handler'); ?> |
+ = $this->programStatus->global_service_event_handler
+ ? $this->programStatus->global_service_event_handler
+ : $this->translate('N/A'); ?> |
+
+
+ = $this->translate('Global Host Event Handler'); ?> |
+ = $this->programStatus->global_host_event_handler
+ ? $this->programStatus->global_host_event_handler
+ : $this->translate('N/A'); ?> |
+
+
+
+ programStatus->is_currently_running === true): ?>
+
+ = sprintf(
+ $this->translate('%s has been up and running with PID %d since %s'),
+ $this->backendName,
+ $this->programStatus->process_id,
+ $this->timeSince($this->programStatus->program_start_time)) ?>
+
+
+
+ = sprintf($this->translate('%s is not running'), $this->backendName) ?>
+
+
+
+
+
+
= $this->translate('Performance Info') ?>
+
+
= $this->translate('Object summaries') ?>
+
+
+
+ |
+ = $this->translate('overall') ?> |
+ = $this->translate('scheduled') ?> |
+
+
+
+
+
+ = $this->translate('Hosts') ?>
+ |
+
+ = $rv->total_hosts; ?>
+ |
+
+ = $rv->total_scheduled_hosts; ?>
+ |
+
+
+
+
+ = $this->translate('Services') ?>
+ |
+
+ = $rv->total_services; ?>
+ |
+
+ = $rv->total_scheduled_services; ?>
+ |
+
+
+
+
+ = $this->translate('Average services per host') ?>
+ |
+
+ = sprintf('%.2f', $rv->average_services_per_host); ?>
+ |
+
+ = sprintf('%.2f', $rv->average_scheduled_services_per_host); ?>
+ |
+
+
+
+
+
= $this->translate('Active checks') ?>
+
+
+
+ |
+ |
+ = $this->translate('Latency') ?> |
+ = $this->translate('Execution time') ?> |
+
+
+
+
+
+ = $this->translate('Host Checks') ?>
+ |
+ = $cp->host_active_count; ?> |
+ = sprintf('%.3f', $cp->host_active_latency_avg); ?>s |
+ = sprintf('%.3f', $cp->host_active_execution_avg); ?>s |
+
+
+
+ = $this->translate('Service Checks') ?>
+ |
+ = $cp->service_active_count; ?> |
+ = sprintf('%.3f', $cp->service_active_latency_avg); ?>s |
+ = sprintf('%.3f', $cp->service_active_execution_avg); ?>s |
+
+
+
+
+
= $this->translate('Passive checks') ?>
+
+
+
+
+ = $this->translate('Host Checks') ?>
+ |
+ = $cp->host_passive_count; ?> |
+
+
+
+ = $this->translate('Service Checks') ?>
+ |
+ = $cp->service_passive_count; ?> |
+
+
+
+
+
-
-
- = sprintf($this->translate('%s is not running'), $this->backendName) ?>
-
-
-
-
-
- = $this->translate('Program Start Time') ?> |
- = $this->dateFormat()->formatDateTime($this->programStatus->program_start_time) ?> |
-
-
- = $this->translate('Last Status Update'); ?> |
- = $this->timeSince($this->programStatus->status_update_time) ?> ago |
-
-
- = $this->translate('Last External Command Check'); ?> |
- = $this->timeSince($this->programStatus->last_command_check) ?> ago |
-
-
- = $this->translate('Last Log File Rotation'); ?> |
- = $this->programStatus->last_log_rotation
- ? $this->timeSince($this->programStatus->last_log_rotation)
- : $this->translate('N/A') ?> |
-
-
- = $this->translate('Global Service Event Handler'); ?> |
- = $this->programStatus->global_service_event_handler
- ? $this->programStatus->global_service_event_handler
- : $this->translate('N/A'); ?> |
-
-
- = $this->translate('Global Host Event Handler'); ?> |
- = $this->programStatus->global_host_event_handler
- ? $this->programStatus->global_host_event_handler
- : $this->translate('N/A'); ?> |
-
-
-
-
- = $this->toggleFeaturesForm ?>
diff --git a/modules/monitoring/configuration.php b/modules/monitoring/configuration.php
index f7d876a29..366067c09 100644
--- a/modules/monitoring/configuration.php
+++ b/modules/monitoring/configuration.php
@@ -136,14 +136,10 @@ $section->add($this->translate('Alert Summary'), array(
* System Section
*/
$section = $this->menuSection($this->translate('System'));
-$section->add($this->translate('Process Info'), array(
+$section->add($this->translate('Monitoring Health'), array(
'url' => 'monitoring/process/info',
'priority' => 120
));
-$section->add($this->translate('Performance Info'), array(
- 'url' => 'monitoring/process/performance',
- 'priority' => 130
-));
/*
* Dashboard
diff --git a/modules/monitoring/public/css/module.less b/modules/monitoring/public/css/module.less
index 84b3ba899..6a2dae87e 100644
--- a/modules/monitoring/public/css/module.less
+++ b/modules/monitoring/public/css/module.less
@@ -176,3 +176,19 @@ div.selection-info {
padding-top:0.5em;
float: right;
}
+
+.optionbox {
+ margin-left: 0em;
+ margin-right: 3em;
+}
+
+.optionbox label {
+ max-width: 6.5em;
+ text-align: left;
+ vertical-align: middle;
+ margin-right: 0em;
+}
+
+.optionbox input {
+ vertical-align: middle;
+}
diff --git a/public/css/icinga/main-content.less b/public/css/icinga/main-content.less
index a9d5a94a9..ccdd63795 100644
--- a/public/css/icinga/main-content.less
+++ b/public/css/icinga/main-content.less
@@ -185,3 +185,7 @@ table.benchmark {
.dashboard table.benchmark {
font-size: 0.9em;
}
+
+.left {
+ text-align: left !important;
+}
diff --git a/public/css/icinga/monitoring-colors.less b/public/css/icinga/monitoring-colors.less
index 17a7b59fe..7beee80d0 100644
--- a/public/css/icinga/monitoring-colors.less
+++ b/public/css/icinga/monitoring-colors.less
@@ -311,6 +311,13 @@ a.critical {
.boxview div.box h2:first-child > a:hover {
}
+.boxview div.box h3 {
+ line-height: 1.5em;
+ font-size: 0.9em;
+ color: #555;
+ border-bottom: 1px solid #d9d9d9;
+}
+
/* Box body of contents */
.boxview div.box.contents {
padding: 0.2em;