Cli: Add blacklist/whitelist commands for agent commands

refs #7253
This commit is contained in:
Michael Friedrich 2014-10-28 21:56:46 +01:00
parent b344743a9f
commit 70fe95bbba
1 changed files with 109 additions and 1 deletions

View File

@ -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;
} }