diff --git a/etc/initsystem/CMakeLists.txt b/etc/initsystem/CMakeLists.txt index e1bebb009..dd57ab1a0 100644 --- a/etc/initsystem/CMakeLists.txt +++ b/etc/initsystem/CMakeLists.txt @@ -15,6 +15,7 @@ # 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) @@ -26,8 +27,10 @@ if(NOT WIN32) 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 ) @@ -37,7 +40,7 @@ if(NOT WIN32) "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 diff --git a/etc/initsystem/icinga2.init.d.cmake b/etc/initsystem/icinga2.init.d.cmake index bc41ccf67..03c88a632 100644 --- a/etc/initsystem/icinga2.init.d.cmake +++ b/etc/initsystem/icinga2.init.d.cmake @@ -20,8 +20,23 @@ SYSCONFIGFILE=@ICINGA2_SYSCONFIGFILE@ 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 + +# 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:="@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"} + +# Load extra environment variables +if [ -f /etc/default/icinga2 ]; then + . /etc/default/icinga2 fi test -x $DAEMON || exit 5 @@ -31,16 +46,6 @@ if [ ! -e $ICINGA2_CONFIG_FILE ]; then exit 6 fi -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 - 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) getent group $ICINGA2_COMMAND_GROUP >/dev/null 2>&1 || (echo "Icinga command group '$ICINGA2_COMMAND_GROUP' does not exist. Exiting." && exit 6) @@ -52,15 +57,10 @@ elif [ -f /etc/init.d/functions ]; then . /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." diff --git a/etc/initsystem/icinga2.sysconfig.cmake b/etc/initsystem/icinga2.sysconfig.cmake index a8335b4eb..d5d7497f1 100644 --- a/etc/initsystem/icinga2.sysconfig.cmake +++ b/etc/initsystem/icinga2.sysconfig.cmake @@ -1,13 +1,16 @@ -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@ diff --git a/etc/initsystem/prepare-dirs b/etc/initsystem/prepare-dirs.cmake similarity index 59% rename from etc/initsystem/prepare-dirs rename to etc/initsystem/prepare-dirs.cmake index 74bb85a5b..7465d6619 100644 --- a/etc/initsystem/prepare-dirs +++ b/etc/initsystem/prepare-dirs.cmake @@ -3,25 +3,15 @@ # 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) @@ -35,20 +25,10 @@ if [ ! -e "$ICINGA2_RUN_DIR"/icinga2 ]; then 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" diff --git a/etc/initsystem/safe-reload b/etc/initsystem/safe-reload.cmake similarity index 73% rename from etc/initsystem/safe-reload rename to etc/initsystem/safe-reload.cmake index 2fd44b73d..57e10b1ac 100644 --- a/etc/initsystem/safe-reload +++ b/etc/initsystem/safe-reload.cmake @@ -1,12 +1,7 @@ #!/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: " diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 321d7f74f..0e462307c 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -156,67 +156,69 @@ static int Main() Application::DeclareZonesDir(Application::GetSysconfDir() + "/icinga2/zones.d"); #ifndef _WIN32 - if (!Utility::PathExists(Application::GetSysconfigFile())) { + if (!autocomplete && !Utility::PathExists(Application::GetSysconfigFile())) { Log(LogWarning, "icinga-app") << "Sysconfig file '" << Application::GetSysconfigFile() << "' cannot be read. Using default values."; } #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::DeclareRunAsUser(icingaUser); Application::DeclareRunAsGroup(icingaGroup); + if (!autocomplete) { #ifdef RLIMIT_NOFILE - String rLimitFiles = Utility::GetFromSysconfig("ICINGA2_RLIMIT_FILES"); - if (rLimitFiles.IsEmpty()) - Application::DeclareRLimitFiles(Application::GetDefaultRLimitFiles()); - else { - try { - Application::DeclareRLimitFiles(Convert::ToLong(rLimitFiles)); - } catch (const std::invalid_argument& ex) { - std::cout - << "Error while parsing \"ICINGA2_RLIMIT_FILES\" from sysconfig: " << ex.what() << '\n'; - return EXIT_FAILURE; + String rLimitFiles = Utility::GetFromEnvironment("ICINGA2_RLIMIT_FILES"); + if (rLimitFiles.IsEmpty()) + Application::DeclareRLimitFiles(Application::GetDefaultRLimitFiles()); + else { + try { + Application::DeclareRLimitFiles(Convert::ToLong(rLimitFiles)); + } catch (const std::invalid_argument& ex) { + std::cout + << "Error setting \"ICINGA2_RLIMIT_FILES\": " << ex.what() << '\n'; + return EXIT_FAILURE; + } } - } #endif /* RLIMIT_NOFILE */ #ifdef RLIMIT_NPROC - String rLimitProcesses = Utility::GetFromSysconfig("ICINGA2_RLIMIT_PROCESSES"); - if (rLimitProcesses.IsEmpty()) - Application::DeclareRLimitProcesses(Application::GetDefaultRLimitProcesses()); - else { - try { - Application::DeclareRLimitProcesses(Convert::ToLong(rLimitProcesses)); - } catch (const std::invalid_argument& ex) { - std::cout - << "Error while parsing \"ICINGA2_RLIMIT_PROCESSES\" from sysconfig: " << ex.what() << '\n'; - return EXIT_FAILURE; + String rLimitProcesses = Utility::GetFromEnvironment("ICINGA2_RLIMIT_PROCESSES"); + if (rLimitProcesses.IsEmpty()) + Application::DeclareRLimitProcesses(Application::GetDefaultRLimitProcesses()); + else { + try { + Application::DeclareRLimitProcesses(Convert::ToLong(rLimitProcesses)); + } catch (const std::invalid_argument& ex) { + std::cout + << "Error setting \"ICINGA2_RLIMIT_PROCESSES\": " << ex.what() << '\n'; + return EXIT_FAILURE; + } } - } #endif /* RLIMIT_NPROC */ #ifdef RLIMIT_STACK - String rLimitStack = Utility::GetFromSysconfig("ICINGA2_RLIMIT_STACK"); - if (rLimitStack.IsEmpty()) - Application::DeclareRLimitStack(Application::GetDefaultRLimitStack()); - else { - try { - Application::DeclareRLimitStack(Convert::ToLong(rLimitStack)); - } catch (const std::invalid_argument& ex) { - std::cout - << "Error while parsing \"ICINGA2_RLIMIT_STACK\" from sysconfig: " << ex.what() << '\n'; - return EXIT_FAILURE; + String rLimitStack = Utility::GetFromEnvironment("ICINGA2_RLIMIT_STACK"); + if (rLimitStack.IsEmpty()) + Application::DeclareRLimitStack(Application::GetDefaultRLimitStack()); + else { + try { + Application::DeclareRLimitStack(Convert::ToLong(rLimitStack)); + } catch (const std::invalid_argument& ex) { + std::cout + << "Error setting \"ICINGA2_RLIMIT_STACK\": " << ex.what() << '\n'; + return EXIT_FAILURE; + } } - } #endif /* RLIMIT_STACK */ + } Application::DeclareConcurrency(std::thread::hardware_concurrency()); Application::DeclareMaxConcurrentChecks(Application::GetDefaultMaxConcurrentChecks()); diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 2d1fb8965..8d2162011 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -1936,37 +1936,16 @@ String Utility::GetIcingaDataPath() #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 */ } diff --git a/lib/base/utility.hpp b/lib/base/utility.hpp index 97bb834b8..8311f8d54 100644 --- a/lib/base/utility.hpp +++ b/lib/base/utility.hpp @@ -147,7 +147,7 @@ public: static String GetIcingaDataPath(); #endif /* _WIN32 */ - static String GetFromSysconfig(const String& env); + static String GetFromEnvironment(const String& env); #ifdef I2_DEBUG static void SetTime(double);