]> granicus.if.org Git - icinga2/blobdiff - components/agent/agentchecktask.cpp
Implement support for hosts in the agent component.
[icinga2] / components / agent / agentchecktask.cpp
index 6b6e3a289da8b848e7cc19f0e63f6ce916dc80d2..58ee20214337a9e35316f4d47c0956c8f77d22fe 100644 (file)
@@ -84,24 +84,41 @@ void AgentCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckResu
        resolvers.push_back(std::make_pair("command", checkable->GetCheckCommand()));
        resolvers.push_back(std::make_pair("icinga", IcingaApplication::GetInstance()));
 
+       String agent_identity = MacroProcessor::ResolveMacros("$agent_identity$", resolvers, checkable->GetLastCheckResult());
        String agent_host = MacroProcessor::ResolveMacros("$agent_host$", resolvers, checkable->GetLastCheckResult());
-       String agent_port = MacroProcessor::ResolveMacros("$agent_port$", resolvers, checkable->GetLastCheckResult());
+       String agent_service = MacroProcessor::ResolveMacros("$agent_service$", resolvers, checkable->GetLastCheckResult());
 
-       if (agent_host.IsEmpty() || agent_port.IsEmpty()) {
-               Log(LogWarning, "agent", "'agent_host' and 'agent_port' must be set for agent checks.");
+       if (agent_identity.IsEmpty() || agent_host.IsEmpty()) {
+               Log(LogWarning, "agent", "'agent_name' and 'agent_host' must be set for agent checks.");
                return;
        }
-       
-       std::pair<String, String> key = std::make_pair(agent_host, agent_port);
+
+       String agent_peer_host = MacroProcessor::ResolveMacros("$agent_peer_host$", resolvers, checkable->GetLastCheckResult());
+       String agent_peer_port = MacroProcessor::ResolveMacros("$agent_peer_port$", resolvers, checkable->GetLastCheckResult());
        
        double now = Utility::GetTime();
        
+       BOOST_FOREACH(const AgentListener::Ptr& al, DynamicType::GetObjects<AgentListener>()) {
+               double seen = al->GetAgentSeen(agent_identity);
+
+               if (seen < now - 300)
+                       continue;
+
+               CheckResult::Ptr cr = al->GetCheckResult(agent_identity, agent_host, agent_service);
+
+               if (cr) {
+                       checkable->ProcessCheckResult(cr);
+                       return;
+               }
+       }
+       
        {
                boost::mutex::scoped_lock lock(l_Mutex);
                l_PendingChecks[checkable] = now;
        }
-       
+
        BOOST_FOREACH(const AgentListener::Ptr& al, DynamicType::GetObjects<AgentListener>()) {
-               al->AddConnection(agent_host, agent_port);
+               if (!agent_peer_host.IsEmpty() && !agent_peer_port.IsEmpty())
+                       al->AddConnection(agent_peer_host, agent_peer_port);
        }
 }