Refactor Application::*Const()
authorGunnar Beutner <gunnar.beutner@icinga.com>
Thu, 9 Aug 2018 13:37:23 +0000 (15:37 +0200)
committerGunnar Beutner <gunnar.beutner@icinga.com>
Mon, 13 Aug 2018 13:27:05 +0000 (15:27 +0200)
40 files changed:
doc/17-language-reference.md
icinga-app/icinga.cpp
lib/base/CMakeLists.txt
lib/base/application.cpp
lib/base/application.hpp
lib/base/configobject.cpp
lib/base/configuration.cpp [new file with mode: 0644]
lib/base/configuration.hpp [new file with mode: 0644]
lib/base/configuration.ti [new file with mode: 0644]
lib/base/scriptframe.cpp
lib/base/socketevents.cpp
lib/base/tlsutility.cpp
lib/cli/apisetuputility.cpp
lib/cli/daemoncommand.cpp
lib/cli/daemonutility.cpp
lib/cli/featureutility.cpp
lib/cli/nodesetupcommand.cpp
lib/cli/nodeutility.cpp
lib/cli/nodewizardcommand.cpp
lib/cli/objectlistcommand.cpp
lib/cli/troubleshootcommand.cpp
lib/cli/variablegetcommand.cpp
lib/cli/variablelistcommand.cpp
lib/cli/variableutility.cpp
lib/compat/checkresultreader.ti
lib/compat/compatlogger.ti
lib/compat/externalcommandlistener.ti
lib/compat/statusdatawriter.cpp
lib/compat/statusdatawriter.ti
lib/config/configitem.cpp
lib/config/expression.cpp
lib/icinga/icingaapplication.cpp
lib/livestatus/livestatuslistener.ti
lib/perfdata/perfdatawriter.ti
lib/remote/apilistener-filesync.cpp
lib/remote/apilistener.cpp
lib/remote/apilistener.ti
lib/remote/configpackageutility.cpp
lib/remote/consolehandler.cpp
lib/remote/jsonrpcconnection.cpp

index 0e48a6c25b2ae2f228c40e92690870ddb08aebef..4de8afbfd848da1e6956576e89f0ab9d40e4efc9 100644 (file)
@@ -232,6 +232,7 @@ The `using` keyword only has an effect for the current file and only for code th
 The following namespaces are automatically imported as if by using the `using` keyword:
 
 * System
+* System.Configuration
 * Types
 * Icinga
 
index 5e8cbd8ec42b1ba6631d32b7b8eea25246f1dd3a..a2bf8001c5e26152f8e38c0e78d0567277cf31e6 100644 (file)
@@ -23,6 +23,7 @@
 #include "config/configitembuilder.hpp"
 #include "config/expression.hpp"
 #include "base/application.hpp"
+#include "base/configuration.hpp"
 #include "base/logger.hpp"
 #include "base/timer.hpp"
 #include "base/utility.hpp"
@@ -101,7 +102,7 @@ static void HandleLegacyDefines()
        String dataPrefix = Utility::GetIcingaDataPath();
 #endif /* _WIN32 */
 
-       Value localStateDir = Application::GetConst("LocalStateDir");
+       Value localStateDir = Configuration::LocalStateDir;
 
        if (!localStateDir.IsEmpty()) {
                Log(LogWarning, "icinga-app")
@@ -110,51 +111,51 @@ static void HandleLegacyDefines()
                        << " For compatibility reasons, these are now set based on the 'LocalStateDir' constant.";
 
 #ifdef _WIN32
-               ScriptGlobal::Set("DataDir", localStateDir + "\\lib\\icinga2");
-               ScriptGlobal::Set("LogDir", localStateDir + "\\log\\icinga2");
-               ScriptGlobal::Set("CacheDir", localStateDir + "\\cache\\icinga2");
-               ScriptGlobal::Set("SpoolDir", localStateDir + "\\spool\\icinga2");
+               Configuration::DataDir = localStateDir + "\\lib\\icinga2";
+               Configuration::LogDir = localStateDir + "\\log\\icinga2";
+               Configuration::CacheDir = localStateDir + "\\cache\\icinga2";
+               Configuration::SpoolDir = localStateDir + "\\spool\\icinga2";
        } else {
-               ScriptGlobal::Set("LocalStateDir", dataPrefix + "\\var");
+               Configuration::LocalStateDir = dataPrefix + "\\var";
 #else /* _WIN32 */
-               ScriptGlobal::Set("DataDir", localStateDir + "/lib/icinga2");
-               ScriptGlobal::Set("LogDir", localStateDir + "/log/icinga2");
-               ScriptGlobal::Set("CacheDir", localStateDir + "/cache/icinga2");
-               ScriptGlobal::Set("SpoolDir", localStateDir + "/spool/icinga2");
+               Configuration::DataDir = localStateDir + "/lib/icinga2";
+               Configuration::LogDir = localStateDir + "/log/icinga2";
+               Configuration::CacheDir = localStateDir + "/cache/icinga2";
+               Configuration::SpoolDir = localStateDir + "/spool/icinga2";
        } else {
-               ScriptGlobal::Set("LocalStateDir", ICINGA_LOCALSTATEDIR);
+               Configuration::LocalStateDir = ICINGA_LOCALSTATEDIR;
 #endif /* _WIN32 */
        }
 
-       Value sysconfDir = Application::GetConst("SysconfDir");
+       Value sysconfDir = Configuration::SysconfDir;
        if (!sysconfDir.IsEmpty()) {
                Log(LogWarning, "icinga-app")
                        << "Please do not set the deprecated 'Sysconfdir' constant, use the 'ConfigDir' constant instead! For compatibility reasons, their value is set based on the 'SysconfDir' constant.";
 
 #ifdef _WIN32
-               ScriptGlobal::Set("ConfigDir", sysconfDir + "\\icinga2");
+               Configuration::ConfigDir = sysconfDir + "\\icinga2";
        } else {
-               ScriptGlobal::Set("SysconfDir", dataPrefix + "\\etc");
+               Configuration::SysconfDir = dataPrefix + "\\etc";
 #else /* _WIN32 */
-               ScriptGlobal::Set("ConfigDir", sysconfDir + "/icinga2");
+               Configuration::ConfigDir = sysconfDir + "/icinga2";
        } else {
-               ScriptGlobal::Set("SysconfDir", ICINGA_SYSCONFDIR);
+               Configuration::SysconfDir = ICINGA_SYSCONFDIR;
 #endif /* _WIN32 */
        }
 
-       Value runDir = Application::GetConst("RunDir");
+       Value runDir = Configuration::RunDir;
        if (!runDir.IsEmpty()) {
                Log(LogWarning, "icinga-app")
                        << "Please do not set the deprecated 'RunDir' constant, use the 'InitRunDir' constant instead! For compatiblity reasons, their value is set based on the 'RunDir' constant.";
 
 #ifdef _WIN32
-               ScriptGlobal::Set("InitRunDir", runDir + "\\icinga2");
+               Configuration::InitRunDir = runDir + "\\icinga2";
        } else {
-               ScriptGlobal::Set("RunDir", dataPrefix + "\\var\\run");
+               Configuration::RunDir = dataPrefix + "\\var\\run";
 #else /* _WIN32 */
-               ScriptGlobal::Set("InitRunDir", runDir + "/icinga2");
+               Configuration::InitRunDir = runDir + "/icinga2";
        } else {
-               ScriptGlobal::Set("RunDir", ICINGA_RUNDIR);
+               Configuration::RunDir = ICINGA_RUNDIR;
 #endif /* _WIN32 */
        }
 }
@@ -199,43 +200,43 @@ static int Main()
        String dataPrefix = Utility::GetIcingaDataPath();
 
        if (!binaryPrefix.IsEmpty() && !dataPrefix.IsEmpty()) {
-               Application::DeclareConst("PrefixDir", binaryPrefix);
-               Application::DeclareConst("ProgramData", dataPrefix);
+               Configuration::PrefixDir = binaryPrefix;
+               Configuration::ProgramData = dataPrefix;
 
-               Application::DeclareConst("ConfigDir", dataPrefix + "\\etc\\icinga2");
+               Configuration::ConfigDir = dataPrefix + "\\etc\\icinga2";
 
-               Application::DeclareConst("DataDir", dataPrefix + "\\var\\lib\\icinga2");
-               Application::DeclareConst("LogDir", dataPrefix + "\\var\\log\\icinga2");
-               Application::DeclareConst("CacheDir", dataPrefix + "\\var\\cache\\icinga2");
-               Application::DeclareConst("SpoolDir", dataPrefix + "\\var\\spool\\icinga2");
+               Configuration::DataDir =  dataPrefix + "\\var\\lib\\icinga2";
+               Configuration::LogDir = dataPrefix + "\\var\\log\\icinga2";
+               Configuration::CacheDir = dataPrefix + "\\var\\cache\\icinga2";
+               Configuration::SpoolDir = dataPrefix + "\\var\\spool\\icinga2";
 
                /* Internal constants. */
-               Application::DeclareConst("PkgDataDir", binaryPrefix + "\\share\\icinga2");
-               Application::DeclareConst("IncludeConfDir", binaryPrefix + "\\share\\icinga2\\include");
+               Configuration::PkgDataDir = binaryPrefix + "\\share\\icinga2";
+               Configuration::IncludeConfDir = binaryPrefix + "\\share\\icinga2\\include";
        } else {
                Log(LogWarning, "icinga-app", "Registry key could not be read. Falling back to built-in paths.");
 
 #endif /* _WIN32 */
-               Application::DeclareConst("ConfigDir", ICINGA_CONFIGDIR);
+               Configuration::ConfigDir = ICINGA_CONFIGDIR;
 
-               Application::DeclareConst("DataDir", ICINGA_DATADIR);
-               Application::DeclareConst("LogDir", ICINGA_LOGDIR);
-               Application::DeclareConst("CacheDir", ICINGA_CACHEDIR);
-               Application::DeclareConst("SpoolDir", ICINGA_SPOOLDIR);
+               Configuration::DataDir = ICINGA_DATADIR;
+               Configuration::LogDir = ICINGA_LOGDIR;
+               Configuration::CacheDir = ICINGA_CACHEDIR;
+               Configuration::SpoolDir = ICINGA_SPOOLDIR;
 
-               Application::DeclareConst("PrefixDir", ICINGA_PREFIX);
+               Configuration::PrefixDir = ICINGA_PREFIX;
 
                /* Internal constants. */
-               Application::DeclareConst("PkgDataDir", ICINGA_PKGDATADIR);
-               Application::DeclareConst("IncludeConfDir", ICINGA_INCLUDECONFDIR);
+               Configuration::PkgDataDir = ICINGA_PKGDATADIR;
+               Configuration::IncludeConfDir = ICINGA_INCLUDECONFDIR;
 
-               Application::DeclareConst("InitRunDir", ICINGA_INITRUNDIR);
+               Configuration::InitRunDir = ICINGA_INITRUNDIR;
 
 #ifdef _WIN32
        }
 #endif /* _WIN32 */
 
-       Application::DeclareConst("ZonesDir", Application::GetConst("ConfigDir") + "/zones.d");
+       Configuration::ZonesDir = Configuration::ConfigDir + "/zones.d";
 
        String icingaUser = Utility::GetFromEnvironment("ICINGA2_USER");
        if (icingaUser.IsEmpty())
@@ -245,17 +246,17 @@ static int Main()
        if (icingaGroup.IsEmpty())
                icingaGroup = ICINGA_GROUP;
 
-       Application::DeclareConst("RunAsUser", icingaUser);
-       Application::DeclareConst("RunAsGroup", icingaGroup);
+       Configuration::RunAsUser = icingaUser;
+       Configuration::RunAsGroup = icingaGroup;
 
        if (!autocomplete) {
 #ifdef RLIMIT_NOFILE
                String rLimitFiles = Utility::GetFromEnvironment("ICINGA2_RLIMIT_FILES");
                if (rLimitFiles.IsEmpty())
-                       Application::DeclareConst("RLimitFiles", Application::GetDefaultRLimitFiles());
+                       Configuration::RLimitFiles = Application::GetDefaultRLimitFiles();
                else {
                        try {
-                               Application::DeclareConst("RLimitFiles", Convert::ToLong(rLimitFiles));
+                               Configuration::RLimitFiles = Convert::ToLong(rLimitFiles);
                        } catch (const std::invalid_argument& ex) {
                                std::cout
                                        << "Error setting \"ICINGA2_RLIMIT_FILES\": " << ex.what() << '\n';
@@ -267,10 +268,10 @@ static int Main()
 #ifdef RLIMIT_NPROC
                String rLimitProcesses = Utility::GetFromEnvironment("ICINGA2_RLIMIT_PROCESSES");
                if (rLimitProcesses.IsEmpty())
-                       Application::DeclareConst("RLimitProcesses", Application::GetDefaultRLimitProcesses());
+                       Configuration::RLimitProcesses = Application::GetDefaultRLimitProcesses();
                else {
                        try {
-                               Application::DeclareConst("RLimitProcesses", Convert::ToLong(rLimitProcesses));
+                               Configuration::RLimitProcesses = Convert::ToLong(rLimitProcesses);
                        } catch (const std::invalid_argument& ex) {
                                std::cout
                                        << "Error setting \"ICINGA2_RLIMIT_PROCESSES\": " << ex.what() << '\n';
@@ -282,10 +283,10 @@ static int Main()
 #ifdef RLIMIT_STACK
                String rLimitStack = Utility::GetFromEnvironment("ICINGA2_RLIMIT_STACK");
                if (rLimitStack.IsEmpty())
-                       Application::DeclareConst("RLimitStack", Application::GetDefaultRLimitStack());
+                       Configuration::RLimitStack = Application::GetDefaultRLimitStack();
                else {
                        try {
-                               Application::DeclareConst("RLimitStack", Convert::ToLong(rLimitStack));
+                               Configuration::RLimitStack = Convert::ToLong(rLimitStack);
                        } catch (const std::invalid_argument& ex) {
                                std::cout
                                        << "Error setting \"ICINGA2_RLIMIT_STACK\": " << ex.what() << '\n';
@@ -295,10 +296,9 @@ static int Main()
 #endif /* RLIMIT_STACK */
        }
 
-       Application::DeclareConst("Concurrency", std::thread::hardware_concurrency());
-       Application::DeclareConst("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks());
+       ScriptGlobal::Set("MaxConcurrentChecks", Application::GetDefaultMaxConcurrentChecks());
 
-       ScriptGlobal::Set("AttachDebugger", false);
+       ScriptGlobal::Set("Environment", "production");
 
        ScriptGlobal::Set("System.PlatformKernel", Utility::GetPlatformKernel(), true);
        ScriptGlobal::Set("System.PlatformKernelVersion", Utility::GetPlatformKernelVersion(), true);
@@ -360,7 +360,7 @@ static int Main()
        std::ifstream userFile;
 
        /* The implicit string assignment is needed for Windows builds. */
-       String configDir = Application::GetConst("ConfigDir");
+       String configDir = Configuration::ConfigDir;
        userFile.open(configDir + "/user");
 
        if (userFile && command && !Application::IsProcessElevated()) {
@@ -462,19 +462,21 @@ static int Main()
                }
        }
 
+       Configuration::SetReadOnly(true);
+
        /* Ensure that all defined constants work in the way we expect them. */
        HandleLegacyDefines();
 
        if (vm.count("script-debugger"))
                Application::SetScriptDebuggerEnabled(true);
 
-       Application::DeclareConst("StatePath", Application::GetConst("DataDir") + "/icinga2.state");
-       Application::DeclareConst("ModAttrPath", Application::GetConst("DataDir") + "/modified-attributes.conf");
-       Application::DeclareConst("ObjectsPath", Application::GetConst("CacheDir") + "/icinga2.debug");
-       Application::DeclareConst("VarsPath", Application::GetConst("CacheDir") + "/icinga2.vars");
-       Application::DeclareConst("PidPath", Application::GetConst("InitRunDir") + "/icinga2.pid");
+       Configuration::StatePath = Configuration::DataDir + "/icinga2.state";
+       Configuration::ModAttrPath = Configuration::DataDir + "/modified-attributes.conf";
+       Configuration::ObjectsPath = Configuration::CacheDir + "/icinga2.debug";
+       Configuration::VarsPath = Configuration::CacheDir + "/icinga2.vars";
+       Configuration::PidPath = Configuration::InitRunDir + "/icinga2.pid";
 
-       ConfigCompiler::AddIncludeSearchDir(Application::GetConst("IncludeConfDir"));
+       ConfigCompiler::AddIncludeSearchDir(Configuration::IncludeConfDir);
 
        if (!autocomplete && vm.count("include")) {
                for (const String& includePath : vm["include"].as<std::vector<std::string> >()) {
@@ -584,8 +586,8 @@ static int Main()
                                return 0;
                        }
                } else if (command && command->GetImpersonationLevel() == ImpersonateIcinga) {
-                       String group = Application::GetConst("RunAsGroup");
-                       String user = Application::GetConst("RunAsUser");
+                       String group = Configuration::RunAsGroup;
+                       String user = Configuration::RunAsUser;
 
                        errno = 0;
                        struct group *gr = getgrnam(group.CStr());
index 3cdc08556e565f3024f509b3110521cf08289e8b..9988d8e70d73947fcab886638d540ebd2de64eda 100644 (file)
@@ -17,6 +17,7 @@
 
 mkclass_target(application.ti application-ti.cpp application-ti.hpp)
 mkclass_target(configobject.ti configobject-ti.cpp configobject-ti.hpp)
+mkclass_target(configuration.ti configuration-ti.cpp configuration-ti.hpp)
 mkclass_target(datetime.ti datetime-ti.cpp datetime-ti.hpp)
 mkclass_target(filelogger.ti filelogger-ti.cpp filelogger-ti.hpp)
 mkclass_target(function.ti function-ti.cpp function-ti.hpp)
@@ -33,6 +34,7 @@ set(base_SOURCES
   boolean.cpp boolean.hpp boolean-script.cpp
   configobject.cpp configobject.hpp configobject-ti.hpp configobject-script.cpp
   configtype.cpp configtype.hpp
+  configuration.cpp configuration.hpp configuration-ti.hpp
   configwriter.cpp configwriter.hpp
   console.cpp console.hpp
   context.cpp context.hpp
index bc8ec1bd45eb5ce9d522c02fa2aafbbf0a7f6195..5fa49a7bab36a8da51b8b17035d1166931f305a0 100644 (file)
@@ -168,7 +168,7 @@ void Application::SetResourceLimits()
        rlimit rl;
 
 #      ifdef RLIMIT_NOFILE
-       rlim_t fileLimit = GetConst("RLimitFiles");
+       rlim_t fileLimit = Configuration::RLimitFiles;
 
        if (fileLimit != 0) {
                if (fileLimit < GetDefaultRLimitFiles()) {
@@ -189,7 +189,7 @@ void Application::SetResourceLimits()
        }
 
 #      ifdef RLIMIT_NPROC
-       rlim_t processLimit = GetConst("RLimitProcesses");
+       rlim_t processLimit = Configuration::RLimitProcesses;
 
        if (processLimit != 0) {
                if (processLimit < GetDefaultRLimitProcesses()) {
@@ -228,7 +228,7 @@ void Application::SetResourceLimits()
 
        rlim_t stackLimit;
 
-       stackLimit = GetConst("RLimitStack");
+       stackLimit = Configuration::RLimitStack;
 
        if (stackLimit != 0) {
                if (stackLimit < GetDefaultRLimitStack()) {
@@ -549,30 +549,32 @@ void Application::DisplayInfoMessage(std::ostream& os, bool skipVersion)
                << "  Kernel version: " << Utility::GetPlatformKernelVersion() << "\n"
                << "  Architecture: " << Utility::GetPlatformArchitecture() << "\n";
 
+       Namespace::Ptr systemNS = ScriptGlobal::Get("System");
+
        os << "\nBuild information:\n"
-               << "  Compiler: " << ScriptGlobal::Get("BuildCompilerName") << " " << ScriptGlobal::Get("BuildCompilerVersion") << "\n"
-               << "  Build host: " << ScriptGlobal::Get("BuildHostName") << "\n";
+               << "  Compiler: " << systemNS->Get("BuildCompilerName") << " " << systemNS->Get("BuildCompilerVersion") << "\n"
+               << "  Build host: " << systemNS->Get("BuildHostName") << "\n";
 
        os << "\nApplication information:\n"
                << "\nGeneral paths:\n"
-               << "  Config directory: " << GetConst("ConfigDir") << "\n"
-               << "  Data directory: " << GetConst("DataDir") << "\n"
-               << "  Log directory: " << GetConst("LogDir") << "\n"
-               << "  Cache directory: " << GetConst("CacheDir") << "\n"
-               << "  Spool directory: " << GetConst("SpoolDir") << "\n"
-               << "  Run directory: " << GetConst("InitRunDir") << "\n"
+               << "  Config directory: " << Configuration::ConfigDir << "\n"
+               << "  Data directory: " << Configuration::DataDir << "\n"
+               << "  Log directory: " << Configuration::LogDir << "\n"
+               << "  Cache directory: " << Configuration::CacheDir << "\n"
+               << "  Spool directory: " << Configuration::SpoolDir << "\n"
+               << "  Run directory: " << Configuration::InitRunDir << "\n"
                << "\nOld paths (deprecated):\n"
-               << "  Installation root: " << GetConst("PrefixDir") << "\n"
-               << "  Sysconf directory: " << GetConst("SysconfDir") << "\n"
-               << "  Run directory (base): " << GetConst("RunDir") << "\n"
-               << "  Local state directory: " << GetConst("LocalStateDir") << "\n"
+               << "  Installation root: " << Configuration::PrefixDir << "\n"
+               << "  Sysconf directory: " << Configuration::SysconfDir << "\n"
+               << "  Run directory (base): " << Configuration::RunDir << "\n"
+               << "  Local state directory: " << Configuration::LocalStateDir << "\n"
                << "\nInternal paths:\n"
-               << "  Package data directory: " << GetConst("PkgDataDir") << "\n"
-               << "  State path: " << GetConst("StatePath") << "\n"
-               << "  Modified attributes path: " << GetConst("ModAttrPath") << "\n"
-               << "  Objects path: " << GetConst("ObjectsPath") << "\n"
-               << "  Vars path: " << GetConst("VarsPath") << "\n"
-               << "  PID path: " << GetConst("PidPath") << "\n";
+               << "  Package data directory: " << Configuration::PkgDataDir << "\n"
+               << "  State path: " << Configuration::StatePath << "\n"
+               << "  Modified attributes path: " << Configuration::ModAttrPath << "\n"
+               << "  Objects path: " << Configuration::ObjectsPath << "\n"
+               << "  Vars path: " << Configuration::VarsPath << "\n"
+               << "  PID path: " << Configuration::PidPath << "\n";
 
 }
 
@@ -590,7 +592,7 @@ void Application::DisplayBugMessage(std::ostream& os)
 
 String Application::GetCrashReportFilename()
 {
-       return GetConst("LogDir") + "/crash/report." + Convert::ToString(Utility::GetTime());
+       return Configuration::LogDir + "/crash/report." + Convert::ToString(Utility::GetTime());
 }
 
 
@@ -740,7 +742,7 @@ void Application::SigUsr2Handler(int)
         */
        Application::Ptr instance = GetInstance();
        try {
-               instance->UpdatePidFile(GetConst("PidPath"), m_ReloadProcess);
+               instance->UpdatePidFile(Configuration::PidPath, m_ReloadProcess);
        } catch (const std::exception&) {
                /* abort restart */
                Log(LogCritical, "Application", "Cannot update PID file. Aborting restart operation.");
@@ -783,7 +785,7 @@ void Application::SigAbrtHandler(int)
                }
        }
 
-       bool interactive_debugger = Convert::ToBool(ScriptGlobal::Get("AttachDebugger"));
+       bool interactive_debugger = Configuration::AttachDebugger;
 
        if (!interactive_debugger) {
                std::ofstream ofs;
@@ -893,7 +895,7 @@ void Application::ExceptionHandler()
                }
        }
 
-       bool interactive_debugger = Convert::ToBool(ScriptGlobal::Get("AttachDebugger"));
+       bool interactive_debugger = Configuration::AttachDebugger;
 
        if (!interactive_debugger) {
                std::ofstream ofs;
@@ -1012,10 +1014,10 @@ int Application::Run()
 #endif /* _WIN32 */
 
        try {
-               UpdatePidFile(GetConst("PidPath"));
+               UpdatePidFile(Configuration::PidPath);
        } catch (const std::exception&) {
                Log(LogCritical, "Application")
-                       << "Cannot update PID file '" << GetConst("PidPath") << "'. Aborting.";
+                       << "Cannot update PID file '" << Configuration::PidPath << "'. Aborting.";
                return EXIT_FAILURE;
        }
 
@@ -1097,7 +1099,7 @@ void Application::ClosePidFile(bool unlink)
 
        if (m_PidFile) {
                if (unlink) {
-                       String pidpath = GetConst("PidPath");
+                       String pidpath = Configuration::PidPath;
                        ::unlink(pidpath.CStr());
                }
 
@@ -1165,39 +1167,6 @@ pid_t Application::ReadPidFile(const String& filename)
        return runningpid;
 }
 
-/**
- * Declares a const with ScriptGlobal
- *
- * @param name The const name.
- * @param value The new value.
- */
-void Application::DeclareConst(const String& name, const Value& value)
-{
-       if (!ScriptGlobal::Exists(name))
-               ScriptGlobal::Set(name, value);
-}
-
-/**
- * Returns the value of a const from ScriptGlobal
- *
- * @param name The const name.
- */
-Value Application::GetConst(const String& name)
-{
-       return GetConst(name, Empty);
-}
-
-/**
- * Returns the value of a const from ScriptGlobal with default value
- *
- * @param name The const name.
- * @param def  The default value.
- */
-Value Application::GetConst(const String& name, Value defaultValue)
-{
-       return ScriptGlobal::Get(name, &defaultValue);
-}
-
 int Application::GetDefaultRLimitFiles()
 {
        return 16 * 1024;
@@ -1213,17 +1182,6 @@ int Application::GetDefaultRLimitStack()
        return 256 * 1024;
 }
 
-/**
- * Retrieves the concurrency level.
- *
- * @returns The concurrency level.
- */
-int Application::GetConcurrency()
-{
-       Value defaultConcurrency = std::thread::hardware_concurrency();
-       return ScriptGlobal::Get("Concurrency", &defaultConcurrency);
-}
-
 /**
  * Sets the max concurrent checks.
  *
index 88fc51ab67a95a74428d9df01ffaf6c7c0f037c3..72a76b6ea656395482f66f3808daaa82fd016699 100644 (file)
@@ -23,6 +23,7 @@
 #include "base/i2-base.hpp"
 #include "base/application-ti.hpp"
 #include "base/logger.hpp"
+#include "base/configuration.hpp"
 #include <iosfwd>
 
 namespace icinga
@@ -85,10 +86,6 @@ public:
 
        static String GetExePath(const String& argv0);
 
-       static void DeclareConst(const String& name, const Value& value);
-       static Value GetConst(const String& name);
-       static Value GetConst(const String& name, Value defaultValue);
-
 #ifdef _WIN32
        static bool IsProcessElevated();
 #endif /* _WIN32 */
@@ -97,7 +94,6 @@ public:
        static int GetDefaultRLimitProcesses();
        static int GetDefaultRLimitStack();
 
-       static int GetConcurrency();
        static int GetMaxConcurrentChecks();
        static int GetDefaultMaxConcurrentChecks();
        static void SetMaxConcurrentChecks(int maxChecks);
index 6aedfaca6b7a6f3b65caba8dade92fc94e6bbfaa..b95a578183ce725c265f2e4a3fad3ca9551649a1 100644 (file)
@@ -571,7 +571,7 @@ void ConfigObject::RestoreObjects(const String& filename, int attributeTypes)
 
        unsigned long restored = 0;
 
-       WorkQueue upq(25000, Application::GetConcurrency());
+       WorkQueue upq(25000, Configuration::Concurrency);
        upq.SetName("ConfigObject::RestoreObjects");
 
        String message;
diff --git a/lib/base/configuration.cpp b/lib/base/configuration.cpp
new file mode 100644 (file)
index 0000000..31f6912
--- /dev/null
@@ -0,0 +1,370 @@
+/******************************************************************************
+ * Icinga 2                                                                   *
+ * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
+ *                                                                            *
+ * This program is free software; you can redistribute it and/or              *
+ * modify it under the terms of the GNU General Public License                *
+ * as published by the Free Software Foundation; either version 2             *
+ * of the License, or (at your option) any later version.                     *
+ *                                                                            *
+ * This program is distributed in the hope that it will be useful,            *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
+ * GNU General Public License for more details.                               *
+ *                                                                            *
+ * You should have received a copy of the GNU General Public License          *
+ * along with this program; if not, write to the Free Software Foundation     *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
+ ******************************************************************************/
+
+#include "base/configuration.hpp"
+#include "base/configuration-ti.cpp"
+#include "base/exception.hpp"
+
+using namespace icinga;
+
+REGISTER_TYPE(Configuration);
+
+String Configuration::ApiBindHost;
+String Configuration::ApiBindPort{"5665"};
+bool Configuration::AttachDebugger{false};
+String Configuration::CacheDir;
+int Configuration::Concurrency{static_cast<int>(std::thread::hardware_concurrency())};
+String Configuration::ConfigDir;
+String Configuration::DataDir;
+String Configuration::EventEngine;
+String Configuration::IncludeConfDir;
+String Configuration::InitRunDir;
+String Configuration::LogDir;
+String Configuration::ModAttrPath;
+String Configuration::ObjectsPath;
+String Configuration::PidPath;
+String Configuration::PkgDataDir;
+String Configuration::PrefixDir;
+String Configuration::ProgramData;
+int Configuration::RLimitFiles;
+int Configuration::RLimitProcesses;
+int Configuration::RLimitStack;
+String Configuration::RunAsGroup;
+String Configuration::RunAsUser;
+String Configuration::SpoolDir;
+String Configuration::StatePath;
+String Configuration::VarsPath;
+String Configuration::ZonesDir;
+
+/* deprecated */
+String Configuration::LocalStateDir;
+String Configuration::RunDir;
+String Configuration::SysconfDir;
+
+/* internal */
+bool Configuration::m_ReadOnly{false};
+
+template<typename T>
+void HandleUserWrite(const String& name, T *target, const T& value, bool readOnly)
+{
+       if (readOnly)
+               BOOST_THROW_EXCEPTION(ScriptError("Configuration attribute '" + name + "' is read-only."));
+
+       *target = value;
+}
+
+String Configuration::GetApiBindHost() const
+{
+       return Configuration::ApiBindHost;
+}
+
+void Configuration::SetApiBindHost(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ApiBindHost", &Configuration::ApiBindHost, val, m_ReadOnly);
+}
+
+String Configuration::GetApiBindPort() const
+{
+       return Configuration::ApiBindPort;
+}
+
+void Configuration::SetApiBindPort(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ApiBindPort", &Configuration::ApiBindPort, val, m_ReadOnly);
+}
+
+bool Configuration::GetAttachDebugger() const
+{
+       return Configuration::AttachDebugger;
+}
+
+void Configuration::SetAttachDebugger(bool val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("AttachDebugger", &Configuration::AttachDebugger, val, m_ReadOnly);
+}
+
+String Configuration::GetCacheDir() const
+{
+       return Configuration::CacheDir;
+}
+
+void Configuration::SetCacheDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("CacheDir", &Configuration::CacheDir, val, m_ReadOnly);
+}
+
+int Configuration::GetConcurrency() const
+{
+       return Configuration::Concurrency;
+}
+
+void Configuration::SetConcurrency(int val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("Concurrency", &Configuration::Concurrency, val, m_ReadOnly);
+}
+
+String Configuration::GetConfigDir() const
+{
+       return Configuration::ConfigDir;
+}
+
+void Configuration::SetConfigDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ConfigDir", &Configuration::ConfigDir, val, m_ReadOnly);
+}
+
+String Configuration::GetDataDir() const
+{
+       return Configuration::DataDir;
+}
+
+void Configuration::SetDataDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("DataDir", &Configuration::DataDir, val, m_ReadOnly);
+}
+
+String Configuration::GetEventEngine() const
+{
+       return Configuration::EventEngine;
+}
+
+void Configuration::SetEventEngine(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("EventEngine", &Configuration::EventEngine, val, m_ReadOnly);
+}
+
+String Configuration::GetIncludeConfDir() const
+{
+       return Configuration::IncludeConfDir;
+}
+
+void Configuration::SetIncludeConfDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("IncludeConfDir", &Configuration::IncludeConfDir, val, m_ReadOnly);
+}
+
+String Configuration::GetInitRunDir() const
+{
+       return Configuration::InitRunDir;
+}
+
+void Configuration::SetInitRunDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("InitRunDir", &Configuration::InitRunDir, val, m_ReadOnly);
+}
+
+String Configuration::GetLogDir() const
+{
+       return Configuration::LogDir;
+}
+
+void Configuration::SetLogDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("LogDir", &Configuration::LogDir, val, m_ReadOnly);
+}
+
+String Configuration::GetModAttrPath() const
+{
+       return Configuration::ModAttrPath;
+}
+
+void Configuration::SetModAttrPath(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ModAttrPath", &Configuration::ModAttrPath, val, m_ReadOnly);
+}
+
+String Configuration::GetObjectsPath() const
+{
+       return Configuration::ObjectsPath;
+}
+
+void Configuration::SetObjectsPath(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ObjectsPath", &Configuration::ObjectsPath, val, m_ReadOnly);
+}
+
+String Configuration::GetPidPath() const
+{
+       return Configuration::PidPath;
+}
+
+void Configuration::SetPidPath(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("PidPath", &Configuration::PidPath, val, m_ReadOnly);
+}
+
+String Configuration::GetPkgDataDir() const
+{
+       return Configuration::PkgDataDir;
+}
+
+void Configuration::SetPkgDataDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("PkgDataDir", &Configuration::PkgDataDir, val, m_ReadOnly);
+}
+
+String Configuration::GetPrefixDir() const
+{
+       return Configuration::PrefixDir;
+}
+
+void Configuration::SetPrefixDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("PrefixDir", &Configuration::PrefixDir, val, m_ReadOnly);
+}
+
+String Configuration::GetProgramData() const
+{
+       return Configuration::ProgramData;
+}
+
+void Configuration::SetProgramData(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ProgramData", &Configuration::ProgramData, val, m_ReadOnly);
+}
+
+int Configuration::GetRLimitFiles() const
+{
+       return Configuration::RLimitFiles;
+}
+
+void Configuration::SetRLimitFiles(int val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("RLimitFiles", &Configuration::RLimitFiles, val, m_ReadOnly);
+}
+
+int Configuration::GetRLimitProcesses() const
+{
+       return RLimitProcesses;
+}
+
+void Configuration::SetRLimitProcesses(int val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("RLimitProcesses", &Configuration::RLimitProcesses, val, m_ReadOnly);
+}
+
+int Configuration::GetRLimitStack() const
+{
+       return Configuration::RLimitStack;
+}
+
+void Configuration::SetRLimitStack(int val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("RLimitStack", &Configuration::RLimitStack, val, m_ReadOnly);
+}
+
+String Configuration::GetRunAsGroup() const
+{
+       return Configuration::RunAsGroup;
+}
+
+void Configuration::SetRunAsGroup(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("RunAsGroup", &Configuration::RunAsGroup, val, m_ReadOnly);
+}
+
+String Configuration::GetRunAsUser() const
+{
+       return Configuration::RunAsUser;
+}
+
+void Configuration::SetRunAsUser(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("RunAsUser", &Configuration::RunAsUser, val, m_ReadOnly);
+}
+
+String Configuration::GetSpoolDir() const
+{
+       return Configuration::SpoolDir;
+}
+
+void Configuration::SetSpoolDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("SpoolDir", &Configuration::SpoolDir, val, m_ReadOnly);
+}
+
+String Configuration::GetStatePath() const
+{
+       return Configuration::StatePath;
+}
+
+void Configuration::SetStatePath(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("StatePath", &Configuration::StatePath, val, m_ReadOnly);
+}
+
+String Configuration::GetVarsPath() const
+{
+       return Configuration::VarsPath;
+}
+
+void Configuration::SetVarsPath(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("VarsPath", &Configuration::VarsPath, val, m_ReadOnly);
+}
+
+String Configuration::GetZonesDir() const
+{
+       return Configuration::ZonesDir;
+}
+
+void Configuration::SetZonesDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("ZonesDir", &Configuration::ZonesDir, val, m_ReadOnly);
+}
+
+String Configuration::GetLocalStateDir() const
+{
+       return Configuration::LocalStateDir;
+}
+
+void Configuration::SetLocalStateDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("LocalStateDir", &Configuration::LocalStateDir, val, m_ReadOnly);
+}
+
+String Configuration::GetSysconfDir() const
+{
+       return Configuration::SysconfDir;
+}
+
+void Configuration::SetSysconfDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("SysconfDir", &Configuration::SysconfDir, val, m_ReadOnly);
+}
+
+String Configuration::GetRunDir() const
+{
+       return Configuration::RunDir;
+}
+
+void Configuration::SetRunDir(const String& val, bool suppress_events, const Value& cookie)
+{
+       HandleUserWrite("RunDir", &Configuration::RunDir, val, m_ReadOnly);
+}
+
+bool Configuration::GetReadOnly()
+{
+       return m_ReadOnly;
+}
+
+void Configuration::SetReadOnly(bool readOnly)
+{
+       m_ReadOnly = readOnly;
+}
diff --git a/lib/base/configuration.hpp b/lib/base/configuration.hpp
new file mode 100644 (file)
index 0000000..02a516b
--- /dev/null
@@ -0,0 +1,169 @@
+/******************************************************************************
+ * Icinga 2                                                                   *
+ * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
+ *                                                                            *
+ * This program is free software; you can redistribute it and/or              *
+ * modify it under the terms of the GNU General Public License                *
+ * as published by the Free Software Foundation; either version 2             *
+ * of the License, or (at your option) any later version.                     *
+ *                                                                            *
+ * This program is distributed in the hope that it will be useful,            *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
+ * GNU General Public License for more details.                               *
+ *                                                                            *
+ * You should have received a copy of the GNU General Public License          *
+ * along with this program; if not, write to the Free Software Foundation     *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
+ ******************************************************************************/
+
+#ifndef CONFIGURATION_H
+#define CONFIGURATION_H
+
+#include "base/i2-base.hpp"
+#include "base/configuration-ti.hpp"
+
+namespace icinga
+{
+
+/**
+ * Global configuration.
+ *
+ * @ingroup base
+ */
+class Configuration : public ObjectImpl<Configuration>
+{
+public:
+       DECLARE_OBJECT(Configuration);
+
+       String GetApiBindHost() const override;
+       void SetApiBindHost(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetApiBindPort() const override;
+       void SetApiBindPort(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       bool GetAttachDebugger() const override;
+       void SetAttachDebugger(bool value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetCacheDir() const override;
+       void SetCacheDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       int GetConcurrency() const override;
+       void SetConcurrency(int value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetConfigDir() const override;
+       void SetConfigDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetDataDir() const override;
+       void SetDataDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetEventEngine() const override;
+       void SetEventEngine(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetIncludeConfDir() const override;
+       void SetIncludeConfDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetInitRunDir() const override;
+       void SetInitRunDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetLogDir() const override;
+       void SetLogDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetModAttrPath() const override;
+       void SetModAttrPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetObjectsPath() const override;
+       void SetObjectsPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetPidPath() const override;
+       void SetPidPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetPkgDataDir() const override;
+       void SetPkgDataDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetPrefixDir() const override;
+       void SetPrefixDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetProgramData() const override;
+       void SetProgramData(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       int GetRLimitFiles() const override;
+       void SetRLimitFiles(int value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       int GetRLimitProcesses() const override;
+       void SetRLimitProcesses(int value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       int GetRLimitStack() const override;
+       void SetRLimitStack(int value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetRunAsGroup() const override;
+       void SetRunAsGroup(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetRunAsUser() const override;
+       void SetRunAsUser(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetSpoolDir() const override;
+       void SetSpoolDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetStatePath() const override;
+       void SetStatePath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetVarsPath() const override;
+       void SetVarsPath(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetZonesDir() const override;
+       void SetZonesDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       /* deprecated */
+       String GetLocalStateDir() const override;
+       void SetLocalStateDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetSysconfDir() const override;
+       void SetSysconfDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       String GetRunDir() const override;
+       void SetRunDir(const String& value, bool suppress_events = false, const Value& cookie = Empty) override;
+
+       static bool GetReadOnly();
+       static void SetReadOnly(bool readOnly);
+
+       static String ApiBindHost;
+       static String ApiBindPort;
+       static bool AttachDebugger;
+       static String CacheDir;
+       static int Concurrency;
+       static String ConfigDir;
+       static String DataDir;
+       static String EventEngine;
+       static String IncludeConfDir;
+       static String InitRunDir;
+       static String LogDir;
+       static String ModAttrPath;
+       static String ObjectsPath;
+       static String PidPath;
+       static String PkgDataDir;
+       static String PrefixDir;
+       static String ProgramData;
+       static int RLimitFiles;
+       static int RLimitProcesses;
+       static int RLimitStack;
+       static String RunAsGroup;
+       static String RunAsUser;
+       static String SpoolDir;
+       static String StatePath;
+       static String VarsPath;
+       static String ZonesDir;
+
+       /* deprecated */
+       static String LocalStateDir;
+       static String RunDir;
+       static String SysconfDir;
+
+private:
+       static bool m_ReadOnly;
+
+};
+
+}
+
+#endif /* CONFIGURATION_H */
diff --git a/lib/base/configuration.ti b/lib/base/configuration.ti
new file mode 100644 (file)
index 0000000..abcba7d
--- /dev/null
@@ -0,0 +1,176 @@
+/******************************************************************************
+ * Icinga 2                                                                   *
+ * Copyright (C) 2012-2018 Icinga Development Team (https://www.icinga.com/)  *
+ *                                                                            *
+ * This program is free software; you can redistribute it and/or              *
+ * modify it under the terms of the GNU General Public License                *
+ * as published by the Free Software Foundation; either version 2             *
+ * of the License, or (at your option) any later version.                     *
+ *                                                                            *
+ * This program is distributed in the hope that it will be useful,            *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of             *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              *
+ * GNU General Public License for more details.                               *
+ *                                                                            *
+ * You should have received a copy of the GNU General Public License          *
+ * along with this program; if not, write to the Free Software Foundation     *
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.             *
+ ******************************************************************************/
+
+#include "base/configobject.hpp"
+
+library base;
+
+namespace icinga
+{
+
+abstract class Configuration
+{
+       [config, no_storage, virtual] String ApiBindHost {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String ApiBindPort {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] bool AttachDebugger {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String CacheDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] int Concurrency {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String ConfigDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String DataDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String EventEngine {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String IncludeConfDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String InitRunDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String LogDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String ModAttrPath {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String ObjectsPath {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String PidPath {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String PkgDataDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String PrefixDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String ProgramData {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] int RLimitFiles {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] int RLimitProcesses {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] int RLimitStack {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String RunAsGroup {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String RunAsUser {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String SpoolDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String StatePath {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String VarsPath {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String ZonesDir {
+               get;
+               set;
+       };
+
+       /* deprecated */
+       [config, no_storage, virtual] String LocalStateDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String RunDir {
+               get;
+               set;
+       };
+
+       [config, no_storage, virtual] String SysconfDir {
+               get;
+               set;
+       };
+};
+
+}
index 01f871ec4d73b1b0576672a450d7485e4c58ff99..90407613efa27a345592b20b32798355d9cb7d9e 100644 (file)
@@ -21,6 +21,7 @@
 #include "base/scriptglobal.hpp"
 #include "base/namespace.hpp"
 #include "base/exception.hpp"
+#include "base/configuration.hpp"
 
 using namespace icinga;
 
@@ -36,6 +37,8 @@ INITIALIZE_ONCE_WITH_PRIORITY([]() {
        Namespace::Ptr systemNS = new Namespace(systemNSBehavior);
        globalNS->SetAttribute("System", std::make_shared<ConstEmbeddedNamespaceValue>(systemNS));
 
+       systemNS->SetAttribute("Configuration", std::make_shared<EmbeddedNamespaceValue>(new Configuration()));
+
        auto typesNSBehavior = new ConstNamespaceBehavior();
        typesNSBehavior->Freeze();
        Namespace::Ptr typesNS = new Namespace(typesNSBehavior);
index e54ca0e6facd6673a10a6a9a26a217a54898ccbc..b967a345fff6181ff497df7ff0a507f05169abe7 100644 (file)
@@ -79,7 +79,7 @@ void SocketEventEngine::WakeUpThread(int sid, bool wait)
 
 void SocketEvents::InitializeEngine()
 {
-       String eventEngine = ScriptGlobal::Get("EventEngine", &Empty);
+       String eventEngine = Configuration::EventEngine;
 
        if (eventEngine.IsEmpty())
 #ifdef __linux__
@@ -105,7 +105,7 @@ void SocketEvents::InitializeEngine()
 
        l_SocketIOEngine->Start();
 
-       ScriptGlobal::Set("EventEngine", eventEngine);
+       Configuration::EventEngine = eventEngine;
 }
 
 /**
index 42fc929211912100446732104c8854e64e26cbcb..66abf2b86ff89059eba827c49b591f479d6282c0 100644 (file)
@@ -535,7 +535,7 @@ std::shared_ptr<X509> CreateCert(EVP_PKEY *pubkey, X509_NAME *subject, X509_NAME
 
 String GetIcingaCADir()
 {
-       return Application::GetConst("DataDir") + "/ca";
+       return Configuration::DataDir + "/ca";
 }
 
 std::shared_ptr<X509> CreateCertIcingaCA(EVP_PKEY *pubkey, X509_NAME *subject)
index a7739227cb9c7657a94e1f38f978a6cec406b5d3..640a878c9f1939db1a1484a1e24cfff44c647f0b 100644 (file)
@@ -40,7 +40,7 @@ using namespace icinga;
 
 String ApiSetupUtility::GetConfdPath()
 {
-       return Application::GetConst("ConfigDir") + "/conf.d";
+       return Configuration::ConfigDir + "/conf.d";
 }
 
 String ApiSetupUtility::GetApiUsersConfPath()
@@ -80,8 +80,8 @@ bool ApiSetupUtility::SetupMasterCertificates(const String& cn)
        String pki_path = ApiListener::GetCertsDir();
        Utility::MkDirP(pki_path, 0700);
 
-       String user = ScriptGlobal::Get("RunAsUser");
-       String group = ScriptGlobal::Get("RunAsGroup");
+       String user = Configuration::RunAsUser;
+       String group = Configuration::RunAsGroup;
 
        if (!Utility::SetFileOwnership(pki_path, user, group)) {
                Log(LogWarning, "cli")
index ba20eb82341433222d22b446ca7d7e90c9653e9a..0cf7d3b918d0862e656712d67379ddb8d5dd1071 100644 (file)
@@ -72,7 +72,7 @@ static bool Daemonize()
                do {
                        Utility::Sleep(0.1);
 
-                       readpid = Application::ReadPidFile(Application::GetConst("PidPath"));
+                       readpid = Application::ReadPidFile(Configuration::PidPath);
                        ret = waitpid(pid, &status, WNOHANG);
                } while (readpid != pid && ret == 0);
 
@@ -193,7 +193,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
                << ")";
 
        if (!vm.count("validate") && !vm.count("reload-internal")) {
-               pid_t runningpid = Application::ReadPidFile(Application::GetConst("PidPath"));
+               pid_t runningpid = Application::ReadPidFile(Configuration::PidPath);
                if (runningpid > 0) {
                        Log(LogCritical, "cli")
                                << "Another instance of Icinga already running with PID " << runningpid;
@@ -206,7 +206,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
                configs = vm["config"].as<std::vector<std::string> >();
        else if (!vm.count("no-config")) {
                /* The implicit string assignment is needed for Windows builds. */
-               String configDir = Application::GetConst("ConfigDir");
+               String configDir = Configuration::ConfigDir;
                configs.push_back(configDir + "/icinga2.conf");
        }
 
@@ -214,7 +214,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
 
        std::vector<ConfigItem::Ptr> newItems;
 
-       if (!DaemonUtility::LoadConfigFiles(configs, newItems, Application::GetConst("ObjectsPath"), Application::GetConst("VarsPath")))
+       if (!DaemonUtility::LoadConfigFiles(configs, newItems, Configuration::ObjectsPath, Configuration::VarsPath))
                return EXIT_FAILURE;
 
        if (vm.count("validate")) {
@@ -256,7 +256,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
 
        /* restore the previous program state */
        try {
-               ConfigObject::RestoreObjects(Application::GetConst("StatePath"));
+               ConfigObject::RestoreObjects(Configuration::StatePath);
        } catch (const std::exception& ex) {
                Log(LogCritical, "cli")
                        << "Failed to restore state file: " << DiagnosticInformation(ex);
@@ -264,7 +264,7 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
        }
 
        {
-               WorkQueue upq(25000, Application::GetConcurrency());
+               WorkQueue upq(25000, Configuration::Concurrency);
                upq.SetName("DaemonCommand::Run");
 
                // activate config only after daemonization: it starts threads and that is not compatible with fork()
index 64d8b17c8e6e3b56f396070211c2719505e7edda..ea1630c8ad9083ac313179f505b5ff75ede7f7b4 100644 (file)
@@ -121,7 +121,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector<std::string>& configs,
         * unfortunately moving it there is somewhat non-trivial. */
        success = true;
 
-       String zonesEtcDir = Application::GetConst("ZonesDir");
+       String zonesEtcDir = Configuration::ZonesDir;
        if (!zonesEtcDir.IsEmpty() && Utility::PathExists(zonesEtcDir))
                Utility::Glob(zonesEtcDir + "/*", std::bind(&IncludeZoneDirRecursive, _1, "_etc", std::ref(success)), GlobDirectory);
 
@@ -130,7 +130,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector<std::string>& configs,
 
        /* Load package config files - they may contain additional zones which
         * are authoritative on this node and are checked in HasZoneConfigAuthority(). */
-       String packagesVarDir = Application::GetConst("DataDir") + "/api/packages";
+       String packagesVarDir = Configuration::DataDir + "/api/packages";
        if (Utility::PathExists(packagesVarDir))
                Utility::Glob(packagesVarDir + "/*", std::bind(&IncludePackage, _1, std::ref(success)), GlobDirectory);
 
@@ -138,7 +138,7 @@ bool DaemonUtility::ValidateConfigFiles(const std::vector<std::string>& configs,
                return false;
 
        /* Load cluster synchronized configuration files */
-       String zonesVarDir = Application::GetConst("DataDir") + "/api/zones";
+       String zonesVarDir = Configuration::DataDir + "/api/zones";
        if (Utility::PathExists(zonesVarDir))
                Utility::Glob(zonesVarDir + "/*", std::bind(&IncludeNonLocalZone, _1, "_cluster", std::ref(success)), GlobDirectory);
 
@@ -174,7 +174,7 @@ bool DaemonUtility::LoadConfigFiles(const std::vector<std::string>& configs,
                return false;
        }
 
-       WorkQueue upq(25000, Application::GetConcurrency());
+       WorkQueue upq(25000, Configuration::Concurrency);
        upq.SetName("DaemonUtility::LoadConfigFiles");
        bool result = ConfigItem::CommitItems(ascope.GetContext(), upq, newItems);
 
index e01834c70ca3216a0f28cbad2ba3d3276b7d3b08..74c7a75bd1ba80f519adffbfa4019a7157f641c1 100644 (file)
@@ -31,12 +31,12 @@ using namespace icinga;
 
 String FeatureUtility::GetFeaturesAvailablePath()
 {
-       return Application::GetConst("ConfigDir") + "/features-available";
+       return Configuration::ConfigDir + "/features-available";
 }
 
 String FeatureUtility::GetFeaturesEnabledPath()
 {
-       return Application::GetConst("ConfigDir") + "/features-enabled";
+       return Configuration::ConfigDir + "/features-enabled";
 }
 
 std::vector<String> FeatureUtility::GetFieldCompletionSuggestions(const String& word, bool enable)
index 652f70f28396d5cee92755b91455d1d00d1e3019..86581e6ea7c8500115e9fe943bdf36adfb0d19dd 100644 (file)
@@ -353,8 +353,8 @@ int NodeSetupCommand::SetupNode(const boost::program_options::variables_map& vm,
        String certsDir = ApiListener::GetCertsDir();
        Utility::MkDirP(certsDir, 0700);
 
-       String user = ScriptGlobal::Get("RunAsUser");
-       String group = ScriptGlobal::Get("RunAsGroup");
+       String user = Configuration::RunAsUser;
+       String group = Configuration::RunAsGroup;
 
        if (!Utility::SetFileOwnership(certsDir, user, group)) {
                Log(LogWarning, "cli")
index 25998825961ab38b9f00c54f7aab6c182fd05916..101607fe0045e11b5675685df5da3930d9ffe169 100644 (file)
@@ -43,12 +43,12 @@ using namespace icinga;
 
 String NodeUtility::GetConstantsConfPath()
 {
-       return Application::GetConst("ConfigDir") + "/constants.conf";
+       return Configuration::ConfigDir + "/constants.conf";
 }
 
 String NodeUtility::GetZonesConfPath()
 {
-       return Application::GetConst("ConfigDir") + "/zones.conf";
+       return Configuration::ConfigDir + "/zones.conf";
 }
 
 /*
@@ -170,8 +170,8 @@ bool NodeUtility::WriteNodeConfigObjects(const String& filename, const Array::Pt
 
        Utility::MkDirP(path, 0755);
 
-       String user = ScriptGlobal::Get("RunAsUser");
-       String group = ScriptGlobal::Get("RunAsGroup");
+       String user = Configuration::RunAsUser;
+       String group = Configuration::RunAsGroup;
 
        if (!Utility::SetFileOwnership(path, user, group)) {
                Log(LogWarning, "cli")
@@ -274,7 +274,7 @@ void NodeUtility::SerializeObject(std::ostream& fp, const Dictionary::Ptr& objec
  */
 bool NodeUtility::UpdateConfiguration(const String& value, bool include, bool recursive)
 {
-       String configurationFile = Application::GetConst("ConfigDir") + "/icinga2.conf";
+       String configurationFile = Configuration::ConfigDir + "/icinga2.conf";
 
        Log(LogInformation, "cli")
                << "Updating '" << value << "' include in '" << configurationFile << "'.";
index 11e035aa7231ef230f526461d7c0ed0f4df8ea90..96beba825b6356d6ccb5704ba16ef4c486694374 100644 (file)
@@ -272,8 +272,8 @@ wizard_endpoint_loop_start:
        String certsDir = ApiListener::GetCertsDir();
        Utility::MkDirP(certsDir, 0700);
 
-       String user = ScriptGlobal::Get("RunAsUser");
-       String group = ScriptGlobal::Get("RunAsGroup");
+       String user = Configuration::RunAsUser;
+       String group = Configuration::RunAsGroup;
 
        if (!Utility::SetFileOwnership(certsDir, user, group)) {
                Log(LogWarning, "cli")
@@ -850,7 +850,7 @@ wizard_global_zone_loop_start:
                }
 
                /* Include api-users.conf */
-               String apiUsersFilePath = Application::GetConst("ConfigDir") + "/conf.d/api-users.conf";
+               String apiUsersFilePath = Configuration::ConfigDir + "/conf.d/api-users.conf";
 
                std::cout << ConsoleColorTag(Console_Bold | Console_ForegroundGreen)
                        << "Checking if the api-users.conf file exists...\n"
index f5c347eed2f244ecf84d4fb1b386858ae32e7f29..32495153a9b450c1f01ae0437d89484ef99fa7f6 100644 (file)
@@ -67,11 +67,11 @@ void ObjectListCommand::InitParameters(boost::program_options::options_descripti
  */
 int ObjectListCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       String objectfile = Application::GetConst("ObjectsPath");
+       String objectfile = Configuration::ObjectsPath;
 
        if (!Utility::PathExists(objectfile)) {
                Log(LogCritical, "cli")
-                       << "Cannot open objects file '" << Application::GetConst("ObjectsPath") << "'.";
+                       << "Cannot open objects file '" << Configuration::ObjectsPath << "'.";
                Log(LogCritical, "cli", "Run 'icinga2 daemon -C' to validate config and generate the cache file.");
                return 1;
        }
index 2770b5588e0d2ccb217d51897ea7d3226180ec70..1e9892d9c11a7d170fdcb3c9bb59fddb38de4ada 100644 (file)
@@ -147,26 +147,26 @@ bool TroubleshootCommand::GeneralInfo(InfoLog& log, const boost::program_options
 
        //Application::DisplayInfoMessage() but formatted
        InfoLogLine(log)
-               << "\tApplication version: " << Application::GetConst("AppVersion") << '\n'
+               << "\tApplication version: " << Application::GetAppVersion() << '\n'
                << "\t\n"
-               << "\tConfig directory: " << Application::GetConst("ConfigDir") << "\n"
-               << "\tData directory: " << Application::GetConst("DataDir") << "\n"
-               << "\tLog directory: " << Application::GetConst("LogDir") << "\n"
-               << "\tCache directory: " << Application::GetConst("CacheDir") << "\n"
-               << "\tRun directory: " << Application::GetConst("InitRunDir") << "\n"
+               << "\tConfig directory: " << Configuration::ConfigDir << "\n"
+               << "\tData directory: " << Configuration::DataDir << "\n"
+               << "\tLog directory: " << Configuration::LogDir << "\n"
+               << "\tCache directory: " << Configuration::CacheDir << "\n"
+               << "\tRun directory: " << Configuration::InitRunDir << "\n"
                << "\t\n"
                << "Old paths (deprecated):\n"
-               << "\tInstallation root: " << Application::GetConst("PrefixDir") << '\n'
-               << "\tSysconf directory: " << Application::GetConst("SysconfDir") << '\n'
-               << "\tRun directory: " << Application::GetConst("RunDir") << '\n'
-               << "\tLocal state directory: " << Application::GetConst("LocalStateDir") << '\n'
+               << "\tInstallation root: " << Configuration::PrefixDir << '\n'
+               << "\tSysconf directory: " << Configuration::SysconfDir << '\n'
+               << "\tRun directory: " << Configuration::RunDir << '\n'
+               << "\tLocal state directory: " << Configuration::LocalStateDir << '\n'
                << "\t\n"
                << "Internal paths:\n"
-               << "\tPackage data directory: " << Application::GetConst("PkgDataDir") << '\n'
-               << "\tState path: " << Application::GetConst("StatePath") << '\n'
-               << "\tObjects path: " << Application::GetConst("ObjectsPath") << '\n'
-               << "\tVars path: " << Application::GetConst("VarsPath") << '\n'
-               << "\tPID path: " << Application::GetConst("PidPath") << '\n';
+               << "\tPackage data directory: " << Configuration::PkgDataDir << '\n'
+               << "\tState path: " << Configuration::StatePath << '\n'
+               << "\tObjects path: " << Configuration::ObjectsPath << '\n'
+               << "\tVars path: " << Configuration::VarsPath << '\n'
+               << "\tPID path: " << Configuration::PidPath << '\n';
 
        InfoLogLine(log)
                << '\n';
@@ -186,7 +186,7 @@ bool TroubleshootCommand::ObjectInfo(InfoLog& log, const boost::program_options:
        InfoLogLine(log, Console_ForegroundBlue)
                << std::string(14, '=') << " OBJECT INFORMATION " << std::string(14, '=') << "\n\n";
 
-       String objectfile = Application::GetConst("ObjectsPath");
+       String objectfile = Configuration::ObjectsPath;
        std::set<String> configs;
 
        if (!Utility::PathExists(objectfile)) {
@@ -262,14 +262,14 @@ bool TroubleshootCommand::ConfigInfo(InfoLog& log, const boost::program_options:
        InfoLogLine(log)
                << "A collection of important configuration files follows, please make sure to remove any sensitive data such as credentials, internal company names, etc\n";
 
-       if (!PrintFile(log, Application::GetConst("ConfigDir") + "/icinga2.conf")) {
+       if (!PrintFile(log, Configuration::ConfigDir + "/icinga2.conf")) {
                InfoLogLine(log, 0, LogWarning)
                        << "icinga2.conf not found, therefore skipping validation.\n"
                        << "If you are using an icinga2.conf somewhere but the default path please validate it via 'icinga2 daemon -C -c \"path\to/icinga2.conf\"'\n"
                        << "and provide it with your support request.\n";
        }
 
-       if (!PrintFile(log, Application::GetConst("ConfigDir") + "/zones.conf")) {
+       if (!PrintFile(log, Configuration::ConfigDir + "/zones.conf")) {
                InfoLogLine(log, 0, LogWarning)
                        << "zones.conf not found.\n"
                        << "If you are using a zones.conf somewhere but the default path please provide it with your support request\n";
@@ -380,7 +380,7 @@ void TroubleshootCommand::GetLatestReport(const String& filename, time_t& bestTi
 
 bool TroubleshootCommand::PrintCrashReports(InfoLog& log)
 {
-       String spath = Application::GetConst("LogDir") + "/crash/report.*";
+       String spath = Configuration::LogDir + "/crash/report.*";
        time_t bestTimestamp = 0;
        String bestFilename;
 
@@ -393,7 +393,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log)
                if (int const * err = boost::get_error_info<errinfo_win32_error>(ex)) {
                        if (*err != 3) {//Error code for path does not exist
                                InfoLogLine(log, 0, LogWarning)
-                                       << Application::GetConst("LogDir") + "/crash/ does not exist\n";
+                                       << Configuration::LogDir + "/crash/ does not exist\n";
 
                                return false;
                        }
@@ -406,7 +406,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log)
 #else
        catch (...) {
                InfoLogLine(log, 0, LogWarning) << "Error printing crash reports.\n"
-                       << "Does " << Application::GetConst("LogDir") + "/crash/ exist?\n";
+                       << "Does " << Configuration::LogDir + "/crash/ exist?\n";
 
                return false;
        }
@@ -414,7 +414,7 @@ bool TroubleshootCommand::PrintCrashReports(InfoLog& log)
 
        if (!bestTimestamp)
                InfoLogLine(log, Console_ForegroundYellow)
-                       << "No crash logs found in " << Application::GetConst("LogDir") << "/crash/\n\n";
+                       << "No crash logs found in " << Configuration::LogDir << "/crash/\n\n";
        else {
                InfoLogLine(log)
                        << "Latest crash report is from " << Utility::FormatDateTime("%Y-%m-%d %H:%M:%S", Utility::GetTime()) << '\n'
@@ -454,8 +454,8 @@ bool TroubleshootCommand::PrintFile(InfoLog& log, const String& path)
 
 bool TroubleshootCommand::CheckConfig()
 {
-       String configDir = Application::GetConst("ConfigDir");
-       String objectsPath = Application::GetConst("ObjectsPath");
+       String configDir = Configuration::ConfigDir;
+       String objectsPath = Configuration::ObjectsPath;
        return DaemonUtility::ValidateConfigFiles({ configDir + "/icinga2.conf" }, objectsPath);
 }
 
@@ -622,10 +622,10 @@ void TroubleshootCommand::InitParameters(boost::program_options::options_descrip
 int TroubleshootCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
 #ifdef _WIN32 //Dislikes ':' in filenames
-       String path = Application::GetConst("LogDir") + "/troubleshooting-"
+       String path = Configuration::LogDir + "/troubleshooting-"
                + Utility::FormatDateTime("%Y-%m-%d_%H-%M-%S", Utility::GetTime()) + ".log";
 #else
-       String path = Application::GetConst("LogDir") + "/troubleshooting-"
+       String path = Configuration::LogDir + "/troubleshooting-"
                + Utility::FormatDateTime("%Y-%m-%d_%H:%M:%S", Utility::GetTime()) + ".log";
 #endif /*_WIN32*/
 
index 8557701480a333843b1d7490934ae38e62103b8b..72e5b58b47d91b197ceccade744cdb457730533a 100644 (file)
@@ -75,7 +75,7 @@ int VariableGetCommand::Run(const boost::program_options::variables_map& vm, con
                return 0;
        }
 
-       String varsfile = Application::GetConst("VarsPath");
+       String varsfile = Configuration::VarsPath;
 
        if (!Utility::PathExists(varsfile)) {
                Log(LogCritical, "cli")
index 9ebbadf119c44777faf1a838740cb7170b955308..612f912f8528643d844c59b250edf3465750975b 100644 (file)
@@ -53,7 +53,7 @@ String VariableListCommand::GetShortDescription() const
  */
 int VariableListCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
 {
-       String varsfile = Application::GetConst("VarsPath");
+       String varsfile = Configuration::VarsPath;
 
        if (!Utility::PathExists(varsfile)) {
                Log(LogCritical, "cli")
index ed9bd770da202d019163a132b47b00f2df379eae..1c03f25d7abd0f10bfb1c5f38f2bb833213097a2 100644 (file)
@@ -31,7 +31,7 @@ using namespace icinga;
 
 Value VariableUtility::GetVariable(const String& name)
 {
-       String varsfile = Application::GetConst("VarsPath");
+       String varsfile = Configuration::VarsPath;
 
        std::fstream fp;
        fp.open(varsfile.CStr(), std::ios_base::in);
@@ -61,7 +61,7 @@ Value VariableUtility::GetVariable(const String& name)
 
 void VariableUtility::PrintVariables(std::ostream& outfp)
 {
-       String varsfile = Application::GetConst("VarsPath");
+       String varsfile = Configuration::VarsPath;
 
        std::fstream fp;
        fp.open(varsfile.CStr(), std::ios_base::in);
index cc558a55341c253ee9dfbcf6fcb8e49f153ac8b8..1f97c22fd84490a59e2e2ec39c674307fcee0f1a 100644 (file)
@@ -30,7 +30,7 @@ class CheckResultReader : ConfigObject
        activation_priority 100;
 
        [config] String spool_dir {
-               default {{{ return Application::GetConst("DataDir") + "/spool/checkresults/"; }}}
+               default {{{ return Configuration::DataDir + "/spool/checkresults/"; }}}
        };
 };
 
index 4066a72bd27772381bb564c528d9302c35303930..0ea63ad1dc539afdfa412c6caec3fbcc958ef36c 100644 (file)
@@ -30,7 +30,7 @@ class CompatLogger : ConfigObject
        activation_priority 100;
 
        [config] String log_dir {
-               default {{{ return Application::GetConst("LogDir") + "/compat"; }}}
+               default {{{ return Configuration::LogDir + "/compat"; }}}
        };
        [config] String rotation_method {
                default {{{ return "HOURLY"; }}}
index 697b3a0c430c8f2940ccff31868b4ab61cb6edd1..8ff99a5d3cc073878eb30e6a59ada0666da8bbce 100644 (file)
@@ -30,7 +30,7 @@ class ExternalCommandListener : ConfigObject
        activation_priority 100;
 
        [config] String command_path {
-               default {{{ return Application::GetConst("InitRunDir") + "/cmd/icinga2.cmd"; }}}
+               default {{{ return Configuration::InitRunDir + "/cmd/icinga2.cmd"; }}}
        };
 };
 
index e5a4578ac3d5cfa5fbc2c1b2bcf3706fdb88bbb0..b2b8ce37605847af4e0e43bbe63cbe0a11bf4cbc 100644 (file)
@@ -559,7 +559,7 @@ void StatusDataWriter::UpdateObjectsCache()
 {
        CONTEXT("Writing objects.cache file");
 
-       String objectsPath = Application::GetConst("ObjectsPath");
+       String objectsPath = Configuration::ObjectsPath;
 
        std::fstream objectfp;
        String tempObjectsPath = Utility::CreateTempFile(objectsPath + ".XXXXXX", 0644, objectfp);
index 846834f31b16cb39171c558fe4ac5576dcf1192b..db81940ed3f64063febcd12ede54bc678f7fed90 100644 (file)
@@ -30,10 +30,10 @@ class StatusDataWriter : ConfigObject
        activation_priority 100;
 
        [config] String status_path {
-               default {{{ return Application::GetConst("CacheDir") + "/status.dat"; }}}
+               default {{{ return Configuration::CacheDir + "/status.dat"; }}}
        };
        [config] String objects_path {
-               default {{{ return Application::GetConst("CacheDir") + "/objects.cache"; }}}
+               default {{{ return Configuration::CacheDir + "/objects.cache"; }}}
        };
        [config] double update_interval {
                default {{{ return 15; }}}
index 53c889b4d774b7f65a90773361c5febad1525529..47b7e327cdf86a3bf5a52eec643a262467400ad9 100644 (file)
@@ -577,8 +577,8 @@ bool ConfigItem::ActivateItems(WorkQueue& upq, const std::vector<ConfigItem::Ptr
 
        if (withModAttrs) {
                /* restore modified attributes */
-               if (Utility::PathExists(Application::GetConst("ModAttrPath"))) {
-                       std::unique_ptr<Expression> expression = ConfigCompiler::CompileFile(Application::GetConst("ModAttrPath"));
+               if (Utility::PathExists(Configuration::ModAttrPath)) {
+                       std::unique_ptr<Expression> expression = ConfigCompiler::CompileFile(Configuration::ModAttrPath);
 
                        if (expression) {
                                try {
@@ -675,7 +675,7 @@ bool ConfigItem::RunWithActivationContext(const Function::Ptr& function)
 
        function->Invoke();
 
-       WorkQueue upq(25000, Application::GetConcurrency());
+       WorkQueue upq(25000, Configuration::Concurrency);
        upq.SetName("ConfigItem::RunWithActivationContext");
 
        std::vector<ConfigItem::Ptr> newItems;
index 7600b130e586547ceb1b03e758734c324ef974a7..e3910488e39937752a3d69768d468ded86c7c6c8 100644 (file)
@@ -121,6 +121,7 @@ VariableExpression::VariableExpression(String variable, std::vector<std::shared_
        : DebuggableExpression(debugInfo), m_Variable(std::move(variable)), m_Imports(std::move(imports))
 {
        m_Imports.push_back(MakeIndexer(ScopeGlobal, "System"));
+       m_Imports.push_back(std::unique_ptr<Expression>(new IndexerExpression(MakeIndexer(ScopeGlobal, "System"), MakeLiteral("Configuration"))));
        m_Imports.push_back(MakeIndexer(ScopeGlobal, "Types"));
        m_Imports.push_back(MakeIndexer(ScopeGlobal, "Icinga"));
 }
index fab5187a6b75d4b14db7889a1649c2d2be5f3f37..28ca04bbd724a48b79ef7de4347df913f0194247 100644 (file)
@@ -163,13 +163,13 @@ static void PersistModAttrHelper(std::fstream& fp, ConfigObject::Ptr& previousOb
 
 void IcingaApplication::DumpProgramState()
 {
-       ConfigObject::DumpObjects(GetConst("StatePath"));
+       ConfigObject::DumpObjects(Configuration::StatePath);
        DumpModifiedAttributes();
 }
 
 void IcingaApplication::DumpModifiedAttributes()
 {
-       String path = GetConst("ModAttrPath");
+       String path = Configuration::ModAttrPath;
 
        std::fstream fp;
        String tempFilename = Utility::CreateTempFile(path + ".XXXXXX", 0644, fp);
index 1a4729d5e56ad22a2f8b153dcb512f06e1f7c560..5c886176ec93f9d9ed8f8a4657f6890470c631f5 100644 (file)
@@ -32,7 +32,7 @@ class LivestatusListener : ConfigObject {
                default {{{ return "unix"; }}}
        };
        [config] String socket_path {
-               default {{{ return Application::GetConst("InitRunDir") + "/cmd/livestatus"; }}}
+               default {{{ return Configuration::InitRunDir + "/cmd/livestatus"; }}}
        };
        [config] String bind_host {
                default {{{ return "127.0.0.1"; }}}
@@ -41,7 +41,7 @@ class LivestatusListener : ConfigObject {
                default {{{ return "6558"; }}}
        };
        [config] String compat_log_path {
-               default {{{ return Application::GetConst("LogDir") + "/compat"; }}}
+               default {{{ return Configuration::LogDir + "/compat"; }}}
        };
 };
 
index 4b6560291099c366f48d49bbaee97f6a25c24e58..ab0a2b6d683e5f391c11667defe4075da714c735 100644 (file)
@@ -30,16 +30,16 @@ class PerfdataWriter : ConfigObject
        activation_priority 100;
 
        [config] String host_perfdata_path {
-               default {{{ return Application::GetConst("SpoolDir") + "/perfdata/host-perfdata"; }}}
+               default {{{ return Configuration::SpoolDir + "/perfdata/host-perfdata"; }}}
        };
        [config] String service_perfdata_path {
-               default {{{ return Application::GetConst("SpoolDir") + "/perfdata/service-perfdata"; }}}
+               default {{{ return Configuration::SpoolDir + "/perfdata/service-perfdata"; }}}
        };
        [config] String host_temp_path {
-               default {{{ return Application::GetConst("SpoolDir") + "/tmp/host-perfdata"; }}}
+               default {{{ return Configuration::SpoolDir + "/tmp/host-perfdata"; }}}
        };
        [config] String service_temp_path {
-               default {{{ return Application::GetConst("SpoolDir") + "/tmp/service-perfdata"; }}}
+               default {{{ return Configuration::SpoolDir + "/tmp/service-perfdata"; }}}
        };
        [config] String host_format_template {
                default {{{
index 0c898723721960e2d73d31daf19337005fa61700..5d3c1ddb9e1b8278b3a21f8432ddac8b3ed64c52 100644 (file)
@@ -202,7 +202,7 @@ void ApiListener::SyncZoneDir(const Zone::Ptr& zone) const
        if (sumUpdates == 0)
                return;
 
-       String oldDir = Application::GetConst("DataDir") + "/api/zones/" + zone->GetName();
+       String oldDir = Configuration::DataDir + "/api/zones/" + zone->GetName();
 
        Log(LogInformation, "ApiListener")
                << "Copying " << sumUpdates << " zone configuration files for zone '" << zone->GetName() << "' to '" << oldDir << "'.";
@@ -240,7 +240,7 @@ void ApiListener::SendConfigUpdate(const JsonRpcConnection::Ptr& aclient)
        Dictionary::Ptr configUpdateV1 = new Dictionary();
        Dictionary::Ptr configUpdateV2 = new Dictionary();
 
-       String zonesDir = Application::GetConst("DataDir") + "/api/zones";
+       String zonesDir = Configuration::DataDir + "/api/zones";
 
        for (const Zone::Ptr& zone : ConfigType::GetObjectsByType<Zone>()) {
                String zoneDir = zonesDir + "/" + zone->GetName();
@@ -315,7 +315,7 @@ Value ApiListener::ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const D
                        continue;
                }
 
-               String oldDir = Application::GetConst("DataDir") + "/api/zones/" + zone->GetName();
+               String oldDir = Configuration::DataDir + "/api/zones/" + zone->GetName();
 
                Utility::MkDirP(oldDir, 0700);
 
index 8c0abf570fa254d3fdd235d5ff2395678cc5cd96..4dd914470e4999d628456076bea048f1cd0db9b2 100644 (file)
@@ -56,22 +56,22 @@ ApiListener::ApiListener()
 
 String ApiListener::GetApiDir()
 {
-       return Application::GetConst("DataDir") + "/api/";
+       return Configuration::DataDir + "/api/";
 }
 
 String ApiListener::GetCertsDir()
 {
-       return Application::GetConst("DataDir") + "/certs/";
+       return Configuration::DataDir + "/certs/";
 }
 
 String ApiListener::GetCaDir()
 {
-       return Application::GetConst("DataDir") + "/ca/";
+       return Configuration::DataDir + "/ca/";
 }
 
 String ApiListener::GetCertificateRequestsDir()
 {
-       return Application::GetConst("DataDir") + "/certificate-requests/";
+       return Configuration::DataDir + "/certificate-requests/";
 }
 
 String ApiListener::GetDefaultCertPath()
@@ -1479,7 +1479,7 @@ String ApiListener::GetFromZoneName(const Zone::Ptr& fromZone)
 
 void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket)
 {
-       String path = Application::GetConst("CacheDir") + "/api-state.json";
+       String path = Configuration::CacheDir + "/api-state.json";
        std::pair<String, String> details = socket->GetClientAddressDetails();
 
        Utility::SaveJsonFile(path, 0644, new Dictionary({
@@ -1490,7 +1490,7 @@ void ApiListener::UpdateStatusFile(TcpSocket::Ptr socket)
 
 void ApiListener::RemoveStatusFile()
 {
-       String path = Application::GetConst("CacheDir") + "/api-state.json";
+       String path = Configuration::CacheDir + "/api-state.json";
 
        if (Utility::PathExists(path)) {
                if (unlink(path.CStr()) < 0 && errno != ENOENT) {
index 04e4832709434a015fbe918f3efa6b1a68d69943..e4227a6d1d7919d994e2b59b897ed428f855afbf 100644 (file)
@@ -42,10 +42,10 @@ class ApiListener : ConfigObject
        };
 
        [config] String bind_host {
-               default {{{ return Application::GetConst("ApiBindHost"); }}}
+               default {{{ return Configuration::ApiBindHost; }}}
        };
        [config] String bind_port {
-               default {{{ return Application::GetConst("ApiBindPort", "5665"); }}}
+               default {{{ return Configuration::ApiBindPort; }}}
        };
 
        [config] bool accept_config;
index 19b1022e8d66358d9d42954fcc4277b289631c29..34620e1dbab13faef70d1f4cececfd05b848d692 100644 (file)
@@ -30,7 +30,7 @@ using namespace icinga;
 
 String ConfigPackageUtility::GetPackageDir()
 {
-       return Application::GetConst("DataDir") + "/api/packages";
+       return Configuration::DataDir + "/api/packages";
 }
 
 void ConfigPackageUtility::CreatePackage(const String& name)
index aff47a9a91ec84976f14e52fdf8ea89ed715919b..22b49d4b7d01bafc8e4b28edf77c386e822d03b5 100644 (file)
@@ -290,7 +290,10 @@ std::vector<String> ConsoleHandler::GetAutocompletionSuggestions(const String& w
                }
        }
 
-       AddSuggestions(matches, word, "", false, ScriptGlobal::Get("System"));
+       Namespace::Ptr systemNS = ScriptGlobal::Get("System");
+
+       AddSuggestions(matches, word, "", false, systemNS);
+       AddSuggestions(matches, word, "", true, systemNS->Get("Configuration"));
        AddSuggestions(matches, word, "", false, ScriptGlobal::Get("Types"));
        AddSuggestions(matches, word, "", false, ScriptGlobal::Get("Icinga"));
 
index 259679edc18690bb37f5b3eac0e3c16766ff54a0..0022d5072efd9e241fb3ec2a204a04ce68b19633 100644 (file)
@@ -59,7 +59,7 @@ void JsonRpcConnection::StaticInitialize()
        l_JsonRpcConnectionTimeoutTimer->SetInterval(15);
        l_JsonRpcConnectionTimeoutTimer->Start();
 
-       l_JsonRpcConnectionWorkQueueCount = Application::GetConcurrency();
+       l_JsonRpcConnectionWorkQueueCount = Configuration::Concurrency;
        l_JsonRpcConnectionWorkQueues = new WorkQueue[l_JsonRpcConnectionWorkQueueCount];
 
        for (size_t i = 0; i < l_JsonRpcConnectionWorkQueueCount; i++) {