mirror of
https://github.com/Icinga/icingaweb2.git
synced 2025-07-28 16:24:04 +02:00
Merge remote-tracking branch 'origin/master' into feature/redesign-7144
This commit is contained in:
commit
63cd5854d4
@ -32,7 +32,7 @@ class LoginForm extends Form
|
|||||||
array(
|
array(
|
||||||
'required' => true,
|
'required' => true,
|
||||||
'label' => t('Username'),
|
'label' => t('Username'),
|
||||||
'placeholder' => t(''),
|
'placeholder' => t('Please enter your username...'),
|
||||||
'class' => false === isset($formData['username']) ? 'autofocus' : ''
|
'class' => false === isset($formData['username']) ? 'autofocus' : ''
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
@ -42,7 +42,7 @@ class LoginForm extends Form
|
|||||||
array(
|
array(
|
||||||
'required' => true,
|
'required' => true,
|
||||||
'label' => t('Password'),
|
'label' => t('Password'),
|
||||||
'placeholder' => t(''),
|
'placeholder' => t('...and your password'),
|
||||||
'class' => isset($formData['username']) ? 'autofocus' : ''
|
'class' => isset($formData['username']) ? 'autofocus' : ''
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -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
|
* A web server, e.g. Apache or nginx
|
||||||
* PHP Zend Framework
|
* PHP >= 5.3.0
|
||||||
* PHP with MySQL or PostgreSQL libraries
|
* MySQL or PostgreSQL PHP libraries when using a database for authentication or storing user preferences into a database
|
||||||
* MySQL or PostgreSQL server and client software
|
* LDAP PHP library when using Active Directory or LDAP for authentication
|
||||||
* Icinga 1.x or Icinga 2 as backend providers
|
* 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`
|
## <a id="installation-from-package"></a> Installing Icinga Web 2 from Package
|
||||||
package). OpenSUSE requires the [server monitoring](https://build.opensuse.org/project/show/server:monitoring) repository (which provides the `php5-ZendFramework` package) enabled.
|
|
||||||
|
|
||||||
## 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
|
**Step 1: Getting the Source**
|
||||||
if you want to create packages, configure and make is the best choice for installation.
|
|
||||||
|
|
||||||
./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
|
* git://git.icinga.org/icingaweb2.git
|
||||||
an apache configuration entry is added to your apache server, so you should restart
|
* http://git.icinga.org/icingaweb2.git
|
||||||
your web server according to your systems configuration.
|
|
||||||
|
|
||||||
### 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,
|
**Step 3: Configuring the Web Server**
|
||||||
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`
|
|
||||||
|
|
||||||
### 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
|
*Apache*
|
||||||
/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`
|
|
||||||
|
|
||||||
### 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
|
*nginx*
|
||||||
create all database tables. You will find the installation guides for the different databases in the sections below:
|
|
||||||
|
|
||||||
*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
|
Visit Icinga Web 2 in your browser and complete installation using the web setup.
|
||||||
|
|
||||||
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.
|
|
||||||
|
@ -537,6 +537,24 @@ class Monitoring_ListController extends Controller
|
|||||||
}
|
}
|
||||||
$this->addTitleTab('eventhistory', $this->translate('Event Overview'));
|
$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(
|
$query = $this->backend->select()->from('eventHistory', array(
|
||||||
'host_name',
|
'host_name',
|
||||||
'service_description',
|
'service_description',
|
||||||
@ -550,6 +568,9 @@ class Monitoring_ListController extends Controller
|
|||||||
'host',
|
'host',
|
||||||
'service'
|
'service'
|
||||||
));
|
));
|
||||||
|
if ($this->getParam('state')) {
|
||||||
|
$query->applyFilter(Filter::expression('state', '=', $this->getParam('state')));
|
||||||
|
}
|
||||||
|
|
||||||
$this->setupSortControl(array(
|
$this->setupSortControl(array(
|
||||||
'timestamp' => 'Occurence'
|
'timestamp' => 'Occurence'
|
||||||
|
@ -23,16 +23,9 @@ class Monitoring_ProcessController extends Controller
|
|||||||
->add(
|
->add(
|
||||||
'info',
|
'info',
|
||||||
array(
|
array(
|
||||||
'title' => $this->translate('Process Info'),
|
'title' => $this->translate('Monitoring Health'),
|
||||||
'url' =>'monitoring/process/info'
|
'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()
|
public function infoAction()
|
||||||
{
|
{
|
||||||
$this->view->title = $this->translate('Process Info');
|
$this->view->title = $this->translate('Monitoring Health');
|
||||||
$this->getTabs()->activate('info');
|
$this->getTabs()->activate('info');
|
||||||
$this->setAutorefreshInterval(10);
|
$this->setAutorefreshInterval(10);
|
||||||
$this->view->backendName = $this->backend->getName();
|
$this->view->backendName = $this->backend->getName();
|
||||||
@ -80,6 +73,14 @@ class Monitoring_ProcessController extends Controller
|
|||||||
->load($programStatus)
|
->load($programStatus)
|
||||||
->handleRequest();
|
->handleRequest();
|
||||||
$this->view->toggleFeaturesForm = $toggleFeaturesForm;
|
$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()
|
public function performanceAction()
|
||||||
{
|
{
|
||||||
$this->getTabs()->activate('performance');
|
$this->getTabs()->activate('performance');
|
||||||
|
@ -237,18 +237,28 @@ class BackendConfigForm extends ConfigForm
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
$resourceName = (isset($formData['resource'])) ? $formData['resource'] : $this->getValue('resource');
|
if (empty($formData)) {
|
||||||
if ($resourceElement) {
|
$options = $resourceElement->options;
|
||||||
$resourceElement->getDecorator('Description')->setEscape(false);
|
$resourceName = array_shift($options);
|
||||||
$link = sprintf(
|
} else {
|
||||||
'<a href="%s" data-base-target="_main">%s</a>',
|
$resourceName = (isset($formData['resource'])) ? $formData['resource'] : $this->getValue('resource');
|
||||||
$this->getView()->href('/icingaweb/config/editresource', array('resource' => $resourceName)),
|
|
||||||
mt('monitoring', 'Show resource configuration')
|
|
||||||
);
|
|
||||||
$resourceElement->setDescription($resourceElement->getDescription() . ' (' . $link . ')');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addElement($resourceElement);
|
$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
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
160
modules/monitoring/application/forms/EventOverviewForm.php
Normal file
160
modules/monitoring/application/forms/EventOverviewForm.php
Normal 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')
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -4,9 +4,16 @@
|
|||||||
<div style="margin: 1em" class="dontprint">
|
<div style="margin: 1em" class="dontprint">
|
||||||
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
|
<?= $this->translate('Sort by'); ?> <?= $this->sortControl->render($this); ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $this->history->count())); ?>
|
<?= $this->widget('limiter', array('url' => $this->url, 'max' => $this->history->count())); ?>
|
||||||
<?= $this->paginationControl($history, null, null, array('preserve' => $this->preserve)); ?>
|
<?= $this->paginationControl($history, null, null, array('preserve' => $this->preserve)); ?>
|
||||||
</div>
|
|
||||||
|
<br> <br>
|
||||||
|
<?= $form ?>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
|
<?= $this->filterEditor ?>
|
||||||
|
</div>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
||||||
<div class="content">
|
<div class="content">
|
||||||
|
@ -1,55 +1,171 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$rv = $this->runtimeVariables()->create($this->runtimevariables);
|
||||||
|
$cp = $this->checkPerformance()->create($this->checkperformance);
|
||||||
|
|
||||||
|
?>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<?= $this->tabs ?>
|
<?= $this->tabs ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content processinfo">
|
<div class="content processinfo">
|
||||||
<?php if ((bool) $this->programStatus->is_currently_running === true): ?>
|
<div class="boxview">
|
||||||
<div class="backend-running">
|
|
||||||
<?= sprintf(
|
<div class="box left">
|
||||||
$this->translate('%s has been up and running with PID %d since %s'),
|
<h2><?= $this->translate('Feature Commands') ?></h2>
|
||||||
$this->backendName,
|
<?= $this->toggleFeaturesForm ?>
|
||||||
$this->programStatus->process_id,
|
</div>
|
||||||
$this->timeSince($this->programStatus->program_start_time)) ?>
|
|
||||||
|
<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>
|
</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>
|
</div>
|
||||||
|
@ -136,14 +136,10 @@ $section->add($this->translate('Alert Summary'), array(
|
|||||||
* System Section
|
* System Section
|
||||||
*/
|
*/
|
||||||
$section = $this->menuSection($this->translate('System'));
|
$section = $this->menuSection($this->translate('System'));
|
||||||
$section->add($this->translate('Process Info'), array(
|
$section->add($this->translate('Monitoring Health'), array(
|
||||||
'url' => 'monitoring/process/info',
|
'url' => 'monitoring/process/info',
|
||||||
'priority' => 120
|
'priority' => 120
|
||||||
));
|
));
|
||||||
$section->add($this->translate('Performance Info'), array(
|
|
||||||
'url' => 'monitoring/process/performance',
|
|
||||||
'priority' => 130
|
|
||||||
));
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dashboard
|
* Dashboard
|
||||||
|
@ -176,3 +176,19 @@ div.selection-info {
|
|||||||
padding-top:0.5em;
|
padding-top:0.5em;
|
||||||
float: right;
|
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;
|
||||||
|
}
|
||||||
|
@ -185,3 +185,7 @@ table.benchmark {
|
|||||||
.dashboard table.benchmark {
|
.dashboard table.benchmark {
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.left {
|
||||||
|
text-align: left !important;
|
||||||
|
}
|
||||||
|
@ -311,6 +311,13 @@ a.critical {
|
|||||||
.boxview div.box h2:first-child > a:hover {
|
.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 */
|
/* Box body of contents */
|
||||||
.boxview div.box.contents {
|
.boxview div.box.contents {
|
||||||
padding: 0.2em;
|
padding: 0.2em;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user