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 @@
translate('Sort by'); ?> sortControl->render($this); ?>
+ widget('limiter', array('url' => $this->url, 'max' => $this->history->count())); ?> paginationControl($history, null, null, array('preserve' => $this->preserve)); ?> - + +

+ + +
+ 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); + +?>
tabs ?>
- programStatus->is_currently_running === true): ?> -
- 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)) ?> +
+ +
+

translate('Feature Commands') ?>

+ toggleFeaturesForm ?> +
+ +
+

translate('Process Info') ?>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
translate('Program Start Time') ?>dateFormat()->formatDateTime($this->programStatus->program_start_time) ?>
translate('Last Status Update'); ?>timeSince($this->programStatus->status_update_time) ?> ago
translate('Last External Command Check'); ?>timeSince($this->programStatus->last_command_check) ?> ago
translate('Last Log File Rotation'); ?>programStatus->last_log_rotation + ? $this->timeSince($this->programStatus->last_log_rotation) + : $this->translate('N/A') ?>
translate('Global Service Event Handler'); ?>programStatus->global_service_event_handler + ? $this->programStatus->global_service_event_handler + : $this->translate('N/A'); ?>
translate('Global Host Event Handler'); ?>programStatus->global_host_event_handler + ? $this->programStatus->global_host_event_handler + : $this->translate('N/A'); ?>
+ programStatus->is_currently_running === true): ?> +
+ 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)) ?> +
+ +
+ translate('%s is not running'), $this->backendName) ?> +
+ +
+ +
+

translate('Performance Info') ?>

+ +

translate('Object summaries') ?>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
translate('overall') ?>translate('scheduled') ?>
+ translate('Hosts') ?> + + total_hosts; ?> + + total_scheduled_hosts; ?> +
+ translate('Services') ?> + + total_services; ?> + + total_scheduled_services; ?> +
+ translate('Average services per host') ?> + + average_services_per_host); ?> + + average_scheduled_services_per_host); ?> +
+ +

translate('Active checks') ?>

+ + + + + + + + + + + + + + + + + + + + + + + +
translate('Latency') ?>translate('Execution time') ?>
+ translate('Host Checks') ?> + host_active_count; ?>host_active_latency_avg); ?>shost_active_execution_avg); ?>s
+ translate('Service Checks') ?> + service_active_count; ?>service_active_latency_avg); ?>sservice_active_execution_avg); ?>s
+ +

translate('Passive checks') ?>

+ + + + + + + + + + + +
+ translate('Host Checks') ?> + host_passive_count; ?>
+ translate('Service Checks') ?> + service_passive_count; ?>
+
+
- -
- translate('%s is not running'), $this->backendName) ?> -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
translate('Program Start Time') ?>dateFormat()->formatDateTime($this->programStatus->program_start_time) ?>
translate('Last Status Update'); ?>timeSince($this->programStatus->status_update_time) ?> ago
translate('Last External Command Check'); ?>timeSince($this->programStatus->last_command_check) ?> ago
translate('Last Log File Rotation'); ?>programStatus->last_log_rotation - ? $this->timeSince($this->programStatus->last_log_rotation) - : $this->translate('N/A') ?>
translate('Global Service Event Handler'); ?>programStatus->global_service_event_handler - ? $this->programStatus->global_service_event_handler - : $this->translate('N/A'); ?>
translate('Global Host Event Handler'); ?>programStatus->global_host_event_handler - ? $this->programStatus->global_host_event_handler - : $this->translate('N/A'); ?>
-
- 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;