mirror of https://github.com/Icinga/icinga2.git
parent
b344743a9f
commit
70fe95bbba
|
@ -18,8 +18,12 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include "cli/agentblackandwhitelistcommand.hpp"
|
#include "cli/agentblackandwhitelistcommand.hpp"
|
||||||
|
#include "cli/agentutility.hpp"
|
||||||
#include "base/logger.hpp"
|
#include "base/logger.hpp"
|
||||||
#include "base/application.hpp"
|
#include "base/application.hpp"
|
||||||
|
#include "base/objectlock.hpp"
|
||||||
|
#include "base/json.hpp"
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
#include <boost/algorithm/string/case_conv.hpp>
|
#include <boost/algorithm/string/case_conv.hpp>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
@ -120,6 +124,110 @@ void BlackAndWhitelistCommand::InitParameters(boost::program_options::options_de
|
||||||
*/
|
*/
|
||||||
int BlackAndWhitelistCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
|
int BlackAndWhitelistCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const
|
||||||
{
|
{
|
||||||
Log(LogWarning, "cli", "TODO: Not implemented yet.");
|
String list_path = AgentUtility::GetRepositoryPath() + "/" + m_Type + ".list";
|
||||||
|
|
||||||
|
Dictionary::Ptr lists = make_shared<Dictionary>();
|
||||||
|
|
||||||
|
if (Utility::PathExists(list_path)) {
|
||||||
|
lists = Utility::LoadJsonFile(list_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_Command == BlackAndWhitelistCommandAdd) {
|
||||||
|
if (!vm.count("agent")) {
|
||||||
|
Log(LogCritical, "cli", "At least the agent name filter is required!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!vm.count("host")) {
|
||||||
|
Log(LogCritical, "cli", "At least the host name filter is required!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary::Ptr host_service = make_shared<Dictionary>();
|
||||||
|
|
||||||
|
String agent_filter = vm["agent"].as<std::string>();
|
||||||
|
String host_filter = vm["host"].as<std::string>();
|
||||||
|
String service_filter;
|
||||||
|
|
||||||
|
host_service->Set("host_filter", host_filter);
|
||||||
|
|
||||||
|
if (vm.count("service")) {
|
||||||
|
service_filter = vm["service"].as<std::string>();
|
||||||
|
host_service->Set("service_filter", service_filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lists->Contains(agent_filter)) {
|
||||||
|
Dictionary::Ptr stored_host_service = lists->Get(agent_filter);
|
||||||
|
|
||||||
|
if (stored_host_service->Get("host_filter") == host_filter && !vm.count("service")) {
|
||||||
|
Log(LogWarning, "cli")
|
||||||
|
<< "Found agent filter '" << agent_filter << "' with host filter '" << host_filter << "'. Bailing out.";
|
||||||
|
return 1;
|
||||||
|
} else if (stored_host_service->Get("host_filter") == host_filter && stored_host_service->Get("service_filter") == service_filter) {
|
||||||
|
Log(LogWarning, "cli")
|
||||||
|
<< "Found agent filter '" << agent_filter << "' with host filter '" << host_filter << "' and service filter '"
|
||||||
|
<< service_filter << "'. Bailing out.";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lists->Set(agent_filter, host_service);
|
||||||
|
|
||||||
|
Utility::SaveJsonFile(list_path, lists);
|
||||||
|
|
||||||
|
} else if (m_Command == BlackAndWhitelistCommandList) {
|
||||||
|
std::cout << "Listing all " << m_Type << " entries:\n";
|
||||||
|
|
||||||
|
ObjectLock olock(lists);
|
||||||
|
BOOST_FOREACH(const Dictionary::Pair& kv, lists) {
|
||||||
|
String agent_filter = kv.first;
|
||||||
|
Dictionary::Ptr host_service = kv.second;
|
||||||
|
|
||||||
|
std::cout << "Agent " << m_Type << ": '" << agent_filter << "' Host: '"
|
||||||
|
<< host_service->Get("host_filter") << "' Service: '" << host_service->Get("service_filter") << "'.\n";
|
||||||
|
}
|
||||||
|
} else if (m_Command == BlackAndWhitelistCommandRemove) {
|
||||||
|
if (!vm.count("agent")) {
|
||||||
|
Log(LogCritical, "cli", "At least the agent name filter is required!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (!vm.count("host")) {
|
||||||
|
Log(LogCritical, "cli", "At least the host name filter is required!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String agent_filter = vm["agent"].as<std::string>();
|
||||||
|
String host_filter = vm["host"].as<std::string>();
|
||||||
|
String service_filter;
|
||||||
|
|
||||||
|
if (vm.count("service")) {
|
||||||
|
service_filter = vm["service"].as<std::string>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lists->Contains(agent_filter)) {
|
||||||
|
|
||||||
|
Dictionary::Ptr host_service = lists->Get(agent_filter);
|
||||||
|
|
||||||
|
if (host_service->Get("host_filter") == host_filter && !vm.count("service")) {
|
||||||
|
Log(LogInformation, "cli")
|
||||||
|
<< "Found agent filter '" << agent_filter << "' with host filter '" << host_filter << "'. Removing from " << m_Type << ".";
|
||||||
|
lists->Remove(agent_filter);
|
||||||
|
} else if (host_service->Get("host_filter") == host_filter && host_service->Get("service_filter") == service_filter) {
|
||||||
|
Log(LogInformation, "cli")
|
||||||
|
<< "Found agent filter '" << agent_filter << "' with host filter '" << host_filter << "' and service filter '"
|
||||||
|
<< service_filter << "'. Removing from " << m_Type << ".";
|
||||||
|
lists->Remove(agent_filter);
|
||||||
|
} else {
|
||||||
|
Log(LogCritical, "cli", "Cannot remove filter!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log(LogCritical, "cli", "Cannot remove filter!");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Utility::SaveJsonFile(list_path, lists);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue