From 56ae875861ab260b80a030f50c4aff9f9dc8fff0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 13:32:39 +0200 Subject: Adding upstream version 2.14.2. Signed-off-by: Daniel Baumann --- etc/CMakeLists.txt | 69 +++++++ etc/bash_completion.d/icinga2 | 17 ++ etc/icinga2/conf.d/app.conf | 1 + etc/icinga2/conf.d/commands.conf | 196 ++++++++++++++++++++ etc/icinga2/conf.d/downtimes.conf | 20 +++ etc/icinga2/conf.d/groups.conf | 37 ++++ etc/icinga2/conf.d/hosts.conf | 52 ++++++ etc/icinga2/conf.d/notifications.conf | 33 ++++ etc/icinga2/conf.d/services.conf | 117 ++++++++++++ etc/icinga2/conf.d/templates.conf | 83 +++++++++ etc/icinga2/conf.d/timeperiods.conf | 35 ++++ etc/icinga2/conf.d/users.conf | 17 ++ etc/icinga2/conf.d/win32/hosts.conf | 43 +++++ etc/icinga2/conf.d/win32/services.conf | 92 ++++++++++ etc/icinga2/constants.conf.cmake | 28 +++ etc/icinga2/features-available/api.conf | 10 ++ etc/icinga2/features-available/checker.conf | 5 + etc/icinga2/features-available/command.conf | 7 + etc/icinga2/features-available/compatlog.conf | 7 + etc/icinga2/features-available/debuglog.conf | 10 ++ etc/icinga2/features-available/elasticsearch.conf | 8 + etc/icinga2/features-available/gelf.conf | 10 ++ etc/icinga2/features-available/graphite.conf | 9 + etc/icinga2/features-available/icingadb.conf | 5 + etc/icinga2/features-available/ido-mysql.conf | 11 ++ etc/icinga2/features-available/ido-pgsql.conf | 11 ++ etc/icinga2/features-available/influxdb.conf | 25 +++ etc/icinga2/features-available/influxdb2.conf | 27 +++ etc/icinga2/features-available/journald.conf | 7 + etc/icinga2/features-available/livestatus.conf | 6 + etc/icinga2/features-available/mainlog.conf | 8 + etc/icinga2/features-available/notification.conf | 5 + etc/icinga2/features-available/opentsdb.conf | 25 +++ etc/icinga2/features-available/perfdata.conf | 6 + etc/icinga2/features-available/syslog.conf | 8 + .../features-available/windowseventlog.conf | 8 + etc/icinga2/features-enabled/checker.conf | 1 + etc/icinga2/features-enabled/notification.conf | 1 + etc/icinga2/features-enabled/windowseventlog.conf | 1 + etc/icinga2/icinga2.conf | 57 ++++++ etc/icinga2/scripts/mail-host-notification.sh | 177 ++++++++++++++++++ etc/icinga2/scripts/mail-service-notification.sh | 190 ++++++++++++++++++++ etc/icinga2/win32/constants.conf | 28 +++ etc/icinga2/win32/icinga2.conf | 55 ++++++ etc/icinga2/zones.conf | 63 +++++++ etc/icinga2/zones.d/README | 2 + etc/initsystem/CMakeLists.txt | 44 +++++ etc/initsystem/icinga2.init.d.cmake | 198 +++++++++++++++++++++ etc/initsystem/icinga2.service.cmake | 30 ++++ etc/initsystem/icinga2.service.limits.conf | 9 + etc/initsystem/icinga2.sysconfig.cmake | 15 ++ etc/initsystem/prepare-dirs.cmake | 52 ++++++ etc/initsystem/safe-reload.cmake | 52 ++++++ etc/logrotate.d/icinga2.cmake | 21 +++ 54 files changed, 2054 insertions(+) create mode 100644 etc/CMakeLists.txt create mode 100644 etc/bash_completion.d/icinga2 create mode 100644 etc/icinga2/conf.d/app.conf create mode 100644 etc/icinga2/conf.d/commands.conf create mode 100644 etc/icinga2/conf.d/downtimes.conf create mode 100644 etc/icinga2/conf.d/groups.conf create mode 100644 etc/icinga2/conf.d/hosts.conf create mode 100644 etc/icinga2/conf.d/notifications.conf create mode 100644 etc/icinga2/conf.d/services.conf create mode 100644 etc/icinga2/conf.d/templates.conf create mode 100644 etc/icinga2/conf.d/timeperiods.conf create mode 100644 etc/icinga2/conf.d/users.conf create mode 100644 etc/icinga2/conf.d/win32/hosts.conf create mode 100644 etc/icinga2/conf.d/win32/services.conf create mode 100644 etc/icinga2/constants.conf.cmake create mode 100644 etc/icinga2/features-available/api.conf create mode 100644 etc/icinga2/features-available/checker.conf create mode 100644 etc/icinga2/features-available/command.conf create mode 100644 etc/icinga2/features-available/compatlog.conf create mode 100644 etc/icinga2/features-available/debuglog.conf create mode 100644 etc/icinga2/features-available/elasticsearch.conf create mode 100644 etc/icinga2/features-available/gelf.conf create mode 100644 etc/icinga2/features-available/graphite.conf create mode 100644 etc/icinga2/features-available/icingadb.conf create mode 100644 etc/icinga2/features-available/ido-mysql.conf create mode 100644 etc/icinga2/features-available/ido-pgsql.conf create mode 100644 etc/icinga2/features-available/influxdb.conf create mode 100644 etc/icinga2/features-available/influxdb2.conf create mode 100644 etc/icinga2/features-available/journald.conf create mode 100644 etc/icinga2/features-available/livestatus.conf create mode 100644 etc/icinga2/features-available/mainlog.conf create mode 100644 etc/icinga2/features-available/notification.conf create mode 100644 etc/icinga2/features-available/opentsdb.conf create mode 100644 etc/icinga2/features-available/perfdata.conf create mode 100644 etc/icinga2/features-available/syslog.conf create mode 100644 etc/icinga2/features-available/windowseventlog.conf create mode 100644 etc/icinga2/features-enabled/checker.conf create mode 100644 etc/icinga2/features-enabled/notification.conf create mode 100644 etc/icinga2/features-enabled/windowseventlog.conf create mode 100644 etc/icinga2/icinga2.conf create mode 100755 etc/icinga2/scripts/mail-host-notification.sh create mode 100755 etc/icinga2/scripts/mail-service-notification.sh create mode 100644 etc/icinga2/win32/constants.conf create mode 100644 etc/icinga2/win32/icinga2.conf create mode 100644 etc/icinga2/zones.conf create mode 100644 etc/icinga2/zones.d/README create mode 100644 etc/initsystem/CMakeLists.txt create mode 100644 etc/initsystem/icinga2.init.d.cmake create mode 100644 etc/initsystem/icinga2.service.cmake create mode 100644 etc/initsystem/icinga2.service.limits.conf create mode 100644 etc/initsystem/icinga2.sysconfig.cmake create mode 100644 etc/initsystem/prepare-dirs.cmake create mode 100644 etc/initsystem/safe-reload.cmake create mode 100644 etc/logrotate.d/icinga2.cmake (limited to 'etc') diff --git a/etc/CMakeLists.txt b/etc/CMakeLists.txt new file mode 100644 index 0000000..40e181a --- /dev/null +++ b/etc/CMakeLists.txt @@ -0,0 +1,69 @@ +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ + +if(NOT WIN32) + configure_file(icinga2/constants.conf.cmake ${CMAKE_CURRENT_BINARY_DIR}/icinga2/constants.conf @ONLY) +endif() + +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + configure_file(logrotate.d/icinga2.cmake ${CMAKE_CURRENT_BINARY_DIR}/logrotate.d/icinga2 @ONLY) +endif() + +if(NOT WIN32) + install_if_not_exists(${CMAKE_CURRENT_BINARY_DIR}/icinga2/constants.conf ${ICINGA2_CONFIGDIR}) + install_if_not_exists(icinga2/icinga2.conf ${ICINGA2_CONFIGDIR}) +else() + install_if_not_exists(${CMAKE_CURRENT_SOURCE_DIR}/icinga2/win32/constants.conf ${ICINGA2_CONFIGDIR}) + install_if_not_exists(icinga2/win32/icinga2.conf ${ICINGA2_CONFIGDIR}) +endif() + +install_if_not_exists(icinga2/zones.conf ${ICINGA2_CONFIGDIR}) +install_if_not_exists(icinga2/conf.d/app.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/commands.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/downtimes.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/groups.conf ${ICINGA2_CONFIGDIR}/conf.d) + +if(NOT WIN32) + install_if_not_exists(icinga2/conf.d/hosts.conf ${ICINGA2_CONFIGDIR}/conf.d) + install_if_not_exists(icinga2/conf.d/services.conf ${ICINGA2_CONFIGDIR}/conf.d) +else() + install_if_not_exists(icinga2/conf.d/win32/hosts.conf ${ICINGA2_CONFIGDIR}/conf.d) + install_if_not_exists(icinga2/conf.d/win32/services.conf ${ICINGA2_CONFIGDIR}/conf.d) +endif() + +install_if_not_exists(icinga2/conf.d/notifications.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/templates.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/timeperiods.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/conf.d/users.conf ${ICINGA2_CONFIGDIR}/conf.d) +install_if_not_exists(icinga2/features-available/api.conf ${ICINGA2_CONFIGDIR}/features-available) +install_if_not_exists(icinga2/features-available/debuglog.conf ${ICINGA2_CONFIGDIR}/features-available) +install_if_not_exists(icinga2/features-available/mainlog.conf ${ICINGA2_CONFIGDIR}/features-available) +if(NOT WIN32) + install_if_not_exists(icinga2/features-available/syslog.conf ${ICINGA2_CONFIGDIR}/features-available) + if(HAVE_SYSTEMD) + install_if_not_exists(icinga2/features-available/journald.conf ${ICINGA2_CONFIGDIR}/features-available) + endif() +else() + install_if_not_exists(icinga2/features-available/windowseventlog.conf ${ICINGA2_CONFIGDIR}/features-available) +endif() +install_if_not_exists(icinga2/scripts/mail-host-notification.sh ${ICINGA2_CONFIGDIR}/scripts) +install_if_not_exists(icinga2/scripts/mail-service-notification.sh ${ICINGA2_CONFIGDIR}/scripts) +install_if_not_exists(icinga2/zones.d/README ${ICINGA2_CONFIGDIR}/zones.d) + +if(${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + install_if_not_exists(${CMAKE_CURRENT_BINARY_DIR}/logrotate.d/icinga2 ${LOGROTATE_DIR}) +endif() + +if(NOT WIN32) + install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled\")") + install(CODE "execute_process(COMMAND \"${CMAKE_COMMAND}\" -E create_symlink ../features-available/mainlog.conf \"\$ENV{DESTDIR}${ICINGA2_FULL_CONFIGDIR}/features-enabled/mainlog.conf\")") + + install(FILES bash_completion.d/icinga2 DESTINATION ${BASHCOMPLETION_DIR}) +else() + install_if_not_exists(icinga2/features-enabled/windowseventlog.conf ${ICINGA2_CONFIGDIR}/features-enabled) +endif() + +if(${CMAKE_SYSTEM_NAME} MATCHES "(Linux|Solaris|SunOS)") + add_subdirectory(initsystem) +endif() + +set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "${CPACK_NSIS_EXTRA_INSTALL_COMMANDS}" PARENT_SCOPE) diff --git a/etc/bash_completion.d/icinga2 b/etc/bash_completion.d/icinga2 new file mode 100644 index 0000000..5c49ab0 --- /dev/null +++ b/etc/bash_completion.d/icinga2 @@ -0,0 +1,17 @@ +_icinga2() +{ + local cur opts + opts="${COMP_WORDS[*]}" + cur="${COMP_WORDS[COMP_CWORD]}" + COMPREPLY=($(icinga2 --autocomplete $COMP_CWORD ${COMP_WORDS[*]} < /dev/null)) + case $COMPREPLY in + */|*=) + compopt -o nospace + ;; + esac + + return 0 +} + +complete -F _icinga2 icinga2 + diff --git a/etc/icinga2/conf.d/app.conf b/etc/icinga2/conf.d/app.conf new file mode 100644 index 0000000..3e4be0d --- /dev/null +++ b/etc/icinga2/conf.d/app.conf @@ -0,0 +1 @@ +object IcingaApplication "app" { } diff --git a/etc/icinga2/conf.d/commands.conf b/etc/icinga2/conf.d/commands.conf new file mode 100644 index 0000000..e7d555c --- /dev/null +++ b/etc/icinga2/conf.d/commands.conf @@ -0,0 +1,196 @@ +/* Command objects */ + +/* Notification Commands + * + * Please check the documentation for all required and + * optional parameters. + */ + +object NotificationCommand "mail-host-notification" { + command = [ ConfigDir + "/scripts/mail-host-notification.sh" ] + + arguments += { + "-4" = "$notification_address$" + "-6" = "$notification_address6$" + "-b" = "$notification_author$" + "-c" = "$notification_comment$" + "-d" = { + required = true + value = "$notification_date$" + } + "-f" = { + value = "$notification_from$" + description = "Set from address. Requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)" + } + "-i" = "$notification_icingaweb2url$" + "-l" = { + required = true + value = "$notification_hostname$" + } + "-n" = { + required = true + value = "$notification_hostdisplayname$" + } + "-o" = { + required = true + value = "$notification_hostoutput$" + } + "-r" = { + required = true + value = "$notification_useremail$" + } + "-s" = { + required = true + value = "$notification_hoststate$" + } + "-X" = "$notification_hostnotes$" + "-t" = { + required = true + value = "$notification_type$" + } + "-v" = "$notification_logtosyslog$" + } + + vars += { + notification_address = "$address$" + notification_address6 = "$address6$" + notification_author = "$notification.author$" + notification_comment = "$notification.comment$" + notification_type = "$notification.type$" + notification_date = "$icinga.long_date_time$" + notification_hostname = "$host.name$" + notification_hostdisplayname = "$host.display_name$" + notification_hostoutput = "$host.output$" + notification_hoststate = "$host.state$" + notification_useremail = "$user.email$" + notification_hostnotes = "$host.notes$" + } +} + +object NotificationCommand "mail-service-notification" { + command = [ ConfigDir + "/scripts/mail-service-notification.sh" ] + + arguments += { + "-4" = "$notification_address$" + "-6" = "$notification_address6$" + "-b" = "$notification_author$" + "-c" = "$notification_comment$" + "-d" = { + required = true + value = "$notification_date$" + } + "-e" = { + required = true + value = "$notification_servicename$" + } + "-f" = { + value = "$notification_from$" + description = "Set from address. Requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)" + } + "-i" = "$notification_icingaweb2url$" + "-l" = { + required = true + value = "$notification_hostname$" + } + "-n" = { + required = true + value = "$notification_hostdisplayname$" + } + "-o" = { + required = true + value = "$notification_serviceoutput$" + } + "-r" = { + required = true + value = "$notification_useremail$" + } + "-s" = { + required = true + value = "$notification_servicestate$" + } + "-t" = { + required = true + value = "$notification_type$" + } + "-X" = "$notification_hostnotes$" + "-x" = "$notification_servicenotes$" + "-u" = { + required = true + value = "$notification_servicedisplayname$" + } + "-v" = "$notification_logtosyslog$" + } + + vars += { + notification_address = "$address$" + notification_address6 = "$address6$" + notification_author = "$notification.author$" + notification_comment = "$notification.comment$" + notification_type = "$notification.type$" + notification_date = "$icinga.long_date_time$" + notification_hostname = "$host.name$" + notification_hostdisplayname = "$host.display_name$" + notification_servicename = "$service.name$" + notification_serviceoutput = "$service.output$" + notification_servicestate = "$service.state$" + notification_useremail = "$user.email$" + notification_servicedisplayname = "$service.display_name$" + notification_hostnotes = "$host.notes$" + notification_servicenotes = "$service.notes$" + } +} + +/* + * If you prefer to use the notification scripts with environment + * variables instead of command line parameters, you can use + * the following commands. They have been updated from < 2.7 + * to support the new notification scripts and should help + * with an upgrade. + * Remove the comment blocks and comment the notification commands above. + */ + +/* + +object NotificationCommand "mail-host-notification" { + command = [ ConfigDir + "/scripts/mail-host-notification.sh" ] + + env = { + NOTIFICATIONTYPE = "$notification.type$" + HOSTDISPLAYNAME = "$host.display_name$" + HOSTNAME = "$host.name$" + HOSTADDRESS = "$address$" + HOSTSTATE = "$host.state$" + LONGDATETIME = "$icinga.long_date_time$" + HOSTOUTPUT = "$host.output$" + NOTIFICATIONAUTHORNAME = "$notification.author$" + NOTIFICATIONCOMMENT = "$notification.comment$" + HOSTDISPLAYNAME = "$host.display_name$" + USEREMAIL = "$user.email$" + HOSTNOTES = "$host.notes$" + } +} + +object NotificationCommand "mail-service-notification" { + command = [ ConfigDir + "/scripts/mail-service-notification.sh" ] + + env = { + NOTIFICATIONTYPE = "$notification.type$" + SERVICENAME = "$service.name$" + HOSTNAME = "$host.name$" + HOSTDISPLAYNAME = "$host.display_name$" + HOSTADDRESS = "$address$" + SERVICESTATE = "$service.state$" + LONGDATETIME = "$icinga.long_date_time$" + SERVICEOUTPUT = "$service.output$" + NOTIFICATIONAUTHORNAME = "$notification.author$" + NOTIFICATIONCOMMENT = "$notification.comment$" + HOSTDISPLAYNAME = "$host.display_name$" + SERVICEDISPLAYNAME = "$service.display_name$" + USEREMAIL = "$user.email$" + HOSTNOTES = "$host.notes$" + SERVICENOTES = "$service.notes$" + } +} + +*/ + diff --git a/etc/icinga2/conf.d/downtimes.conf b/etc/icinga2/conf.d/downtimes.conf new file mode 100644 index 0000000..0bed647 --- /dev/null +++ b/etc/icinga2/conf.d/downtimes.conf @@ -0,0 +1,20 @@ +/** + * The example downtime apply rule. + */ + +apply ScheduledDowntime "backup-downtime" to Service { + author = "icingaadmin" + comment = "Scheduled downtime for backup" + + ranges = { + monday = service.vars.backup_downtime + tuesday = service.vars.backup_downtime + wednesday = service.vars.backup_downtime + thursday = service.vars.backup_downtime + friday = service.vars.backup_downtime + saturday = service.vars.backup_downtime + sunday = service.vars.backup_downtime + } + + assign where service.vars.backup_downtime != "" +} diff --git a/etc/icinga2/conf.d/groups.conf b/etc/icinga2/conf.d/groups.conf new file mode 100644 index 0000000..e6004a3 --- /dev/null +++ b/etc/icinga2/conf.d/groups.conf @@ -0,0 +1,37 @@ +/** + * Host group examples. + */ + +object HostGroup "linux-servers" { + display_name = "Linux Servers" + + assign where host.vars.os == "Linux" +} + +object HostGroup "windows-servers" { + display_name = "Windows Servers" + + assign where host.vars.os == "Windows" +} + +/** + * Service group examples. + */ + +object ServiceGroup "ping" { + display_name = "Ping Checks" + + assign where match("ping*", service.name) +} + +object ServiceGroup "http" { + display_name = "HTTP Checks" + + assign where match("http*", service.check_command) +} + +object ServiceGroup "disk" { + display_name = "Disk Checks" + + assign where match("disk*", service.check_command) +} diff --git a/etc/icinga2/conf.d/hosts.conf b/etc/icinga2/conf.d/hosts.conf new file mode 100644 index 0000000..e54d01d --- /dev/null +++ b/etc/icinga2/conf.d/hosts.conf @@ -0,0 +1,52 @@ +/* + * Host definitions with object attributes + * used for apply rules for Service, Notification, + * Dependency and ScheduledDowntime objects. + * + * Tip: Use `icinga2 object list --type Host` to + * list all host objects after running + * configuration validation (`icinga2 daemon -C`). + */ + +/* + * This is an example host based on your + * local host's FQDN. Specify the NodeName + * constant in `constants.conf` or use your + * own description, e.g. "db-host-1". + */ + +object Host NodeName { + /* Import the default host template defined in `templates.conf`. */ + import "generic-host" + + /* Specify the address attributes for checks e.g. `ssh` or `http`. */ + address = "127.0.0.1" + address6 = "::1" + + /* Set custom variable `os` for hostgroup assignment in `groups.conf`. */ + vars.os = "Linux" + + /* Define http vhost attributes for service apply rules in `services.conf`. */ + vars.http_vhosts["http"] = { + http_uri = "/" + } + /* Uncomment if you've successfully installed Icinga Web 2. */ + //vars.http_vhosts["Icinga Web 2"] = { + // http_uri = "/icingaweb2" + //} + + /* Define disks and attributes for service apply rules in `services.conf`. */ + vars.disks["disk"] = { + /* No parameters. */ + } + vars.disks["disk /"] = { + disk_partitions = "/" + } + + /* Define notification mail attributes for notification apply rules in `notifications.conf`. */ + vars.notification["mail"] = { + /* The UserGroup `icingaadmins` is defined in `users.conf`. */ + groups = [ "icingaadmins" ] + } +} + diff --git a/etc/icinga2/conf.d/notifications.conf b/etc/icinga2/conf.d/notifications.conf new file mode 100644 index 0000000..ac65875 --- /dev/null +++ b/etc/icinga2/conf.d/notifications.conf @@ -0,0 +1,33 @@ +/** + * The example notification apply rules. + * + * Only applied if host/service objects have + * the custom variable `notification` defined + * and containing `mail` as key. + * + * Check `hosts.conf` for an example. + */ + +apply Notification "mail-icingaadmin" to Host { + import "mail-host-notification" + user_groups = host.vars.notification.mail.groups + users = host.vars.notification.mail.users + + //interval = 2h + + //vars.notification_logtosyslog = true + + assign where host.vars.notification.mail +} + +apply Notification "mail-icingaadmin" to Service { + import "mail-service-notification" + user_groups = host.vars.notification.mail.groups + users = host.vars.notification.mail.users + + //interval = 2h + + //vars.notification_logtosyslog = true + + assign where host.vars.notification.mail +} diff --git a/etc/icinga2/conf.d/services.conf b/etc/icinga2/conf.d/services.conf new file mode 100644 index 0000000..c8e1b3c --- /dev/null +++ b/etc/icinga2/conf.d/services.conf @@ -0,0 +1,117 @@ +/* + * Service apply rules. + * + * The CheckCommand objects `ping4`, `ping6`, etc + * are provided by the plugin check command templates. + * Check the documentation for details. + * + * Tip: Use `icinga2 object list --type Service` to + * list all service objects after running + * configuration validation (`icinga2 daemon -C`). + */ + +/* + * This is an example host based on your + * local host's FQDN. Specify the NodeName + * constant in `constants.conf` or use your + * own description, e.g. "db-host-1". + */ + +/* + * These are generic `ping4` and `ping6` + * checks applied to all hosts having the + * `address` resp. `address6` attribute + * defined. + */ +apply Service "ping4" { + import "generic-service" + + check_command = "ping4" + + assign where host.address +} + +apply Service "ping6" { + import "generic-service" + + check_command = "ping6" + + assign where host.address6 +} + +/* + * Apply the `ssh` service to all hosts + * with the `address` attribute defined and + * the custom variable `os` set to `Linux`. + */ +apply Service "ssh" { + import "generic-service" + + check_command = "ssh" + + assign where (host.address || host.address6) && host.vars.os == "Linux" +} + + + +apply Service for (http_vhost => config in host.vars.http_vhosts) { + import "generic-service" + + check_command = "http" + + vars += config +} + +apply Service for (disk => config in host.vars.disks) { + import "generic-service" + + check_command = "disk" + + vars += config +} + +apply Service "icinga" { + import "generic-service" + + check_command = "icinga" + + assign where host.name == NodeName +} + +apply Service "load" { + import "generic-service" + + check_command = "load" + + /* Used by the ScheduledDowntime apply rule in `downtimes.conf`. */ + vars.backup_downtime = "02:00-03:00" + + assign where host.name == NodeName +} + +apply Service "procs" { + import "generic-service" + + check_command = "procs" + + assign where host.name == NodeName +} + +apply Service "swap" { + import "generic-service" + + check_command = "swap" + + assign where host.name == NodeName +} + +apply Service "users" { + import "generic-service" + + check_command = "users" + + assign where host.name == NodeName +} + + + diff --git a/etc/icinga2/conf.d/templates.conf b/etc/icinga2/conf.d/templates.conf new file mode 100644 index 0000000..5655e3f --- /dev/null +++ b/etc/icinga2/conf.d/templates.conf @@ -0,0 +1,83 @@ +/* + * Generic template examples. + */ + + +/** + * Provides default settings for hosts. By convention + * all hosts should import this template. + * + * The CheckCommand object `hostalive` is provided by + * the plugin check command templates. + * Check the documentation for details. + */ +template Host "generic-host" { + max_check_attempts = 3 + check_interval = 1m + retry_interval = 30s + + check_command = "hostalive" +} + +/** + * Provides default settings for services. By convention + * all services should import this template. + */ +template Service "generic-service" { + max_check_attempts = 5 + check_interval = 1m + retry_interval = 30s +} + +/** + * Provides default settings for users. By convention + * all users should inherit from this template. + */ + +template User "generic-user" { + +} + +/** + * Provides default settings for host notifications. + * By convention all host notifications should import + * this template. + */ +template Notification "mail-host-notification" { + command = "mail-host-notification" + + states = [ Up, Down ] + types = [ Problem, Acknowledgement, Recovery, Custom, + FlappingStart, FlappingEnd, + DowntimeStart, DowntimeEnd, DowntimeRemoved ] + + vars += { + // notification_icingaweb2url = "https://www.example.com/icingaweb2" + // notification_from = "Icinga 2 Host Monitoring " + notification_logtosyslog = false + } + + period = "24x7" +} + +/** + * Provides default settings for service notifications. + * By convention all service notifications should import + * this template. + */ +template Notification "mail-service-notification" { + command = "mail-service-notification" + + states = [ OK, Warning, Critical, Unknown ] + types = [ Problem, Acknowledgement, Recovery, Custom, + FlappingStart, FlappingEnd, + DowntimeStart, DowntimeEnd, DowntimeRemoved ] + + vars += { + // notification_icingaweb2url = "https://www.example.com/icingaweb2" + // notification_from = "Icinga 2 Service Monitoring " + notification_logtosyslog = false + } + + period = "24x7" +} diff --git a/etc/icinga2/conf.d/timeperiods.conf b/etc/icinga2/conf.d/timeperiods.conf new file mode 100644 index 0000000..ea162ff --- /dev/null +++ b/etc/icinga2/conf.d/timeperiods.conf @@ -0,0 +1,35 @@ +/** + * Sample timeperiods for Icinga 2. + * Check the documentation for details. + */ + +object TimePeriod "24x7" { + display_name = "Icinga 2 24x7 TimePeriod" + ranges = { + "monday" = "00:00-24:00" + "tuesday" = "00:00-24:00" + "wednesday" = "00:00-24:00" + "thursday" = "00:00-24:00" + "friday" = "00:00-24:00" + "saturday" = "00:00-24:00" + "sunday" = "00:00-24:00" + } +} + +object TimePeriod "9to5" { + display_name = "Icinga 2 9to5 TimePeriod" + ranges = { + "monday" = "09:00-17:00" + "tuesday" = "09:00-17:00" + "wednesday" = "09:00-17:00" + "thursday" = "09:00-17:00" + "friday" = "09:00-17:00" + } +} + +object TimePeriod "never" { + display_name = "Icinga 2 never TimePeriod" + ranges = { + } +} + diff --git a/etc/icinga2/conf.d/users.conf b/etc/icinga2/conf.d/users.conf new file mode 100644 index 0000000..515ef21 --- /dev/null +++ b/etc/icinga2/conf.d/users.conf @@ -0,0 +1,17 @@ +/** + * The example user 'icingaadmin' and the example + * group 'icingaadmins'. + */ + +object User "icingaadmin" { + import "generic-user" + + display_name = "Icinga 2 Admin" + groups = [ "icingaadmins" ] + + email = "icinga@localhost" +} + +object UserGroup "icingaadmins" { + display_name = "Icinga 2 Admin Group" +} diff --git a/etc/icinga2/conf.d/win32/hosts.conf b/etc/icinga2/conf.d/win32/hosts.conf new file mode 100644 index 0000000..ecee11a --- /dev/null +++ b/etc/icinga2/conf.d/win32/hosts.conf @@ -0,0 +1,43 @@ +/* + * Host definitions with object attributes + * used for apply rules for Service, Notification, + * Dependency and ScheduledDowntime objects. + * + * Tip: Use `icinga2 object list --type Host` to + * list all host objects after running + * configuration validation (`icinga2 daemon -C`). + */ + +/* + * This is an example host based on your + * local host's FQDN. Specify the NodeName + * constant in `constants.conf` or use your + * own description, e.g. "db-host-1". + */ + +object Host NodeName { + /* Import the default host template defined in `templates.conf`. */ + import "generic-host" + + /* Specify the address attributes for checks e.g. `ssh` or `http`. */ + address = "127.0.0.1" + address6 = "::1" + + /* Set custom variable `os` for hostgroup assignment in `groups.conf`. */ + vars.os = "Windows" + + /* Define disks and attributes for service apply rules in `services.conf`. */ + vars.disks["disk"] = { + /* No parameters. */ + } + vars.disks["disk C:"] = { + disk_win_path = "C:" + } + + /* Define notification mail attributes for notification apply rules in `notifications.conf`. */ + vars.notification["mail"] = { + /* The UserGroup `icingaadmins` is defined in `users.conf`. */ + groups = [ "icingaadmins" ] + } +} + diff --git a/etc/icinga2/conf.d/win32/services.conf b/etc/icinga2/conf.d/win32/services.conf new file mode 100644 index 0000000..929be54 --- /dev/null +++ b/etc/icinga2/conf.d/win32/services.conf @@ -0,0 +1,92 @@ +/* + * Service apply rules. + * + * The CheckCommand objects `ping4`, `ping6`, etc + * are provided by the plugin check command templates. + * Check the documentation for details. + * + * Tip: Use `icinga2 object list --type Service` to + * list all service objects after running + * configuration validation (`icinga2 daemon -C`). + */ + +/* + * This is an example host based on your + * local host's FQDN. Specify the NodeName + * constant in `constants.conf` or use your + * own description, e.g. "db-host-1". + */ + +/* + * These are generic `ping4` and `ping6` + * checks applied to all hosts having the + * `address` resp. `address6` attribute + * defined. + */ +apply Service "ping4" { + import "generic-service" + + check_command = "ping4-windows" + + assign where host.address +} + +apply Service "ping6" { + import "generic-service" + + check_command = "ping6-windows" + + assign where host.address6 +} + +apply Service for (disk => config in host.vars.disks) { + import "generic-service" + + check_command = "disk-windows" + + vars += config +} + +apply Service "icinga" { + import "generic-service" + + check_command = "icinga" + + assign where host.name == NodeName +} + +apply Service "load" { + import "generic-service" + + check_command = "load-windows" + + /* Used by the ScheduledDowntime apply rule in `downtimes.conf`. */ + vars.backup_downtime = "02:00-03:00" + + assign where host.name == NodeName +} + +apply Service "procs" { + import "generic-service" + + check_command = "procs-windows" + + assign where host.name == NodeName +} + +apply Service "swap" { + import "generic-service" + + check_command = "swap-windows" + + assign where host.name == NodeName +} + +apply Service "users" { + import "generic-service" + + check_command = "users-windows" + + assign where host.name == NodeName +} + diff --git a/etc/icinga2/constants.conf.cmake b/etc/icinga2/constants.conf.cmake new file mode 100644 index 0000000..1dae310 --- /dev/null +++ b/etc/icinga2/constants.conf.cmake @@ -0,0 +1,28 @@ +/** + * This file defines global constants which can be used in + * the other configuration files. + */ + +/* The directory which contains the plugins from the Monitoring Plugins project. */ +const PluginDir = "@ICINGA2_PLUGINDIR@" + +/* The directory which contains the Manubulon plugins. + * Check the documentation, chapter "SNMP Manubulon Plugin Check Commands", for details. + */ +const ManubulonPluginDir = "@ICINGA2_PLUGINDIR@" + +/* The directory which you use to store additional plugins which ITL provides user contributed command definitions for. + * Check the documentation, chapter "Plugins Contribution", for details. + */ +const PluginContribDir = "@ICINGA2_PLUGINDIR@" + +/* Our local instance name. By default this is the server's hostname as returned by `hostname --fqdn`. + * This should be the common name from the API certificate. + */ +//const NodeName = "localhost" + +/* Our local zone name. */ +const ZoneName = NodeName + +/* Secret key for remote node tickets */ +const TicketSalt = "" diff --git a/etc/icinga2/features-available/api.conf b/etc/icinga2/features-available/api.conf new file mode 100644 index 0000000..b072a44 --- /dev/null +++ b/etc/icinga2/features-available/api.conf @@ -0,0 +1,10 @@ +/** + * The API listener is used for distributed monitoring setups. + */ + +object ApiListener "api" { + //accept_config = false + //accept_commands = false + + ticket_salt = TicketSalt +} diff --git a/etc/icinga2/features-available/checker.conf b/etc/icinga2/features-available/checker.conf new file mode 100644 index 0000000..6f003b8 --- /dev/null +++ b/etc/icinga2/features-available/checker.conf @@ -0,0 +1,5 @@ +/** + * The checker component takes care of executing service checks. + */ + +object CheckerComponent "checker" { } diff --git a/etc/icinga2/features-available/command.conf b/etc/icinga2/features-available/command.conf new file mode 100644 index 0000000..ffdd143 --- /dev/null +++ b/etc/icinga2/features-available/command.conf @@ -0,0 +1,7 @@ +/** + * The ExternalCommandListener implements support for the external + * commands pipe. + */ + +object ExternalCommandListener "command" { } + diff --git a/etc/icinga2/features-available/compatlog.conf b/etc/icinga2/features-available/compatlog.conf new file mode 100644 index 0000000..6f5cf5f --- /dev/null +++ b/etc/icinga2/features-available/compatlog.conf @@ -0,0 +1,7 @@ +/** + * The CompatLogger type is responsible for writing log files in a format + * that is compatible with Icinga 1.x. + */ + +object CompatLogger "compatlog" { } + diff --git a/etc/icinga2/features-available/debuglog.conf b/etc/icinga2/features-available/debuglog.conf new file mode 100644 index 0000000..e66518f --- /dev/null +++ b/etc/icinga2/features-available/debuglog.conf @@ -0,0 +1,10 @@ +/** + * The FileLogger type writes log information to a log file. + * Unlike the mainlog feature this sets up a logger + * with severity "debug". + */ + +object FileLogger "debug-file" { + severity = "debug" + path = LogDir + "/debug.log" +} diff --git a/etc/icinga2/features-available/elasticsearch.conf b/etc/icinga2/features-available/elasticsearch.conf new file mode 100644 index 0000000..8014913 --- /dev/null +++ b/etc/icinga2/features-available/elasticsearch.conf @@ -0,0 +1,8 @@ +object ElasticsearchWriter "elasticsearch" { + //host = "127.0.0.1" + //port = 9200 + //index = "icinga2" + //enable_send_perfdata = false + //flush_threshold = 1024 + //flush_interval = 10s +} diff --git a/etc/icinga2/features-available/gelf.conf b/etc/icinga2/features-available/gelf.conf new file mode 100644 index 0000000..c14c864 --- /dev/null +++ b/etc/icinga2/features-available/gelf.conf @@ -0,0 +1,10 @@ +/** + * The GelfWriter type writes event log entries + * to a GELF tcp socket provided by Graylog, + * Logstash or any other receiver. + */ + +object GelfWriter "gelf" { + //host = "127.0.0.1" + //port = 12201 +} diff --git a/etc/icinga2/features-available/graphite.conf b/etc/icinga2/features-available/graphite.conf new file mode 100644 index 0000000..ae8a928 --- /dev/null +++ b/etc/icinga2/features-available/graphite.conf @@ -0,0 +1,9 @@ +/** + * The GraphiteWriter type writes check result metrics and + * performance data to a graphite tcp socket. + */ + +object GraphiteWriter "graphite" { + //host = "127.0.0.1" + //port = 2003 +} diff --git a/etc/icinga2/features-available/icingadb.conf b/etc/icinga2/features-available/icingadb.conf new file mode 100644 index 0000000..9951c83 --- /dev/null +++ b/etc/icinga2/features-available/icingadb.conf @@ -0,0 +1,5 @@ +object IcingaDB "icingadb" { + //host = "127.0.0.1" + //port = 6380 + //password = "xxx" +} diff --git a/etc/icinga2/features-available/ido-mysql.conf b/etc/icinga2/features-available/ido-mysql.conf new file mode 100644 index 0000000..7b44c23 --- /dev/null +++ b/etc/icinga2/features-available/ido-mysql.conf @@ -0,0 +1,11 @@ +/** + * The IdoMysqlConnection type implements MySQL support + * for DB IDO. + */ + +object IdoMysqlConnection "ido-mysql" { + //user = "icinga" + //password = "icinga" + //host = "localhost" + //database = "icinga" +} diff --git a/etc/icinga2/features-available/ido-pgsql.conf b/etc/icinga2/features-available/ido-pgsql.conf new file mode 100644 index 0000000..9f3c132 --- /dev/null +++ b/etc/icinga2/features-available/ido-pgsql.conf @@ -0,0 +1,11 @@ +/** + * The IdoPgsqlConnection type implements PostgreSQL support + * for DB IDO. + */ + +object IdoPgsqlConnection "ido-pgsql" { + //user = "icinga" + //password = "icinga" + //host = "localhost" + //database = "icinga" +} diff --git a/etc/icinga2/features-available/influxdb.conf b/etc/icinga2/features-available/influxdb.conf new file mode 100644 index 0000000..f0af37b --- /dev/null +++ b/etc/icinga2/features-available/influxdb.conf @@ -0,0 +1,25 @@ +/** + * The InfluxdbWriter type writes check result metrics and + * performance data to an InfluxDB v1 HTTP API + */ + +object InfluxdbWriter "influxdb" { + //host = "127.0.0.1" + //port = 8086 + //database = "icinga2" + //flush_threshold = 1024 + //flush_interval = 10s + //host_template = { + // measurement = "$host.check_command$" + // tags = { + // hostname = "$host.name$" + // } + //} + //service_template = { + // measurement = "$service.check_command$" + // tags = { + // hostname = "$host.name$" + // service = "$service.name$" + // } + //} +} diff --git a/etc/icinga2/features-available/influxdb2.conf b/etc/icinga2/features-available/influxdb2.conf new file mode 100644 index 0000000..53f7a21 --- /dev/null +++ b/etc/icinga2/features-available/influxdb2.conf @@ -0,0 +1,27 @@ +/** + * The Influxdb2Writer type writes check result metrics and + * performance data to an InfluxDB v2 HTTP API + */ + +object Influxdb2Writer "influxdb2" { + //host = "127.0.0.1" + //port = 8086 + //organization = "monitoring" + //bucket = "icinga2" + //auth_token = "ABCDEvwxyz0189-_" + //flush_threshold = 1024 + //flush_interval = 10s + //host_template = { + // measurement = "$host.check_command$" + // tags = { + // hostname = "$host.name$" + // } + //} + //service_template = { + // measurement = "$service.check_command$" + // tags = { + // hostname = "$host.name$" + // service = "$service.name$" + // } + //} +} diff --git a/etc/icinga2/features-available/journald.conf b/etc/icinga2/features-available/journald.conf new file mode 100644 index 0000000..e0b36f7 --- /dev/null +++ b/etc/icinga2/features-available/journald.conf @@ -0,0 +1,7 @@ +/** + * The JournaldLogger type writes log information to the systemd journal. + */ + +object JournaldLogger "journald" { + severity = "warning" +} diff --git a/etc/icinga2/features-available/livestatus.conf b/etc/icinga2/features-available/livestatus.conf new file mode 100644 index 0000000..246c085 --- /dev/null +++ b/etc/icinga2/features-available/livestatus.conf @@ -0,0 +1,6 @@ +/** + * The LivestatusListener type implements the Livestatus query protocol. + */ + +object LivestatusListener "livestatus" { } + diff --git a/etc/icinga2/features-available/mainlog.conf b/etc/icinga2/features-available/mainlog.conf new file mode 100644 index 0000000..a3bb19d --- /dev/null +++ b/etc/icinga2/features-available/mainlog.conf @@ -0,0 +1,8 @@ +/** + * The FileLogger type writes log information to a file. + */ + +object FileLogger "main-log" { + severity = "information" + path = LogDir + "/icinga2.log" +} diff --git a/etc/icinga2/features-available/notification.conf b/etc/icinga2/features-available/notification.conf new file mode 100644 index 0000000..3f9a88e --- /dev/null +++ b/etc/icinga2/features-available/notification.conf @@ -0,0 +1,5 @@ +/** + * The notification component is responsible for sending notifications. + */ + +object NotificationComponent "notification" { } diff --git a/etc/icinga2/features-available/opentsdb.conf b/etc/icinga2/features-available/opentsdb.conf new file mode 100644 index 0000000..471a622 --- /dev/null +++ b/etc/icinga2/features-available/opentsdb.conf @@ -0,0 +1,25 @@ +/** + * The OpenTsdbWriter type writes check result metrics and + * performance data to a OpenTSDB tcp socket. + */ + +object OpenTsdbWriter "opentsdb" { + //host = "127.0.0.1" + //port = 4242 + //enable_generic_metrics = false + + // Custom Tagging, refer to Icinga object type documentation for + // OpenTsdbWriter + //host_template = { + // metric = "icinga.host" + // tags = { + // zone = "$host.zone$" + // } + //} + //service_template = { + // metric = "icinga.service.$service.check_command$" + // tags = { + // zone = "$service.zone$" + // } + //} +} diff --git a/etc/icinga2/features-available/perfdata.conf b/etc/icinga2/features-available/perfdata.conf new file mode 100644 index 0000000..3ba8635 --- /dev/null +++ b/etc/icinga2/features-available/perfdata.conf @@ -0,0 +1,6 @@ +/** + * The PerfdataWriter type writes performance data files and rotates + * them in a regular interval. + */ + +object PerfdataWriter "perfdata" { } diff --git a/etc/icinga2/features-available/syslog.conf b/etc/icinga2/features-available/syslog.conf new file mode 100644 index 0000000..3b794b4 --- /dev/null +++ b/etc/icinga2/features-available/syslog.conf @@ -0,0 +1,8 @@ +/** + * The SyslogLogger type writes log information to syslog. + */ + +object SyslogLogger "syslog" { + severity = "warning" +} + diff --git a/etc/icinga2/features-available/windowseventlog.conf b/etc/icinga2/features-available/windowseventlog.conf new file mode 100644 index 0000000..8e5c0ae --- /dev/null +++ b/etc/icinga2/features-available/windowseventlog.conf @@ -0,0 +1,8 @@ +/** + * The WindowsEventLogLogger type writes log information to the Windows Event Log. + */ + +object WindowsEventLogLogger "windowseventlog" { + severity = "information" +} + diff --git a/etc/icinga2/features-enabled/checker.conf b/etc/icinga2/features-enabled/checker.conf new file mode 100644 index 0000000..0b39650 --- /dev/null +++ b/etc/icinga2/features-enabled/checker.conf @@ -0,0 +1 @@ +include "../features-available/checker.conf" diff --git a/etc/icinga2/features-enabled/notification.conf b/etc/icinga2/features-enabled/notification.conf new file mode 100644 index 0000000..b549ad4 --- /dev/null +++ b/etc/icinga2/features-enabled/notification.conf @@ -0,0 +1 @@ +include "../features-available/notification.conf" diff --git a/etc/icinga2/features-enabled/windowseventlog.conf b/etc/icinga2/features-enabled/windowseventlog.conf new file mode 100644 index 0000000..8e57873 --- /dev/null +++ b/etc/icinga2/features-enabled/windowseventlog.conf @@ -0,0 +1 @@ +include "../features-available/windowseventlog.conf" diff --git a/etc/icinga2/icinga2.conf b/etc/icinga2/icinga2.conf new file mode 100644 index 0000000..17513a3 --- /dev/null +++ b/etc/icinga2/icinga2.conf @@ -0,0 +1,57 @@ +/** + * Icinga 2 configuration file + * - this is where you define settings for the Icinga application including + * which hosts/services to check. + * + * For an overview of all available configuration options please refer + * to the documentation that is distributed as part of Icinga 2. + */ + +/** + * The constants.conf defines global constants. + */ +include "constants.conf" + +/** + * The zones.conf defines zones for a cluster setup. + * Not required for single instance setups. + */ +include "zones.conf" + +/** + * The Icinga Template Library (ITL) provides a number of useful templates + * and command definitions. + * Common monitoring plugin command definitions are included separately. + */ +include +include +include +include + +/** + * This includes the Icinga 2 Windows plugins. These command definitions + * are required on a master node when a client is used as command endpoint. + */ +include + +/** + * This includes the NSClient++ check commands. These command definitions + * are required on a master node when a client is used as command endpoint. + */ +include + +/** + * The features-available directory contains a number of configuration + * files for features which can be enabled and disabled using the + * icinga2 feature enable / icinga2 feature disable CLI commands. + * These commands work by creating and removing symbolic links in + * the features-enabled directory. + */ +include "features-enabled/*.conf" + +/** + * Although in theory you could define all your objects in this file + * the preferred way is to create separate directories and files in the conf.d + * directory. Each of these files must have the file extension ".conf". + */ +include_recursive "conf.d" diff --git a/etc/icinga2/scripts/mail-host-notification.sh b/etc/icinga2/scripts/mail-host-notification.sh new file mode 100755 index 0000000..70d3b50 --- /dev/null +++ b/etc/icinga2/scripts/mail-host-notification.sh @@ -0,0 +1,177 @@ +#!/usr/bin/env bash +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ +# Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license + +PROG="`basename $0`" +ICINGA2HOST="`hostname`" +MAILBIN="mail" + +if [ -z "`which $MAILBIN`" ] ; then + echo "$MAILBIN not found in \$PATH. Consider installing it." + exit 1 +fi + +## Function helpers +Usage() { +cat << EOF + +Required parameters: + -d LONGDATETIME (\$icinga.long_date_time\$) + -l HOSTNAME (\$host.name\$) + -n HOSTDISPLAYNAME (\$host.display_name\$) + -o HOSTOUTPUT (\$host.output\$) + -r USEREMAIL (\$user.email\$) + -s HOSTSTATE (\$host.state\$) + -t NOTIFICATIONTYPE (\$notification.type\$) + +Optional parameters: + -4 HOSTADDRESS (\$address\$) + -6 HOSTADDRESS6 (\$address6\$) + -X HOSTNOTES (\$host.notes\$) + -b NOTIFICATIONAUTHORNAME (\$notification.author\$) + -c NOTIFICATIONCOMMENT (\$notification.comment\$) + -i ICINGAWEB2URL (\$notification_icingaweb2url\$, Default: unset) + -f MAILFROM (\$notification_mailfrom\$, requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)) + -v (\$notification_sendtosyslog\$, Default: false) + +EOF +} + +Help() { + Usage; + exit 0; +} + +Error() { + if [ "$1" ]; then + echo $1 + fi + Usage; + exit 1; +} + +urlencode() { + local LANG=C i=0 c e s="$1" + + while [ $i -lt ${#1} ]; do + [ "$i" -eq 0 ] || s="${s#?}" + c=${s%"${s#?}"} + [ -z "${c#[[:alnum:].~_-]}" ] || c=$(printf '%%%02X' "'$c") + e="${e}${c}" + i=$((i + 1)) + done + echo "$e" +} + +## Main +while getopts 4:6::b:c:d:f:hi:l:n:o:r:s:t:v:X: opt +do + case "$opt" in + 4) HOSTADDRESS=$OPTARG ;; + 6) HOSTADDRESS6=$OPTARG ;; + b) NOTIFICATIONAUTHORNAME=$OPTARG ;; + c) NOTIFICATIONCOMMENT=$OPTARG ;; + d) LONGDATETIME=$OPTARG ;; # required + f) MAILFROM=$OPTARG ;; + h) Help ;; + i) ICINGAWEB2URL=$OPTARG ;; + l) HOSTNAME=$OPTARG ;; # required + n) HOSTDISPLAYNAME=$OPTARG ;; # required + o) HOSTOUTPUT=$OPTARG ;; # required + X) HOSTNOTES=$OPTARG ;; + r) USEREMAIL=$OPTARG ;; # required + s) HOSTSTATE=$OPTARG ;; # required + t) NOTIFICATIONTYPE=$OPTARG ;; # required + v) VERBOSE=$OPTARG ;; + \?) echo "ERROR: Invalid option -$OPTARG" >&2 + Error ;; + :) echo "Missing option argument for -$OPTARG" >&2 + Error ;; + *) echo "Unimplemented option: -$OPTARG" >&2 + Error ;; + esac +done + +shift $((OPTIND - 1)) + +## Keep formatting in sync with mail-service-notification.sh +for P in LONGDATETIME HOSTNAME HOSTDISPLAYNAME HOSTOUTPUT HOSTSTATE USEREMAIL NOTIFICATIONTYPE ; do + eval "PAR=\$${P}" + + if [ ! "$PAR" ] ; then + Error "Required parameter '$P' is missing." + fi +done + +## Build the message's subject +SUBJECT="[$NOTIFICATIONTYPE] Host $HOSTDISPLAYNAME is $HOSTSTATE!" + +## Build the notification message +NOTIFICATION_MESSAGE=`cat << EOF +***** Host Monitoring on $ICINGA2HOST ***** + +$HOSTDISPLAYNAME is $HOSTSTATE! + +Info: $HOSTOUTPUT + +When: $LONGDATETIME +Host: $HOSTNAME +EOF +` + +## Check whether IPv4 was specified. +if [ -n "$HOSTADDRESS" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +IPv4: $HOSTADDRESS" +fi + +## Check whether IPv6 was specified. +if [ -n "$HOSTADDRESS6" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +IPv6: $HOSTADDRESS6" +fi + +## Check whether host notes was specified. +if [ -n "$HOSTNOTES" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +Host notes: $HOSTNOTES" +fi + +## Check whether author and comment was specified. +if [ -n "$NOTIFICATIONCOMMENT" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE + +Comment by $NOTIFICATIONAUTHORNAME: + $NOTIFICATIONCOMMENT" +fi + +## Check whether Icinga Web 2 URL was specified. +if [ -n "$ICINGAWEB2URL" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE + +$ICINGAWEB2URL/icingadb/host?name=$(urlencode "$HOSTNAME")" +fi + +## Check whether verbose mode was enabled and log to syslog. +if [ "$VERBOSE" = "true" ] ; then + logger "$PROG sends $SUBJECT => $USEREMAIL" +fi + +## Send the mail using the $MAILBIN command. +## If an explicit sender was specified, try to set it. +if [ -n "$MAILFROM" ] ; then + + ## Modify this for your own needs! + + ## Debian/Ubuntu use mailutils which requires `-a` to append the header + if [ -f /etc/debian_version ]; then + /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -a "From: $MAILFROM" -s "$SUBJECT" $USEREMAIL + ## Other distributions (RHEL/SUSE/etc.) prefer mailx which sets a sender address with `-r` + else + /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -r "$MAILFROM" -s "$SUBJECT" $USEREMAIL + fi + +else + /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" \ + | $MAILBIN -s "$SUBJECT" $USEREMAIL +fi diff --git a/etc/icinga2/scripts/mail-service-notification.sh b/etc/icinga2/scripts/mail-service-notification.sh new file mode 100755 index 0000000..31d9137 --- /dev/null +++ b/etc/icinga2/scripts/mail-service-notification.sh @@ -0,0 +1,190 @@ +#!/usr/bin/env bash +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ +# Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license + +PROG="`basename $0`" +ICINGA2HOST="`hostname`" +MAILBIN="mail" + +if [ -z "`which $MAILBIN`" ] ; then + echo "$MAILBIN not found in \$PATH. Consider installing it." + exit 1 +fi + +## Function helpers +Usage() { +cat << EOF + +Required parameters: + -d LONGDATETIME (\$icinga.long_date_time\$) + -e SERVICENAME (\$service.name\$) + -l HOSTNAME (\$host.name\$) + -n HOSTDISPLAYNAME (\$host.display_name\$) + -o SERVICEOUTPUT (\$service.output\$) + -r USEREMAIL (\$user.email\$) + -s SERVICESTATE (\$service.state\$) + -t NOTIFICATIONTYPE (\$notification.type\$) + -u SERVICEDISPLAYNAME (\$service.display_name\$) + +Optional parameters: + -4 HOSTADDRESS (\$address\$) + -6 HOSTADDRESS6 (\$address6\$) + -X HOSTNOTES (\$host.notes\$) + -x SERVICENOTES (\$service.notes\$) + -b NOTIFICATIONAUTHORNAME (\$notification.author\$) + -c NOTIFICATIONCOMMENT (\$notification.comment\$) + -i ICINGAWEB2URL (\$notification_icingaweb2url\$, Default: unset) + -f MAILFROM (\$notification_mailfrom\$, requires GNU mailutils (Debian/Ubuntu) or mailx (RHEL/SUSE)) + -v (\$notification_sendtosyslog\$, Default: false) + +EOF +} + +Help() { + Usage; + exit 0; +} + +Error() { + if [ "$1" ]; then + echo $1 + fi + Usage; + exit 1; +} + +urlencode() { + local LANG=C i=0 c e s="$1" + + while [ $i -lt ${#1} ]; do + [ "$i" -eq 0 ] || s="${s#?}" + c=${s%"${s#?}"} + [ -z "${c#[[:alnum:].~_-]}" ] || c=$(printf '%%%02X' "'$c") + e="${e}${c}" + i=$((i + 1)) + done + echo "$e" +} + +## Main +while getopts 4:6:b:c:d:e:f:hi:l:n:o:r:s:t:u:v:X:x: opt +do + case "$opt" in + 4) HOSTADDRESS=$OPTARG ;; + 6) HOSTADDRESS6=$OPTARG ;; + b) NOTIFICATIONAUTHORNAME=$OPTARG ;; + c) NOTIFICATIONCOMMENT=$OPTARG ;; + d) LONGDATETIME=$OPTARG ;; # required + e) SERVICENAME=$OPTARG ;; # required + f) MAILFROM=$OPTARG ;; + h) Usage ;; + i) ICINGAWEB2URL=$OPTARG ;; + l) HOSTNAME=$OPTARG ;; # required + n) HOSTDISPLAYNAME=$OPTARG ;; # required + X) HOSTNOTES=$OPTARG ;; + x) SERVICENOTES=$OPTARG ;; + o) SERVICEOUTPUT=$OPTARG ;; # required + r) USEREMAIL=$OPTARG ;; # required + s) SERVICESTATE=$OPTARG ;; # required + t) NOTIFICATIONTYPE=$OPTARG ;; # required + u) SERVICEDISPLAYNAME=$OPTARG ;; # required + v) VERBOSE=$OPTARG ;; + \?) echo "ERROR: Invalid option -$OPTARG" >&2 + Usage ;; + :) echo "Missing option argument for -$OPTARG" >&2 + Usage ;; + *) echo "Unimplemented option: -$OPTARG" >&2 + Usage ;; + esac +done + +shift $((OPTIND - 1)) + +## Keep formatting in sync with mail-host-notification.sh +for P in LONGDATETIME HOSTNAME HOSTDISPLAYNAME SERVICENAME SERVICEDISPLAYNAME SERVICEOUTPUT SERVICESTATE USEREMAIL NOTIFICATIONTYPE ; do + eval "PAR=\$${P}" + + if [ ! "$PAR" ] ; then + Error "Required parameter '$P' is missing." + fi +done + +## Build the message's subject +SUBJECT="[$NOTIFICATIONTYPE] $SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE!" + +## Build the notification message +NOTIFICATION_MESSAGE=`cat << EOF +***** Service Monitoring on $ICINGA2HOST ***** + +$SERVICEDISPLAYNAME on $HOSTDISPLAYNAME is $SERVICESTATE! + +Info: $SERVICEOUTPUT + +When: $LONGDATETIME +Service: $SERVICENAME +Host: $HOSTNAME +EOF +` + +## Check whether IPv4 was specified. +if [ -n "$HOSTADDRESS" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +IPv4: $HOSTADDRESS" +fi + +## Check whether IPv6 was specified. +if [ -n "$HOSTADDRESS6" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +IPv6: $HOSTADDRESS6" +fi + +## Check whether host notes was specified. +if [ -n "$HOSTNOTES" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +Host notes: $HOSTNOTES" +fi + +## Check whether service notes was specified. +if [ -n "$SERVICENOTES" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE +Service notes: $SERVICENOTES" +fi + +## Check whether author and comment was specified. +if [ -n "$NOTIFICATIONCOMMENT" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE + +Comment by $NOTIFICATIONAUTHORNAME: + $NOTIFICATIONCOMMENT" +fi + +## Check whether Icinga Web 2 URL was specified. +if [ -n "$ICINGAWEB2URL" ] ; then + NOTIFICATION_MESSAGE="$NOTIFICATION_MESSAGE + +$ICINGAWEB2URL/icingadb/service?name=$(urlencode "$SERVICENAME")&host.name=$(urlencode "$HOSTNAME")" +fi + +## Check whether verbose mode was enabled and log to syslog. +if [ "$VERBOSE" = "true" ] ; then + logger "$PROG sends $SUBJECT => $USEREMAIL" +fi + +## Send the mail using the $MAILBIN command. +## If an explicit sender was specified, try to set it. +if [ -n "$MAILFROM" ] ; then + + ## Modify this for your own needs! + + ## Debian/Ubuntu use mailutils which requires `-a` to append the header + if [ -f /etc/debian_version ]; then + /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -a "From: $MAILFROM" -s "$SUBJECT" $USEREMAIL + ## Other distributions (RHEL/SUSE/etc.) prefer mailx which sets a sender address with `-r` + else + /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" | $MAILBIN -r "$MAILFROM" -s "$SUBJECT" $USEREMAIL + fi + +else + /usr/bin/printf "%b" "$NOTIFICATION_MESSAGE" \ + | $MAILBIN -s "$SUBJECT" $USEREMAIL +fi diff --git a/etc/icinga2/win32/constants.conf b/etc/icinga2/win32/constants.conf new file mode 100644 index 0000000..f793d1d --- /dev/null +++ b/etc/icinga2/win32/constants.conf @@ -0,0 +1,28 @@ +/** + * This file defines global constants which can be used in + * the other configuration files. + */ + +/* The directory which contains the plugins from the Monitoring Plugins project. */ +const PluginDir = PrefixDir + "/sbin" + +/* The directory which contains the Manubulon plugins. + * Check the documentation, chapter "SNMP Manubulon Plugin Check Commands", for details. + */ +const ManubulonPluginDir = PrefixDir + "/sbin" + +/* The directory which you use to store additional plugins which ITL provides user contributed command definitions for. + * Check the documentation, chapter "Plugins Contribution", for details. + */ +const PluginContribDir = PrefixDir + "/sbin" + +/* Our local instance name. By default this is the server's hostname as returned by `hostname --fqdn`. + * This should be the common name from the API certificate. + */ +//const NodeName = "localhost" + +/* Our local zone name. */ +const ZoneName = NodeName + +/* Secret key for remote node tickets */ +const TicketSalt = "" diff --git a/etc/icinga2/win32/icinga2.conf b/etc/icinga2/win32/icinga2.conf new file mode 100644 index 0000000..cc47c41 --- /dev/null +++ b/etc/icinga2/win32/icinga2.conf @@ -0,0 +1,55 @@ +/** + * Icinga 2 configuration file + * - this is where you define settings for the Icinga application including + * which hosts/services to check. + * + * For an overview of all available configuration options please refer + * to the documentation that is distributed as part of Icinga 2. + */ + +/** + * The constants.conf defines global constants. + */ +include "constants.conf" + +/** + * The zones.conf defines zones for a cluster setup. + * Not required for single instance setups. + */ +include "zones.conf" + +/** + * The Icinga Template Library (ITL) provides a number of useful templates + * and command definitions. + * Common monitoring plugin command definitions are included separately. + */ +include +include +include +include + +/** + * This includes the Icinga 2 Windows plugins. + */ +include + +/** + * This includes the NSClient++ check commands. + */ +include + +/** + * The features-available directory contains a number of configuration + * files for features which can be enabled and disabled using the + * icinga2 feature enable / icinga2 feature disable CLI commands. + * These commands work by creating and removing symbolic links in + * the features-enabled directory. + */ +include "features-enabled/*.conf" + +/** + * Although in theory you could define all your objects in this file + * the preferred way is to create separate directories and files in the conf.d + * directory. Each of these files must have the file extension ".conf". + */ +include_recursive "conf.d" diff --git a/etc/icinga2/zones.conf b/etc/icinga2/zones.conf new file mode 100644 index 0000000..70ac766 --- /dev/null +++ b/etc/icinga2/zones.conf @@ -0,0 +1,63 @@ +/* + * Endpoint and Zone configuration for a cluster setup + * This local example requires `NodeName` defined in + * constants.conf. + */ + +object Endpoint NodeName { + host = NodeName +} + +object Zone ZoneName { + endpoints = [ NodeName ] +} + +/* + * Defines a global zone for distributed setups with masters, + * satellites and clients. + * This is required to sync configuration commands, + * templates, apply rules, etc. to satellite and clients. + * All nodes require the same configuration and must + * have `accept_config` enabled in the `api` feature. + */ + +object Zone "global-templates" { + global = true +} + +/* + * Defines a global zone for the Icinga Director. + * This is required to sync configuration commands, + * templates, apply rules, etc. to satellite and clients. + * All nodes require the same configuration and must + * have `accept_config` enabled in the `api` feature. + */ + +object Zone "director-global" { + global = true +} + +/* + * Read the documentation on how to configure + * a cluster setup with multiple zones. + */ + +/* +object Endpoint "master.example.org" { + host = "master.example.org" +} + +object Endpoint "satellite.example.org" { + host = "satellite.example.org" +} + +object Zone "master" { + endpoints = [ "master.example.org" ] +} + +object Zone "satellite" { + parent = "master" + endpoints = [ "satellite.example.org" ] +} +*/ + diff --git a/etc/icinga2/zones.d/README b/etc/icinga2/zones.d/README new file mode 100644 index 0000000..e378eae --- /dev/null +++ b/etc/icinga2/zones.d/README @@ -0,0 +1,2 @@ +Please check the documentation for more details: +https://icinga.com/docs/icinga2/latest/doc/06-distributed-monitoring/ diff --git a/etc/initsystem/CMakeLists.txt b/etc/initsystem/CMakeLists.txt new file mode 100644 index 0000000..eb0f9f2 --- /dev/null +++ b/etc/initsystem/CMakeLists.txt @@ -0,0 +1,44 @@ +# Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ + + +if(NOT WIN32) + configure_file(icinga2.sysconfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/initsystem/icinga2.sysconfig @ONLY) + get_filename_component(ICINGA2_SYSCONFIGFILE_NAME ${ICINGA2_SYSCONFIGFILE} NAME) + get_filename_component(ICINGA2_SYSCONFIGFILE_DIR ${ICINGA2_SYSCONFIGFILE} PATH) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/initsystem/icinga2.sysconfig + DESTINATION ${ICINGA2_SYSCONFIGFILE_DIR} + RENAME ${ICINGA2_SYSCONFIGFILE_NAME} + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ + ) + + configure_file(prepare-dirs.cmake ${CMAKE_CURRENT_BINARY_DIR}/initsystem/prepare-dirs @ONLY) + configure_file(safe-reload.cmake ${CMAKE_CURRENT_BINARY_DIR}/initsystem/safe-reload @ONLY) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/initsystem/prepare-dirs ${CMAKE_CURRENT_BINARY_DIR}/initsystem/safe-reload + DESTINATION ${CMAKE_INSTALL_PREFIX}/lib/icinga2 + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + ) + + # required for packaging on Gentoo, see Bug #6498 + option (INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT + "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" OFF) + + if (NOT USE_SYSTEMD OR INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT) + configure_file(icinga2.init.d.cmake ${CMAKE_CURRENT_BINARY_DIR}/initsystem/icinga2 @ONLY) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/initsystem/icinga2 + DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/init.d + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + ) + endif() + + if (USE_SYSTEMD OR INSTALL_SYSTEMD_SERVICE_AND_INITSCRIPT) + configure_file(icinga2.service.cmake ${CMAKE_CURRENT_BINARY_DIR}/initsystem/icinga2.service @ONLY) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/initsystem/icinga2.service + DESTINATION ${DESTDIR}/usr/lib/systemd/system + PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ + ) + endif() +endif() diff --git a/etc/initsystem/icinga2.init.d.cmake b/etc/initsystem/icinga2.init.d.cmake new file mode 100644 index 0000000..56588a7 --- /dev/null +++ b/etc/initsystem/icinga2.init.d.cmake @@ -0,0 +1,198 @@ +#!/bin/sh +# +# chkconfig: 35 90 12 +# description: Icinga 2 +# +### BEGIN INIT INFO +# Provides: icinga2 +# Required-Start: $remote_fs $syslog $network +# Required-Stop: $remote_fs $syslog $network +# Should-Start: mysql postgresql +# Should-Stop: mysql postgresql +# Default-Start: 2 3 5 +# Default-Stop: 0 1 6 +# Short-Description: icinga2 host/service/network monitoring and management system +# Description: Icinga 2 is a monitoring and management system for hosts, services and networks. +### END INIT INFO + +# Get function from functions library +if [ -f /etc/rc.d/init.d/functions ]; then + . /etc/rc.d/init.d/functions +elif [ -f /etc/init.d/functions ]; then + . /etc/init.d/functions +fi + +# load system specific defines +SYSCONFIGFILE=@ICINGA2_SYSCONFIGFILE@ +if [ -f "$SYSCONFIGFILE" ]; then + . "$SYSCONFIGFILE" +else + echo "Couldn't load system specific defines from $SYSCONFIGFILE. Using defaults." +fi + +# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" + +: "${ICINGA2_USER:="@ICINGA2_USER@"}" +: "${ICINGA2_GROUP:="@ICINGA2_GROUP@"}" +: "${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"}" +: "${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"}" +: "${ICINGA2_CONFIG_FILE:="@ICINGA2_CONFIGDIR@/icinga2.conf"}" +: "${ICINGA2_ERROR_LOG:=@ICINGA2_LOGDIR@/error.log}" +: "${ICINGA2_STARTUP_LOG:=@ICINGA2_LOGDIR@/startup.log}" +: "${ICINGA2_PID_FILE:="@ICINGA2_INITRUNDIR@/icinga2.pid"}" + +# Load extra environment variables +if [ -f /etc/default/icinga2 ]; then + . /etc/default/icinga2 +fi + +test -x "$DAEMON" || exit 5 + +if [ ! -e "$ICINGA2_CONFIG_FILE" ]; then + echo "Config file '$ICINGA2_CONFIG_FILE' does not exist." + exit 6 +fi + +if ! getent passwd "$ICINGA2_USER" >/dev/null 2>&1; then + echo "Icinga user '$ICINGA2_USER' does not exist. Exiting." + exit 6 +fi + +if ! getent group "$ICINGA2_GROUP" >/dev/null 2>&1; then + echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting." + exit 6 +fi + +if ! getent group "$ICINGA2_COMMAND_GROUP" >/dev/null 2>&1; then + echo "Icinga command group '$ICINGA2_COMMAND_GROUP' does not exist. Exiting." + exit 6 +fi + +# Start Icinga 2 +start() { + printf "Starting Icinga 2: " + @CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs "$SYSCONFIGFILE" + + if ! "$DAEMON" daemon -c "$ICINGA2_CONFIG_FILE" -d -e "$ICINGA2_ERROR_LOG" > "$ICINGA2_STARTUP_LOG" 2>&1; then + echo "Error starting Icinga. Check '$ICINGA2_STARTUP_LOG' for details." + exit 1 + else + echo "Done" + fi +} + +# Restart Icinga 2 +stop() { + printf "Stopping Icinga 2: " + + if [ ! -e "$ICINGA2_PID_FILE" ]; then + echo "The PID file '$ICINGA2_PID_FILE' does not exist." + if [ "x$1" = "xnofail" ]; then + return + else + exit 7 + fi + fi + + pid=`cat "$ICINGA2_PID_FILE"` + + if icinga2 internal signal -s SIGINT -p "$pid" >/dev/null 2>&1; then + for i in 1 2 3 4 5 6 7 8 9 10; do + if ! icinga2 internal signal -s SIGCHLD -p "$pid" >/dev/null 2>&1; then + break + fi + + printf '.' + sleep 3 + done + fi + + if icinga2 internal signal -s SIGCHLD -p "$pid" >/dev/null 2>&1; then + icinga2 internal signal -s SIGKILL -p "$pid" >/dev/null 2>&1 + fi + + echo "Done" +} + +# Reload Icinga 2 +reload() { + exec @CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload "$SYSCONFIGFILE" +} + +# Check the Icinga 2 configuration +checkconfig() { + printf "Checking configuration: " + + if ! "$DAEMON" daemon -c "$ICINGA2_CONFIG_FILE" -C > "$ICINGA2_STARTUP_LOG" 2>&1; then + if [ "x$1" = "x" ]; then + cat "$ICINGA2_STARTUP_LOG" + echo "Icinga 2 detected configuration errors. Check '$ICINGA2_STARTUP_LOG' for details." + exit 1 + else + echo "Not ${1}ing Icinga 2 due to configuration errors. Check '$ICINGA2_STARTUP_LOG' for details." + if [ "x$2" = "xfail" ]; then + exit 1 + fi + fi + fi + + echo "Done" + # no arguments requires full output + if [ "x$1" = "x" ]; then + cat "$ICINGA2_STARTUP_LOG" + fi +} + +# Print status for Icinga 2 +status() { + printf "Icinga 2 status: " + + if [ ! -e "$ICINGA2_PID_FILE" ]; then + echo "Not running" + exit 3 + fi + + pid=`cat "$ICINGA2_PID_FILE"` + if icinga2 internal signal -s SIGCHLD -p "$pid" >/dev/null 2>&1; then + echo "Running" + else + echo "Not running" + exit 3 + fi +} + +### main logic ### +case "$1" in + start) + checkconfig start fail + start + ;; + stop) + stop + ;; + status) + status + ;; + restart) + checkconfig restart fail + stop nofail + start + ;; + condrestart) + status > /dev/null 2>&1 || exit 0 + checkconfig restart fail + stop nofail + start + ;; + reload) + reload + ;; + checkconfig) + checkconfig + ;; + *) + echo "Usage: $0 {start|stop|restart|reload|checkconfig|status}" + exit 3 +esac + +exit 0 diff --git a/etc/initsystem/icinga2.service.cmake b/etc/initsystem/icinga2.service.cmake new file mode 100644 index 0000000..ca85930 --- /dev/null +++ b/etc/initsystem/icinga2.service.cmake @@ -0,0 +1,30 @@ +[Unit] +Description=Icinga host/service/network monitoring system +Requires=network-online.target +After=syslog.target network-online.target icingadb-redis.service postgresql.service mariadb.service carbon-cache.service carbon-relay.service + +[Service] +Type=notify +NotifyAccess=all +Environment="ICINGA2_ERROR_LOG=@ICINGA2_LOGDIR@/error.log" +EnvironmentFile=@ICINGA2_SYSCONFIGFILE@ +ExecStartPre=@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs @ICINGA2_SYSCONFIGFILE@ +ExecStart=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 daemon --close-stdio -e ${ICINGA2_ERROR_LOG} +PIDFile=@ICINGA2_INITRUNDIR@/icinga2.pid +ExecReload=@CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload @ICINGA2_SYSCONFIGFILE@ +TimeoutStartSec=30m +KillMode=mixed + +# Systemd >228 enforces a lower process number for services. +# Depending on the distribution and Systemd version, this must +# be explicitly raised. Packages will set the needed values +# into /etc/systemd/system/icinga2.service.d/limits.conf +# +# Please check the troubleshooting documentation for further details. +# The values below can be used as examples for customized service files. + +#TasksMax=infinity +#LimitNPROC=62883 + +[Install] +WantedBy=multi-user.target diff --git a/etc/initsystem/icinga2.service.limits.conf b/etc/initsystem/icinga2.service.limits.conf new file mode 100644 index 0000000..dea0cde --- /dev/null +++ b/etc/initsystem/icinga2.service.limits.conf @@ -0,0 +1,9 @@ +# Icinga 2 sets Systemd default values to extend OS defaults. +# +# Please check the troubleshooting documentation for further details. + +[Service] +TasksMax=infinity + +# Uncomment this setting in case of further problems. +#LimitNPROC=62883 diff --git a/etc/initsystem/icinga2.sysconfig.cmake b/etc/initsystem/icinga2.sysconfig.cmake new file mode 100644 index 0000000..167c125 --- /dev/null +++ b/etc/initsystem/icinga2.sysconfig.cmake @@ -0,0 +1,15 @@ +#This is the default environment Icinga 2 runs with. +#Make your changes here. + +#DAEMON=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2 +#ICINGA2_CONFIG_FILE=@ICINGA2_CONFIGDIR@/icinga2.conf +#ICINGA2_INIT_RUN_DIR=@ICINGA2_INITRUNDIR@ +#ICINGA2_PID_FILE=@ICINGA2_INITRUNDIR@/icinga2.pid +#ICINGA2_LOG_DIR=@ICINGA2_LOGDIR@ +#ICINGA2_ERROR_LOG=@ICINGA2_LOGDIR@/error.log +#ICINGA2_STARTUP_LOG=@ICINGA2_LOGDIR@/startup.log +#ICINGA2_LOG=@ICINGA2_LOGDIR@/icinga2.log +#ICINGA2_CACHE_DIR=@ICINGA2_CACHEDIR@ +#ICINGA2_USER=@ICINGA2_USER@ +#ICINGA2_GROUP=@ICINGA2_GROUP@ +#ICINGA2_COMMAND_GROUP=@ICINGA2_COMMAND_GROUP@ diff --git a/etc/initsystem/prepare-dirs.cmake b/etc/initsystem/prepare-dirs.cmake new file mode 100644 index 0000000..0053b90 --- /dev/null +++ b/etc/initsystem/prepare-dirs.cmake @@ -0,0 +1,52 @@ +#!/bin/sh +# +# This script prepares directories and files needed for running Icinga2 +# + +# Load sysconf on systems where the initsystem does not pass the environment +if [ "$1" != "" ]; then + if [ -r "$1" ]; then + . "$1" + else + echo "Unable to read sysconf from '$1'. Exiting." && exit 6 + fi +fi + +# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" + +: "${ICINGA2_USER:="@ICINGA2_USER@"}" +: "${ICINGA2_GROUP:="@ICINGA2_GROUP@"}" +: "${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"}" +: "${ICINGA2_INIT_RUN_DIR:="@ICINGA2_FULL_INITRUNDIR@"}" +: "${ICINGA2_LOG_DIR:="@ICINGA2_FULL_LOGDIR@"}" +: "${ICINGA2_CACHE_DIR:="@ICINGA2_FULL_CACHEDIR@"}" + +if ! getent passwd "$ICINGA2_USER" >/dev/null 2>&1; then + echo "Icinga user '$ICINGA2_USER' does not exist. Exiting." + exit 6 +fi + +if ! getent group "$ICINGA2_GROUP" >/dev/null 2>&1; then + echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting." + exit 6 +fi + +if ! getent group "$ICINGA2_COMMAND_GROUP" >/dev/null 2>&1; then + echo "Icinga command group '$ICINGA2_COMMAND_GROUP' does not exist. Exiting." + exit 6 +fi + +if [ ! -e "$ICINGA2_INIT_RUN_DIR" ]; then + mkdir -m 755 "$ICINGA2_INIT_RUN_DIR" + mkdir -m 2750 "$ICINGA2_INIT_RUN_DIR"/cmd +fi + +chown -R "$ICINGA2_USER:$ICINGA2_COMMAND_GROUP" "$ICINGA2_INIT_RUN_DIR" + +test -e "$ICINGA2_LOG_DIR" || install -m 750 -o "$ICINGA2_USER" -g "$ICINGA2_COMMAND_GROUP" -d "$ICINGA2_LOG_DIR" + +if type restorecon >/dev/null 2>&1; then + restorecon -R "$ICINGA2_INIT_RUN_DIR"/ +fi + +test -e "$ICINGA2_CACHE_DIR" || install -m 750 -o "$ICINGA2_USER" -g "$ICINGA2_COMMAND_GROUP" -d "$ICINGA2_CACHE_DIR" diff --git a/etc/initsystem/safe-reload.cmake b/etc/initsystem/safe-reload.cmake new file mode 100644 index 0000000..0cba415 --- /dev/null +++ b/etc/initsystem/safe-reload.cmake @@ -0,0 +1,52 @@ +#!/bin/sh + +# Load sysconf on systems where the initsystem does not pass the environment +if [ "$1" != "" ]; then + if [ -r "$1" ]; then + . "$1" + else + echo "Unable to read sysconf from '$1'. Exiting." + exit 6 + fi +fi + +# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@" + +: "${ICINGA2_PID_FILE:="@ICINGA2_FULL_INITRUNDIR@/icinga2.pid"}" +: "${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"}" + +printf "Validating config files: " + +OUTPUTFILE=`mktemp` + +if type selinuxenabled >/dev/null 2>&1; then + if selinuxenabled; then + chcon -t icinga2_tmp_t "$OUTPUTFILE" >/dev/null 2>&1 + fi +fi + +if ! "$DAEMON" daemon --validate --color > "$OUTPUTFILE"; then + echo "Failed" + + cat "$OUTPUTFILE" + rm -f "$OUTPUTFILE" + exit 1 +fi + +echo "Done" +rm -f "$OUTPUTFILE" + +printf "Reloading Icinga 2: " + +if [ ! -e "$ICINGA2_PID_FILE" ]; then + exit 7 +fi + +pid=`cat "$ICINGA2_PID_FILE"` +if ! kill -HUP "$pid" >/dev/null 2>&1; then + echo "Error: Icinga not running" + exit 7 +fi + +echo "Done" +exit 0 diff --git a/etc/logrotate.d/icinga2.cmake b/etc/logrotate.d/icinga2.cmake new file mode 100644 index 0000000..f0a9e59 --- /dev/null +++ b/etc/logrotate.d/icinga2.cmake @@ -0,0 +1,21 @@ +@ICINGA2_LOGDIR@/icinga2.log @ICINGA2_LOGDIR@/debug.log { + daily + rotate 7@LOGROTATE_USE_SU@ + compress + delaycompress + missingok + notifempty@LOGROTATE_CREATE@ + postrotate + /bin/kill -USR1 $(cat @ICINGA2_INITRUNDIR@/icinga2.pid 2> /dev/null) 2> /dev/null || true + endscript +} + +@ICINGA2_LOGDIR@/error.log { + daily + rotate 90@LOGROTATE_USE_SU@ + compress + delaycompress + missingok + notifempty@LOGROTATE_CREATE@ + # TODO: figure out how to get Icinga to re-open this log file +} -- cgit v1.2.3