#include #include #include "cereal/messaging/messaging.h" #include "selfdrive/common/swaglog.h" #include "selfdrive/loggerd/logger.h" static kj::Array build_boot_log() { MessageBuilder msg; auto boot = msg.initEvent().initBoot(); boot.setWallTimeNanos(nanos_since_epoch()); std::string pstore = "/sys/fs/pstore"; std::map pstore_map = util::read_files_in_dir(pstore); const std::vector log_keywords = {"Kernel panic"}; auto lpstore = boot.initPstore().initEntries(pstore_map.size()); int i = 0; for (auto& kv : pstore_map) { auto lentry = lpstore[i]; lentry.setKey(kv.first); lentry.setValue(capnp::Data::Reader((const kj::byte*)kv.second.data(), kv.second.size())); i++; for (auto &k : log_keywords) { if (kv.second.find(k) != std::string::npos) { LOGE("%s: found '%s'", kv.first.c_str(), k.c_str()); } } } boot.setLaunchLog(util::read_file("/tmp/launch_log")); return capnp::messageToFlatArray(msg); } int main(int argc, char** argv) { const std::string path = LOG_ROOT + "/boot/" + logger_get_route_name() + ".bz2"; LOGW("bootlog to %s", path.c_str()); // Open bootlog bool r = util::create_directories(LOG_ROOT + "/boot/", 0775); assert(r); BZFile bz_file(path.c_str()); // Write initdata bz_file.write(logger_build_init_data().asBytes()); // Write bootlog bz_file.write(build_boot_log().asBytes()); return 0; }