Merge remote-tracking branch 'origin/master' into feature/redesign-7144

This commit is contained in:
Thomas Gelf 2014-11-19 07:56:48 +01:00
commit 63cd5854d4
12 changed files with 455 additions and 169 deletions

View File

@ -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' : ''
)
);

View File

@ -1,117 +1,62 @@
# <a id="installation"></a> 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
## <a id="installation-requirements"></a> 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.
## <a id="installation-from-package"></a> Installing Icinga Web 2 from Package
## configure && make
A guide on how to install Icinga Web 2 from package will follow shortly.
### Basic installation
## <a id="installation-from-source"></a> 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-&lt;version&gt;/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-&lt;version&gt;/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.

View File

@ -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'

View File

@ -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');

View File

@ -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(
'<a href="%s" data-base-target="_main">%s</a>',
$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(
'<a href="%s" data-base-target="_main">%s</a>',
$this->getView()->href('/icingaweb/config/editresource', array('resource' => $resourceName)),
mt('monitoring', 'Show resource configuration')
),
'escape' => false
)
);
}
}
}

View File

@ -0,0 +1,160 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Module\Monitoring\Forms;
use Icinga\Data\Filter\FilterNot;
use Icinga\Web\Url;
use \Zend_Form;
use Icinga\Web\Form;
use Icinga\Data\Filter\Filter;
/**
* Configure the filter for the event overview
*/
class EventOverviewForm extends Form
{
/**
* Initialize this form
*/
public function init()
{
$this->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')
);
}
}

View File

@ -4,9 +4,16 @@
<div style="margin: 1em" class="dontprint">
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
</div>
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $this->history->count())); ?>
<?= $this->paginationControl($history, null, null, array('preserve' => $this->preserve)); ?>
</div>
<br> <br>
<?= $form ?>
<div class="content">
<?= $this->filterEditor ?>
</div>
<?php endif ?>
<div class="content">

View File

@ -1,55 +1,171 @@
<?php
$rv = $this->runtimeVariables()->create($this->runtimevariables);
$cp = $this->checkPerformance()->create($this->checkperformance);
?>
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content processinfo">
<?php if ((bool) $this->programStatus->is_currently_running === true): ?>
<div class="backend-running">
<?= 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)) ?>
<div class="boxview">
<div class="box left">
<h2><?= $this->translate('Feature Commands') ?></h2>
<?= $this->toggleFeaturesForm ?>
</div>
<div class="box left">
<h2><?= $this->translate('Process Info') ?></h2>
<table class="avp">
<tbody>
<tr>
<th><?= $this->translate('Program Start Time') ?></th>
<td><?= $this->dateFormat()->formatDateTime($this->programStatus->program_start_time) ?></td>
</tr>
<tr>
<th><?= $this->translate('Last Status Update'); ?></th>
<td><?= $this->timeSince($this->programStatus->status_update_time) ?> ago</td>
</tr>
<tr>
<th><?= $this->translate('Last External Command Check'); ?></th>
<td><?= $this->timeSince($this->programStatus->last_command_check) ?> ago</td>
</tr>
<tr>
<th><?= $this->translate('Last Log File Rotation'); ?></th>
<td><?= $this->programStatus->last_log_rotation
? $this->timeSince($this->programStatus->last_log_rotation)
: $this->translate('N/A') ?></td>
</tr>
<tr>
<th><?= $this->translate('Global Service Event Handler'); ?></th>
<td><?= $this->programStatus->global_service_event_handler
? $this->programStatus->global_service_event_handler
: $this->translate('N/A'); ?></td>
</tr>
<tr>
<th><?= $this->translate('Global Host Event Handler'); ?></th>
<td><?= $this->programStatus->global_host_event_handler
? $this->programStatus->global_host_event_handler
: $this->translate('N/A'); ?></td>
</tr>
</tbody>
</table>
<?php if ((bool) $this->programStatus->is_currently_running === true): ?>
<div class="backend-running">
<?= 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)) ?>
</div>
<?php else: ?>
<div class="backend-not-running">
<?= sprintf($this->translate('%s is not running'), $this->backendName) ?>
</div>
<?php endif ?>
</div>
<div class="box left">
<h2><?= $this->translate('Performance Info') ?></h2>
<h3><?= $this->translate('Object summaries') ?></h3>
<table class="avp">
<thead>
<tr>
<th></th>
<th><?= $this->translate('overall') ?></th>
<th><?= $this->translate('scheduled') ?></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<strong><?= $this->translate('Hosts') ?></strong>
</td>
<td>
<?= $rv->total_hosts; ?>
</td>
<td>
<?= $rv->total_scheduled_hosts; ?>
</td>
</tr>
<tr>
<td>
<strong><?= $this->translate('Services') ?></strong>
</td>
<td>
<?= $rv->total_services; ?>
</td>
<td>
<?= $rv->total_scheduled_services; ?>
</td>
</tr>
<tr>
<td>
<strong><?= $this->translate('Average services per host') ?></strong>
</td>
<td>
<?= sprintf('%.2f', $rv->average_services_per_host); ?>
</td>
<td>
<?= sprintf('%.2f', $rv->average_scheduled_services_per_host); ?>
</td>
</tr>
</tbody>
</table>
<h3><?= $this->translate('Active checks') ?></h3>
<table class="avp">
<thead>
<tr>
<th></th>
<th></th>
<th><?= $this->translate('Latency') ?></th>
<th><?= $this->translate('Execution time') ?></th>
</tr>
</thead>
<tbody>
<tr>
<td>
<strong><?= $this->translate('Host Checks') ?></strong>
</td>
<td><?= $cp->host_active_count; ?></td>
<td><?= sprintf('%.3f', $cp->host_active_latency_avg); ?>s</td>
<td><?= sprintf('%.3f', $cp->host_active_execution_avg); ?>s</td>
</tr>
<tr>
<td>
<strong><?= $this->translate('Service Checks') ?></strong>
</td>
<td><?= $cp->service_active_count; ?></td>
<td><?= sprintf('%.3f', $cp->service_active_latency_avg); ?>s</td>
<td><?= sprintf('%.3f', $cp->service_active_execution_avg); ?>s</td>
</tr>
</tbody>
</table>
<h3><?= $this->translate('Passive checks') ?></h3>
<table class="avp">
<tbody>
<tr>
<td>
<strong><?= $this->translate('Host Checks') ?></strong>
</td>
<td><?= $cp->host_passive_count; ?></td>
</tr>
<tr>
<td>
<strong><?= $this->translate('Service Checks') ?></strong>
</td>
<td><?= $cp->service_passive_count; ?></td>
</tr>
</tbody>
</table>
</div>
</div>
<?php else: ?>
<div class="backend-not-running">
<?= sprintf($this->translate('%s is not running'), $this->backendName) ?>
</div>
<?php endif ?>
<table class="avp">
<tbody>
<tr>
<th><?= $this->translate('Program Start Time') ?></th>
<td><?= $this->dateFormat()->formatDateTime($this->programStatus->program_start_time) ?></td>
</tr>
<tr>
<th><?= $this->translate('Last Status Update'); ?></th>
<td><?= $this->timeSince($this->programStatus->status_update_time) ?> ago</td>
</tr>
<tr>
<th><?= $this->translate('Last External Command Check'); ?></th>
<td><?= $this->timeSince($this->programStatus->last_command_check) ?> ago</td>
</tr>
<tr>
<th><?= $this->translate('Last Log File Rotation'); ?></th>
<td><?= $this->programStatus->last_log_rotation
? $this->timeSince($this->programStatus->last_log_rotation)
: $this->translate('N/A') ?></td>
</tr>
<tr>
<th><?= $this->translate('Global Service Event Handler'); ?></th>
<td><?= $this->programStatus->global_service_event_handler
? $this->programStatus->global_service_event_handler
: $this->translate('N/A'); ?></td>
</tr>
<tr>
<th><?= $this->translate('Global Host Event Handler'); ?></th>
<td><?= $this->programStatus->global_host_event_handler
? $this->programStatus->global_host_event_handler
: $this->translate('N/A'); ?></td>
</tr>
</tbody>
</table>
<hr>
<?= $this->toggleFeaturesForm ?>
</div>

View File

@ -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

View File

@ -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;
}

View File

@ -185,3 +185,7 @@ table.benchmark {
.dashboard table.benchmark {
font-size: 0.9em;
}
.left {
text-align: left !important;
}

View File

@ -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;