#include "repository.hpp" #include #include #include namespace openpower { namespace pels { namespace fs = std::filesystem; using namespace phosphor::logging; namespace file_error = sdbusplus::xyz::openbmc_project::Common::File::Error; Repository::Repository(const std::filesystem::path& basePath) : _logPath(basePath / "logs") { if (!fs::exists(_logPath)) { fs::create_directories(_logPath); } } std::string Repository::getPELFilename(uint32_t pelID, const BCDTime& time) { char name[50]; sprintf(name, "%.2X%.2X%.2X%.2X%.2X%.2X%.2X%.2X_%.8X", time.yearMSB, time.yearLSB, time.month, time.day, time.hour, time.minutes, time.seconds, time.hundredths, pelID); return std::string{name}; } void Repository::add(std::unique_ptr& pel) { auto path = _logPath / getPELFilename(pel->id(), pel->commitTime()); std::ofstream file{path, std::ios::binary}; if (!file.good()) { // If this fails, the filesystem is probably full so it isn't like // we could successfully create yet another error log here. auto e = errno; log("Failed creating PEL file", entry("FILE=%s", path.c_str())); fs::remove(path); log("Unable to open PEL file for writing", entry("ERRNO=%d", e), entry("PATH=%s", path.c_str())); throw file_error::Open(); } auto data = pel->data(); file.write(reinterpret_cast(data.data()), data.size()); if (file.fail()) { // Same note as above about not being able to create an error log // for this case even if we wanted. auto e = errno; log("Failed writing PEL file", entry("FILE=%s", path.c_str())); file.close(); fs::remove(path); log("Unable to write PEL file", entry("ERRNO=%d", e), entry("PATH=%s", path.c_str())); throw file_error::Write(); } } } // namespace pels } // namespace openpower