From: Jean Flach Date: Wed, 23 May 2018 11:37:29 +0000 (+0200) Subject: Rework sysconfig file X-Git-Tag: v2.9.0~44^2~1 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ed4e008e79a6ccb05b0aed78245f1495e3ebc611;p=icinga2 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 --- 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,24 +20,29 @@ 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 -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 @@ -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);