From 70fe95bbba931506a3a0b85c5c2e39b6ec2033e4 Mon Sep 17 00:00:00 2001 From: Michael Friedrich Date: Tue, 28 Oct 2014 21:56:46 +0100 Subject: [PATCH] Cli: Add blacklist/whitelist commands for agent commands refs #7253 --- lib/cli/agentblackandwhitelistcommand.cpp | 110 +++++++++++++++++++++- 1 file changed, 109 insertions(+), 1 deletion(-) diff --git a/lib/cli/agentblackandwhitelistcommand.cpp b/lib/cli/agentblackandwhitelistcommand.cpp index 506175a17..c9bd29645 100644 --- a/lib/cli/agentblackandwhitelistcommand.cpp +++ b/lib/cli/agentblackandwhitelistcommand.cpp @@ -18,8 +18,12 @@ ******************************************************************************/ #include "cli/agentblackandwhitelistcommand.hpp" +#include "cli/agentutility.hpp" #include "base/logger.hpp" #include "base/application.hpp" +#include "base/objectlock.hpp" +#include "base/json.hpp" +#include #include #include #include @@ -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& ap) const { - Log(LogWarning, "cli", "TODO: Not implemented yet."); + String list_path = AgentUtility::GetRepositoryPath() + "/" + m_Type + ".list"; + + Dictionary::Ptr lists = make_shared(); + + 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(); + + String agent_filter = vm["agent"].as(); + String host_filter = vm["host"].as(); + String service_filter; + + host_service->Set("host_filter", host_filter); + + if (vm.count("service")) { + service_filter = vm["service"].as(); + 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(); + String host_filter = vm["host"].as(); + String service_filter; + + if (vm.count("service")) { + service_filter = vm["service"].as(); + } + + 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; }