]> granicus.if.org Git - icinga2/commitdiff
Cli: Add blacklist/whitelist commands for agent commands
authorMichael Friedrich <michael.friedrich@netways.de>
Tue, 28 Oct 2014 20:56:46 +0000 (21:56 +0100)
committerMichael Friedrich <michael.friedrich@netways.de>
Tue, 28 Oct 2014 21:03:55 +0000 (22:03 +0100)
refs #7253

lib/cli/agentblackandwhitelistcommand.cpp

index 506175a17fbbc22e827d2f451fce05a9411579d5..c9bd29645f0c5e4de3d24212ef1c058e305a447e 100644 (file)
  ******************************************************************************/
 
 #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 <boost/foreach.hpp>
 #include <boost/algorithm/string/case_conv.hpp>
 #include <iostream>
 #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
 {
-       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;
 }