1#!/bin/sh
2#
3# chkconfig: 35 90 12
4# description: Icinga 2
5#
6### BEGIN INIT INFO
7# Provides:          icinga2
8# Required-Start:    $remote_fs $syslog $network
9# Required-Stop:     $remote_fs $syslog $network
10# Should-Start:      mysql postgresql
11# Should-Stop:       mysql postgresql
12# Default-Start:     2 3 5
13# Default-Stop:      0 1 6
14# Short-Description: icinga2 host/service/network monitoring and management system
15# Description:       Icinga 2 is a monitoring and management system for hosts, services and networks.
16### END INIT INFO
17
18# Get function from functions library
19if [ -f /etc/rc.d/init.d/functions ]; then
20	. /etc/rc.d/init.d/functions
21elif [ -f /etc/init.d/functions ]; then
22	. /etc/init.d/functions
23fi
24
25# load system specific defines
26SYSCONFIGFILE=@ICINGA2_SYSCONFIGFILE@
27if [ -f "$SYSCONFIGFILE" ]; then
28	. "$SYSCONFIGFILE"
29else
30	echo "Couldn't load system specific defines from $SYSCONFIGFILE. Using defaults."
31fi
32
33# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@"
34
35: "${ICINGA2_USER:="@ICINGA2_USER@"}"
36: "${ICINGA2_GROUP:="@ICINGA2_GROUP@"}"
37: "${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"}"
38: "${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"}"
39: "${ICINGA2_CONFIG_FILE:="@ICINGA2_CONFIGDIR@/icinga2.conf"}"
40: "${ICINGA2_ERROR_LOG:=@ICINGA2_LOGDIR@/error.log}"
41: "${ICINGA2_STARTUP_LOG:=@ICINGA2_LOGDIR@/startup.log}"
42: "${ICINGA2_PID_FILE:="@ICINGA2_INITRUNDIR@/icinga2.pid"}"
43
44# Load extra environment variables
45if [ -f /etc/default/icinga2 ]; then
46	. /etc/default/icinga2
47fi
48
49test -x "$DAEMON" || exit 5
50
51if [ ! -e "$ICINGA2_CONFIG_FILE" ]; then
52	echo "Config file '$ICINGA2_CONFIG_FILE' does not exist."
53	exit 6
54fi
55
56if ! getent passwd "$ICINGA2_USER" >/dev/null 2>&1; then
57	echo "Icinga user '$ICINGA2_USER' does not exist. Exiting."
58	exit 6
59fi
60
61if ! getent group "$ICINGA2_GROUP" >/dev/null 2>&1; then
62	echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting."
63	exit 6
64fi
65
66if ! getent group "$ICINGA2_COMMAND_GROUP" >/dev/null 2>&1; then
67	echo "Icinga command group '$ICINGA2_COMMAND_GROUP' does not exist. Exiting."
68	exit 6
69fi
70
71# Start Icinga 2
72start() {
73	printf "Starting Icinga 2: "
74	@CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs "$SYSCONFIGFILE"
75
76	if ! "$DAEMON" daemon -c "$ICINGA2_CONFIG_FILE" -d -e "$ICINGA2_ERROR_LOG" > "$ICINGA2_STARTUP_LOG" 2>&1; then
77		echo "Error starting Icinga. Check '$ICINGA2_STARTUP_LOG' for details."
78		exit 1
79	else
80		echo "Done"
81	fi
82}
83
84# Restart Icinga 2
85stop() {
86	printf "Stopping Icinga 2: "
87
88	if [ ! -e "$ICINGA2_PID_FILE" ]; then
89		echo "The PID file '$ICINGA2_PID_FILE' does not exist."
90		if [ "x$1" = "xnofail" ]; then
91			return
92		else
93			exit 7
94		fi
95	fi
96
97	pid=`cat "$ICINGA2_PID_FILE"`
98
99	if icinga2 internal signal -s SIGINT -p "$pid" >/dev/null 2>&1; then
100		for i in 1 2 3 4 5 6 7 8 9 10; do
101		if ! icinga2 internal signal -s SIGCHLD -p "$pid" >/dev/null 2>&1; then
102				break
103			fi
104
105			printf '.'
106			sleep 3
107		done
108	fi
109
110	if icinga2 internal signal -s SIGCHLD -p "$pid" >/dev/null 2>&1; then
111		icinga2 internal signal -s SIGKILL -p "$pid" >/dev/null 2>&1
112	fi
113
114	echo "Done"
115}
116
117# Reload Icinga 2
118reload() {
119	exec @CMAKE_INSTALL_PREFIX@/lib/icinga2/safe-reload "$SYSCONFIGFILE"
120}
121
122# Check the Icinga 2 configuration
123checkconfig() {
124	printf "Checking configuration: "
125
126	if ! "$DAEMON" daemon -c "$ICINGA2_CONFIG_FILE" -C > "$ICINGA2_STARTUP_LOG" 2>&1; then
127		if [ "x$1" = "x" ]; then
128			cat "$ICINGA2_STARTUP_LOG"
129			echo "Icinga 2 detected configuration errors. Check '$ICINGA2_STARTUP_LOG' for details."
130			exit 1
131		else
132			echo "Not ${1}ing Icinga 2 due to configuration errors. Check '$ICINGA2_STARTUP_LOG' for details."
133			if [ "x$2" = "xfail" ]; then
134				exit 1
135			fi
136		fi
137	fi
138
139	echo "Done"
140	# no arguments requires full output
141	if [ "x$1" = "x" ]; then
142		cat "$ICINGA2_STARTUP_LOG"
143	fi
144}
145
146# Print status for Icinga 2
147status() {
148	printf "Icinga 2 status: "
149
150	if [ ! -e "$ICINGA2_PID_FILE" ]; then
151		echo "Not running"
152		exit 3
153	fi
154
155	pid=`cat "$ICINGA2_PID_FILE"`
156	if icinga2 internal signal -s SIGCHLD -p "$pid" >/dev/null 2>&1; then
157		echo "Running"
158	else
159		echo "Not running"
160		exit 3
161	fi
162}
163
164### main logic ###
165case "$1" in
166	start)
167		checkconfig start fail
168		start
169	;;
170	stop)
171		stop
172	;;
173	status)
174		status
175	;;
176	restart)
177		checkconfig restart fail
178		stop nofail
179		start
180	;;
181	condrestart)
182		status > /dev/null 2>&1 || exit 0
183		checkconfig restart fail
184		stop nofail
185		start
186	;;
187	reload)
188		reload
189	;;
190	checkconfig)
191		checkconfig
192	;;
193	*)
194		echo "Usage: $0 {start|stop|restart|reload|checkconfig|status}"
195		exit 3
196esac
197
198exit 0
199