]> granicus.if.org Git - icinga2/commitdiff
livestatus: fix check_command_expanded for hosts table
authorMichael Friedrich <michael.friedrich@netways.de>
Wed, 17 Jul 2013 14:38:31 +0000 (16:38 +0200)
committerMichael Friedrich <michael.friedrich@netways.de>
Wed, 17 Jul 2013 14:38:31 +0000 (16:38 +0200)
refs #4372

components/livestatus/hoststable.cpp

index ef74951743017b9c749df2dcea9124e486282201..27437617b96862cd39adbdc0588a133259b4b7f0 100644 (file)
@@ -215,16 +215,48 @@ Value HostsTable::CheckCommandAccessor(const Value& row)
 Value HostsTable::CheckCommandExpandedAccessor(const Value& row)
 {
        /* use hostcheck service */
-       Service::Ptr hc = static_cast<Host::Ptr>(row)->GetHostCheckService();
+       Host::Ptr host = static_cast<Host::Ptr>(row);
+       Service::Ptr hc = host->GetHostCheckService();
 
        if (!hc)
                return Empty;
 
-       CheckCommand::Ptr checkcommand = hc->GetCheckCommand();
-       if (checkcommand)
-               return checkcommand->GetName(); /* this is the name without '!' args */
+       CheckCommand::Ptr commandObj = hc->GetCheckCommand();
 
-       return Empty;
+       if (!commandObj)
+               return Empty;
+
+       Value raw_command = commandObj->GetCommandLine();
+
+       std::vector<MacroResolver::Ptr> resolvers;
+       resolvers.push_back(commandObj);
+       resolvers.push_back(hc);
+       resolvers.push_back(host);
+       resolvers.push_back(IcingaApplication::GetInstance());
+
+       Value commandLine = MacroProcessor::ResolveMacros(raw_command, resolvers, Dictionary::Ptr(), Utility::EscapeShellCmd);
+
+       String buf;
+       if (commandLine.IsObjectType<Array>()) {
+               Array::Ptr args = commandLine;
+
+               ObjectLock olock(args);
+               String arg;
+               BOOST_FOREACH(arg, args) {
+                       // This is obviously incorrect for non-trivial cases.
+                       String argitem = " \"" + arg + "\"";
+                       boost::algorithm::replace_all(argitem, "\n", "\\n");
+                       buf += argitem;
+               }
+       } else if (!commandLine.IsEmpty()) {
+               String args = Convert::ToString(commandLine);
+               boost::algorithm::replace_all(args, "\n", "\\n");
+               buf += args;
+       } else {
+               buf += "<internal>";
+       }
+
+       return buf;
 }
 
 Value HostsTable::EventHandlerAccessor(const Value& row)