Configuration Overview of Icinga-Web
Prev | Chapter 6. User Interfaces | Next

## Configuration Overview of Icinga-Web

Where are my config files?

We're trying to reduce global configuration files. Icinga operates in modules, every module has its own configuration. The Icinga-Web configuration settings like api, authentication and database settings are stored in `etc/conf.d/`. They won't get overwritten during the next upgrade process. The folder may be changed during installation using --with-conf-folder.

This is also done with the libraries. If you need information about the cronk library, take a look into `app/modules/Cronks/lib` (for js things `app/modules/Cronks/lib/js`).

A sample module looks like this:

    tree -d -L 1 app/modules/AppKit/
    app/modules/AppKit/
    |-- actions
    |-- config
    |-- lib
    |-- models
    |-- templates
    |-- validate
    |-- views

Index

- Global Configuration Section

  - databases.xml

  - access.xml

- Session Cookie Lifetime

- Change default Timezone

- Module Configuration

- Authentication

- Icinga-API connection

- Customised Configuration

Global Configuration Section

app/config

Here you find the global configuration files for e.g. the Web session, the Icinga web path and the database information.

The main interesting files:

- `databases.xml` - holds the connection information for your icinga-web database

  - General settings

    The following settings are applicable to every database defined in Icinga-Web

    If you look at the default icinga_web database definition, you'll see most of the settings that exist on a generic database connection:

        <db:database name="icinga_web" class="AppKitDoctrineDatabase">
            <ae:parameter name="dsn">mysql://icinga_web:icinga_web@localhost:3306/icinga_web</ae:parameter>
            <ae:parameter name="charset">utf8</ae:parameter>
            <ae:parameter name="manager_attributes">
                <ae:parameter name="Doctrine_Core::ATTR_MODEL_LOADING">CONSERVATIVE</ae:parameter>
            </ae:parameter>

            <ae:parameter name="load_models">%core.module_dir%/AppKit/lib/database/models/generated</ae:parameter>
            <ae:parameter name="models_directory">%core.module_dir%/AppKit/lib/database/models</ae:parameter>
            <ae:parameter name="date_format"><![CDATA[YYYY-MM-DD HH24:MI:SS]]></ae:parameter>

            <ae:parameter name="caching">
                <ae:parameter name="enabled">false</ae:parameter>
                <ae:parameter name="driver">apc</ae:parameter>
                <ae:parameter name="use_query_cache">true</ae:parameter>
                <ae:parameter name="use_result_cache">true</ae:parameter>
                <ae:parameter name="result_cache_lifespan">60</ae:parameter>
            </ae:parameter>

        </db:database>

    - Database identifier

          <db:database name="%Database name%" class="%Handler%">
             ...
          </db:database>

      With the db:database tag you let Icinga-Web know about a database, this tag must have two attributes:

      - name: The name for your database. At this time (>= v1.5) 'icinga-web' is reserved for the internal icinga-web database, containing user information, credentials, persistence settings, etc. and 'icinga', which represents the database ido2db writes its Icinga information to.

      - class: Always use AppKitDoctrineDatabase, only the 'icinga' database required 'IcingaDoctrineDatabase' (see later)

    - dsn (Data Source Name):

      Defines the credentials, type and location of the database:

      For MySQL, PostgreSQL, and Oracle:

          <db:database ...>
              ...
              <ae:parameter name="dsn">%driver%://%username%:%password%@%host%:%port%/%database name%</ae:parameter>
              ...
          </db:database>

      For sqlite3:

          <db:database ...>
              ...
              <ae:parameter name="dsn">sqlite:///%path to your db file%</ae:parameter>
              ...
          </db:database>

      | Note
      SQLite database files must be read and writeable for the webserver's user, as well as the folder that contains the file.

      - %driver%: The database backend to use

        - mysql: A MySQL database

        - pgsql: A PostgreSQL database

        - oracle: An Oracle database accessed via the oci8 driver.

          Don't use the pdo driver, as this one is far away from being ready for productive use.

        - icingaOracle: Special implementation that must be used when using an Icinga database (some table names are different, and name length limits must be automatically respected to ensure no developers are killing themselves during development).

      - %username%: The username to use for db-authentication

      - %password%: The password to use for db-authentication

      - %host%: The host of your db-server

      - %port%: The port of your db-server

        - mysql-default: 3306

        - postgresql-default: 5432

        - oracle-default: 1521

      - %database name%: The name of your database

    - charset

          <db:database ...>
              ...
              <ae:parameter name="charset">utf8</ae:parameter>
              ...
          </db:database>

      In general, your database charset should be utf8.

    - manager_attributes, load_models, models_directory

          <db:database ...>
              ...
              <ae:parameter name="manager_attributes">
                  <ae:parameter name="Doctrine_Core::ATTR_MODEL_LOADING">CONSERVATIVE</ae:parameter>
              </ae:parameter>
              ...
          </db:database>

      You can safely ignore this section and just copy it, this only handles doctrine specific settings (in particular, how database models will be loaded and where they are located. If you want to know more, look at the doctrine documentation).

    - date_formate

      This is required to properly access oracle databases and sets the date format to use for this database.

          <db:database ...>
              ...
              <ae:parameter name="date_format"><![CDATA[YYYY-MM-DD HH24:MI:SS]]></ae:parameter>
              ...
          </db:database>

    - Caching

          <db:database ...>
              ...
              <ae:parameter name="caching">
                  <ae:parameter name="enabled">false</ae:parameter>
                  <ae:parameter name="driver">apc</ae:parameter>
                  <ae:parameter name="use_query_cache">true</ae:parameter>
                  <ae:parameter name="use_result_cache">true</ae:parameter>
                  <ae:parameter name="result_cache_lifespan">60</ae:parameter>
              </ae:parameter>
          <db:database>

      If you use apc or memcache, you can cache either database queries or results. While query caching almost never is a bad thing (if you're not developing), result cache is a rather specific case - as you might get outdated data from your database. So never use it for your Icinga database!

      - enabled: Turn caching on or off for this database

      - driver: apc or memcache, though memcache is experimental (so try it out !)

      - use_query_cache: Cache queries (only the sql used to request, not the results)

      - use_result_cache: Cache database results (danger!)

      - result_cache_lifespan: How long results should be cached in seconds when using use_result_cache

  - The icinga_web database

    You must have a icinga_web database which holds information about users, credentials, view-persistence, etc. This database must be called 'icinga_web'. All settings are described in the previous section.

  - The icinga database

    From icinga-web v1.5, the icinga-api will be accessed via doctrine (previously there was an own project, the 'icinga-api'). In the following, only special and additional settings will be explained. If not mentioned otherwise, all rules from 'General settings' apply.

    - Database identifier

      The icinga database identifier must use IcingaDoctrineDatabase as the 'class' attribute and 'icinga' as the database name, see:

          <db:database name="icinga" class="IcingaDoctrineDatabase">
          ...
          </db:database>

    - dsn

      You can use the same credentials as in `ido2db.cfg` but for security reasons, it's highly advised to create a read only user especially for icinga-web. Below is an example which values from `ido2db.cfg` fit.

              <ae:parameter name="dsn">mysql://db_user:db_pass@db_host:db_port/db_name</ae:parameter>

    - prefix

      Defines the prefix like defined in Icinga's `ido2db.cfg`

          <db:database name="icinga" class="IcingaDoctrineDatabase">
          ...
              <ae:parameter name="prefix">icinga_</ae:parameter>
          ...
          </db:database>

      For Oracle, add a blank value.

          <db:database name="icinga" class="IcingaDoctrineDatabase">
          ...
              <ae:parameter name="prefix"></ae:parameter>
          ...
          </db:database>

    - use_retained

      Whether to use retained or original data dumps (see the value in `idomod.cfg`)

          <db:database name="icinga" class="IcingaDoctrineDatabase">
          ...
               <ae:parameter name="use_retained">true</ae:parameter>
          </db:database>

  - Complete listing

        <?xml version="1.0" encoding="UTF-8"?>

        <databases xmlns:db="http://agavi.org/agavi/config/parts/databases/1.0" xmlns:ae="http://agavi.org/agavi/config/global/envelope/1.0">

            <db:database name="icinga_web" class="AppKitDoctrineDatabase">
                <ae:parameter name="dsn">mysql://icinga_web:icinga_web@localhost:3306/icinga_web</ae:parameter>
                <ae:parameter name="charset">utf8</ae:parameter>
                <ae:parameter name="manager_attributes">
                    <ae:parameter name="Doctrine_Core::ATTR_MODEL_LOADING">CONSERVATIVE</ae:parameter>
                </ae:parameter>

                <ae:parameter name="load_models">%core.module_dir%/AppKit/lib/database/models/generated</ae:parameter>
                <ae:parameter name="models_directory">%core.module_dir%/AppKit/lib/database/models</ae:parameter>
                <ae:parameter name="date_format"><![CDATA[YYYY-MM-DD HH24:MI:SS]]></ae:parameter>

                <ae:parameter name="caching">
                    <ae:parameter name="enabled">false</ae:parameter>
                    <ae:parameter name="driver">apc</ae:parameter>
                    <ae:parameter name="use_query_cache">true</ae:parameter>
                    <ae:parameter name="use_result_cache">true</ae:parameter>
                    <ae:parameter name="result_cache_lifespan">60</ae:parameter>
                </ae:parameter>

            </db:database>

            <db:database xmlns="http://agavi.org/agavi/config/parts/databases/1.0" name="icinga" class="IcingaDoctrineDatabase">
                <ae:parameter name="dsn">mysql://icinga:icinga@localhost:3306/icinga</ae:parameter>
                <ae:parameter name="prefix">icinga_</ae:parameter>
                <ae:parameter name="charset">utf8</ae:parameter>
                 <ae:parameter name="use_retained">true</ae:parameter>
                <ae:parameter name="manager_attributes">
                    <ae:parameter name="Doctrine_Core::ATTR_MODEL_LOADING">CONSERVATIVE</ae:parameter>
                </ae:parameter>
                <ae:parameter name="load_models">%core.module_dir%/Api/lib/database/models/generated</ae:parameter>
                <ae:parameter name="models_directory">%core.module_dir%/Api/lib/database/models</ae:parameter>
                <ae:parameter name="caching">
                    <ae:parameter name="enabled">false</ae:parameter>
                    <ae:parameter name="driver">apc</ae:parameter>
                    <ae:parameter name="use_query_cache">true</ae:parameter>
                </ae:parameter>

            </db:database>

        </databases>

- access.xml

  The `access.xml` config file has two main purposes:

  - Define hosts that can be accessed by icinga-web (via system or ssh) and define files/binaries that can be written to/read from/executed

  - Map icinga instances to these hosts

  The `access.xml` config will be used by icinga-webs console-handler implementation and provides additional security, as it prevents arbitary execution/manipulation of files in the last instance.

  Sections

  - Instances

    Setting up instances happens in the <instances> section:

    Example: Map instance 'default' to host 'localhost'

        <!-- Map your instances to hosts here -->
         <instances>
            <instance name="default">localhost</instance>
         </instances>

    Allowed subelements

    - instance: Only 'instance' is allowed as a subelement, this node maps an instance name determined by the attribute "name" to a host (see later), determined by the value of this tag:

           <instance name="%icinga instance name%">%host name%</instance>

  - Defaults

    The default section defines default values for host settings, i.e. which files can be read/written to/executed by default. Also the default host used by icinga-web will be defined here.

    Allowed subelements

    - defaultHost: Defines the host that will be used for actions, if no host is defined. At this time (v1.6), this is only important for some modules and doesn't affect icinga-web's basic featureset.

           <defaultHost>localhost</defaultHost>

      The host must be defined in the hosts section

    - access: Icinga-Web (and modules, if written correctly) don't access non architecture-level system resources directly, but via a console-interface, which handles security. In the access section you define, which system resources may be accessed by this handler and where they are located. Also you give system resources a resource name. For example, the console handler only accesses the icinga pipe through the 'icinga_pipe' symbol name.

      The access section allows four sub-elements: 'readwrite', 'read', 'write', 'execute', which define the access level to resources located underneath. Resources themselves are defined under the 'folders' or 'files' tags and encapsulated by 'resource': The following example allows r/w access to Icinga's `objects` folder and the `icinga.cfg` file. Write, read, and execute follow the same scheme so the 'readwrite' tag is to be replaced with the appropriate tag.

         <readwrite>
            <folders>
               <resource name="icinga_objects">/usr/local/icinga/etc/objects</resource>
            </folders>
            <files>
               <resource name="icinga_cfg">/usr/local/icinga/etc/icinga.cfg</resource>
            </files>
         </readwrite>

    As mentioned above, each resource maps a resource symbol (name) to a path. This is optional, but recommended. If a symbol exists more than once, the last will be used.

    | Note
    Custom default definitions in your config folder If you override a custom section, like readwrite, all previously set definitions will be ignored and must be redefined if you want to use them. This doesn't affect module configurations.

  - Hosts

    The hosts section is the section where access methods and credentials, but also specific rights for hosts are defined.

    Allowed subelements:

    - host: Defines a single host and gives him a name which can be used to reference this host (like in the instances section).

           <!-- Example for ssh connection with user/password auth -->
           <host name="vm_host1">
              <type>ssh</type>
              <ssh-config>
                 <host>localhost</host>
                 <port>22</port>
                 <auth>
                    <type>password</type>
                    <user>john_doe</user>
                    <password>foobar</password>
                 </auth>
              </ssh-config>

              <access useDefaults="true" />
           </host>

      The 'host' tag has a bunch of subelements:

    - type: Either local or ssh. Defines if commands will be executed directly on the machine icinga-web is running on or via ssh.

    - access: See the access section above. Additionally, 'useDefaults' can be set in order to tell the CommandInterface that all default access definitions may be applied (if they are not overwritten in this section)

    - ssh-config: (Only if type:ssh) This defines how the host will be accessed over ssh. There are three authentication methods for ssh: 'none', 'password' or 'key', which will be explained in the next session. No matter which method you choose, the 'host' and 'port' entries must be set on every host.

  - SSH-Config auth

    This section explains the auth area of the ssh-config setting, which we introduced in the previous section. The elements underneath the 'auth' tag vary depending on the auth type chosen.

    - Auth type: none

      This tells the Console-connection to only use a username for authentication:

           <ssh-config>
              <host>localhost</host>
              <port>22</port>
              <auth>
                 <type>none</type>
                 <user>john_doe</user>
              </auth>
           </ssh-config>

      In this example, only the username 'john_doe' will be provided for authentication. This can be useful if your machines use automatic key authentication.

    - Auth type: password

      This tells the console-connection to use a username and a password for authentication:

           <ssh-config>
              <host>localhost</host>
              <port>22</port>
              <auth>
                 <type>password</type>
                 <user>john_doe</user>
                 <password>foobar</password>
              </auth>
           </ssh-config>

      In this example, only username 'john_doe' and the password 'foobar' will be provided for authentication.

    - Auth type: key

      | Important
      Experimental! Try it out and open a ticket if you encounter any issues!

      This tells the Console-connection to use a key file for authentication, optionally secured with a password:

           <ssh-config>
              <host>localhost</host>
              <port>22</port>
              <auth>
                 <type>key</type>
                 <user>testuser</user>
                 <private-key>/usr/local/icinga-web/app/modules/Api/lib/.ssh/host1_rsa</private-key>
                 <password>secret123</password>
              </auth>
           </ssh-config>

      Here the private key defined in the 'private-key' tag will be used. You shouldn't and needn't to define this path in the hosts-access section!

  Troubleshooting

  - I can't send commands!

    Make sure your webservers user has write access to the icinga pipe and make sure the icinga_pipe symbol is located in the readwrite or write section of your host (or defaults). Make sure the path is correct

- `factories.xml` - holds the config for your web session, e.g. the session_cookie_lifetime-parameter

- `icinga.xml` - holds the config for your Icinga Web root-dir, Web path.

Session Cookie Lifetime

Example: change the session_cookie_lifetime

The Session Lifetime is the time in seconds until the Icinga Web session expires. It can be configured on global level in the file `app/config/factories.xml`.

    #> vi app/config/factories.xml
    <ae:parameter name="session_cookie_lifetime">3600</ae:parameter>

Please make your customised settings in `factories.site.xml`.

Change Icinga-Web timezone

Example: Change the default timezone for Icinga-Web

If the time(zone) in Icinga-Web differs from your system time(zone), please check the date.timezone entry in `app/modules/AppKit/config/module.xml` (e.g. 'Europe/Berlin')

    #> vi app/modules/AppKit/config/module.xml
    <ae:parameter name="date.timezone">GMT</ae:parameter>

Module Configuration

- app/modules/AppKit

  Here lives the framework spun around: Authentication, Menus and so on.

  Authentication

  Example: LDAP authentication

  Look into `app/modules/AppKit/config/auth.xml`.

  There is a provider like this:

       <ae:parameter name="msad-ldap1">
                  <ae:parameter name="auth_module">AppKit</ae:parameter>
                  <ae:parameter name="auth_provider">Auth.Provider.LDAP</ae:parameter>
                  <ae:parameter name="auth_enable">true</ae:parameter>
                  <ae:parameter name="auth_authoritative">true</ae:parameter>
                  <ae:parameter name="auth_create">true</ae:parameter>
                  <ae:parameter name="auth_update">true</ae:parameter>

                  <ae:parameter name="auth_map">
                      <ae:parameter name="user_firstname">givenName</ae:parameter>
                      <ae:parameter name="user_lastname">sn</ae:parameter>
                      <ae:parameter name="user_email">mail</ae:parameter>
                  </ae:parameter>

                  <ae:parameter name="ldap_dsn">ldap://ad.icinga.org</ae:parameter>
                  <ae:parameter name="ldap_basedn">DC=ad,DC=icinga,DC=org</ae:parameter>
                  <ae:parameter name="ldap_binddn">ldap@AD.ICINGA.ORG</ae:parameter>
                  <ae:parameter name="ldap_bindpw"><![CDATA[XXXXXXXXX]]></ae:parameter>
                  <ae:parameter name="ldap_userattr">uid</ae:parameter>
                  <ae:parameter name="ldap_filter_user"><![CDATA[(&(sAmAccountName=__USERNAME__))]]></ae:parameter>
              </ae:parameter>

  The `auth.xml` holds the documentation for the global config. The LDAP authentication should be done with some basic LDAP knowledge.

  You can also duplicate the provider to provide more authentication bases. You can split the auth into authentication and authorising parts if you want. If you have new providers, please share them and let the auth database grow!

  Please store your custom authentication configuration in `auth.site.xml` !

- app/modules/Cronks

  All the cronks are implemented there: Grids, iframes. All of them are simple html sites which hold ExtJS component codes. If you need to add a new cronk, this module is your friend.

  If you want to develop a new cronk take a look at HowToDevelopCronks

  To change the configuration, go to the Cronks module.

      #> ls app/modules/Cronks/config
      autoload.xml  config_handlers.xml  cronks.xml  module.xml  validators.xml

  - `module.xml` - to define new categories in which the cronks appears, module.xml holds all the information

  - `cronks.xml` - to make new cronks accessible or define new iframe cronks

- app/modules/Web

  Or better: Icinga. This module holds all Icinga related stuff, IcingaAPI2Json, status information. Also the IcingaAPI connection is configured here.

  Icinga-API connection settings

  Example: Change the IcingaApi connection settings

  Take a look at `app/modules/Web/config/icinga-io.xml`, here you'll find the default settings for the IcingaApi connection.

      #> vi app/modules/Web/config/icinga-io.xml

                <setting name="api.interfaces.data">
                                              <!-- IcingaApi connection interface -->
                                              <ae:parameter name="api_type">IcingaApi::CONNECTION_IDO</ae:parameter>

                                              <!-- Suits for all interfaes -->
                                              <ae:parameter name="config_type">mysql</ae:parameter>
                                              <ae:parameter name="config_host">localhost</ae:parameter>
                                              <ae:parameter name="config_port">3306</ae:parameter>

                                              <!-- ###BEGIN_CONNECTION_IDO### -->
                                              <!-- Database specific (IcingaApi::CONNECTION_IDO) -->
                                              <ae:parameter name="config_database">icinga</ae:parameter>
                                              <ae:parameter name="config_user">icinga</ae:parameter>
                                              <ae:parameter name="config_password">icinga</ae:parameter>
                                              <ae:parameter name="config_table_prefix">icinga_</ae:parameter>
                                              <!-- ###END_CONNECTION_IDO### -->

  If you want to change these settings to your needs, please edit `app/modules/Web/config/icinga-io.site.xml`.

Customised Configuration

Notes

When creating and/or editing configuration files, keep the following in mind:

- Lines that start with a <!-- and end with --> character are taken to be comments and are not processed

- Variable names are case-sensitive

- The Icinga-Web configuration settings like api, authentication and database settings are stored in `etc/conf.d/` (prior to v1.5 they were located in app/modules/Appkit(/Cronks/Web)/config/). They won't get overwritten during the next upgrade process. The folder may be changed during installation using --with-conf-folder.

| Note
After changing those configs you need to clear the config cache!

     #> rm -rf app/cache/config/*.php

or

     #> /usr/local/icinga-web/bin/clearcache.sh

You need more information? Please have a look at our Development Wiki.

Prev | Up | Next
Upgrading Icinga-Web and Icinga-Web Database | Home | Introduction to Icinga-Web

© 2009-2011 Icinga Development Team, http://www.icinga.org