# along with this program; if not, write to the Free Software Foundation
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
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)
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 prepare-dirs safe-reload
+ 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
)
"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)
+ 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
if [ -f $SYSCONFIGFILE ]; then
. $SYSCONFIGFILE
else
- echo "Can't load system specific defines from $SYSCONFIGFILE."
- exit 6
+ echo "Couldn't load system specific defines from $SYSCONFIGFILE. Using defaults."
fi
-test -x $DAEMON || exit 5
+# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@"
-if [ ! -e $ICINGA2_CONFIG_FILE ]; then
- echo "Config file '$ICINGA2_CONFIG_FILE' does not exist."
- exit 6
-fi
+: ${ICINGA2_USER:="@ICINGA2_USER@"}
+: ${ICINGA2_GROUP:="@ICINGA2_GROUP@"}
+: ${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"}
+: ${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"}
+: ${ICINGA2_CONFIG_FILE:="@CMAKE_INSTALL_FULL_SYSCONFDIR@/icinga2/icinga2.conf"}
+: ${ICINGA2_ERROR_LOG:=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log}
+: ${ICINGA2_STARTUP_LOG:=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/startup.log}
+: ${ICINGA2_PID_FILE:="@ICINGA2_RUNDIR@/icinga2/icinga2.pid"}
-if [ ! $ICINGA2_USER ]; then
- echo "Could not fetch \$ICINGA2_USER. Exiting."
- exit 6
+# Load extra environment variables
+if [ -f /etc/default/icinga2 ]; then
+ . /etc/default/icinga2
fi
-if [ ! $ICINGA2_GROUP ]; then
- echo "Could not fetch \$ICINGA2_GROUP. Exiting."
+test -x $DAEMON || exit 5
+
+if [ ! -e $ICINGA2_CONFIG_FILE ]; then
+ echo "Config file '$ICINGA2_CONFIG_FILE' does not exist."
exit 6
fi
. /etc/init.d/functions
fi
-# Load extra environment variables
-if [ -f /etc/default/icinga2 ]; then
- . /etc/default/icinga2
-fi
-
# Start Icinga 2
start() {
printf "Starting Icinga 2: "
- @CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs $SYSCONFIGFILE
+ @CMAKE_INSTALL_PREFIX@/lib/icinga2/prepare-dirs
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."
-DAEMON=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2
-ICINGA2_CONFIG_FILE=@CMAKE_INSTALL_FULL_SYSCONFDIR@/icinga2/icinga2.conf
-ICINGA2_RUN_DIR=@ICINGA2_RUNDIR@
-ICINGA2_STATE_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@
-ICINGA2_PID_FILE=@ICINGA2_RUNDIR@/icinga2/icinga2.pid
-ICINGA2_LOG_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2
-ICINGA2_ERROR_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log
-ICINGA2_STARTUP_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/startup.log
-ICINGA2_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/icinga2.log
-ICINGA2_CACHE_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2
-ICINGA2_USER=@ICINGA2_USER@
-ICINGA2_GROUP=@ICINGA2_GROUP@
-ICINGA2_COMMAND_GROUP=@ICINGA2_COMMAND_GROUP@
+#This is the default environment Icinga 2 runs with.
+#Make your changes here.
+
+#DAEMON=@CMAKE_INSTALL_FULL_SBINDIR@/icinga2
+#ICINGA2_CONFIG_FILE=@CMAKE_INSTALL_FULL_SYSCONFDIR@/icinga2/icinga2.conf
+#ICINGA2_RUN_DIR=@ICINGA2_RUNDIR@
+#ICINGA2_STATE_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@
+#ICINGA2_PID_FILE=@ICINGA2_RUNDIR@/icinga2/icinga2.pid
+#ICINGA2_LOG_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2
+#ICINGA2_ERROR_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/error.log
+#ICINGA2_STARTUP_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/startup.log
+#ICINGA2_LOG=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2/icinga2.log
+#ICINGA2_CACHE_DIR=@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2
+#ICINGA2_USER=@ICINGA2_USER@
+#ICINGA2_GROUP=@ICINGA2_GROUP@
+#ICINGA2_COMMAND_GROUP=@ICINGA2_COMMAND_GROUP@
# This script prepares directories and files needed for running Icinga2
#
-# load system specific defines
-SYSCONFIGFILE=$1
-if [ -f "$SYSCONFIGFILE" ]; then
- . $SYSCONFIGFILE
-else
- echo "Error: You need to supply the path to the Icinga2 sysconfig file as parameter."
- exit 1
-fi
-
+# Set defaults, to overwrite see "@ICINGA2_SYSCONFIGFILE@"
-if [ ! $ICINGA2_USER ]; then
- echo "Could not fetch \$ICINGA2_USER. Exiting."
- exit 6
-fi
-
-if [ ! $ICINGA2_GROUP ]; then
- echo "Could not fetch \$ICINGA2_GROUP. Exiting."
- exit 6
-fi
+: ${ICINGA2_USER:="@ICINGA2_USER@"}
+: ${ICINGA2_GROUP:="@ICINGA2_GROUP@"}
+: ${ICINGA2_COMMAND_GROUP:="@ICINGA2_COMMAND_GROUP@"}
+: ${ICINGA2_RUN_DIR:="@ICINGA2_RUNDIR@"}
+: ${ICINGA2_LOG_DIR:="@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/log/icinga2"}
+: ${ICINGA2_STATE_DIR:="@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2"}
+: ${ICINGA2_CACHE_DIR:="@CMAKE_INSTALL_FULL_LOCALSTATEDIR@/cache/icinga2"}
getent passwd $ICINGA2_USER >/dev/null 2>&1 || (echo "Icinga user '$ICINGA2_USER' does not exist. Exiting." && exit 6)
getent group $ICINGA2_GROUP >/dev/null 2>&1 || (echo "Icinga group '$ICINGA2_GROUP' does not exist. Exiting." && exit 6)
chown -R $ICINGA2_USER:$ICINGA2_COMMAND_GROUP "$ICINGA2_RUN_DIR"/icinga2
fi
-# Could be undefined in installations where sysconf is not overridden on upgrade
-if [ -z "$ICINGA2_LOG_DIR" ]; then
- ICINGA2_LOG_DIR=$(dirname -- "$ICINGA2_LOG")
-fi
-
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_RUN_DIR"/icinga2/
fi
-# Add a fallback if the user did not specify this directory in the sysconfig file
-if [ -z "$ICINGA2_CACHE_DIR" ]; then
- ICINGA2_CACHE_DIR="$ICINGA2_STATE_DIR"/cache/icinga2
-fi
-
test -e "$ICINGA2_CACHE_DIR" || install -m 750 -o $ICINGA2_USER -g $ICINGA2_COMMAND_GROUP -d "$ICINGA2_CACHE_DIR"
#!/bin/sh
-# load system specific defines
-SYSCONFIGFILE=$1
-if [ ! -f "$SYSCONFIGFILE" ]; then
- echo "Error: You need to supply the path to the Icinga2 sysconfig file as a parameter."
- exit 1
-fi
-. $SYSCONFIGFILE
+: ${ICINGA2_PID_FILE:="@ICINGA2_RUNDIR@/icinga2/icinga2.pid"}
+: ${DAEMON:="@CMAKE_INSTALL_FULL_SBINDIR@/icinga2"}
printf "Validating config files: "
}
#endif /* _WIN32 */
- String icingaUser = Utility::GetFromSysconfig("ICINGA2_USER");
+ String icingaUser = Utility::GetFromEnvironment("ICINGA2_USER");
if (icingaUser.IsEmpty())
icingaUser = ICINGA_USER;
- String icingaGroup = Utility::GetFromSysconfig("ICINGA2_GROUP");
+ String icingaGroup = Utility::GetFromEnvironment("ICINGA2_GROUP");
if (icingaGroup.IsEmpty())
icingaGroup = ICINGA_GROUP;
Application::DeclareRunAsGroup(icingaGroup);
#ifdef RLIMIT_NOFILE
- String rLimitFiles = Utility::GetFromSysconfig("ICINGA2_RLIMIT_FILES");
+ String rLimitFiles = Utility::GetFromEnvironment("ICINGA2_RLIMIT_FILES");
if (rLimitFiles.IsEmpty())
Application::DeclareRLimitFiles(Application::GetDefaultRLimitFiles());
else {
Application::DeclareRLimitFiles(Convert::ToLong(rLimitFiles));
} catch (const std::invalid_argument& ex) {
std::cout
- << "Error while parsing \"ICINGA2_RLIMIT_FILES\" from sysconfig: " << ex.what() << '\n';
+ << "Error setting \"ICINGA2_RLIMIT_FILES\": " << ex.what() << '\n';
return EXIT_FAILURE;
}
}
#endif /* RLIMIT_NOFILE */
#ifdef RLIMIT_NPROC
- String rLimitProcesses = Utility::GetFromSysconfig("ICINGA2_RLIMIT_PROCESSES");
+ String rLimitProcesses = Utility::GetFromEnvironment("ICINGA2_RLIMIT_PROCESSES");
if (rLimitProcesses.IsEmpty())
Application::DeclareRLimitProcesses(Application::GetDefaultRLimitProcesses());
else {
Application::DeclareRLimitProcesses(Convert::ToLong(rLimitProcesses));
} catch (const std::invalid_argument& ex) {
std::cout
- << "Error while parsing \"ICINGA2_RLIMIT_PROCESSES\" from sysconfig: " << ex.what() << '\n';
+ << "Error setting \"ICINGA2_RLIMIT_PROCESSES\": " << ex.what() << '\n';
return EXIT_FAILURE;
}
}
#endif /* RLIMIT_NPROC */
#ifdef RLIMIT_STACK
- String rLimitStack = Utility::GetFromSysconfig("ICINGA2_RLIMIT_STACK");
+ String rLimitStack = Utility::GetFromEnvironment("ICINGA2_RLIMIT_STACK");
if (rLimitStack.IsEmpty())
Application::DeclareRLimitStack(Application::GetDefaultRLimitStack());
else {
Application::DeclareRLimitStack(Convert::ToLong(rLimitStack));
} catch (const std::invalid_argument& ex) {
std::cout
- << "Error while parsing \"ICINGA2_RLIMIT_STACK\" from sysconfig: " << ex.what() << '\n';
+ << "Error setting \"ICINGA2_RLIMIT_STACK\": " << ex.what() << '\n';
return EXIT_FAILURE;
}
}
#endif /* _WIN32 */
-String Utility::GetFromSysconfig(const String& env)
+String Utility::GetFromEnvironment(const String& env)
{
#ifndef _WIN32
- String sysconf = Application::GetSysconfigFile();
- if (sysconf.IsEmpty())
- return "";
-
- if (!Utility::PathExists(sysconf))
- return "";
-
- String cmdInner = ". " + EscapeShellArg(sysconf) + " 2>&1 >/dev/null;echo \"$" + env + "\"";
- String cmd = "sh -c " + EscapeShellArg(cmdInner);
-
- FILE *fp = popen(cmd.CStr(), "r");
-
- if (!fp)
- return "";
-
- char line[1024];
- String out;
-
- if (fgets(line, sizeof(line), fp))
- out = line;
+ const char *envValue = getenv(env.CStr());
+ if (envValue == NULL)
+ return String();
else
- return "";
-
- pclose(fp);
-
- return out.Trim();
-#else
- //TODO: Figure out how to do this on windows
- return "";
+ return String(envValue);
+#else /* _WIN32 */
+ // While getenv exists on Windows, we don't set them. Therefore there is no reason to read them.
+ return String();
#endif /* _WIN32 */
}
static String GetIcingaDataPath();
#endif /* _WIN32 */
- static String GetFromSysconfig(const String& env);
+ static String GetFromEnvironment(const String& env);
#ifdef I2_DEBUG
static void SetTime(double);