]> granicus.if.org Git - icinga2/blobdiff - doc/21-development.md
Merge pull request #7124 from Icinga/bugfix/namespace-thread-safe
[icinga2] / doc / 21-development.md
index b6ae7eca402d818ec0cc13934c749bc244be6eae..0053106b4441ad39378f0397ab3bfd9ccfdafe67 100644 (file)
@@ -4,13 +4,19 @@ This chapter provides hints on Icinga 2 debugging,
 development, package builds and tests.
 
 * [Debug Icinga 2](21-development.md#development-debug)
+  * [GDB Backtrace](21-development.md#development-debug-gdb-backtrace)
+  * [Core Dump](21-development.md#development-debug-core-dump)
+* [Test Icinga 2](21-development.md#development-tests)
+  * [Snapshot Packages (Nightly Builds)](21-development.md#development-tests-snapshot-packages)
 * [Develop Icinga 2](21-development.md#development-develop)
- * [Linux Dev Environment](21-development.md#development-linux-dev-env)
- * [macOS Dev Environment](21-development.md#development-macos-dev-env)
- * [Windows Dev Environment](21-development.md#development-windows-dev-env)
 * [Linux Dev Environment](21-development.md#development-linux-dev-env)
 * [macOS Dev Environment](21-development.md#development-macos-dev-env)
 * [Windows Dev Environment](21-development.md#development-windows-dev-env)
 * [Package Builds](21-development.md#development-package-builds)
+  * [RPM](21-development.md#development-package-builds-rpms)
+  * [DEB](21-development.md#development-package-builds-deb)
+  * [Windows](21-development.md#development-package-builds-windows)
 * [Advanced Tips](21-development.md#development-advanced)
-* [Tests](21-development.md#development-tests)
 
 
 ## Debug Icinga 2 <a id="development-debug"></a>
@@ -20,6 +26,7 @@ a stack trace or coredump if the application crashed. It is also useful
 for developers working with different debuggers.
 
 > **Note:**
+>
 > This is intentionally mentioned before any development insights
 > as debugging is a more frequent and commonly asked question.
 
@@ -30,29 +37,12 @@ The Icinga 2 packages provide a debug package which must be
 installed separately for all involved binaries, like `icinga2-bin`
 or `icinga2-ido-mysql`.
 
-Debian/Ubuntu:
-
-```
-apt-get install icinga2-dbg
-```
-
-RHEL/CentOS:
-
-```
-yum install icinga2-debuginfo
-```
-
-Fedora:
-
-```
-dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo
-```
-
-SLES/openSUSE:
-
-```
-zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo
-```
+Distribution       | Command
+-------------------|------------------------------------------
+Debian/Ubuntu      | `apt-get install icinga2-dbg`
+RHEL/CentOS        | `yum install icinga2-debuginfo`
+Fedora             | `dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo`
+SLES/openSUSE      | `zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo`
 
 Furthermore, you may also have to install debug symbols for Boost and your C++ library.
 
@@ -64,23 +54,12 @@ build flag for debug builds.
 
 Install GDB in your development environment.
 
-Debian/Ubuntu:
-
-```
-apt-get install gdb
-```
-
-RHEL/CentOS/Fedora:
-
-```
-yum install gdb
-```
-
-SLES/openSUSE:
-
-```
-zypper install gdb
-```
+Distribution       | Command
+-------------------|------------------------------------------
+Debian/Ubuntu      | `apt-get install gdb`
+RHEL/CentOS        | `yum install gdb`
+Fedora             | `dnf install gdb`
+SLES/openSUSE      | `zypper install gdb`
 
 #### GDB Run <a id="development-debug-gdb-run"></a>
 
@@ -131,6 +110,12 @@ a new gdb run.
 #### GDB Backtrace <a id="development-debug-gdb-backtrace"></a>
 
 If Icinga 2 aborted its operation abnormally, generate a backtrace.
+
+> **Note**
+>
+> Please install the [required debug symbols](21-development.md#debug-requirements)
+> prior to generating a backtrace.
+
 `thread apply all` is important here since this includes all running threads.
 We need this information when e.g. debugging dead locks and hanging features.
 
@@ -155,6 +140,11 @@ make sure to attach as much detail as possible.
 If Icinga 2 is still running, generate a full backtrace from the running
 process and store it into a new file (e.g. for debugging dead locks).
 
+> **Note**
+>
+> Please install the [required debug symbols](21-development.md#debug-requirements)
+> prior to generating a backtrace.
+
 Icinga 2 runs with 2 processes: main and command executor, therefore generate two backtrace logs
 and add them to the GitHub issue.
 
@@ -224,32 +214,34 @@ If you want to delete all breakpoints, use `d` and select `yes`.
 
 Breakpoint Example:
 
-    (gdb) b __cxa_throw
-    (gdb) r
-    (gdb) up
-    ....
-    (gdb) up
-    #11 0x00007ffff7cbf9ff in icinga::Utility::GlobRecursive(icinga::String const&, icinga::String const&, boost::function<void (icinga::String const&)> const&, int) (path=..., pattern=..., callback=..., type=1)
-        at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609
-    609                        callback(cpath);
-    (gdb) l
-    604
-    605        #endif /* _WIN32 */
-    606
-    607                std::sort(files.begin(), files.end());
-    608                BOOST_FOREACH(const String& cpath, files) {
-    609                        callback(cpath);
-    610                }
-    611
-    612                std::sort(dirs.begin(), dirs.end());
-    613                BOOST_FOREACH(const String& cpath, dirs) {
-    (gdb) p files
-    $3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615,
-        m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615,
-        m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615,
-        m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615,
-        m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615,
-        m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}}
+```
+(gdb) b __cxa_throw
+(gdb) r
+(gdb) up
+....
+(gdb) up
+#11 0x00007ffff7cbf9ff in icinga::Utility::GlobRecursive(icinga::String const&, icinga::String const&, boost::function<void (icinga::String const&)> const&, int) (path=..., pattern=..., callback=..., type=1)
+    at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609
+609                    callback(cpath);
+(gdb) l
+604
+605    #endif /* _WIN32 */
+606
+607            std::sort(files.begin(), files.end());
+608            BOOST_FOREACH(const String& cpath, files) {
+609                    callback(cpath);
+610            }
+611
+612            std::sort(dirs.begin(), dirs.end());
+613            BOOST_FOREACH(const String& cpath, dirs) {
+(gdb) p files
+$3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615,
+    m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615,
+    m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615,
+    m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615,
+    m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615,
+    m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}}
+```
 
 
 ### Core Dump <a id="development-debug-core-dump"></a>
@@ -262,10 +254,11 @@ developers to analyze and fix the problem.
 
 This requires setting the core dump file size to `unlimited`.
 
-Example for Systemd:
+
+##### Systemd
 
 ```
-vim /usr/lib/systemd/system/icinga2.service
+systemctl edit icinga2.service
 
 [Service]
 ...
@@ -276,7 +269,7 @@ systemctl daemon-reload
 systemctl restart icinga2
 ```
 
-Example for init script:
+##### Init Script
 
 ```
 vim /etc/init.d/icinga2
@@ -286,10 +279,13 @@ ulimit -c unlimited
 service icinga2 restart
 ```
 
+##### Verify
+
 Verify that the Icinga 2 process core file size limit is set to `unlimited`.
 
 ```
-cat /proc/`pidof icinga2`/limits
+for pid in $(pidof icinga2); do cat /proc/$pid/limits; done
+
 ...
 Max core file size        unlimited            unlimited            bytes
 ```
@@ -301,7 +297,7 @@ The Icinga 2 daemon runs with the SUID bit set. Therefore you need
 to explicitly enable core dumps for SUID on Linux.
 
 ```
-sysctl -w fs.suid_dumpable=1
+sysctl -w fs.suid_dumpable=2
 ```
 
 Adjust the coredump kernel format and file location on Linux:
@@ -402,6 +398,157 @@ Up/down in stacktrace:
 > down
 ```
 
+## Test Icinga 2 <a id="development-tests"></a>
+
+### Snapshot Packages (Nightly Builds) <a id="development-tests-snapshot-packages"></a>
+
+Icinga provides snapshot packages as nightly builds from [Git master](https://github.com/icinga/icinga2).
+
+These packages contain development code which should be considered "work in progress".
+While developers ensure that tests are running fine with CI actions on PRs,
+things might break, or changes are not yet documented in the changelog.
+
+You can help the developers and test the snapshot packages, e.g. when larger
+changes or rewrites are taking place for a new major version. Your feedback
+is very much appreciated.
+
+Snapshot packages are available for all supported platforms including
+Linux and Windows and can be obtained from [https://packages.icinga.com](https://packages.icinga.com).
+
+The [Vagrant boxes](https://github.com/Icinga/icinga-vagrant) also use
+the Icinga snapshot packages to allow easier integration tests. It is also
+possible to use Docker with base OS images and installing the snapshot
+packages.
+
+If you encounter a problem, please [open a new issue](https://github.com/Icinga/icinga2/issues/new/choose)
+on GitHub and mention that you're testing the snapshot packages.
+
+#### RHEL/CentOS <a id="development-tests-snapshot-packages-rhel"></a>
+
+2.11+ requires the [EPEL repository](02-getting-started.md#package-repositories-rhel-epel) for Boost 1.66+.
+
+In addition to that, the `icinga-rpm-release` package already provides the `icinga-snapshot-builds`
+repository but it is disabled by default.
+
+```
+yum -y install https://packages.icinga.com/epel/icinga-rpm-release-7-latest.noarch.rpm
+yum -y install epel-release
+yum makecache
+
+yum install --enablerepo=icinga-snapshot-builds icinga2
+```
+
+#### Debian <a id="development-tests-snapshot-packages-debian"></a>
+
+2.11+ requires Boost 1.66+ which either is provided by the OS, backports or Icinga stable repositories.
+It is advised to configure both Icinga repositories, stable and snapshot and selectively
+choose the repository with the `-t` flag on `apt-get install`.
+
+```
+apt-get update
+apt-get -y install apt-transport-https wget gnupg
+
+wget -O - https://packages.icinga.com/icinga.key | apt-key add -
+
+DIST=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release); \
+ echo "deb https://packages.icinga.com/debian icinga-${DIST} main" > \
+ /etc/apt/sources.list.d/${DIST}-icinga.list
+ echo "deb-src https://packages.icinga.com/debian icinga-${DIST} main" >> \
+ /etc/apt/sources.list.d/${DIST}-icinga.list
+
+DIST=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release); \
+ echo "deb http://packages.icinga.com/debian icinga-${DIST}-snapshots main" > \
+ /etc/apt/sources.list.d/${DIST}-icinga-snapshots.list
+ echo "deb-src http://packages.icinga.com/debian icinga-${DIST}-snapshots main" >> \
+ /etc/apt/sources.list.d/${DIST}-icinga-snapshots.list
+
+apt-get update
+```
+
+On Debian Stretch, you'll also need to add Debian Backports.
+
+```
+DIST=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release); \
+ echo "deb https://deb.debian.org/debian ${DIST}-backports main" > \
+ /etc/apt/sources.list.d/${DIST}-backports.list
+
+apt-get update
+```
+
+Then install the snapshot packages.
+
+```
+DIST=$(awk -F"[)(]+" '/VERSION=/ {print $2}' /etc/os-release); \
+apt-get install -t icinga-${DIST}-snapshots icinga2
+```
+
+#### Ubuntu <a id="development-tests-snapshot-packages-ubuntu"></a>
+
+```
+apt-get update
+apt-get -y install apt-transport-https wget gnupg
+
+wget -O - https://packages.icinga.com/icinga.key | apt-key add -
+
+. /etc/os-release; if [ ! -z ${UBUNTU_CODENAME+x} ]; then DIST="${UBUNTU_CODENAME}"; else DIST="$(lsb_release -c| awk '{print $2}')"; fi; \
+ echo "deb https://packages.icinga.com/ubuntu icinga-${DIST} main" > \
+ /etc/apt/sources.list.d/${DIST}-icinga.list
+ echo "deb-src https://packages.icinga.com/ubuntu icinga-${DIST} main" >> \
+ /etc/apt/sources.list.d/${DIST}-icinga.list
+
+. /etc/os-release; if [ ! -z ${UBUNTU_CODENAME+x} ]; then DIST="${UBUNTU_CODENAME}"; else DIST="$(lsb_release -c| awk '{print $2}')"; fi; \
+ echo "deb https://packages.icinga.com/ubuntu icinga-${DIST}-snapshots main" > \
+ /etc/apt/sources.list.d/${DIST}-icinga-snapshots.list
+ echo "deb-src https://packages.icinga.com/ubuntu icinga-${DIST}-snapshots main" >> \
+ /etc/apt/sources.list.d/${DIST}-icinga-snapshots.list
+
+apt-get update
+```
+
+Then install the snapshot packages.
+
+```
+. /etc/os-release; if [ ! -z ${UBUNTU_CODENAME+x} ]; then DIST="${UBUNTU_CODENAME}"; else DIST="$(lsb_release -c| awk '{print $2}')"; fi; \
+apt-get install -t icinga-${DIST}-snapshots icinga2
+```
+
+#### SLES <a id="development-tests-snapshot-packages-sles"></a>
+
+The required Boost packages are provided with the stable release repository.
+
+```
+rpm --import https://packages.icinga.com/icinga.key
+
+zypper ar https://packages.icinga.com/SUSE/ICINGA-release.repo
+zypper ref
+
+zypper ar https://packages.icinga.com/SUSE/ICINGA-snapshot.repo
+zypper ref
+```
+
+Selectively install the snapshot packages using the `-r` parameter.
+
+```
+zypper in -r icinga-snapshot-builds icinga2
+```
+
+
+### Unit Tests <a id="development-tests-unit"></a>
+
+Build the binaries and run the tests.
+
+
+```
+make -j4 -C debug
+make test -C debug
+```
+
+Run a specific boost test:
+
+```
+debug/Bin/Debug/boosttest-test-base --run_test=remote_url
+```
+
 
 
 ## Develop Icinga 2 <a id="development-develop"></a>
@@ -473,6 +620,7 @@ Here's a few books we can recommend:
 
 * [Accelerated C++: Practical Programming by Example](https://www.amazon.com/Accelerated-C-Practical-Programming-Example/dp/020170353X) (Andrew Koenig, Barbara E. Moo)
 * [Effective C++](https://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876) (Scott Meyers)
+* [Boost C++ Application Development Cookbook - Second Edition: Recipes to simplify your application development](https://www.amazon.com/dp/1787282244/ref=cm_sw_em_r_mt_dp_U_dN1OCbERS00EQ) (Antony Polukhin)
 * [Der C++ Programmierer](https://www.amazon.de/Programmierer-lernen-Professionell-anwenden-L%C3%B6sungen/dp/3446416447), German (Ulrich Breymann)
 * [C++11 programmieren](https://www.amazon.de/gp/product/3836217325/), German (Torsten T. Will)
 
@@ -641,10 +789,10 @@ vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf
 gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon
 ```
 
-##### Debian 9 <a id="development-linux-dev-env-debian"></a>
+#### Debian 9 <a id="development-linux-dev-env-debian"></a>
 
 ```
-apt-get -y install gdb vim git cmake make ccache build-essential libssl-dev libboost-all-dev bison flex default-libmysqlclient-dev libpq-dev libyajl-dev libedit-dev monitoring-plugins
+apt-get -y install gdb vim git cmake make ccache build-essential libssl-dev libboost-all-dev bison flex default-libmysqlclient-dev libpq-dev libedit-dev monitoring-plugins
 
 ln -s /usr/bin/ccache /usr/local/bin/gcc
 ln -s /usr/bin/ccache /usr/local/bin/g++
@@ -681,31 +829,14 @@ It is advised to use Homebrew to install required build dependencies.
 Macports have been reported to work as well, typically you'll get more help
 with Homebrew from Icinga developers.
 
-#### Users and Groups
-
-First off, create the following from `Settings - Users & Groups`:
-
-* Users: `icinga`
-* Groups: `icinga` with `icinga` as member
-* Groups: `icingaweb2`
-
-Then disallow login for these users.
-
-```
-dscl
-list Local/Default/Users
-read Local/Default/Users/icinga
-change Local/Default/Users/icinga UserShell /bin/bash /usr/bin/false
-sudo dscl . create /Users/icinga IsHidden 1
-sudo dseditgroup -o edit -a _www -t user icingaweb2
-```
+The idea is to run Icinga with the current user, avoiding root permissions.
 
 #### Requirements
 
 OpenSSL 1.0.x doesn't build anymore, so we're explicitly using 1.1.x here.
 
 ```
-brew install ccache boost cmake bison flex yajl openssl@1.1 mysql-connector-c++ postgresql libpq
+brew install ccache boost cmake bison flex openssl@1.1 mysql-connector-c++ postgresql libpq
 ```
 
 ##### ccache
@@ -716,48 +847,50 @@ sudo mkdir /opt/ccache
 sudo ln -s `which ccache` /opt/ccache/clang
 sudo ln -s `which ccache` /opt/ccache/clang++
 
-vim $HOME/.bashrc
+vim $HOME/.bash_profile
 
 # ccache is managed with symlinks to avoid collision with cgo
 export PATH="/opt/ccache:$PATH"
 
-source $HOME/.bashrc
+source $HOME/.bash_profile
 ```
 
 #### Builds
 
-We will build two different flavors on macOS.
+Icinga is built as release (optimized build for packages) and debug (more symbols and details for debugging). Debug builds
+typically run slower than release builds and must not be used for performance benchmarks.
 
 ```
 mkdir -p release debug
 
 cd debug
-cmake -DICINGA2_UNITY_BUILD=OFF -DICINGA2_WITH_STUDIO=ON -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib ..
+cmake -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib -DICINGA2_PLUGINDIR=/usr/local/sbin ..
 cd ..
 
 make -j4 -C debug
-sudo make -j4 install -C debug
+make -j4 install -C debug
 ```
 
 ##### Build Aliases
 
-This is derived from dnsmichi's flavour and not generally best practice.
+This is derived from [dnsmichi's flavour](https://github.com/dnsmichi/dotfiles) and not generally best practice.
 
 ```
-vim $HOME/.bashrc
-
-export PATH=/usr/local/icinga2/sbin/:$PATH
-source /usr/local/icinga2/etc/bash_completion.d/icinga2
+vim $HOME/.bash_profile
 
-export I2_GENERIC="-DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib -DICINGA2_PLUGINDIR=/usr/local/sbin"
+export I2_GENERIC="-DCMAKE_INSTALL_PREFIX=/usr/local/icinga/icinga2 -DICINGA2_USER=`id -u -n` -DICINGA2_GROUP=`id -g -n` -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl@1.1/include -DOPENSSL_SSL_LIBRARY=/usr/local/opt/openssl@1.1/lib/libssl.dylib -DOPENSSL_CRYPTO_LIBRARY=/usr/local/opt/openssl@1.1/lib/libcrypto.dylib -DICINGA2_PLUGINDIR=/usr/local/sbin -DICINGA2_WITH_PGSQL=OFF"
 
 export I2_DEBUG="-DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF $I2_GENERIC"
 export I2_RELEASE="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DICINGA2_WITH_TESTS=ON -DICINGA2_UNITY_BUILD=ON $I2_GENERIC"
 
-alias i2_debug="mkdir -p debug; cd debug; cmake $I2_DEBUG ..; make -j4; sudo make -j4 install; cd .."
-alias i2_release="mkdir -p release; cd release; cmake $I2_RELEASE ..; make -j4; sudo make -j4 install; cd .."
+alias i2_debug="mkdir -p debug; cd debug; cmake $I2_DEBUG ..; make -j4; make -j4 install; cd .."
+alias i2_release="mkdir -p release; cd release; cmake $I2_RELEASE ..; make -j4; make -j4 install; cd .."
+
+export PATH=/usr/local/icinga/icinga2/sbin/:$PATH
+test -f /usr/local/icinga/icinga2/etc/bash_completion.d/icinga2 && source /usr/local/icinga/icinga2/etc/bash_completion.d/icinga2
 
-source $HOME/.bashrc
+
+source $HOME/.bash_profile
 ```
 
 #### Run
@@ -772,18 +905,26 @@ icinga2 daemon
 #### Plugins
 
 ```
-brew install nagios-plugins
+brew install monitoring-plugins
 
 sudo vim /usr/local/icinga2/etc/icinga2/constants.conf
 const PluginDir = "/usr/local/sbin"
 ```
 
+#### Backends: Redis
+
+```
+brew install redis
+brew services start redis
+```
+
 #### Databases: MariaDB
 
 ```
 brew install mariadb
-ln -sfv /usr/local/opt/mariadb/*.plist ~/Library/LaunchAgents
-launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
+mkdir -p /usr/local/etc/my.cnf.d
+brew services start mariadb
+
 mysql_secure_installation
 ```
 
@@ -800,14 +941,20 @@ exit
 ```
 
 ```
-cd $HOME/coding/icinga/icinga2
+mysql -e 'create database icinga;'
+mysql -e "grant all on icinga.* to 'icinga'@'localhost' identified by 'icinga';"
+mysql icinga < $HOME/dev/icinga/icinga2/lib/db_ido_mysql/schema/mysql.sql
+```
 
-sudo mysql
+#### API
 
-CREATE DATABASE icinga;
-GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'icinga';
-quit
-sudo mysql icinga < lib/db_ido_mysql/schema/mysql.sql
+```
+icinga2 api setup
+cd /usr/local/icinga/icinga2/var/lib/icinga2/certs
+HOST_NAME=mbpmif.int.netways.de
+icinga2 pki new-cert --cn ${HOST_NAME} --csr ${HOST_NAME}.csr --key ${HOST_NAME}.key
+icinga2 pki sign-csr --csr ${HOST_NAME}.csr --cert ${HOST_NAME}.crt
+echo "const NodeName = \"${HOST_NAME}\"" >> /usr/local/icinga/icinga2/etc/icinga2/constants.conf
 ```
 
 
@@ -835,23 +982,48 @@ the web installer and start the installation.
 
 You need a free Microsoft account to download and also store your preferences.
 
-Choose the following minimal set:
-
-* .NET Framework 4.x SDK
-* C# Compiler
-* Visual Studio C++ core features
-* VC++ toolset
-* Windows 10 SDK (10.0.10240.0 - required)
-* Just-in-time debugger
-* Windows 8 SDK (includes mscoree.lib required by clrchecktask)
-* C++/CLI support
-* Windows Universal C Runtime
-* Git for Windows
-* .NET Framework 3.5 development tools
-* Github extension for Visual Studio
+Choose these individual components on Visual Studio 2017:
+
+* .NET
+  * .NET Framework 3.5 development tools
+  * .NET Framework 4.6.1 SDK
+  * .NET Framework 4.6.1 targeting pack
+* Code tools
+  * Git for Windows
+  * Static analysis tools
+* Compilers, build tools and runtimes
+  * C# and Visual Basic Roslyn compilers
+  * C++/CU Support
+  * VC++ 2017 v141 toolset (x86_64)
+* Debugging and testing
+  * C++ profiling tools
+  * Just-in-Time debugger
+* Development activities
+  * Visual Studio C++ core features
+* Games and Graphics
+  * Graphics debugger and GPU profiler for DirectX (required by C++ profiling tools)
+* SDKs, libraries and frameworks
+  * Graphics Tools Windows 8.1 SDK (required by C++ profiling tools)
+  * Windows 10 SDK **10.0.10240.0 - exactly this version**
+  * Windows 8.1 SDK
+  * Windows Universal C Runtime
+* Uncategorized
+  * GitHub Extension for Visual Studio
+
 
 After a while, Visual Studio will be ready.
 
+#### .NET Framework 3.5
+
+Windows 10 has .NET Framework >= 4.6 installed by default. The Icinga Agent Wizard
+is built on .NET Framework 2.0 which is not included in .NET Framework 4.6.
+
+Windows 10 provides .NET Framework 3.5 which includes .NET Framework 2.0.
+
+Navigate into `Control Panel` -> `Programs` -> `Turn Windows features on or off`.
+Select `.NET Framework 3.5 (includes .NET 2.0 and 3.0)` and wait until the installation process
+is finished.
+
 #### Flex and Bison
 
 Install it using [chocolatey](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html):
@@ -874,42 +1046,38 @@ will automatically detect them for builds and packaging.
 >
 > We cannot use the chocolatey package as this one does not provide any development headers.
 >
-> Choose 1.0.2 LTS from manual downloads for best compatibility if unsure.
+> Choose 1.1.1 LTS from manual downloads for best compatibility.
 
 #### Boost
 
 In order to use the boost development header and library files you need to [download](http://www.boost.org/users/download/)
-Boost and then extract it to e.g. `C:\boost_1_65_1`.
+Boost and then extract it to e.g. `C:\boost_1_69_0`.
 
 > **Note**
 >
 > Just use `C:`, the zip file already contains the sub folder. Extraction takes a while,
-> the archive contains more than 10k files.
+> the archive contains more than 70k files.
 
-For integrating Boost into Visual Studio 2017, open the `Developer Command Prompt` from the start menu,
-and navigate to `C:\boost_1_65_1`.
+In order to integrate Boost into Visual Studio 2017, open the `Developer Command Prompt` from the start menu,
+and navigate to `C:\boost_1_69_0`.
 
 Execute `bootstrap.bat` first.
 
 ```
-cd C:\boost_1_65_1
+cd C:\boost_1_69_0
 bootstrap.bat
 ```
 
 Once finished, specify the required `toolset` to compile boost against Visual Studio.
-This takes quite some time in a Windows VM.
-
-Visual Studio 2015:
+This takes quite some time in a Windows VM. Boost Context uses Assembler code,
+which isn't treated as exception safe by the VS compiler. Therefore set the
+additional compilation flag according to [this entry](https://lists.boost.org/Archives/boost/2015/08/224570.php).
 
 ```
-b2 --toolset=msvc-14.0
+b2 --toolset=msvc-14.1 asmflags=\safeseh
 ```
 
-Visual Studio 2017:
-
-```
-b2 --toolset=msvc-14.1
-```
+![Windows Boost Build in VS2017 Development Console](images/development/windows_boost_build_dev_cmd.png)
 
 #### TortoiseGit
 
@@ -927,10 +1095,9 @@ Start the setup routine and choose `OpenSSH` as default secure transport when as
 
 Open a Windows Explorer window and navigate into
 
-Version             | Project Location
---------------------|------------------------------
-Visual Studio 2015  | `C:\Users\michi\Documents\Visual Studio 2015\Projects`
-Visual Studio 2017+ | `C:\Users\michi\source\repos`
+```
+cd %HOMEPATH%\source\repos
+```
 
 Right click and select `Git Clone` from the context menu.
 
@@ -942,18 +1109,14 @@ Icinga 2 uses CMake to manage the build environment. You can generate the Visual
 using CMake. [Download](https://cmake.org/download/) and install CMake. Select to add it to PATH for all users
 when asked.
 
-Once setup is completed, open a command prompt and navigate to
-
-Visual Studio 2015
-
-```
-cd C:\Users\<username>\Documents\Visual Studio 2015\Projects\icinga2
-```
+> **Note**
+>
+> In order to properly detect the Boost libraries, install the CMake 3.14+.
 
-Visual Studio 2017
+Once setup is completed, open a command prompt and navigate to
 
 ```
-cd C:\Users\michi\source\repos
+cd %HOMEPATH%\source\repos
 ```
 
 Run CMake with the following command. This generates a new Visual Studio project file called `icinga2.sln`.
@@ -962,30 +1125,45 @@ You need to specify the previously installed component paths:
 
 Variable              | Value                                                                | Description
 ----------------------|----------------------------------------------------------------------|-------------------------------------------------------
-BOOST_ROOT            | `C:\boost_1_65_1`                                                    | Root path where you've extracted and compiled Boost.
-BISON_EXECUTABLE      | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe`     | Path to the Bison executable.
-FLEX_EXECUTABLE       | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe`      | Path to the Flex executable.
-ICINGA2_WITH_MYSQL    | OFF                                                                  | Requires extra setup for MySQL if set to `ON`. Not supported for client setups.
-ICINGA2_WITH_PGSQL    | OFF                                                                  | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups.
-ICINGA2_UNITY_BUILD   | OFF                                                                  | Disable unity builds for development environments.
+`BOOST_ROOT`          | `C:\boost_1_69_0`                                                    | Root path where you've extracted and compiled Boost.
+`BOOST_LIBRARYDIR`    | `C:\boost_1_69_0\stage`                                              | Path to the static compiled Boost libraries, directory must contain `lib`.
+`BISON_EXECUTABLE`    | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe`     | Path to the Bison executable.
+`FLEX_EXECUTABLE`     | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe`      | Path to the Flex executable.
+`ICINGA2_WITH_MYSQL`  | OFF                                                                  | Requires extra setup for MySQL if set to `ON`. Not supported for client setups.
+`ICINGA2_WITH_PGSQL`  | OFF                                                                  | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups.
+`ICINGA2_UNITY_BUILD` | OFF                                                                  | Disable unity builds for development environments.
 
 Tip: If you have previously opened a terminal, run `refreshenv` to re-read updated PATH variables.
 
 ```
-cmake . -DBOOST_ROOT=C:\boost_1_65_1 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF
+cmake . -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=Debug -DBOOST_ROOT=C:\boost_1_69_0 -DBOOST_LIBRARYDIR=C:\boost_1_69_0\stage -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF
 ```
 
 Best is write a small batch/Powershell script which just executes these lines.
 
+```
+@echo off
+
+cd icinga2
+mkdir debug
+cd debug
+del CMakeCache.txt
+
+cmake . -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=Debug -DBOOST_ROOT=C:\boost_1_69_0 -DBOOST_LIBRARYDIR=C:\boost_1_69_0\stage -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF
+
+cmake --build . --target PACKAGE --config Debug
+
+cd ..
+```
+
 
 #### Icinga 2 in Visual Studio
 
 Navigate to
 
-Version             | Project location
---------------------|-------------------------
-Visual Studio 2015  | `C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2`
-Visual Studio 2017+ | `C:\Users\michi\source\repos\icinga2`
+```
+cd %HOMEPATH%\source\repos\icinga2
+```
 
 Open `icinga2.sln`. Log into Visual Studio when asked.
 
@@ -996,10 +1174,8 @@ project directory.
 
 Navigate there and run `icinga2.exe --version`.
 
-Example for Visual Studio 2017:
-
 ```
-cd C:\Users\michi\source\repos\icinga2\Bin\Release\Debug
+cd %HOMEPATH%\source\repos\icinga2\Bin\Release\Debug
 icinga2.exe --version
 ```
 
@@ -1017,11 +1193,12 @@ choco install -y wixtoolset
 ```
 
 Once completed open an administrative shell and navigate to your Visual Studio project.
+
 Let CMake to build a release package.
 
 ```
-cd "c:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2"
-cmake --build . --target PACKAGE --config Release
+cd %HOMEPATH%\source\repos\icinga2
+cmake --build debug --target PACKAGE --config Release
 ```
 
 Note: This will still use the debug builds. A yet more clean approach
@@ -1029,14 +1206,37 @@ is to run CMake with changed release parameters beforehand and then
 re-run the release package builder.
 
 ```
-C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2>
-cmake . -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=Release -DBOOST_ROOT=C:\boost_1_65_1 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF
+cd %HOMEPATH%\source\repos\icinga2
+mkdir release
+cd release
+
+cmake .. -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=Release -DBOOST_ROOT=C:\boost_1_69_0 -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=OFF
+cd ..
 
-cmake --build . --target PACKAGE --config Release
+cmake --build release --target PACKAGE --config Release
 ```
 
 Again, put these lines into a batch/Powershell script and execute that.
 
+```
+@echo off
+cd icinga2
+
+mkdir release
+cd release
+
+del CMakeCache.txt
+
+; set gen=Visual Studio 15 2017 Win64
+set gen=Visual Studio 15 2017
+
+cmake .. -G "%gen%" -DCPACK_GENERATOR=WIX -DCMAKE_BUILD_TYPE=RelWithDebInfo -DBOOST_ROOT=C:\boost_1_69_0 -DBOOST_LIBRARYDIR=C:\boost_1_69_0\stage -DBISON_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe -DFLEX_EXECUTABLE=C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe -DICINGA2_WITH_MYSQL=OFF -DICINGA2_WITH_PGSQL=OFF -DICINGA2_UNITY_BUILD=ON
+cd ..
+
+cmake --build release --target PACKAGE --config Release
+
+cd ..
+```
 
 
 ### Embedded Dev Env: Pi <a id="development-embedded-dev-env"></a>
@@ -1084,48 +1284,44 @@ Icinga application using a dist tarball (including notes for distributions):
 * cmake >= 2.6
 * GNU make (make) or ninja-build
 * C++ compiler which supports C++11
-  - RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below)
-  - Debian/Ubuntu: build-essential
-  - Alpine: build-base
-  - you can also use clang++
+  * RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below)
+  * Debian/Ubuntu: build-essential
+  * Alpine: build-base
+  * you can also use clang++
 * pkg-config
 * OpenSSL library and header files >= 1.0.1
-  - RHEL/Fedora: openssl-devel
-  - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel)
-  - Debian/Ubuntu: libssl-dev
-  - Alpine: libressl-dev
-* Boost library and header files >= 1.48.0
-  - RHEL/Fedora: boost148-devel
-  - Debian/Ubuntu: libboost-all-dev
-  - Alpine: boost-dev
+  * RHEL/Fedora: openssl-devel
+  * SUSE: libopenssl-devel
+  * Debian/Ubuntu: libssl-dev
+  * Alpine: libressl-dev
+* Boost library and header files >= 1.66.0
+  * RHEL/Fedora: boost166-devel
+  * Debian/Ubuntu: libboost-all-dev
+  * Alpine: boost-dev
 * GNU bison (bison)
 * GNU flex (flex) >= 2.5.35
-* Systemd headers
-  - Only required when using Systemd
-  - Debian/Ubuntu: libsystemd-dev
-  - RHEL/Fedora: systemd-devel
+* systemd headers
+  * Only required when using systemd
+  * Debian/Ubuntu: libsystemd-dev
+  * RHEL/Fedora: systemd-devel
 
 ### Optional features <a id="development-package-builds-optional-features"></a>
 
 * MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`)
-  - RHEL/Fedora: mysql-devel
-  - SUSE: libmysqlclient-devel
-  - Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev
-  - Alpine: mariadb-dev
+  * RHEL/Fedora: mysql-devel
+  * SUSE: libmysqlclient-devel
+  * Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev
+  * Alpine: mariadb-dev
 * PostgreSQL (disable with CMake variable `ICINGA2_WITH_PGSQL` to `OFF`)
-  - RHEL/Fedora: postgresql-devel
-  - Debian/Ubuntu: libpq-dev
-  - postgresql-dev on Alpine
-* YAJL (Faster JSON library)
-  - RHEL/Fedora: yajl-devel
-  - Debian: libyajl-dev
-  - Alpine: yajl-dev
+  * RHEL/Fedora: postgresql-devel
+  * Debian/Ubuntu: libpq-dev
+  * postgresql-dev on Alpine
 * libedit (CLI console)
-  - RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms)
-  - Debian/Ubuntu/Alpine: libedit-dev
+  * RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms)
+  * Debian/Ubuntu/Alpine: libedit-dev
 * Termcap (only required if libedit doesn't already link against termcap/ncurses)
-  - RHEL/Fedora: libtermcap-devel
-  - Debian/Ubuntu: (not necessary)
+  * RHEL/Fedora: libtermcap-devel
+  * Debian/Ubuntu: (not necessary)
 
 ### Special requirements <a id="development-package-builds-special-requirements"></a>
 
@@ -1194,66 +1390,70 @@ For all variables regarding defaults paths on in CMake, see
 
 Also see `CMakeLists.txt` for details.
 
-**System Environment**
-- `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc`
-- `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var`
-- `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2`
-- `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2`
-- `ICINGA2_DATADIR`: Data directory  for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2`
-- `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2`
-- `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2`
-- `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2`
-- `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON`
-- `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga`
-- `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga`
-- `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd`
-- `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from;
-  defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2`
-- `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins`
-
-**Build Optimization**
-- `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware.
-- `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF`
-
-**Init System**
-- `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF`
-- `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file
+#### System Environment
+
+* `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc`
+* `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var`
+* `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2`
+* `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2`
+* `ICINGA2_DATADIR`: Data directory  for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2`
+* `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2`
+* `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2`
+* `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2`
+* `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON`
+* `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga`
+* `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga`
+* `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd`
+* `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from;
+* defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2`
+* `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins`
+
+#### Build Optimization
+
+* `ICINGA2_UNITY_BUILD`: Whether to perform a unity build; defaults to `ON`. Note: This requires additional memory and is not advised for building VMs, Docker for Mac and embedded hardware.
+* `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF`
+
+#### Init System
+
+* `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF`
+* `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file
   and the SysV initscript in parallel, regardless of how `USE_SYSTEMD` is set.
   Only use this for special packaging purposes and if you know what you are doing.
   Defaults to `OFF`.
 
-**Features:**
-- `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON`
-- `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON`
-- `ICINGA2_WITH_DEMO`: Determines whether the demo module is built; defaults to `OFF`
-- `ICINGA2_WITH_HELLO`: Determines whether the hello module is built; defaults to `OFF`
-- `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON`
-- `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON`
-- `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON`
-- `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON`
+#### Features
+
+* `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON`
+* `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON`
+* `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON`
+* `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON`
+* `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON`
+* `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON`
 
-**MySQL or MariaDB:**
+#### MySQL or MariaDB
 
 The following settings can be tuned for the MySQL / MariaDB IDO feature.
 
-- `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON`
-- `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient`
-- `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty -
+* `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON`
+* `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient`
+* `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty -
   checking multiple paths like `/usr/include/mysql`
 
-See [FindMySQL.cmake](third-party/cmake/FindMySQL.cmake) for the implementation.
+See [FindMySQL.cmake](https://github.com/Icinga/icinga2/blob/master/third-party/cmake/FindMySQL.cmake)
+for implementation details.
 
-**PostgreSQL:**
+#### PostgreSQL
 
 The following settings can be tuned for the PostgreSQL IDO feature.
 
-- `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON`
-- `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories
-- `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file)
+* `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON`
+* `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories
+* `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file)
 
-See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation.
+See [FindPostgreSQL.cmake](https://github.com/Icinga/icinga2/blob/master/third-party/cmake/FindPostgreSQL.cmake)
+for implementation details.
 
-**Version detection:**
+#### Version detection
 
 CMake determines the Icinga 2 version number using `git describe` if the
 source directory is contained in a Git repository. Otherwise the version number
@@ -1383,11 +1583,6 @@ MACROS
 If you prefer to build packages offline, a suitable Vagrant box is located
 [here](https://atlas.hashicorp.com/mvbcoding/boxes/awslinux/).
 
-##### SLES 11
-
-The Icinga repository provides the required boost package version and must be
-added before building.
-
 ### Build Debian/Ubuntu packages <a id="development-package-builds-deb"></a>
 
 Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from
@@ -1395,7 +1590,7 @@ the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2)
 into your source tree and run the following command:
 
 ```
-dpkg-buildpackage -uc -us
+dpkg-buildpackage -uc -us
 ```
 
 ### Build Alpine Linux packages <a id="development-package-builds-alpine"></a>
@@ -1436,39 +1631,39 @@ icinga2 daemon
 Icinga 2 can be started as a daemon using the provided init script:
 
 ```
-/etc/init.d/icinga2
+/etc/init.d/icinga2
 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status}
 ```
 
-### Systemd <a id="development-package-builds-systemd"></a>
+#### Systemd <a id="development-package-builds-systemd"></a>
 
-If your distribution uses Systemd:
+If your distribution uses systemd:
 
 ```
-systemctl {start|stop|reload|status|enable|disable} icinga2
+systemctl {start|stop|reload|status|enable|disable} icinga2
 ```
 
-In case the distribution is running Systemd >227, you'll also
+In case the distribution is running systemd >227, you'll also
 need to package and install the `etc/initsystem/icinga2.service.limits.conf`
 file into `/etc/systemd/system/icinga2.service.d`.
 
-### openrc <a id="development-package-builds-openrc"></a>
+#### openrc <a id="development-package-builds-openrc"></a>
 
 Or if your distribution uses openrc (like Alpine):
 
 ```
-rc-service icinga2
+rc-service icinga2
 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status}
-  ```
+```
 
 Note: the openrc's init.d is not shipped by default.
 A working init.d with openrc can be found here: (https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd). If you have customized some path, edit the file and adjust it according with your setup.
 Those few steps can be followed:
 
 ```
-wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd
-mv icinga2.initd /etc/init.d/icinga2
-chmod +x /etc/init.d/icinga2
+wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd
+mv icinga2.initd /etc/init.d/icinga2
+chmod +x /etc/init.d/icinga2
 ```
 
 Icinga 2 reads a single configuration file which is used to specify all
@@ -1585,80 +1780,74 @@ Please check `appveyor.yml` for instructions.
 Install the `boost`, `python` and `icinga2` pretty printers. Absolute paths are required,
 so please make sure to update the installation paths accordingly (`pwd`).
 
-    $ mkdir -p ~/.gdb_printers && cd ~/.gdb_printers
+```
+$ mkdir -p ~/.gdb_printers && cd ~/.gdb_printers
+```
 
 Boost Pretty Printers compatible with Python 3:
 
-    $ git clone https://github.com/mateidavid/Boost-Pretty-Printer.git && cd Boost-Pretty-Printer
-    $ git checkout python-3
-    $ pwd
-    /home/michi/.gdb_printers/Boost-Pretty-Printer
+```
+$ git clone https://github.com/mateidavid/Boost-Pretty-Printer.git && cd Boost-Pretty-Printer
+$ git checkout python-3
+$ pwd
+/home/michi/.gdb_printers/Boost-Pretty-Printer
+```
 
 Python Pretty Printers:
 
-    $ cd ~/.gdb_printers
-    $ svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
+```
+$ cd ~/.gdb_printers
+$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
+```
 
 Icinga 2 Pretty Printers:
 
-    $ mkdir -p ~/.gdb_printers/icinga2 && cd ~/.gdb_printers/icinga2
-    $ wget https://raw.githubusercontent.com/Icinga/icinga2/master/tools/debug/gdb/icingadbg.py
+```
+$ mkdir -p ~/.gdb_printers/icinga2 && cd ~/.gdb_printers/icinga2
+$ wget https://raw.githubusercontent.com/Icinga/icinga2/master/tools/debug/gdb/icingadbg.py
+```
 
 Now you'll need to modify/setup your `~/.gdbinit` configuration file.
 You can download the one from Icinga 2 and modify all paths.
 
 Example on Fedora 22:
 
-    $ wget https://raw.githubusercontent.com/Icinga/icinga2/master/tools/debug/gdb/gdbinit -O ~/.gdbinit
-    $ vim ~/.gdbinit
-
-    set print pretty on
-    
-    python
-    import sys
-    sys.path.insert(0, '/home/michi/.gdb_printers/icinga2')
-    from icingadbg import register_icinga_printers
-    register_icinga_printers()
-    end
-    
-    python
-    import sys
-    sys.path.insert(0, '/home/michi/.gdb_printers/python')
-    from libstdcxx.v6.printers import register_libstdcxx_printers
-    try:
-        register_libstdcxx_printers(None)
-    except:
-        pass
-    end
-    
-    python
-    import sys
-    sys.path.insert(0, '/home/michi/.gdb_printers/Boost-Pretty-Printer')
-    import boost_print
-    boost_print.register_printers()
-    end
-
-
-If you are getting the following error when running gdb, the `libstdcxx`
-printers are already preloaded in your environment and you can remove
-the duplicate import in your `~/.gdbinit` file.
-
-    RuntimeError: pretty-printer already registered: libstdc++-v6
-
+```
+$ wget https://raw.githubusercontent.com/Icinga/icinga2/master/tools/debug/gdb/gdbinit -O ~/.gdbinit
+$ vim ~/.gdbinit
 
-## Development Tests <a id="development-tests"></a>
+set print pretty on
 
-Build the binaries and run the tests.
+python
+import sys
+sys.path.insert(0, '/home/michi/.gdb_printers/icinga2')
+from icingadbg import register_icinga_printers
+register_icinga_printers()
+end
 
+python
+import sys
+sys.path.insert(0, '/home/michi/.gdb_printers/python')
+from libstdcxx.v6.printers import register_libstdcxx_printers
+try:
+    register_libstdcxx_printers(None)
+except:
+    pass
+end
 
-```
-make -j4 -C debug
-make test -C debug
+python
+import sys
+sys.path.insert(0, '/home/michi/.gdb_printers/Boost-Pretty-Printer')
+import boost_print
+boost_print.register_printers()
+end
 ```
 
-Run a specific boost test:
+If you are getting the following error when running gdb, the `libstdcxx`
+printers are already preloaded in your environment and you can remove
+the duplicate import in your `~/.gdbinit` file.
 
 ```
-debug/Bin/Debug/boosttest-test-base --run_test=remote_url
+RuntimeError: pretty-printer already registered: libstdc++-v6
 ```