Value ServicesTable::CustomVariablesAccessor(const Value& row) { Service::Ptr service = static_cast<Service::Ptr>(row); if (!service) return Empty; Dictionary::Ptr vars = service->GetVars(); ArrayData result; if (vars) { ObjectLock olock(vars); for (const Dictionary::Pair& kv : vars) { Value val; if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>()) val = JsonEncode(kv.second); else val = kv.second; result.push_back(new Array({ kv.first, val })); } } return new Array(std::move(result)); }
Value ServicesTable::CustomVariableNamesAccessor(const Value& row) { Service::Ptr service = static_cast<Service::Ptr>(row); if (!service) return Empty; Dictionary::Ptr vars = service->GetVars(); ArrayData result; if (vars) { ObjectLock olock(vars); for (const Dictionary::Pair& kv : vars) { result.push_back(kv.first); } } return new Array(std::move(result)); }
Value ServicesTable::CVIsJsonAccessor(const Value& row) { Service::Ptr service = static_cast<Service::Ptr>(row); if (!service) return Empty; Dictionary::Ptr vars = service->GetVars(); if (!vars) return Empty; bool cv_is_json = false; ObjectLock olock(vars); for (const Dictionary::Pair& kv : vars) { if (kv.second.IsObjectType<Array>() || kv.second.IsObjectType<Dictionary>()) cv_is_json = true; } return cv_is_json; }
/* service */ String CompatUtility::GetCheckableCommandArgs(const Checkable::Ptr& checkable) { CheckCommand::Ptr command = checkable->GetCheckCommand(); Dictionary::Ptr args = new Dictionary(); if (command) { Host::Ptr host; Service::Ptr service; tie(host, service) = GetHostService(checkable); String command_line = GetCommandLine(command); Dictionary::Ptr command_vars = command->GetVars(); if (command_vars) { ObjectLock olock(command_vars); for (const Dictionary::Pair& kv : command_vars) { String macro = "$" + kv.first + "$"; // this is too simple if (command_line.Contains(macro)) args->Set(kv.first, kv.second); } } Dictionary::Ptr host_vars = host->GetVars(); if (host_vars) { ObjectLock olock(host_vars); for (const Dictionary::Pair& kv : host_vars) { String macro = "$" + kv.first + "$"; // this is too simple if (command_line.Contains(macro)) args->Set(kv.first, kv.second); macro = "$host.vars." + kv.first + "$"; if (command_line.Contains(macro)) args->Set(kv.first, kv.second); } } if (service) { Dictionary::Ptr service_vars = service->GetVars(); if (service_vars) { ObjectLock olock(service_vars); for (const Dictionary::Pair& kv : service_vars) { String macro = "$" + kv.first + "$"; // this is too simple if (command_line.Contains(macro)) args->Set(kv.first, kv.second); macro = "$service.vars." + kv.first + "$"; if (command_line.Contains(macro)) args->Set(kv.first, kv.second); } } } String arg_string; ObjectLock olock(args); for (const Dictionary::Pair& kv : args) { arg_string += Convert::ToString(kv.first) + "=" + Convert::ToString(kv.second) + "!"; } return arg_string; } return Empty; }