diff --git a/doc/06-distributed-monitoring.md b/doc/06-distributed-monitoring.md
index 6402a1a3e..985e23fd9 100644
--- a/doc/06-distributed-monitoring.md
+++ b/doc/06-distributed-monitoring.md
@@ -2793,35 +2793,3 @@ Add the global zone `global-templates` in case it did not exist.
global = true
}
EOF
-
-## Using Multiple Environments
-
-In some cases it might be useful to run multiple Icinga instance on the same host. Two potential scenarios include:
-
-* running different versions of the same monitoring configuration (e.g. production and testing)
-* running disparate sets of checks for entirely unrelated monitoring environments (e.g. infrastructure and applications)
-
-Icinga supports these scenarios by providing a global variable called `Environment`. It can be set like any other
-global variable, e.g. in the `constants.conf` file or in a file in a global template zone.
-
-The `Environment` variable can also be set using the `--env` command-line option. Setting the variable this way
-has the added effect that Icinga tries to determine if the `Icinga Environments` add-on is available and
-if so uses its CLI commands to determine the configuration and data paths. This command-line option also has the
-effect of changing the listener port for cluster feature to a random port which is made available to the
-`Icinga Environments` add-on through its `config.json` file.
-
-When Icinga establishes a TLS connection to another cluster instance it automatically uses the SNI extension
-to signal which endpoint it is attempting to connect to. On its own this can already be used to position multiple
-Icinga instances behind a load balancer.
-
-SNI example: `icinga2-client1.localdomain`
-
-However, if the `Environment` variable is non-empty Icinga will append the environment name to the SNI hostname
-like this:
-
-SNI example with environment: `icinga2-client1.localdomain:production`
-
-The Icinga Environments add-on provides a reverse proxy which does SNI-based port multiplexing. I.e., it uses a
-single externally-visible TCP port (usually 5665) and forwards connections to one or more Icinga instances
-which are bound to a local TCP port. It does so by inspecting the environment name that is sent as part of the
-SNI extension.
diff --git a/icinga-app/icinga.cpp b/icinga-app/icinga.cpp
index 957cea61b..404cedf30 100644
--- a/icinga-app/icinga.cpp
+++ b/icinga-app/icinga.cpp
@@ -32,8 +32,6 @@
#include "base/context.hpp"
#include "base/console.hpp"
#include "base/process.hpp"
-#include "base/json.hpp"
-#include "base/tcpsocket.hpp"
#include "config.h"
#include
#include
@@ -48,9 +46,6 @@
# include
# include
# include
-
-# define popen _popen
-# define pclose _pclose
#endif /* _WIN32 */
using namespace icinga;
@@ -220,6 +215,8 @@ static int Main()
Application::DeclareConcurrency(std::thread::hardware_concurrency());
Application::DeclareMaxConcurrentChecks(Application::GetDefaultMaxConcurrentChecks());
+ ScriptGlobal::Set("Environment", "production");
+
ScriptGlobal::Set("AttachDebugger", false);
ScriptGlobal::Set("PlatformKernel", Utility::GetPlatformKernel());
@@ -250,8 +247,7 @@ static int Main()
("include,I", po::value >(), "add include search directory")
("log-level,x", po::value(), "specify the log level for the console log.\n"
"The valid value is either debug, notice, information (default), warning, or critical")
- ("script-debugger,X", "whether to enable the script debugger")
- ("env", po::value(), "the name of the environment, e.g. \"production\"");
+ ("script-debugger,X", "whether to enable the script debugger");
po::options_description hiddenDesc("Hidden options");
@@ -275,99 +271,6 @@ static int Main()
return EXIT_FAILURE;
}
- if (vm.count("env") && vm["env"].as() != "") {
- String env = vm["env"].as();
- ScriptGlobal::Set("Environment", env);
- } else {
-#ifndef _WIN32
- String cmd = "icinga-envs";
-#else /* _WIN32 */
- String cmd = "\"" + Utility::DirName(Application::GetExePath(argv[0])) + "\\icinga-envs.exe" + "\"";
-#endif /* _WIN32 */
- cmd += " get-default";
-#ifndef _WIN32
- cmd += " 2>/dev/null";
-#else /* _WIN32 */
- cmd += " 2>NUL";
- cmd = "\"" + cmd + "\"";
-#endif /* _WIN32 */
-
- FILE *fp = popen(cmd.CStr(), "r");
- std::stringstream msgbuf;
- while (!ferror(fp) && !feof(fp)) {
- char buf[512];
- size_t num = fread(buf, 1, sizeof(buf), fp);
- msgbuf << std::string(buf, buf + num);
- }
- pclose(fp);
-
- String env = msgbuf.str();
- ScriptGlobal::Set("Environment", env.Trim());
- }
-
- String env = ScriptGlobal::Get("Environment", NULL);
-#ifndef _WIN32
- String cmd = "icinga-envs";
-#else /* _WIN32 */
- String cmd = "\"" + Utility::DirName(Application::GetExePath(argv[0])) + "\\icinga-envs.exe" + "\"";
-#endif /* _WIN32 */
- cmd += " info --json " + Utility::EscapeShellArg(env);
-#ifndef _WIN32
- cmd += " 2>/dev/null";
-#else /* _WIN32 */
- cmd += " 2>NUL";
- cmd = "\"" + cmd + "\"";
-#endif /* _WIN32 */
-
- FILE *fp = popen(cmd.CStr(), "r");
- std::stringstream msgbuf;
- while (!ferror(fp) && !feof(fp)) {
- char buf[512];
- size_t num = fread(buf, 1, sizeof(buf), fp);
- msgbuf << std::string(buf, buf + num);
- }
- pclose(fp);
-
- Dictionary::Ptr envInfo;
- try {
- envInfo = JsonDecode(msgbuf.str());
- } catch (const std::exception&) {}
-
- if (envInfo) {
- Dictionary::Ptr config = envInfo->Get("config");
-
- if (!config) {
- Log(LogCritical, "app")
- << "Invalid JSON returned by icinga-envs: " << msgbuf.str();
- return EXIT_FAILURE;
- }
-
- String configPath = config->Get("config_path");
- String dataPath = config->Get("data_path");
-
- ScriptGlobal::Set("SysconfDir", configPath);
- ScriptGlobal::Set("RunDir", dataPath + "/run");
- ScriptGlobal::Set("LocalStateDir", dataPath);
-
- TcpSocket::Ptr agentListener = new TcpSocket();
- agentListener->Bind("127.0.0.1", "0", AF_INET);
- auto pieces = agentListener->GetClientAddress().Split(":");
- config->Set("port", Convert::ToLong(pieces[pieces.size() - 1]));
-
- Dictionary::Ptr envData = new Dictionary({
- { "listener", agentListener },
- { "config", config },
- { "meta_path", envInfo->Get("env_path") + "/config.json" }
- });
-
- // Make the agent listener available to the ApiListener later on
- ScriptGlobal::Set("EnvironmentInfo", envData);
- } else if (env != "") {
- Log(LogCritical, "app")
- << "No such environment exists: " << env;
- return EXIT_FAILURE;
- }
-
#ifdef _WIN32
char username[UNLEN + 1];
DWORD usernameLen = UNLEN + 1;
diff --git a/icinga-installer/icinga2.wixpatch.cmake b/icinga-installer/icinga2.wixpatch.cmake
index ab400ed1e..0666261d2 100644
--- a/icinga-installer/icinga2.wixpatch.cmake
+++ b/icinga-installer/icinga2.wixpatch.cmake
@@ -10,9 +10,9 @@
- $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA
- $CM_CP_sbin.icinga2_installer.exe>2 AND NOT SUPPRESS_XTRA
- $CM_CP_sbin.icinga2_installer.exe=2 AND NOT SUPPRESS_XTRA
+ $CM_CP_sbin.icinga2_installer.exe>2
+ $CM_CP_sbin.icinga2_installer.exe>2
+ $CM_CP_sbin.icinga2_installer.exe=2
diff --git a/lib/cli/apisetupcommand.cpp b/lib/cli/apisetupcommand.cpp
index f13b985a1..bc832c525 100644
--- a/lib/cli/apisetupcommand.cpp
+++ b/lib/cli/apisetupcommand.cpp
@@ -49,14 +49,6 @@ int ApiSetupCommand::GetMaxArguments() const
return -1;
}
-void ApiSetupCommand::InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc) const
-{
- visibleDesc.add_options()
- ("quiet,q", "be less verbose")
- ;
-}
-
/**
* The entry point for the "api setup" CLI command.
*
@@ -64,15 +56,12 @@ void ApiSetupCommand::InitParameters(boost::program_options::options_description
*/
int ApiSetupCommand::Run(const boost::program_options::variables_map& vm, const std::vector& ap) const
{
- if (vm.count("quiet"))
- Logger::SetConsoleLogSeverity(LogWarning);
-
String cn = VariableUtility::GetVariable("NodeName");
if (cn.IsEmpty())
cn = Utility::GetFQDN();
- if (!ApiSetupUtility::SetupMaster(cn, true, vm.count("quiet")))
+ if (!ApiSetupUtility::SetupMaster(cn, true))
return 1;
return 0;
diff --git a/lib/cli/apisetupcommand.hpp b/lib/cli/apisetupcommand.hpp
index fcdb56428..f54da0685 100644
--- a/lib/cli/apisetupcommand.hpp
+++ b/lib/cli/apisetupcommand.hpp
@@ -38,8 +38,6 @@ public:
String GetDescription() const override;
String GetShortDescription() const override;
int GetMaxArguments() const override;
- void InitParameters(boost::program_options::options_description& visibleDesc,
- boost::program_options::options_description& hiddenDesc) const override;
int Run(const boost::program_options::variables_map& vm, const std::vector& ap) const override;
ImpersonationLevel GetImpersonationLevel() const override;
};
diff --git a/lib/cli/apisetuputility.cpp b/lib/cli/apisetuputility.cpp
index 3c7336c16..1b60a2c1a 100644
--- a/lib/cli/apisetuputility.cpp
+++ b/lib/cli/apisetuputility.cpp
@@ -48,7 +48,7 @@ String ApiSetupUtility::GetApiUsersConfPath()
return ApiSetupUtility::GetConfdPath() + "/api-users.conf";
}
-bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart, bool quiet)
+bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart)
{
if (!SetupMasterCertificates(cn))
return false;
@@ -56,13 +56,13 @@ bool ApiSetupUtility::SetupMaster(const String& cn, bool prompt_restart, bool qu
if (!SetupMasterApiUser())
return false;
- if (!SetupMasterEnableApi(quiet))
+ if (!SetupMasterEnableApi())
return false;
if (!SetupMasterUpdateConstants(cn))
return false;
- if (prompt_restart && !quiet) {
+ if (prompt_restart) {
std::cout << "Done.\n\n";
std::cout << "Now restart your Icinga 2 daemon to finish the installation!\n\n";
}
@@ -196,11 +196,11 @@ bool ApiSetupUtility::SetupMasterApiUser()
return true;
}
-bool ApiSetupUtility::SetupMasterEnableApi(bool quiet)
+bool ApiSetupUtility::SetupMasterEnableApi()
{
Log(LogInformation, "cli", "Enabling the 'api' feature.");
- FeatureUtility::EnableFeatures({ "api" }, quiet);
+ FeatureUtility::EnableFeatures({ "api" });
return true;
}
diff --git a/lib/cli/apisetuputility.hpp b/lib/cli/apisetuputility.hpp
index 26b163d90..9523ebffc 100644
--- a/lib/cli/apisetuputility.hpp
+++ b/lib/cli/apisetuputility.hpp
@@ -37,11 +37,11 @@ namespace icinga
class ApiSetupUtility
{
public:
- static bool SetupMaster(const String& cn, bool prompt_restart = false, bool quiet = false);
+ static bool SetupMaster(const String& cn, bool prompt_restart = false);
static bool SetupMasterCertificates(const String& cn);
static bool SetupMasterApiUser();
- static bool SetupMasterEnableApi(bool quiet = false);
+ static bool SetupMasterEnableApi();
static bool SetupMasterUpdateConstants(const String& cn);
static String GetConfdPath();
diff --git a/lib/cli/featureutility.cpp b/lib/cli/featureutility.cpp
index e06690f0d..9056b60fe 100644
--- a/lib/cli/featureutility.cpp
+++ b/lib/cli/featureutility.cpp
@@ -56,7 +56,7 @@ std::vector FeatureUtility::GetFieldCompletionSuggestions(const String&
return suggestions;
}
-int FeatureUtility::EnableFeatures(const std::vector& features, bool quiet)
+int FeatureUtility::EnableFeatures(const std::vector& features)
{
String features_available_dir = GetFeaturesAvailablePath();
String features_enabled_dir = GetFeaturesEnabledPath();
@@ -93,9 +93,8 @@ int FeatureUtility::EnableFeatures(const std::vector& features, boo
continue;
}
- if (!quiet)
- std::cout << "Enabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature
- << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n";
+ std::cout << "Enabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature
+ << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n";
#ifndef _WIN32
String relativeSource = "../features-available/" + feature + ".conf";
@@ -132,7 +131,7 @@ int FeatureUtility::EnableFeatures(const std::vector& features, boo
return 0;
}
-int FeatureUtility::DisableFeatures(const std::vector& features, bool quiet)
+int FeatureUtility::DisableFeatures(const std::vector& features)
{
String features_enabled_dir = GetFeaturesEnabledPath();
@@ -161,9 +160,8 @@ int FeatureUtility::DisableFeatures(const std::vector& features, bo
continue;
}
- if (!quiet)
- std::cout << "Disabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature
- << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n";
+ std::cout << "Disabling feature " << ConsoleColorTag(Console_ForegroundMagenta | Console_Bold) << feature
+ << ConsoleColorTag(Console_Normal) << ". Make sure to restart Icinga 2 for these changes to take effect.\n";
}
if (!errors.empty()) {
diff --git a/lib/cli/featureutility.hpp b/lib/cli/featureutility.hpp
index 23115ccca..38f91cce0 100644
--- a/lib/cli/featureutility.hpp
+++ b/lib/cli/featureutility.hpp
@@ -40,8 +40,8 @@ public:
static std::vector GetFieldCompletionSuggestions(const String& word, bool enable);
- static int EnableFeatures(const std::vector& features, bool quiet = false);
- static int DisableFeatures(const std::vector& features, bool quiet = false);
+ static int EnableFeatures(const std::vector& features);
+ static int DisableFeatures(const std::vector& features);
static int ListFeatures(std::ostream& os = std::cout);
static bool GetFeatures(std::vector& features, bool enable);
diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp
index d1190a703..c1546710d 100644
--- a/lib/remote/apilistener.cpp
+++ b/lib/remote/apilistener.cpp
@@ -224,23 +224,11 @@ void ApiListener::Start(bool runtimeCreated)
OpenLogFile();
}
- Dictionary::Ptr envData = ScriptGlobal::Get("EnvironmentInfo", &Empty);
- if (envData) {
- ScriptGlobal::Set("EnvironmentInfo", Empty);
- TcpSocket::Ptr listener = envData->Get("listener");
- if (!AddListener(listener)) {
- Log(LogCritical, "ApiListener")
- << "Failed to set up pre-configured agent listener.";
- Application::Exit(EXIT_FAILURE);
- }
- Utility::SaveJsonFile(envData->Get("meta_path"), 0600, envData->Get("config"));
- } else {
- /* create the primary JSON-RPC listener */
- if (!AddListener(GetBindHost(), GetBindPort())) {
- Log(LogCritical, "ApiListener")
- << "Cannot add listener on host '" << GetBindHost() << "' for port '" << GetBindPort() << "'.";
- Application::Exit(EXIT_FAILURE);
- }
+ /* create the primary JSON-RPC listener */
+ if (!AddListener(GetBindHost(), GetBindPort())) {
+ Log(LogCritical, "ApiListener")
+ << "Cannot add listener on host '" << GetBindHost() << "' for port '" << GetBindPort() << "'.";
+ Application::Exit(EXIT_FAILURE);
}
m_Timer = new Timer();
@@ -313,33 +301,6 @@ bool ApiListener::IsMaster() const
return master == GetLocalEndpoint();
}
-/**
- * Creates a new JSON-RPC listener using the specified TCP socket object.
- *
- * @param listener The TCP socket to use.
- */
-bool ApiListener::AddListener(const TcpSocket::Ptr& listener)
-{
- ObjectLock olock(this);
-
- std::shared_ptr sslContext = m_SSLContext;
-
- if (!sslContext) {
- Log(LogCritical, "ApiListener", "SSL context is required for AddListener()");
- return false;
- }
-
- Log(LogInformation, "ApiListener")
- << "Adding pre-configured listener on address " << listener->GetClientAddress();
-
- std::thread thread(std::bind(&ApiListener::ListenerThreadProc, this, listener));
- thread.detach();
-
- m_Servers.insert(listener);
-
- return true;
-}
-
/**
* Creates a new JSON-RPC listener on the specified port.
*
diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp
index 41c4c3d23..b3894992a 100644
--- a/lib/remote/apilistener.hpp
+++ b/lib/remote/apilistener.hpp
@@ -138,7 +138,6 @@ private:
void CleanupCertificateRequestsTimerHandler();
bool AddListener(const String& node, const String& service);
- bool AddListener(const TcpSocket::Ptr& listener);
void AddConnection(const Endpoint::Ptr& endpoint);
void NewClientHandler(const Socket::Ptr& client, const String& hostname, ConnectionRole role);