mirror of https://github.com/Icinga/icinga2.git
Merge pull request #6328 from Icinga/sysconfig-env
Rework sysconfig file/startup environment
This commit is contained in:
commit
bf0737ded5
|
@ -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
|
||||
|
|
|
@ -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."
|
||||
|
|
|
@ -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@
|
||||
|
|
|
@ -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"
|
|
@ -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: "
|
||||
|
|
@ -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());
|
||||
|
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue