From 4a6320d7f7152b05d2d350700e73dc0449996ab7 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Fri, 18 May 2018 17:04:03 +0200 Subject: [PATCH 1/3] Update log message for skipped certificate renewal Users kept asking about it, still it is just an "information" that this isn't needed yet. --- lib/remote/jsonrpcconnection-pki.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/remote/jsonrpcconnection-pki.cpp b/lib/remote/jsonrpcconnection-pki.cpp index ce9994023..6c867400c 100644 --- a/lib/remote/jsonrpcconnection-pki.cpp +++ b/lib/remote/jsonrpcconnection-pki.cpp @@ -76,9 +76,9 @@ Value RequestCertificateHandler(const MessageOrigin::Ptr& origin, const Dictiona if (X509_cmp_time(X509_get_notBefore(cert.get()), &forceRenewalEnd) != -1 && X509_cmp_time(X509_get_notAfter(cert.get()), &renewalStart) != -1) { Log(LogInformation, "JsonRpcConnection") - << "The certificate for CN '" << cn << "' cannot be renewed yet."; + << "The certificate for CN '" << cn << "' is valid and uptodate. Skipping automated renewal."; result->Set("status_code", 1); - result->Set("error", "The certificate for CN '" + cn + "' cannot be renewed yet."); + result->Set("error", "The certificate for CN '" + cn + "' is valid and uptodate. Skipping automated renewal."); return result; } } From ed4e008e79a6ccb05b0aed78245f1495e3ebc611 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Wed, 23 May 2018 13:37:29 +0200 Subject: [PATCH 2/3] Rework sysconfig file The sysconfig file now only contains the defaults as comments, changes made there are given to the init.d script, prepare-dirs, safe-reload and Icinga 2 itself. If nothing is set in the sysconfig file (as is the default as all lines are commented out) the defaults are used. fixes #6255 --- etc/initsystem/CMakeLists.txt | 7 +++- etc/initsystem/icinga2.init.d.cmake | 36 +++++++++--------- etc/initsystem/icinga2.sysconfig.cmake | 29 ++++++++------- .../{prepare-dirs => prepare-dirs.cmake} | 36 ++++-------------- .../{safe-reload => safe-reload.cmake} | 9 +---- icinga-app/icinga.cpp | 16 ++++---- lib/base/utility.cpp | 37 ++++--------------- lib/base/utility.hpp | 2 +- 8 files changed, 66 insertions(+), 106 deletions(-) rename etc/initsystem/{prepare-dirs => prepare-dirs.cmake} (59%) rename etc/initsystem/{safe-reload => safe-reload.cmake} (73%) 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..44d7ab132 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -162,11 +162,11 @@ static int Main() } #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; @@ -174,7 +174,7 @@ static int Main() 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 { @@ -182,14 +182,14 @@ static int Main() 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 { @@ -197,14 +197,14 @@ static int Main() 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 { @@ -212,7 +212,7 @@ static int Main() 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; } } 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); From 4b17e739eb139704c2de120d0fe037771ef04ad6 Mon Sep 17 00:00:00 2001 From: Jean Flach Date: Wed, 23 May 2018 14:23:48 +0200 Subject: [PATCH 3/3] Don't log when running autocomplete Logging breaks autocomplete, with this patch we should only log when something is going terribly wrong and execution can't be guaranteed or is destined to fail. This commit depends on the previous one which is why it's not in its own pull request. fixes #6256 --- icinga-app/icinga.cpp | 70 ++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp index 44d7ab132..0e462307c 100644 --- a/icinga-app/icinga.cpp +++ b/icinga-app/icinga.cpp @@ -156,7 +156,7 @@ 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."; } @@ -173,50 +173,52 @@ static int Main() Application::DeclareRunAsUser(icingaUser); Application::DeclareRunAsGroup(icingaGroup); + if (!autocomplete) { #ifdef RLIMIT_NOFILE - 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; + 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::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; + 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::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; + 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());