Add support for editing the logfile headers
This lets us fix bugs in logfiles if the need arises.
Change-Id: I374c4f6b3745835af2279d4b29f6f8098a5d7770
diff --git a/aos/events/logging/log_edit.cc b/aos/events/logging/log_edit.cc
new file mode 100644
index 0000000..5db503a
--- /dev/null
+++ b/aos/events/logging/log_edit.cc
@@ -0,0 +1,62 @@
+#include <iostream>
+
+#include "aos/configuration.h"
+#include "aos/events/logging/logger.h"
+#include "aos/events/simulated_event_loop.h"
+#include "aos/init.h"
+#include "aos/json_to_flatbuffer.h"
+#include "aos/util/file.h"
+#include "gflags/gflags.h"
+
+DEFINE_string(logfile, "/tmp/logfile.bfbs",
+ "Name of the logfile to read from.");
+DEFINE_bool(
+ replace, false,
+ "If true, replace the header on the log file with the JSON header.");
+DEFINE_string(
+ header, "",
+ "If provided, this is the path to the JSON with the log file header.");
+
+int main(int argc, char **argv) {
+ gflags::SetUsageMessage(
+ R"(This tool lets us manipulate log files.)");
+ aos::InitGoogle(&argc, &argv);
+
+ if (!FLAGS_header.empty()) {
+ if (FLAGS_replace) {
+ const ::std::string header_json =
+ aos::util::ReadFileToStringOrDie(FLAGS_header);
+ flatbuffers::FlatBufferBuilder fbb;
+ fbb.ForceDefaults(1);
+ flatbuffers::Offset<aos::logger::LogFileHeader> header =
+ aos::JsonToFlatbuffer<aos::logger::LogFileHeader>(header_json, &fbb);
+
+ fbb.FinishSizePrefixed(header);
+
+ const std::string orig_path = FLAGS_logfile + ".orig";
+ PCHECK(rename(FLAGS_logfile.c_str(), orig_path.c_str()) == 0);
+
+ aos::logger::SpanReader span_reader(orig_path);
+ CHECK(span_reader.ReadMessage().empty());
+
+ aos::logger::DetachedBufferWriter buffer_writer(FLAGS_logfile);
+ buffer_writer.QueueSizedFlatbuffer(&fbb);
+
+ while (true) {
+ absl::Span<const uint8_t> msg_data = span_reader.ReadMessage();
+ if (msg_data == absl::Span<const uint8_t>()) {
+ break;
+ }
+
+ buffer_writer.WriteSizedFlatbuffer(msg_data);
+ }
+ } else {
+ aos::logger::MessageReader reader(FLAGS_logfile);
+ aos::util::WriteStringToFileOrDie(
+ FLAGS_header, aos::FlatbufferToJson(reader.log_file_header(), true));
+ }
+ }
+
+ aos::Cleanup();
+ return 0;
+}