void VariableUtility::PrintVariables(std::ostream& outfp) { String varsfile = Application::GetVarsPath(); std::fstream fp; fp.open(varsfile.CStr(), std::ios_base::in); StdioStream::Ptr sfp = new StdioStream(&fp, false); unsigned long variables_count = 0; String message; StreamReadContext src; for (;;) { StreamReadStatus srs = NetString::ReadStringFromStream(sfp, &message, src); if (srs == StatusEof) break; if (srs != StatusNewItem) continue; Dictionary::Ptr variable = JsonDecode(message); outfp << variable->Get("name") << " = " << variable->Get("value") << "\n"; variables_count++; } sfp->Close(); fp.close(); Log(LogNotice, "cli") << "Parsed " << variables_count << " variables."; }
String LivestatusQueryHelper(const std::vector<String>& lines) { LivestatusQuery::Ptr query = new LivestatusQuery(lines, ""); std::stringstream stream; StdioStream::Ptr sstream = new StdioStream(&stream, false); query->Execute(sstream); String output; String result; StreamReadContext src; for (;;) { StreamReadStatus srs = sstream->ReadLine(&result, src); if (srs == StatusEof) break; if (srs != StatusNewItem) continue; if (result.GetLength() > 0) output += result + "\n"; else break; } BOOST_TEST_MESSAGE("Query Result: " + output); return output; }
void ConfigObject::RestoreObjects(const String& filename, int attributeTypes) { if (!Utility::PathExists(filename)) return; Log(LogInformation, "ConfigObject") << "Restoring program state from file '" << filename << "'"; std::fstream fp; fp.open(filename.CStr(), std::ios_base::in); StdioStream::Ptr sfp = new StdioStream (&fp, false); unsigned long restored = 0; WorkQueue upq(25000, Application::GetConcurrency()); upq.SetName("ConfigObject::RestoreObjects"); String message; StreamReadContext src; for (;;) { StreamReadStatus srs = NetString::ReadStringFromStream(sfp, &message, src); if (srs == StatusEof) break; if (srs != StatusNewItem) continue; upq.Enqueue(std::bind(&ConfigObject::RestoreObject, message, attributeTypes)); restored++; } sfp->Close(); upq.Join(); unsigned long no_state = 0; for (const Type::Ptr& type : Type::GetAllTypes()) { auto *dtype = dynamic_cast<ConfigType *>(type.get()); if (!dtype) continue; for (const ConfigObject::Ptr& object : dtype->GetObjects()) { if (!object->GetStateLoaded()) { object->OnStateLoaded(); object->SetStateLoaded(true); no_state++; } } } Log(LogInformation, "ConfigObject") << "Restored " << restored << " objects. Loaded " << no_state << " new objects without state."; }
void ConfigObject::DumpObjects(const String& filename, int attributeTypes) { Log(LogInformation, "ConfigObject") << "Dumping program state to file '" << filename << "'"; std::fstream fp; String tempFilename = Utility::CreateTempFile(filename + ".XXXXXX", 0600, fp); fp.exceptions(std::ofstream::failbit | std::ofstream::badbit); if (!fp) BOOST_THROW_EXCEPTION(std::runtime_error("Could not open '" + tempFilename + "' file")); StdioStream::Ptr sfp = new StdioStream(&fp, false); for (const Type::Ptr& type : Type::GetAllTypes()) { ConfigType *dtype = dynamic_cast<ConfigType *>(type.get()); if (!dtype) continue; for (const ConfigObject::Ptr& object : dtype->GetObjects()) { Dictionary::Ptr persistentObject = new Dictionary(); persistentObject->Set("type", type->GetName()); persistentObject->Set("name", object->GetName()); Dictionary::Ptr update = Serialize(object, attributeTypes); if (!update) continue; persistentObject->Set("update", update); String json = JsonEncode(persistentObject); NetString::WriteStringToStream(sfp, json); } } sfp->Close(); fp.close(); #ifdef _WIN32 _unlink(filename.CStr()); #endif /* _WIN32 */ if (rename(tempFilename.CStr(), filename.CStr()) < 0) { BOOST_THROW_EXCEPTION(posix_error() << boost::errinfo_api_function("rename") << boost::errinfo_errno(errno) << boost::errinfo_file_name(tempFilename)); } }
/** * The entry point for the "object list" CLI command. * * @returns An exit status. */ int ObjectListCommand::Run(const boost::program_options::variables_map& vm, const std::vector<std::string>& ap) const { String objectfile = Application::GetObjectsPath(); if (!Utility::PathExists(objectfile)) { Log(LogCritical, "cli") << "Cannot open objects file '" << Application::GetObjectsPath() << "'."; Log(LogCritical, "cli", "Run 'icinga2 daemon -C' to validate config and generate the cache file."); return 1; } std::fstream fp; fp.open(objectfile.CStr(), std::ios_base::in); StdioStream::Ptr sfp = new StdioStream(&fp, false); unsigned long objects_count = 0; std::map<String, int> type_count; String message; String name_filter, type_filter; if (vm.count("name")) name_filter = vm["name"].as<std::string>(); if (vm.count("type")) type_filter = vm["type"].as<std::string>(); bool first = true; while (NetString::ReadStringFromStream(sfp, &message)) { PrintObject(std::cout, first, message, type_count, name_filter, type_filter); objects_count++; } sfp->Close(); fp.close(); if (vm.count("count")) { if (!first) std::cout << "\n"; PrintTypeCounts(std::cout, type_count); std::cout << "\n"; } Log(LogNotice, "cli") << "Parsed " << objects_count << " objects."; return 0; }
void ApiListener::ReplayLog(const JsonRpcConnection::Ptr& client) { Endpoint::Ptr endpoint = client->GetEndpoint(); if (endpoint->GetLogDuration() == 0) { ObjectLock olock2(endpoint); endpoint->SetSyncing(false); return; } CONTEXT("Replaying log for Endpoint '" + endpoint->GetName() + "'"); int count = -1; double peer_ts = endpoint->GetLocalLogPosition(); double logpos_ts = peer_ts; bool last_sync = false; Endpoint::Ptr target_endpoint = client->GetEndpoint(); ASSERT(target_endpoint); Zone::Ptr target_zone = target_endpoint->GetZone(); if (!target_zone) { ObjectLock olock2(endpoint); endpoint->SetSyncing(false); return; } for (;;) { boost::mutex::scoped_lock lock(m_LogLock); CloseLogFile(); RotateLogFile(); if (count == -1 || count > 50000) { OpenLogFile(); lock.unlock(); } else { last_sync = true; } count = 0; std::vector<int> files; Utility::Glob(GetApiDir() + "log/*", boost::bind(&ApiListener::LogGlobHandler, boost::ref(files), _1), GlobFile); std::sort(files.begin(), files.end()); for (int ts : files) { String path = GetApiDir() + "log/" + Convert::ToString(ts); if (ts < peer_ts) continue; Log(LogNotice, "ApiListener") << "Replaying log: " << path; std::fstream *fp = new std::fstream(path.CStr(), std::fstream::in | std::fstream::binary); StdioStream::Ptr logStream = new StdioStream(fp, true); String message; StreamReadContext src; while (true) { Dictionary::Ptr pmessage; try { StreamReadStatus srs = NetString::ReadStringFromStream(logStream, &message, src); if (srs == StatusEof) break; if (srs != StatusNewItem) continue; pmessage = JsonDecode(message); } catch (const std::exception&) { Log(LogWarning, "ApiListener") << "Unexpected end-of-file for cluster log: " << path; /* Log files may be incomplete or corrupted. This is perfectly OK. */ break; } if (pmessage->Get("timestamp") <= peer_ts) continue; Dictionary::Ptr secname = pmessage->Get("secobj"); if (secname) { ConfigObject::Ptr secobj = ConfigObject::GetObject(secname->Get("type"), secname->Get("name")); if (!secobj) continue; if (!target_zone->CanAccessObject(secobj)) continue; } try { NetString::WriteStringToStream(client->GetStream(), pmessage->Get("message")); count++; } catch (const std::exception& ex) { Log(LogWarning, "ApiListener") << "Error while replaying log for endpoint '" << endpoint->GetName() << "': " << DiagnosticInformation(ex); break; } peer_ts = pmessage->Get("timestamp"); if (ts > logpos_ts + 10) { logpos_ts = ts; Dictionary::Ptr lparams = new Dictionary(); lparams->Set("log_position", logpos_ts); Dictionary::Ptr lmessage = new Dictionary(); lmessage->Set("jsonrpc", "2.0"); lmessage->Set("method", "log::SetLogPosition"); lmessage->Set("params", lparams); JsonRpc::SendMessage(client->GetStream(), lmessage); } } logStream->Close(); } if (count > 0) { Log(LogInformation, "ApiListener") << "Replayed " << count << " messages."; } Log(LogNotice, "ApiListener") << "Replayed " << count << " messages."; if (last_sync) { { ObjectLock olock2(endpoint); endpoint->SetSyncing(false); } OpenLogFile(); break; } } }