1919f71c6SClaire Weinan #include "config.h" 2919f71c6SClaire Weinan 3919f71c6SClaire Weinan #include "dump_manager_faultlog.hpp" 4919f71c6SClaire Weinan 574a1f39cSAsmitha Karunanithi #include "dump_utils.hpp" 6919f71c6SClaire Weinan #include "faultlog_dump_entry.hpp" 7919f71c6SClaire Weinan 8919f71c6SClaire Weinan #include <phosphor-logging/elog-errors.hpp> 9919f71c6SClaire Weinan #include <phosphor-logging/elog.hpp> 10*d1f670feSDhruvaraj Subhashchandran #include <phosphor-logging/lg2.hpp> 11919f71c6SClaire Weinan #include <xyz/openbmc_project/Common/File/error.hpp> 12919f71c6SClaire Weinan #include <xyz/openbmc_project/Common/error.hpp> 13919f71c6SClaire Weinan 14919f71c6SClaire Weinan #include <filesystem> 15919f71c6SClaire Weinan #include <fstream> 16919f71c6SClaire Weinan #include <iostream> 17919f71c6SClaire Weinan #include <string> 18919f71c6SClaire Weinan 19919f71c6SClaire Weinan namespace phosphor 20919f71c6SClaire Weinan { 21919f71c6SClaire Weinan namespace dump 22919f71c6SClaire Weinan { 23919f71c6SClaire Weinan namespace faultlog 24919f71c6SClaire Weinan { 25919f71c6SClaire Weinan 26919f71c6SClaire Weinan using namespace phosphor::logging; 27919f71c6SClaire Weinan using namespace sdbusplus::xyz::openbmc_project::Common::Error; 28919f71c6SClaire Weinan using namespace sdbusplus::xyz::openbmc_project::Common::File::Error; 29919f71c6SClaire Weinan using ErrnoOpen = xyz::openbmc_project::Common::File::Open::ERRNO; 30919f71c6SClaire Weinan using PathOpen = xyz::openbmc_project::Common::File::Open::PATH; 31919f71c6SClaire Weinan 32919f71c6SClaire Weinan sdbusplus::message::object_path createDump(phosphor::dump::DumpCreateParams params)33919f71c6SClaire Weinan Manager::createDump(phosphor::dump::DumpCreateParams params) 34919f71c6SClaire Weinan { 35*d1f670feSDhruvaraj Subhashchandran lg2::info("In dump_manager_fault.cpp createDump"); 36919f71c6SClaire Weinan 37919f71c6SClaire Weinan // Currently we ignore the parameters. 38919f71c6SClaire Weinan // TODO phosphor-debug-collector/issues/22: Check parameter values and 39919f71c6SClaire Weinan // exit early if we don't receive the expected parameters 40919f71c6SClaire Weinan if (params.empty()) 41919f71c6SClaire Weinan { 42*d1f670feSDhruvaraj Subhashchandran lg2::info("No additional parameters received"); 43919f71c6SClaire Weinan } 44919f71c6SClaire Weinan else 45919f71c6SClaire Weinan { 46*d1f670feSDhruvaraj Subhashchandran lg2::info("Got additional parameters"); 47919f71c6SClaire Weinan } 48919f71c6SClaire Weinan 4974a1f39cSAsmitha Karunanithi // Get the originator id and type from params 5074a1f39cSAsmitha Karunanithi std::string originatorId; 5174a1f39cSAsmitha Karunanithi originatorTypes originatorType; 5274a1f39cSAsmitha Karunanithi 5374a1f39cSAsmitha Karunanithi phosphor::dump::extractOriginatorProperties(params, originatorId, 5474a1f39cSAsmitha Karunanithi originatorType); 5574a1f39cSAsmitha Karunanithi 56919f71c6SClaire Weinan // Get the id 57919f71c6SClaire Weinan auto id = lastEntryId + 1; 58919f71c6SClaire Weinan auto idString = std::to_string(id); 59919f71c6SClaire Weinan auto objPath = std::filesystem::path(baseEntryPath) / idString; 60919f71c6SClaire Weinan 61919f71c6SClaire Weinan std::filesystem::path faultLogFilePath(std::string(FAULTLOG_DUMP_PATH) + 62919f71c6SClaire Weinan idString); 63919f71c6SClaire Weinan std::ofstream faultLogFile; 64919f71c6SClaire Weinan 65919f71c6SClaire Weinan errno = 0; 66919f71c6SClaire Weinan 67919f71c6SClaire Weinan faultLogFile.open(faultLogFilePath, 68919f71c6SClaire Weinan std::ofstream::out | std::fstream::trunc); 69919f71c6SClaire Weinan 70919f71c6SClaire Weinan if (faultLogFile.is_open()) 71919f71c6SClaire Weinan { 72*d1f670feSDhruvaraj Subhashchandran lg2::info("faultLogFile is open"); 73919f71c6SClaire Weinan 74919f71c6SClaire Weinan faultLogFile << "This is faultlog file #" << idString << " at " 75919f71c6SClaire Weinan << std::string(FAULTLOG_DUMP_PATH) + idString << std::endl; 76919f71c6SClaire Weinan 77919f71c6SClaire Weinan faultLogFile.close(); 78919f71c6SClaire Weinan } 79919f71c6SClaire Weinan else 80919f71c6SClaire Weinan { 81*d1f670feSDhruvaraj Subhashchandran lg2::error( 82*d1f670feSDhruvaraj Subhashchandran "Failed to open fault log file at {FILE_PATH}, errno: {ERRNO}, " 83*d1f670feSDhruvaraj Subhashchandran "strerror: {STRERROR}, OBJECTPATH: {OBJECT_PATH}, ID: {ID}", 84*d1f670feSDhruvaraj Subhashchandran "FILE_PATH", faultLogFilePath, "ERRNO", errno, "STRERROR", 85*d1f670feSDhruvaraj Subhashchandran strerror(errno), "OBJECT_PATH", objPath, "ID", id); 86919f71c6SClaire Weinan elog<Open>(ErrnoOpen(errno), PathOpen(objPath.c_str())); 87919f71c6SClaire Weinan } 88919f71c6SClaire Weinan 89919f71c6SClaire Weinan try 90919f71c6SClaire Weinan { 91*d1f670feSDhruvaraj Subhashchandran lg2::info("dump_manager_faultlog.cpp: add faultlog entry"); 92919f71c6SClaire Weinan 93919f71c6SClaire Weinan uint64_t timestamp = 94919f71c6SClaire Weinan std::chrono::duration_cast<std::chrono::microseconds>( 95919f71c6SClaire Weinan std::chrono::system_clock::now().time_since_epoch()) 96919f71c6SClaire Weinan .count(); 97919f71c6SClaire Weinan 9874a1f39cSAsmitha Karunanithi entries.insert( 9974a1f39cSAsmitha Karunanithi std::make_pair(id, std::make_unique<faultlog::Entry>( 100919f71c6SClaire Weinan bus, objPath.c_str(), id, timestamp, 10174a1f39cSAsmitha Karunanithi std::filesystem::file_size(faultLogFilePath), 10274a1f39cSAsmitha Karunanithi faultLogFilePath, 10374a1f39cSAsmitha Karunanithi phosphor::dump::OperationStatus::Completed, 10474a1f39cSAsmitha Karunanithi originatorId, originatorType, *this))); 105919f71c6SClaire Weinan } 106919f71c6SClaire Weinan catch (const std::invalid_argument& e) 107919f71c6SClaire Weinan { 108*d1f670feSDhruvaraj Subhashchandran lg2::error("Error in creating dump entry, errormsg: {ERROR}, " 109*d1f670feSDhruvaraj Subhashchandran "OBJECTPATH: {OBJECT_PATH}, ID: {ID}", 110*d1f670feSDhruvaraj Subhashchandran "ERROR", e, "OBJECT_PATH", objPath, "ID", id); 111919f71c6SClaire Weinan elog<InternalFailure>(); 112919f71c6SClaire Weinan } 113919f71c6SClaire Weinan 114919f71c6SClaire Weinan lastEntryId++; 115919f71c6SClaire Weinan 116*d1f670feSDhruvaraj Subhashchandran lg2::info("End of dump_manager_faultlog.cpp createDump"); 117919f71c6SClaire Weinan return objPath.string(); 118919f71c6SClaire Weinan } 119919f71c6SClaire Weinan 120919f71c6SClaire Weinan } // namespace faultlog 121919f71c6SClaire Weinan } // namespace dump 122919f71c6SClaire Weinan } // namespace phosphor 123