This is an automated email from the ASF dual-hosted git repository. fgerlits pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit 9ec2010a0dce27e67124eefe07e9182e2467c055 Author: Adam Debreceni <adebrec...@apache.org> AuthorDate: Wed Sep 6 07:54:39 2023 +0200 MINIFICPP-2193 - Add manifest to debug bundle Signed-off-by: Ferenc Gerlits <fgerl...@gmail.com> This closes #1651 --- extensions/http-curl/tests/C2DebugBundleTest.cpp | 5 ++++- libminifi/src/c2/C2Agent.cpp | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/extensions/http-curl/tests/C2DebugBundleTest.cpp b/extensions/http-curl/tests/C2DebugBundleTest.cpp index b68bd7b7c..315e73e2c 100644 --- a/extensions/http-curl/tests/C2DebugBundleTest.cpp +++ b/extensions/http-curl/tests/C2DebugBundleTest.cpp @@ -91,7 +91,9 @@ class C2DebugBundleHandler : public ServerAwareHandler { } static int field_get(const char* /*key*/, const char* value, size_t valuelen, void* user_data) { auto& file_content = *static_cast<std::optional<std::string>*>(user_data); - file_content = ""; + if (!file_content) { + file_content = ""; + } (*file_content) += std::string(value, valuelen); return MG_FORM_FIELD_HANDLE_GET; } @@ -183,6 +185,7 @@ int main() { log_text.resize(log_stream->size()); log_stream->read(as_writable_bytes(std::span(log_text))); assert(log_text.find("Tis but a scratch") != std::string::npos); + assert(archive_content["manifest.json"].find("minifi-archive-extensions") != std::string::npos); return true; }); diff --git a/libminifi/src/c2/C2Agent.cpp b/libminifi/src/c2/C2Agent.cpp index 9891fb9de..64464a602 100644 --- a/libminifi/src/c2/C2Agent.cpp +++ b/libminifi/src/c2/C2Agent.cpp @@ -676,7 +676,7 @@ C2Payload C2Agent::bundleDebugInfo(std::map<std::string, std::unique_ptr<io::Inp if (!archiver) { throw C2DebugBundleError("Couldn't instantiate archiver"); } - for (auto&[filename, stream] : files) { + for (auto& [filename, stream] : files) { size_t file_size = stream->size(); if (!archiver->newEntry({filename, file_size})) { throw C2DebugBundleError("Couldn't initialize archive entry for '" + filename + "'"); @@ -686,6 +686,23 @@ C2Payload C2Agent::bundleDebugInfo(std::map<std::string, std::unique_ptr<io::Inp throw C2DebugBundleError("Error while writing file '" + filename + "' into the debug bundle"); } } + if (auto node_reporter = node_reporter_.lock()) { + static constexpr const char* MANIFEST_FILE_NAME = "manifest.json"; + auto reported_manifest = node_reporter->getAgentManifest(); + std::string manifest_str = state::response::SerializedResponseNode{ + .name = std::move(reported_manifest.name), + .array = reported_manifest.is_array, + .children = std::move(reported_manifest.serialized_nodes) + }.to_pretty_string(); + if (!archiver->newEntry({MANIFEST_FILE_NAME, manifest_str.size()})) { + throw C2DebugBundleError(fmt::format("Couldn't initialize archive entry for '{}'", MANIFEST_FILE_NAME)); + } + io::BufferStream manifest_stream; + manifest_stream.write(as_bytes(std::span(manifest_str))); + if (gsl::narrow<int64_t>(manifest_stream.size()) != internal::pipe(manifest_stream, *archiver)) { + throw C2DebugBundleError(fmt::format("Error while writing file '{}'", MANIFEST_FILE_NAME)); + } + } if (!archiver->finish()) { throw C2DebugBundleError("Failed to complete debug bundle archive"); }