]> granicus.if.org Git - icinga2/blob - doc/21-development.md
72bca8f338a2d8a74b94f419c119fcc7370ef393
[icinga2] / doc / 21-development.md
1 # Development <a id="development"></a>
2
3 This chapter provides hints on Icinga 2 debugging,
4 development, package builds and tests.
5
6 * [Debug Icinga 2](21-development.md#development-debug)
7   * [GDB Backtrace](21-development.md#development-debug-gdb-backtrace)
8   * [Core Dump](21-development.md#development-debug-core-dump)
9 * [Develop Icinga 2](21-development.md#development-develop)
10   * [Linux Dev Environment](21-development.md#development-linux-dev-env)
11   * [macOS Dev Environment](21-development.md#development-macos-dev-env)
12   * [Windows Dev Environment](21-development.md#development-windows-dev-env)
13 * [Package Builds](21-development.md#development-package-builds)
14   * [RPM](21-development.md#development-package-builds-rpms)
15   * [DEB](21-development.md#development-package-builds-deb)
16   * [Windows](21-development.md#development-package-builds-windows)
17 * [Advanced Tips](21-development.md#development-advanced)
18 * [Tests](21-development.md#development-tests)
19
20
21 ## Debug Icinga 2 <a id="development-debug"></a>
22
23 This chapter targets all users who have been asked by developers to provide
24 a stack trace or coredump if the application crashed. It is also useful
25 for developers working with different debuggers.
26
27 > **Note:**
28 >
29 > This is intentionally mentioned before any development insights
30 > as debugging is a more frequent and commonly asked question.
31
32 ### Debug Requirements <a id="debug-requirements"></a>
33
34 Make sure that the debug symbols are available for Icinga 2.
35 The Icinga 2 packages provide a debug package which must be
36 installed separately for all involved binaries, like `icinga2-bin`
37 or `icinga2-ido-mysql`.
38
39 Distribution       | Command
40 -------------------|------------------------------------------
41 Debian/Ubuntu      | `apt-get install icinga2-dbg`
42 RHEL/CentOS        | `yum install icinga2-debuginfo`
43 Fedora             | `dnf install icinga2-debuginfo icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo`
44 SLES/openSUSE      | `zypper install icinga2-bin-debuginfo icinga2-ido-mysql-debuginfo`
45
46 Furthermore, you may also have to install debug symbols for Boost and your C++ library.
47
48 If you're building your own binaries, you should use the `-DCMAKE_BUILD_TYPE=Debug` cmake
49 build flag for debug builds.
50
51
52 ### GDB as Debugger <a id="development-debug-gdb"></a>
53
54 Install GDB in your development environment.
55
56 Distribution       | Command
57 -------------------|------------------------------------------
58 Debian/Ubuntu      | `apt-get install gdb`
59 RHEL/CentOS        | `yum install gdb`
60 Fedora             | `dnf install gdb`
61 SLES/openSUSE      | `zypper install gdb`
62
63 #### GDB Run <a id="development-debug-gdb-run"></a>
64
65 Call GDB with the binary (`/usr/sbin/icinga2` is a wrapper script calling
66 `/usr/lib64/icinga2/sbin/icinga2` since 2.4) and all arguments and run it in foreground.
67
68 ```
69 gdb --args /usr/lib64/icinga2/sbin/icinga2 daemon -x debug
70 ```
71
72 The exact path to the Icinga 2 binary differs on each distribution. On Ubuntu
73 it is installed into `/usr/lib/x86_64-linux-gnu/icinga2/sbin/icinga2` on 64-bit systems
74 for example.
75
76 > **Note**
77 >
78 > If gdb tells you it's missing debug symbols, quit gdb and install
79 > them: `Missing separate debuginfos, use: debuginfo-install ...`
80
81 Run/restart the application.
82
83 ```
84 (gdb) r
85 ```
86
87 Kill the running application.
88
89 ```
90 (gdb) k
91 ```
92
93 Continue after breakpoint.
94
95 ```
96 (gdb) c
97 ```
98
99 #### GDB Core Dump <a id="development-debug-gdb-coredump"></a>
100
101 Either attach to the running process using `gdb -p PID` or start
102 a new gdb run.
103
104 ```
105 (gdb) r
106 (gdb) generate-core-file
107 ```
108
109 #### GDB Backtrace <a id="development-debug-gdb-backtrace"></a>
110
111 If Icinga 2 aborted its operation abnormally, generate a backtrace.
112
113 > **Note**
114 >
115 > Please install the [required debug symbols](21-development.md#debug-requirements)
116 > prior to generating a backtrace.
117
118 `thread apply all` is important here since this includes all running threads.
119 We need this information when e.g. debugging dead locks and hanging features.
120
121 ```
122 (gdb) bt
123 (gdb) thread apply all bt full
124 ```
125
126 If gdb stops at a SIGPIPE signal please disable the signal before
127 running Icinga 2. This isn't an error, but we need to workaround it.
128
129 ```
130 (gdb) handle SIGPIPE nostop noprint pass
131 (gdb) r
132 ```
133
134 If you create a [new issue](https://github.com/Icinga/icinga2/issues),
135 make sure to attach as much detail as possible.
136
137 #### GDB Backtrace from Running Process <a id="development-debug-gdb-backtrace-running"></a>
138
139 If Icinga 2 is still running, generate a full backtrace from the running
140 process and store it into a new file (e.g. for debugging dead locks).
141
142 > **Note**
143 >
144 > Please install the [required debug symbols](21-development.md#debug-requirements)
145 > prior to generating a backtrace.
146
147 Icinga 2 runs with 2 processes: main and command executor, therefore generate two backtrace logs
148 and add them to the GitHub issue.
149
150 ```
151 for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "thread apply all bt full" -ex "detach" -ex "q" > gdb_bt_${pid}_`date +%s`.log; done
152 ```
153
154 #### GDB Thread List from Running Process <a id="development-debug-gdb-thread-list-running"></a>
155
156 Instead of a full backtrace, you sometimes just need a list of running threads.
157
158 ```
159 for pid in $(pidof icinga2); do gdb -p $pid -batch -ex "info threads" -ex "detach" -ex "q" > gdb_threads_${pid}_`date +%s`.log; done
160 ```
161
162 #### GDB Backtrace Stepping <a id="development-debug-gdb-backtrace-stepping"></a>
163
164 Identifying the problem may require stepping into the backtrace, analysing
165 the current scope, attributes, and possible unmet requirements. `p` prints
166 the value of the selected variable or function call result.
167
168 ```
169 (gdb) up
170 (gdb) down
171 (gdb) p checkable
172 (gdb) p checkable.px->m_Name
173 ```
174
175 #### GDB Breakpoints <a id="development-debug-gdb-breakpoint"></a>
176
177 To set a breakpoint to a specific function call, or file specific line.
178
179 ```
180 (gdb) b checkable.cpp:125
181 (gdb) b icinga::Checkable::SetEnablePerfdata
182 ```
183
184 GDB will ask about loading the required symbols later, select `yes` instead
185 of `no`.
186
187 Then run Icinga 2 until it reaches the first breakpoint. Continue with `c`
188 afterwards.
189
190 ```
191 (gdb) run
192 (gdb) c
193 ```
194
195 In case you want to step into the next line of code, use `n`. If there is a
196 function call where you want to step into, use `s`.
197
198 ```
199 (gdb) n
200
201 (gdb) s
202 ```
203
204 If you want to delete all breakpoints, use `d` and select `yes`.
205
206 ```
207 (gdb) d
208 ```
209
210 > **Tip**
211 >
212 > When debugging exceptions, set your breakpoint like this: `b __cxa_throw`.
213
214 Breakpoint Example:
215
216 ```
217 (gdb) b __cxa_throw
218 (gdb) r
219 (gdb) up
220 ....
221 (gdb) up
222 #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)
223     at /home/michi/coding/icinga/icinga2/lib/base/utility.cpp:609
224 609                     callback(cpath);
225 (gdb) l
226 604
227 605     #endif /* _WIN32 */
228 606
229 607             std::sort(files.begin(), files.end());
230 608             BOOST_FOREACH(const String& cpath, files) {
231 609                     callback(cpath);
232 610             }
233 611
234 612             std::sort(dirs.begin(), dirs.end());
235 613             BOOST_FOREACH(const String& cpath, dirs) {
236 (gdb) p files
237 $3 = std::vector of length 11, capacity 16 = {{static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/agent.conf"}, {static NPos = 18446744073709551615,
238     m_Data = "/etc/icinga2/conf.d/commands.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/downtimes.conf"}, {static NPos = 18446744073709551615,
239     m_Data = "/etc/icinga2/conf.d/groups.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/notifications.conf"}, {static NPos = 18446744073709551615,
240     m_Data = "/etc/icinga2/conf.d/satellite.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/services.conf"}, {static NPos = 18446744073709551615,
241     m_Data = "/etc/icinga2/conf.d/templates.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/test.conf"}, {static NPos = 18446744073709551615,
242     m_Data = "/etc/icinga2/conf.d/timeperiods.conf"}, {static NPos = 18446744073709551615, m_Data = "/etc/icinga2/conf.d/users.conf"}}
243 ```
244
245
246 ### Core Dump <a id="development-debug-core-dump"></a>
247
248 When the Icinga 2 daemon crashes with a `SIGSEGV` signal
249 a core dump file should be written. This will help
250 developers to analyze and fix the problem.
251
252 #### Core Dump File Size Limit <a id="development-debug-core-dump-limit"></a>
253
254 This requires setting the core dump file size to `unlimited`.
255
256
257 ##### Systemd
258
259 ```
260 systemctl edit icinga2.service
261
262 [Service]
263 ...
264 LimitCORE=infinity
265
266 systemctl daemon-reload
267
268 systemctl restart icinga2
269 ```
270
271 ##### Init Script
272
273 ```
274 vim /etc/init.d/icinga2
275 ...
276 ulimit -c unlimited
277
278 service icinga2 restart
279 ```
280
281 ##### Verify
282
283 Verify that the Icinga 2 process core file size limit is set to `unlimited`.
284
285 ```
286 for pid in $(pidof icinga2); do cat /proc/$pid/limits; done
287
288 ...
289 Max core file size        unlimited            unlimited            bytes
290 ```
291
292
293 #### Core Dump Kernel Format <a id="development-debug-core-dump-format"></a>
294
295 The Icinga 2 daemon runs with the SUID bit set. Therefore you need
296 to explicitly enable core dumps for SUID on Linux.
297
298 ```
299 sysctl -w fs.suid_dumpable=2
300 ```
301
302 Adjust the coredump kernel format and file location on Linux:
303
304 ```
305 sysctl -w kernel.core_pattern=/var/lib/cores/core.%e.%p
306
307 install -m 1777 -d /var/lib/cores
308 ```
309
310 MacOS:
311
312 ```
313 sysctl -w kern.corefile=/cores/core.%P
314
315 chmod 777 /cores
316 ```
317
318 #### Core Dump Analysis <a id="development-debug-core-dump-analysis"></a>
319
320 Once Icinga 2 crashes again a new coredump file will be written. Please
321 attach this file to your bug report in addition to the general details.
322
323 Simple test case for a `SIGSEGV` simulation with `sleep`:
324
325 ```
326 ulimit -c unlimited
327 sleep 1800&
328 [1] <PID>
329 kill -SEGV <PID>
330 gdb `which sleep` /var/lib/cores/core.sleep.<PID>
331 (gdb) bt
332 rm /var/lib/cores/core.sleep.*
333 ```
334
335 Analyzing Icinga 2:
336
337 ```
338 gdb /usr/lib64/icinga2/sbin/icinga2 core.icinga2.<PID>
339 (gdb) bt
340 ```
341
342 ### LLDB as Debugger <a id="development-debug-lldb"></a>
343
344 LLDB is available on macOS with the Xcode command line tools.
345
346 ```
347 $ xcode-select --install
348 ```
349
350 In order to run Icinga 2 with LLDB you need to pass the binary as argument.
351
352 ```
353 lldb -- /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon
354 ```
355
356 Breakpoint:
357
358 ```
359 > b checkable.cpp:57
360 > b icinga::Checkable::ProcessCheckResult
361 ```
362
363 Full backtrace:
364
365 ```
366 > bt all
367 ```
368
369 Select thread:
370
371 ```
372 > thr sel 5
373 ```
374
375 Step into:
376
377 ```
378 > s
379 ```
380
381 Next step:
382
383 ```
384 > n
385 ```
386
387 Continue:
388
389 ```
390 > c
391 ```
392
393 Up/down in stacktrace:
394
395 ```
396 > up
397 > down
398 ```
399
400
401
402 ## Develop Icinga 2 <a id="development-develop"></a>
403
404 Icinga 2 can be built on many platforms such as Linux, Unix and Windows.
405 There are limitations in terms of support, e.g. Windows is only supported for agents,
406 not a full-featured master or satellite.
407
408 Before you start with actual development, there is a couple of pre-requisites.
409
410 ### Choose your Editor <a id="development-develop-choose-editor"></a>
411
412 Icinga 2 can be developed with your favorite editor. Icinga developers prefer
413 these tools:
414
415 - vim
416 - CLion (macOS, Linux)
417 - MS Visual Studio (Windows)
418 - Atom
419
420 Editors differ on the functionality. The more helpers you get for C++ development,
421 the faster your development workflow will be.
422
423
424 #### Whitespace Cleanup <a id="development-develop-choose-editor-whitespaces"></a>
425
426 Patches must be cleaned up and follow the indent style (tabs instead of spaces).
427 You should also remove any training whitespaces.
428
429 `git diff` allows to highlight such.
430
431 ```
432 vim $HOME/.gitconfig
433
434 [color "diff"]
435         whitespace = red reverse
436 [core]
437         whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
438 ```
439
440 `vim` also can match these and visually alert you to remove them.
441
442 ```
443 vim $HOME/.vimrc
444
445 highlight ExtraWhitespace ctermbg=red guibg=red
446 match ExtraWhitespace /\s\+$/
447 autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
448 autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
449 autocmd InsertLeave * match ExtraWhitespace /\s\+$/
450 autocmd BufWinLeave * call clearmatches()
451 ```
452
453 ### Get to know the architecture <a id="development-develop-get-to-know-the-architecture"></a>
454
455 Icinga 2 can run standalone or in distributed environments. It contains a whole lot
456 more than a simple check execution engine.
457
458 Read more about it in the [Technical Concepts](19-technical-concepts.md#technical-concepts) chapter.
459
460 ### Get to know the code <a id="development-develop-get-to-know-the-code"></a>
461
462 First off, you really need to know C++ and portions of C++11 and the boost libraries.
463 Best is to start with a book or online tutorial to get into the basics.
464 Icinga developers gained their knowledge through studies, training and self-teaching
465 code by trying it out and asking senior developers for guidance.
466
467 Here's a few books we can recommend:
468
469 * [Accelerated C++: Practical Programming by Example](https://www.amazon.com/Accelerated-C-Practical-Programming-Example/dp/020170353X) (Andrew Koenig, Barbara E. Moo)
470 * [Effective C++](https://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876) (Scott Meyers)
471 * [Der C++ Programmierer](https://www.amazon.de/Programmierer-lernen-Professionell-anwenden-L%C3%B6sungen/dp/3446416447), German (Ulrich Breymann)
472 * [C++11 programmieren](https://www.amazon.de/gp/product/3836217325/), German (Torsten T. Will)
473
474 In addition, it is a good bet to also know SQL when diving into backend development.
475
476 * [SQL Performance Explained](https://www.amazon.de/gp/product/3950307826/) (Markus Winand)
477
478 Last but not least, if you are developing on Windows, get to know the internals about services and the Win32 API.
479
480
481 ### Design Patterns <a id="development-develop-design-patterns"></a>
482
483 Icinga 2 heavily relies on object-oriented programming and encapsulates common
484 functionality into classes and objects. It also uses modern programming techniques
485 to e.g. work with shared pointer memory management.
486
487 Icinga 2 consists of libraries bundled into the main binary. Therefore you'll
488 find many code parts in the `lib/` directory wheras the actual application is
489 built from `icinga-app/`. Accompanied with Icinga 2, there's the Windows plugins
490 which are standalone and compiled from `plugins/`.
491
492 Library        | Description
493 ---------------|------------------------------------
494 base           | Objects, values, types, streams, tockets, TLS, utilities, etc.
495 config         | Configuration compiler, expressions, etc.
496 cli            | CLI (sub) commands and helpers.
497 icinga         | Icinga specific objects and event handling.
498 remote         | Cluster and HTTP client/server and REST API related code.
499 checker        | Checker feature, check scheduler.
500 notification   | Notification feature, notification scheduler.
501 methods        | Command execution methods, plugins and built-in checks.
502 perfdata       | Performance data related, including Graphite, Elastic, etc.
503 db\_ido        | IDO database abstraction layer.
504 db\_ido\_mysql | IDO database driver for MySQL.
505 db\_ido\_pgsql | IDO database driver for PgSQL.
506 mysql\_shin    | Library stub for linking against the MySQL client libraries.
507 pgsql\_shim    | Library stub for linking against the PgSQL client libraries.
508
509 #### Class Compiler <a id="development-develop-design-patterns-class-compiler"></a>
510
511 Another thing you will recognize are the `.ti` files which are compiled
512 by our own class compiler into actual source code. The meta language allows
513 developers to easily add object attributes and specify their behaviour.
514
515 Some object attributes need to be stored over restarts in the state file
516 and therefore have the `state` attribute set. Others are treated as `config`
517 attribute and automatically get configuration validation functions created.
518 Hidden or read-only REST API attributes are marked with `no_user_view` and
519 `no_user_modify`.
520
521 The most beneficial thing are getters and setters being generated. The actual object
522 inherits from `ObjectImpl<TYPE>` and therefore gets them "for free".
523
524 Example:
525
526 ```
527 vim lib/perfdata/gelfwriter.ti
528
529   [config] enable_tls;
530
531 vim lib/perfdata/gelfwriter.cpp
532
533     if (GetEnableTls()) {
534 ```
535
536 The logic is hidden in `tools/mkclass/` in case you want to learn more about it.
537 The first steps during CMake & make also tell you about code generation.
538
539
540 ### Builds: CMake <a id="development-develop-builds-cmake"></a>
541
542 In its early development stages in 2012, Icinga 2 was built with autoconf/automake
543 and separate Windows project files. We've found this very fragile, and have changed
544 this into CMake as our build tool.
545
546 The most common benefits:
547
548 * Everything is described in CMakeLists.txt in each directory
549 * CMake only needs to know that a sub directory needs to be included.
550 * The global CMakeLists.txt acts as main entry point for requirement checks and library/header includes.
551 * Separate binary build directories, the actual source tree stays clean.
552 * CMake automatically generates a Visual Studio project file `icinga2.sln` on Windows.
553
554 ### Builds: Unity Builds <a id="development-develop-builds-unity-builds"></a>
555
556 Another thing you should be aware of: Unity builds on and off.
557
558 Typically, we already use caching mechanisms to reduce recompile time with ccache.
559 For release builds, there's always a new build needed as the difference is huge compared
560 to a previous (major) release.
561
562 Therefore we've invented the Unity builds, which basically concatenates all source files
563 into one big library source code file. The compiler then doesn't need to load the many small
564 files but compiles and links this huge one.
565
566 Unity builds require more memory which is why you should disable them for development
567 builds in small sized VMs (Linux, Windows) and also Docker containers.
568
569 There's a couple of header files which are included everywhere. If you touch/edit them,
570 the cache is invalidated and you need to recompile a lot more files then. `base/utility.hpp`
571 and `remote/zone.hpp` are good candidates for this.
572
573
574 ### Linux Dev Environment <a id="development-linux-dev-env"></a>
575
576 Based on CentOS 7, we have an early draft available inside the Icinga Vagrant boxes:
577 [centos7-dev](https://github.com/Icinga/icinga-vagrant/tree/master/centos7-dev).
578
579 If you're compiling Icinga 2 natively without any virtualization layer in between,
580 this usually is faster. This is also the reason why developers on macOS prefer native builds
581 over Linux or Windows VMs. Don't forget to test the actual code on Linux later! Socket specific
582 stuff like `epoll` is not available on Unix kernels.
583
584 Depending on your workstation and environment, you may either develop and run locally,
585 use a container deployment pipeline or put everything in a high end resource remote VM.
586
587 Fork https://github.com/Icinga/icinga2 into your own repository, e.g. `https://github.com/dnsmichi/icinga2`.
588
589 Create two build directories for different binary builds.
590
591 * `debug` contains the debug build binaries. They contain more debug information and run tremendously slower than release builds from packages. Don't use them for benchmarks.
592 * `release` contains the release build binaries, as you would install them on a live system. This helps comparing specific scenarios for race conditions and more.
593
594 ```
595 mkdir -p release debug
596 ```
597
598 Proceed with the specific distribution examples below.
599
600 * [CentOS 7](21-development.md#development-linux-dev-env-centos)
601 * [Debian 9](21-development.md#development-linux-dev-env-debian)
602
603
604 #### CentOS 7 <a id="development-linux-dev-env-centos"></a>
605
606 ```
607 yum -y install gdb git bash-completion htop rpmdevtools \
608  ccache cmake make gcc-c++ flex bison \
609  openssl-devel boost-devel systemd-devel mysql-devel \
610  postgresql-devel libedit-devel libstdc++-devel
611
612 groupadd icinga
613 groupadd icingacmd
614 useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga
615
616 ln -s /bin/ccache /usr/local/bin/gcc
617 ln -s /bin/ccache /usr/local/bin/g++
618
619 git clone https://github.com/icinga/icinga2.git && cd icinga2
620
621 mkdir debug release
622 cd debug
623 cmake .. -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DICINGA2_PLUGINDIR=/usr/local/sbin
624 cd ..
625 make -j2 install -C debug
626 ```
627
628
629 ```
630 chown -R icinga:icinga /usr/local/icinga2/var/
631
632 /usr/local/icinga2/lib/icinga2/prepare-dirs /usr/local/icinga2/etc/sysconfig/icinga2
633 /usr/local/icinga2/sbin/icinga2 api setup
634 vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf
635
636 gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon
637 ```
638
639 #### Debian 9 <a id="development-linux-dev-env-debian"></a>
640
641 ```
642 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
643
644 ln -s /usr/bin/ccache /usr/local/bin/gcc
645 ln -s /usr/bin/ccache /usr/local/bin/g++
646
647 groupadd icinga
648 groupadd icingacmd
649 useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga
650
651 git clone https://github.com/icinga/icinga2.git && cd icinga2
652
653 mkdir debug release
654 cd debug
655 cmake .. -DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF -DCMAKE_INSTALL_PREFIX=/usr/local/icinga2 -DICINGA2_PLUGINDIR=/usr/local/sbin
656 cd ..
657 make -j2 install -C debug
658 ```
659
660
661 ```
662 chown -R icinga:icinga /usr/local/icinga2/var/
663
664 /usr/local/icinga2/lib/icinga2/prepare-dirs /usr/local/icinga2/etc/sysconfig/icinga2
665 /usr/local/icinga2/sbin/icinga2 api setup
666 vim /usr/local/icinga2/etc/icinga2/conf.d/api-users.conf
667
668 gdb --args /usr/local/icinga2/lib/icinga2/sbin/icinga2 daemon
669 ```
670
671
672
673 ### macOS Dev Environment <a id="development-macos-dev-env"></a>
674
675 It is advised to use Homebrew to install required build dependencies.
676 Macports have been reported to work as well, typically you'll get more help
677 with Homebrew from Icinga developers.
678
679 #### Users and Groups
680
681 First off, create the following from `Settings - Users & Groups`:
682
683 * Users: `icinga`
684 * Groups: `icinga` with `icinga` as member
685 * Groups: `icingaweb2`
686
687 Then disallow login for these users.
688
689 ```
690 dscl
691 list Local/Default/Users
692 read Local/Default/Users/icinga
693 change Local/Default/Users/icinga UserShell /bin/bash /usr/bin/false
694 sudo dscl . create /Users/icinga IsHidden 1
695 sudo dseditgroup -o edit -a _www -t user icingaweb2
696 ```
697
698 #### Requirements
699
700 OpenSSL 1.0.x doesn't build anymore, so we're explicitly using 1.1.x here.
701
702 ```
703 brew install ccache boost cmake bison flex openssl@1.1 mysql-connector-c++ postgresql libpq
704 ```
705
706 ##### ccache
707
708 ```
709 sudo mkdir /opt/ccache
710
711 sudo ln -s `which ccache` /opt/ccache/clang
712 sudo ln -s `which ccache` /opt/ccache/clang++
713
714 vim $HOME/.bashrc
715
716 # ccache is managed with symlinks to avoid collision with cgo
717 export PATH="/opt/ccache:$PATH"
718
719 source $HOME/.bashrc
720 ```
721
722 #### Builds
723
724 We will build two different flavors on macOS.
725
726 ```
727 mkdir -p release debug
728
729 cd debug
730 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 ..
731 cd ..
732
733 make -j4 -C debug
734 sudo make -j4 install -C debug
735 ```
736
737 ##### Build Aliases
738
739 This is derived from dnsmichi's flavour and not generally best practice.
740
741 ```
742 vim $HOME/.bashrc
743
744 export PATH=/usr/local/icinga2/sbin/:$PATH
745 source /usr/local/icinga2/etc/bash_completion.d/icinga2
746
747 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"
748
749 export I2_DEBUG="-DCMAKE_BUILD_TYPE=Debug -DICINGA2_UNITY_BUILD=OFF $I2_GENERIC"
750 export I2_RELEASE="-DCMAKE_BUILD_TYPE=RelWithDebInfo -DICINGA2_WITH_TESTS=ON -DICINGA2_UNITY_BUILD=ON $I2_GENERIC"
751
752 alias i2_debug="mkdir -p debug; cd debug; cmake $I2_DEBUG ..; make -j4; sudo make -j4 install; cd .."
753 alias i2_release="mkdir -p release; cd release; cmake $I2_RELEASE ..; make -j4; sudo make -j4 install; cd .."
754
755 source $HOME/.bashrc
756 ```
757
758 #### Run
759
760 ```
761 chown -R icinga:icinga /usr/local/icinga2
762 chown -R icinga:_www /usr/local/icinga2/var/run/icinga2/cmd
763
764 icinga2 daemon
765 ```
766
767 #### Plugins
768
769 ```
770 brew install nagios-plugins
771
772 sudo vim /usr/local/icinga2/etc/icinga2/constants.conf
773 const PluginDir = "/usr/local/sbin"
774 ```
775
776 #### Databases: MariaDB
777
778 ```
779 brew install mariadb
780 ln -sfv /usr/local/opt/mariadb/*.plist ~/Library/LaunchAgents
781 launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mariadb.plist
782 mysql_secure_installation
783 ```
784
785 ```
786 vim $HOME/.my.cnf
787
788 [client]
789 user = root
790 password = supersecurerootpassword
791
792 sudo -i
793 ln -s /Users/michi/.my.cnf $HOME/.my.cnf
794 exit
795 ```
796
797 ```
798 cd $HOME/coding/icinga/icinga2
799
800 sudo mysql
801
802 CREATE DATABASE icinga;
803 GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE VIEW, INDEX, EXECUTE ON icinga.* TO 'icinga'@'localhost' IDENTIFIED BY 'icinga';
804 quit
805 sudo mysql icinga < lib/db_ido_mysql/schema/mysql.sql
806 ```
807
808
809
810
811 ### Windows Dev Environment <a id="development-windows-dev-env"></a>
812
813 The following sections explain how to setup the required build tools
814 and how to run and debug the code.
815
816 #### Chocolatey
817
818 Open an administrative command prompt (Win key, type “cmd”, right-click and “run as administrator”) and paste the following instructions:
819
820 ```
821 @powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
822 ```
823
824 #### Visual Studio
825
826 Thanks to Microsoft they’ll now provide their Professional Edition of Visual Studio 2017
827 as community version, free for use for open source projects such as Icinga.
828 The installation requires ~9GB disk space. [Download](https://www.visualstudio.com/downloads/)
829 the web installer and start the installation.
830
831 You need a free Microsoft account to download and also store your preferences.
832
833 Choose the following minimal set:
834
835 * .NET Framework 4.x SDK
836 * C# Compiler
837 * Visual Studio C++ core features
838 * VC++ toolset
839 * Windows 10 SDK (10.0.10240.0 - required)
840 * Just-in-time debugger
841 * Windows 8 SDK (includes mscoree.lib required by clrchecktask)
842 * C++/CLI support
843 * Windows Universal C Runtime
844 * Git for Windows
845 * .NET Framework 3.5 development tools
846 * Github extension for Visual Studio
847
848 After a while, Visual Studio will be ready.
849
850 #### .NET Framework 3.5
851
852 Windows 10 only have .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. Thankfully Windows 10 have .NET Framework 3.5 (which includes .NET Framework 2.0) as a component on board, you just need to activate it.
853
854 Go to `Control Panel` -> `Programs` -> `Turn Windows features on or off`. Tick `.NET Framework 3.5 (includes .NET 2.0 and 3.0)` and wait until the installation process succseded.
855
856 #### Flex and Bison
857
858 Install it using [chocolatey](https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html):
859
860 ```
861 choco install -y winflexbison
862 ```
863
864 Chocolatey installs these tools into the hidden directory `C:\ProgramData\chocolatey\lib\winflexbison\tools`.
865
866 #### OpenSSL
867
868 Icinga 2 requires the OpenSSL library. [Download](http://slproweb.com/products/Win32OpenSSL.html)
869 and install it into the default path.
870
871 Once asked for `Copy OpenSSLs DLLs to` select `The Windows system directory`. That way CMake/Visual Studio
872 will automatically detect them for builds and packaging.
873
874 > **Note**
875 >
876 > We cannot use the chocolatey package as this one does not provide any development headers.
877 >
878 > Choose 1.0.2 LTS from manual downloads for best compatibility if unsure.
879
880 #### Boost
881
882 In order to use the boost development header and library files you need to [download](http://www.boost.org/users/download/)
883 Boost and then extract it to e.g. `C:\boost_1_65_1`.
884
885 > **Note**
886 >
887 > Just use `C:`, the zip file already contains the sub folder. Extraction takes a while,
888 > the archive contains more than 10k files.
889
890 For integrating Boost into Visual Studio 2017, open the `Developer Command Prompt` from the start menu,
891 and navigate to `C:\boost_1_65_1`.
892
893 Execute `bootstrap.bat` first.
894
895 ```
896 cd C:\boost_1_65_1
897 bootstrap.bat
898 ```
899
900 Once finished, specify the required `toolset` to compile boost against Visual Studio.
901 This takes quite some time in a Windows VM.
902
903 Visual Studio 2015:
904
905 ```
906 b2 --toolset=msvc-14.0
907 ```
908
909 Visual Studio 2017:
910
911 ```
912 b2 --toolset=msvc-14.1
913 ```
914
915 #### TortoiseGit
916
917 TortoiseGit provides a graphical integration into the Windows explorer. This makes it easier to checkout, commit
918 and whatnot.
919
920 [Download](https://tortoisegit.org/download/) TortoiseGit on your system.
921
922 In order to clone via Git SSH you also need to create a new directory called `.ssh`
923 inside your user's home directory.
924 Therefore open a command prompt (win key, type `cmd`, enter) and run `mkdir .ssh`.
925 Add your `id_rsa` private key and `id_rsa.pub` public key files into that directory.
926
927 Start the setup routine and choose `OpenSSH` as default secure transport when asked.
928
929 Open a Windows Explorer window and navigate into
930
931 Version             | Project Location
932 --------------------|------------------------------
933 Visual Studio 2015  | `C:\Users\michi\Documents\Visual Studio 2015\Projects`
934 Visual Studio 2017+ | `C:\Users\michi\source\repos`
935
936 Right click and select `Git Clone` from the context menu.
937
938 Use `ssh://git@github.com/icinga/icinga2.git` for SSH clones, `https://github.com/icinga/icinga2.git` otherwise.
939
940 #### CMake
941
942 Icinga 2 uses CMake to manage the build environment. You can generate the Visual Studio project files
943 using CMake. [Download](https://cmake.org/download/) and install CMake. Select to add it to PATH for all users
944 when asked.
945
946 Once setup is completed, open a command prompt and navigate to
947
948 Visual Studio 2015
949
950 ```
951 cd C:\Users\<username>\Documents\Visual Studio 2015\Projects\icinga2
952 ```
953
954 Visual Studio 2017
955
956 ```
957 cd C:\Users\michi\source\repos
958 ```
959
960 Run CMake with the following command. This generates a new Visual Studio project file called `icinga2.sln`.
961
962 You need to specify the previously installed component paths:
963
964 Variable              | Value                                                                | Description
965 ----------------------|----------------------------------------------------------------------|-------------------------------------------------------
966 `BOOST_ROOT`          | `C:\boost_1_65_1`                                                    | Root path where you've extracted and compiled Boost.
967 `BISON_EXECUTABLE`    | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_bison.exe`     | Path to the Bison executable.
968 `FLEX_EXECUTABLE`     | `C:\ProgramData\chocolatey\lib\winflexbison\tools\win_flex.exe`      | Path to the Flex executable.
969 `ICINGA2_WITH_MYSQL`  | OFF                                                                  | Requires extra setup for MySQL if set to `ON`. Not supported for client setups.
970 `ICINGA2_WITH_PGSQL`  | OFF                                                                  | Requires extra setup for PgSQL if set to `ON`. Not supported for client setups.
971 `ICINGA2_UNITY_BUILD` | OFF                                                                  | Disable unity builds for development environments.
972
973 Tip: If you have previously opened a terminal, run `refreshenv` to re-read updated PATH variables.
974
975 ```
976 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
977 ```
978
979 Best is write a small batch/Powershell script which just executes these lines.
980
981
982 #### Icinga 2 in Visual Studio
983
984 Navigate to
985
986 Version             | Project location
987 --------------------|-------------------------
988 Visual Studio 2015  | `C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2`
989 Visual Studio 2017+ | `C:\Users\michi\source\repos\icinga2`
990
991 Open `icinga2.sln`. Log into Visual Studio when asked.
992
993 On the right panel, select to build the `Bin/icinga-app` solution.
994
995 The executable binaries are located in `Bin\Release\Debug` in your `icinga2`
996 project directory.
997
998 Navigate there and run `icinga2.exe --version`.
999
1000 Example for Visual Studio 2017:
1001
1002 ```
1003 cd C:\Users\michi\source\repos\icinga2\Bin\Release\Debug
1004 icinga2.exe --version
1005 ```
1006
1007
1008 #### Release Package
1009
1010 CMake uses CPack and NSIS to create the setup executable including all binaries and libraries
1011 in addition to setup dialogues and configuration. Therefore we’ll need to install [NSIS](http://nsis.sourceforge.net/Download)
1012 first.
1013
1014 We also need to install the Windows Installer XML (WIX) toolset.
1015
1016 ```
1017 choco install -y wixtoolset
1018 ```
1019
1020 Once completed open an administrative shell and navigate to your Visual Studio project.
1021 Let CMake to build a release package.
1022
1023 ```
1024 cd "c:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2"
1025 cmake --build . --target PACKAGE --config Release
1026 ```
1027
1028 Note: This will still use the debug builds. A yet more clean approach
1029 is to run CMake with changed release parameters beforehand and then
1030 re-run the release package builder.
1031
1032 ```
1033 C:\Users\michi\Documents\Visual Studio 2015\Projects\icinga2>
1034 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
1035
1036 cmake --build . --target PACKAGE --config Release
1037 ```
1038
1039 Again, put these lines into a batch/Powershell script and execute that.
1040
1041
1042
1043 ### Embedded Dev Env: Pi <a id="development-embedded-dev-env"></a>
1044
1045 > **Note**
1046 >
1047 > This isn't officially supported yet, just a few hints how you can do it yourself.
1048
1049 The following examples source from armhf on Raspberry Pi.
1050
1051 #### ccache
1052
1053 ```
1054 apt install -y ccache
1055
1056 /usr/sbin/update-ccache-symlinks
1057
1058 echo 'export PATH="/usr/lib/ccache:$PATH"' | tee -a ~/.bashrc
1059
1060 source ~/.bashrc && echo $PATH
1061 ```
1062
1063 #### Build
1064
1065 Copy the icinga2 source code into `$HOME/icinga2`. Clone the `deb-icinga2` repository into `debian/`.
1066
1067 ```
1068 git clone https://github.com/Icinga/icinga2 $HOME/icinga2
1069 git clone https://github.com/Icinga/deb-icinga2 $HOME/icinga2/debian
1070 ```
1071
1072 Then build a Debian package and install it like normal.
1073 ```
1074 dpkg-buildpackage -uc -us
1075 ```
1076
1077 ## Package Builds <a id="development-package-builds"></a>
1078
1079 This documentation is explicitly meant for packagers and the Icinga
1080 build infrastructure.
1081
1082 The following requirements need to be fulfilled in order to build the
1083 Icinga application using a dist tarball (including notes for distributions):
1084
1085 * cmake >= 2.6
1086 * GNU make (make) or ninja-build
1087 * C++ compiler which supports C++11
1088   - RHEL/Fedora/SUSE: gcc-c++ >= 4.7 (extra Developer Tools on RHEL5/6 see below)
1089   - Debian/Ubuntu: build-essential
1090   - Alpine: build-base
1091   - you can also use clang++
1092 * pkg-config
1093 * OpenSSL library and header files >= 1.0.1
1094   - RHEL/Fedora: openssl-devel
1095   - SUSE: libopenssl-devel (for SLES 11: libopenssl1-devel)
1096   - Debian/Ubuntu: libssl-dev
1097   - Alpine: libressl-dev
1098 * Boost library and header files >= 1.66.0
1099   - RHEL/Fedora: boost166-devel
1100   - Debian/Ubuntu: libboost-all-dev
1101   - Alpine: boost-dev
1102 * GNU bison (bison)
1103 * GNU flex (flex) >= 2.5.35
1104 * systemd headers
1105   - Only required when using systemd
1106   - Debian/Ubuntu: libsystemd-dev
1107   - RHEL/Fedora: systemd-devel
1108
1109 ### Optional features <a id="development-package-builds-optional-features"></a>
1110
1111 * MySQL (disable with CMake variable `ICINGA2_WITH_MYSQL` to `OFF`)
1112   - RHEL/Fedora: mysql-devel
1113   - SUSE: libmysqlclient-devel
1114   - Debian/Ubuntu: default-libmysqlclient-dev | libmysqlclient-dev
1115   - Alpine: mariadb-dev
1116 * PostgreSQL (disable with CMake variable `ICINGA2_WITH_PGSQL` to `OFF`)
1117   - RHEL/Fedora: postgresql-devel
1118   - Debian/Ubuntu: libpq-dev
1119   - postgresql-dev on Alpine
1120 * libedit (CLI console)
1121   - RHEL/Fedora: libedit-devel on CentOS (RHEL requires rhel-7-server-optional-rpms)
1122   - Debian/Ubuntu/Alpine: libedit-dev
1123 * Termcap (only required if libedit doesn't already link against termcap/ncurses)
1124   - RHEL/Fedora: libtermcap-devel
1125   - Debian/Ubuntu: (not necessary)
1126
1127 ### Special requirements <a id="development-package-builds-special-requirements"></a>
1128
1129 **FreeBSD**: libexecinfo (automatically used when Icinga 2 is installed via port or package)
1130
1131 **RHEL6** and **SLES11**: Requires a newer boost version which is available on packages.icinga.com
1132 with a version suffixed name.
1133
1134 ### Runtime user environment <a id="development-package-builds-runtime-user-env"></a>
1135
1136 By default Icinga will run as user `icinga` and group `icinga`. Additionally the
1137 external command pipe and livestatus features require a dedicated command group
1138 `icingacmd`. You can choose your own user/group names and pass them to CMake
1139 using the `ICINGA2_USER`, `ICINGA2_GROUP` and `ICINGA2_COMMAND_GROUP` variables.
1140
1141 ```
1142 # groupadd icinga
1143 # groupadd icingacmd
1144 # useradd -c "icinga" -s /sbin/nologin -G icingacmd -g icinga icinga
1145 ```
1146
1147 On Alpine (which uses ash busybox) you can run:
1148
1149 ```
1150 # addgroup -S icinga
1151 # addgroup -S icingacmd
1152 # adduser -S -D -H -h /var/spool/icinga2 -s /sbin/nologin -G icinga -g icinga icinga
1153 # adduser icinga icingacmd
1154 ```
1155
1156 Add the web server user to the icingacmd group in order to grant it write
1157 permissions to the external command pipe and livestatus socket:
1158
1159 ```
1160 # usermod -a -G icingacmd www-data
1161 ```
1162
1163 Make sure to replace "www-data" with the name of the user your web server
1164 is running as.
1165
1166 ### Building Icinga 2: Example <a id="development-package-builds-example"></a>
1167
1168 Once you have installed all the necessary build requirements you can build
1169 Icinga 2 using the following commands:
1170
1171 ```
1172 $ mkdir release && cd release
1173 $ cmake ..
1174 $ cd ..
1175 $ make -C release
1176 $ make install -C release
1177 ```
1178
1179 You can specify an alternative installation prefix using `-DCMAKE_INSTALL_PREFIX`:
1180
1181 ```
1182 $ cmake .. -DCMAKE_INSTALL_PREFIX=/tmp/icinga2
1183 ```
1184
1185 ### CMake Variables <a id="development-package-builds-cmake-variables"></a>
1186
1187 In addition to `CMAKE_INSTALL_PREFIX` here are most of the supported Icinga-specific cmake variables.
1188
1189 For all variables regarding defaults paths on in CMake, see
1190 [GNUInstallDirs](https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html).
1191
1192 Also see `CMakeLists.txt` for details.
1193
1194 **System Environment**
1195 - `CMAKE_INSTALL_SYSCONFDIR`: The configuration directory; defaults to `CMAKE_INSTALL_PREFIX/etc`
1196 - `CMAKE_INSTALL_LOCALSTATEDIR`: The state directory; defaults to `CMAKE_INSTALL_PREFIX/var`
1197 - `ICINGA2_CONFIGDIR`: Main config directory; defaults to `CMAKE_INSTALL_SYSCONFDIR/icinga2` usually `/etc/icinga2`
1198 - `ICINGA2_CACHEDIR`: Directory for cache files; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/cache/icinga2` usually `/var/cache/icinga2`
1199 - `ICINGA2_DATADIR`: Data directory  for the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/lib/icinga2` usually `/var/lib/icinga2`
1200 - `ICINGA2_LOGDIR`: Logfiles of the daemon; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/log/icinga2 usually `/var/log/icinga2`
1201 - `ICINGA2_SPOOLDIR`: Spooling directory ; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/spool/icinga2` usually `/var/spool/icinga2`
1202 - `ICINGA2_INITRUNDIR`: Runtime data for the init system; defaults to `CMAKE_INSTALL_LOCALSTATEDIR/run/icinga2` usually `/run/icinga2`
1203 - `ICINGA2_GIT_VERSION_INFO`: Whether to use Git to determine the version number; defaults to `ON`
1204 - `ICINGA2_USER`: The user Icinga 2 should run as; defaults to `icinga`
1205 - `ICINGA2_GROUP`: The group Icinga 2 should run as; defaults to `icinga`
1206 - `ICINGA2_COMMAND_GROUP`: The command group Icinga 2 should use; defaults to `icingacmd`
1207 - `ICINGA2_SYSCONFIGFILE`: Where to put the config file the initscript/systemd pulls it's dirs from;
1208   defaults to `CMAKE_INSTALL_PREFIX/etc/sysconfig/icinga2`
1209 - `ICINGA2_PLUGINDIR`: The path for the Monitoring Plugins project binaries; defaults to `/usr/lib/nagios/plugins`
1210
1211 **Build Optimization**
1212 - `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.
1213 - `ICINGA2_LTO_BUILD`: Whether to use link time optimization (LTO); defaults to `OFF`
1214
1215 **Init System**
1216 - `USE_SYSTEMD=ON|OFF`: Use systemd or a classic SysV initscript; defaults to `OFF`
1217 - `INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT=ON|OFF` Force install both the systemd service definition file
1218   and the SysV initscript in parallel, regardless of how `USE_SYSTEMD` is set.
1219   Only use this for special packaging purposes and if you know what you are doing.
1220   Defaults to `OFF`.
1221
1222 **Features:**
1223 - `ICINGA2_WITH_CHECKER`: Determines whether the checker module is built; defaults to `ON`
1224 - `ICINGA2_WITH_COMPAT`: Determines whether the compat module is built; defaults to `ON`
1225 - `ICINGA2_WITH_DEMO`: Determines whether the demo module is built; defaults to `OFF`
1226 - `ICINGA2_WITH_HELLO`: Determines whether the hello module is built; defaults to `OFF`
1227 - `ICINGA2_WITH_LIVESTATUS`: Determines whether the Livestatus module is built; defaults to `ON`
1228 - `ICINGA2_WITH_NOTIFICATION`: Determines whether the notification module is built; defaults to `ON`
1229 - `ICINGA2_WITH_PERFDATA`: Determines whether the perfdata module is built; defaults to `ON`
1230 - `ICINGA2_WITH_TESTS`: Determines whether the unit tests are built; defaults to `ON`
1231
1232 **MySQL or MariaDB:**
1233
1234 The following settings can be tuned for the MySQL / MariaDB IDO feature.
1235
1236 - `ICINGA2_WITH_MYSQL`: Determines whether the MySQL IDO module is built; defaults to `ON`
1237 - `MYSQL_CLIENT_LIBS`: Client implementation used (mysqlclient / mariadbclient); defaults searches for `mysqlclient` and `mariadbclient`
1238 - `MYSQL_INCLUDE_DIR`: Directory containing include files for the mysqlclient; default empty -
1239   checking multiple paths like `/usr/include/mysql`
1240
1241 See [FindMySQL.cmake](third-party/cmake/FindMySQL.cmake) for the implementation.
1242
1243 **PostgreSQL:**
1244
1245 The following settings can be tuned for the PostgreSQL IDO feature.
1246
1247 - `ICINGA2_WITH_PGSQL`: Determines whether the PostgreSQL IDO module is built; defaults to `ON`
1248 - `PostgreSQL_INCLUDE_DIR`: Top-level directory containing the PostgreSQL include directories
1249 - `PostgreSQL_LIBRARY`: File path to PostgreSQL library : libpq.so (or libpq.so.[ver] file)
1250
1251 See [FindMySQL.cmake](third-party/cmake/FindPostgreSQL.cmake) for the implementation.
1252
1253 **Version detection:**
1254
1255 CMake determines the Icinga 2 version number using `git describe` if the
1256 source directory is contained in a Git repository. Otherwise the version number
1257 is extracted from the [VERSION](VERSION) file. This behavior can be
1258 overridden by creating a file called `icinga-version.h.force` in the source
1259 directory. Alternatively the `-DICINGA2_GIT_VERSION_INFO=OFF` option for CMake
1260 can be used to disable the usage of `git describe`.
1261
1262
1263 ### Building RPMs <a id="development-package-builds-rpms"></a>
1264
1265 #### Build Environment on RHEL, CentOS, Fedora, Amazon Linux
1266
1267 Setup your build environment:
1268
1269 ```
1270 yum -y install rpmdevtools
1271 ```
1272
1273 #### Build Environment on SuSE/SLES
1274
1275 SLES:
1276
1277 ```
1278 zypper addrepo http://download.opensuse.org/repositories/devel:tools/SLE_12_SP4/devel:tools.repo
1279 zypper refresh
1280 zypper install rpmdevtools spectool
1281 ```
1282
1283 OpenSuSE:
1284
1285 ```
1286 zypper addrepo http://download.opensuse.org/repositories/devel:tools/openSUSE_Leap_15.0/devel:tools.repo
1287 zypper refresh
1288 zypper install rpmdevtools spectool
1289 ```
1290
1291 #### Package Builds <a id="development-package-builds-rpms-package-builds"></a>
1292
1293 Prepare the rpmbuild directory tree:
1294
1295 ```
1296 cd $HOME
1297 rpmdev-setuptree
1298 ```
1299
1300 Snapshot builds:
1301
1302 ```
1303 curl https://raw.githubusercontent.com/Icinga/rpm-icinga2/master/icinga2.spec -o $HOME/rpmbuild/SPECS/icinga2.spec
1304 ```
1305
1306 > **Note**
1307 >
1308 > The above command builds snapshot packages. Change to the `release` branch
1309 > for release package builds.
1310
1311 Copy the tarball to `rpmbuild/SOURCES` e.g. by using the `spectool` binary
1312 provided with `rpmdevtools`:
1313
1314 ```
1315 cd $HOME/rpmbuild/SOURCES
1316 spectool -g ../SPECS/icinga2.spec
1317
1318 cd $HOME/rpmbuild
1319 ```
1320
1321 Install the build dependencies. Example for CentOS 7:
1322
1323 ```
1324 yum -y install libedit-devel ncurses-devel gcc-c++ libstdc++-devel openssl-devel \
1325 cmake flex bison boost-devel systemd mysql-devel postgresql-devel httpd \
1326 selinux-policy-devel checkpolicy selinux-policy selinux-policy-doc
1327 ```
1328
1329 Note: If you are using Amazon Linux, systemd is not required.
1330
1331 A shorter way is available using the `yum-builddep` command on RHEL based systems:
1332
1333 ```
1334 yum-builddep SPECS/icinga2.spec
1335 ```
1336
1337 Build the RPM:
1338
1339 ```
1340 rpmbuild -ba SPECS/icinga2.spec
1341 ```
1342
1343 #### Additional Hints <a id="development-package-builds-rpms-additional-hints"></a>
1344
1345 ##### SELinux policy module
1346
1347 The following packages are required to build the SELinux policy module:
1348
1349 * checkpolicy
1350 * selinux-policy (selinux-policy on CentOS 6, selinux-policy-devel on CentOS 7)
1351 * selinux-policy-doc
1352
1353 ##### RHEL/CentOS 6
1354
1355 The RedHat Developer Toolset is required for building Icinga 2 beforehand.
1356 This contains a modern version of flex and a C++ compiler which supports
1357 C++11 features.
1358 ```
1359 cat >/etc/yum.repos.d/devtools-2.repo <<REPO
1360 [testing-devtools-2-centos-\$releasever]
1361 name=testing 2 devtools for CentOS $releasever
1362 baseurl=https://people.centos.org/tru/devtools-2/\$releasever/\$basearch/RPMS
1363 gpgcheck=0
1364 REPO
1365 ```
1366
1367 Dependencies to devtools-2 are used in the RPM SPEC, so the correct tools
1368 should be used for building.
1369
1370 As an alternative, you can use newer Boost packages provided on
1371 [packages.icinga.com](https://packages.icinga.com/epel).
1372 ```
1373 cat >$HOME/.rpmmacros <<MACROS
1374 %build_icinga_org 1
1375 MACROS
1376 ```
1377
1378 ##### Amazon Linux
1379
1380 If you prefer to build packages offline, a suitable Vagrant box is located
1381 [here](https://atlas.hashicorp.com/mvbcoding/boxes/awslinux/).
1382
1383 ##### SLES 11
1384
1385 The Icinga repository provides the required boost package version and must be
1386 added before building.
1387
1388 ### Build Debian/Ubuntu packages <a id="development-package-builds-deb"></a>
1389
1390 Setup your build environment on Debian/Ubuntu, copy the 'debian' directory from
1391 the Debian packaging Git repository (https://github.com/Icinga/deb-icinga2)
1392 into your source tree and run the following command:
1393
1394 ```
1395 dpkg-buildpackage -uc -us
1396 ```
1397
1398 ### Build Alpine Linux packages <a id="development-package-builds-alpine"></a>
1399
1400 A simple way to setup a build environment is installing Alpine in a chroot.
1401 In this way, you can set up an Alpine build environment in a chroot under a
1402 different Linux distro.
1403 There is a script that simplifies these steps with just two commands, and
1404 can be found [here](https://github.com/alpinelinux/alpine-chroot-install).
1405
1406 Once the build environment is installed, you can setup the system to build
1407 the packages by following [this document](https://wiki.alpinelinux.org/wiki/Creating_an_Alpine_package).
1408
1409 ### Build Post Install Tasks <a id="development-package-builds-post-install-tasks"></a>
1410
1411 After building Icinga 2 yourself, your package build system should at least run the following post
1412 install requirements:
1413
1414 * enable the `checker`, `notification` and `mainlog` feature by default
1415 * run 'icinga2 api setup' in order to enable the `api` feature and generate SSL certificates for the node
1416
1417 ### Run Icinga 2 <a id="development-package-builds-run-icinga"></a>
1418
1419 Icinga 2 comes with a binary that takes care of loading all the relevant
1420 components (e.g. for check execution, notifications, etc.):
1421
1422 ```
1423 icinga2 daemon
1424
1425 [2016-12-08 16:44:24 +0100] information/cli: Icinga application loader (version: v2.5.4-231-gb10a6b7; debug)
1426 [2016-12-08 16:44:24 +0100] information/cli: Loading configuration file(s).
1427 [2016-12-08 16:44:25 +0100] information/ConfigItem: Committing config item(s).
1428 ...
1429 ```
1430
1431 #### Init Script <a id="development-package-builds-init-script"></a>
1432
1433 Icinga 2 can be started as a daemon using the provided init script:
1434
1435 ```
1436 /etc/init.d/icinga2
1437 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status}
1438 ```
1439
1440 #### Systemd <a id="development-package-builds-systemd"></a>
1441
1442 If your distribution uses systemd:
1443
1444 ```
1445 systemctl {start|stop|reload|status|enable|disable} icinga2
1446 ```
1447
1448 In case the distribution is running systemd >227, you'll also
1449 need to package and install the `etc/initsystem/icinga2.service.limits.conf`
1450 file into `/etc/systemd/system/icinga2.service.d`.
1451
1452 #### openrc <a id="development-package-builds-openrc"></a>
1453
1454 Or if your distribution uses openrc (like Alpine):
1455
1456 ```
1457 rc-service icinga2
1458 Usage: /etc/init.d/icinga2 {start|stop|restart|reload|checkconfig|status}
1459 ```
1460
1461 Note: the openrc's init.d is not shipped by default.
1462 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.
1463 Those few steps can be followed:
1464
1465 ```
1466 wget https://git.alpinelinux.org/cgit/aports/plain/community/icinga2/icinga2.initd
1467 mv icinga2.initd /etc/init.d/icinga2
1468 chmod +x /etc/init.d/icinga2
1469 ```
1470
1471 Icinga 2 reads a single configuration file which is used to specify all
1472 configuration settings (global settings, hosts, services, etc.). The
1473 configuration format is explained in detail in the [doc/](doc/) directory.
1474
1475 By default `make install` installs example configuration files in
1476 `/usr/local/etc/icinga2` unless you have specified a different prefix or
1477 sysconfdir.
1478
1479
1480 ### Windows Builds <a id="development-package-builds-windows"></a>
1481
1482 The Windows MSI packages are located at https://packages.icinga.com/windows/
1483
1484 #### Requirements <a id="development-package-builds-windows-requirements"></a>
1485
1486 * 32 or 64-bit system
1487 * Visual Studio >= 14 2015
1488 * CMake >= 2.6
1489 * OpenSSL >= 1.0.1
1490 * Flex and Bison
1491
1492 ##### Visual Studio
1493
1494 Download the community edition from [visualstudio.com](https://www.visualstudio.com/en/downloads/)
1495
1496 Workloads to install:
1497 * C++ Desktop
1498 * .NET Desktop
1499
1500 ##### OpenSSL for Icinga
1501
1502 Download custom OpenSSL builds from [openssl-windows GitHub project](https://github.com/Icinga/openssl-windows/releases).
1503
1504 You need to install a binary dist version to 'C:\\Program Files\\OpenSSL'.
1505
1506 The Powershell script `.\tools\win32\download-openssl.ps1` can be used for automated downloads.
1507
1508 ##### Chocolatey
1509
1510 A simple package manager for Windows, please see [install instructions](https://chocolatey.org/install).
1511
1512 ##### Git
1513
1514 Use Chocolatey, see [package details](https://chocolatey.org/packages/git).
1515
1516 ```
1517 choco install git
1518 ```
1519
1520 ##### Flex / Bison
1521
1522 Use Chocolatey, see [package details](https://chocolatey.org/packages/winflexbison3).
1523
1524 ```
1525 choco install winflexbison3
1526 ```
1527
1528 ##### CMake
1529
1530 Use Chocolatey, see [package details](https://chocolatey.org/packages/cmake)
1531 or download from: [cmake.org](https://cmake.org/download/)
1532
1533 ```
1534 choco install cmake
1535 ```
1536
1537 ##### WIX
1538
1539 Use Chocolatey, see [package details](https://chocolatey.org/packages/wixtoolset).
1540
1541 ```
1542 choco install wixtoolset
1543 ```
1544
1545 ##### Boost
1546
1547 Download third party Windows binaries from: [boost.org](http://www.boost.org/users/download/)
1548
1549 For example: `https://dl.bintray.com/boostorg/release/1.65.1/binaries/boost_1_65_1-msvc-14.1-64.exe`
1550
1551 *Warning:*
1552 * Must match your Visual Studio version!
1553 * CMake might not support the latest Boost version (we used CMake 3.10 and Boost 1_65_1)
1554
1555 Run the installer exe.
1556
1557
1558 #### Build Icinga 2
1559
1560 Run with VC Native x64 Command Prompt:
1561
1562 ```
1563 powershell .\tools\win32\configure.ps1
1564 powershell .\tools\win32\build.ps1
1565 powershell .\tools\win32\test.ps1
1566 ```
1567
1568 See these scripts for details.
1569
1570 #### CI: AppVeyor
1571
1572 We are building [Icinga 2 with AppVeyor](https://ci.appveyor.com/project/icinga/icinga2) for testing and CI integration.
1573
1574 Please check `appveyor.yml` for instructions.
1575
1576
1577
1578 ## Advanced Development Tips <a id="development-advanced"></a>
1579
1580 ### GDB Pretty Printers <a id="development-advanced-gdb-pretty-printer"></a>
1581
1582 Install the `boost`, `python` and `icinga2` pretty printers. Absolute paths are required,
1583 so please make sure to update the installation paths accordingly (`pwd`).
1584
1585 ```
1586 $ mkdir -p ~/.gdb_printers && cd ~/.gdb_printers
1587 ```
1588
1589 Boost Pretty Printers compatible with Python 3:
1590
1591 ```
1592 $ git clone https://github.com/mateidavid/Boost-Pretty-Printer.git && cd Boost-Pretty-Printer
1593 $ git checkout python-3
1594 $ pwd
1595 /home/michi/.gdb_printers/Boost-Pretty-Printer
1596 ```
1597
1598 Python Pretty Printers:
1599
1600 ```
1601 $ cd ~/.gdb_printers
1602 $ svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc++-v3/python
1603 ```
1604
1605 Icinga 2 Pretty Printers:
1606
1607 ```
1608 $ mkdir -p ~/.gdb_printers/icinga2 && cd ~/.gdb_printers/icinga2
1609 $ wget https://raw.githubusercontent.com/Icinga/icinga2/master/tools/debug/gdb/icingadbg.py
1610 ```
1611
1612 Now you'll need to modify/setup your `~/.gdbinit` configuration file.
1613 You can download the one from Icinga 2 and modify all paths.
1614
1615 Example on Fedora 22:
1616
1617 ```
1618 $ wget https://raw.githubusercontent.com/Icinga/icinga2/master/tools/debug/gdb/gdbinit -O ~/.gdbinit
1619 $ vim ~/.gdbinit
1620
1621 set print pretty on
1622
1623 python
1624 import sys
1625 sys.path.insert(0, '/home/michi/.gdb_printers/icinga2')
1626 from icingadbg import register_icinga_printers
1627 register_icinga_printers()
1628 end
1629
1630 python
1631 import sys
1632 sys.path.insert(0, '/home/michi/.gdb_printers/python')
1633 from libstdcxx.v6.printers import register_libstdcxx_printers
1634 try:
1635     register_libstdcxx_printers(None)
1636 except:
1637     pass
1638 end
1639
1640 python
1641 import sys
1642 sys.path.insert(0, '/home/michi/.gdb_printers/Boost-Pretty-Printer')
1643 import boost_print
1644 boost_print.register_printers()
1645 end
1646 ```
1647
1648 If you are getting the following error when running gdb, the `libstdcxx`
1649 printers are already preloaded in your environment and you can remove
1650 the duplicate import in your `~/.gdbinit` file.
1651
1652 ```
1653 RuntimeError: pretty-printer already registered: libstdc++-v6
1654 ```
1655
1656 ## Development Tests <a id="development-tests"></a>
1657
1658 Build the binaries and run the tests.
1659
1660
1661 ```
1662 make -j4 -C debug
1663 make test -C debug
1664 ```
1665
1666 Run a specific boost test:
1667
1668 ```
1669 debug/Bin/Debug/boosttest-test-base --run_test=remote_url
1670 ```
1671