| #include "config.h" | 
 |  | 
 | #include "dump_manager_resource.hpp" | 
 |  | 
 | #include "dump_utils.hpp" | 
 | #include "resource_dump_entry.hpp" | 
 | #include "xyz/openbmc_project/Common/error.hpp" | 
 |  | 
 | #include <fmt/core.h> | 
 |  | 
 | #include <phosphor-logging/elog-errors.hpp> | 
 | #include <phosphor-logging/elog.hpp> | 
 |  | 
 | namespace openpower | 
 | { | 
 | namespace dump | 
 | { | 
 | namespace resource | 
 | { | 
 |  | 
 | using namespace phosphor::logging; | 
 | using InternalFailure = | 
 |     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; | 
 |  | 
 | void Manager::notify(uint32_t dumpId, uint64_t size) | 
 | { | 
 |     // Get the timestamp | 
 |     std::time_t timeStamp = std::time(nullptr); | 
 |  | 
 |     // If there is an entry with this sourceId or an invalid id | 
 |     // update that. | 
 |     // If host is sending the source id before the completion | 
 |     // the source id will be updated by the transport layer with host. | 
 |     // if not the source id will stay as invalid one. | 
 |     for (auto& entry : entries) | 
 |     { | 
 |         openpower::dump::resource::Entry* resEntry = | 
 |             dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get()); | 
 |         if ((resEntry->status() == | 
 |              phosphor::dump::OperationStatus::InProgress) && | 
 |             ((resEntry->sourceDumpId() == dumpId) || | 
 |              (resEntry->sourceDumpId() == INVALID_SOURCE_ID))) | 
 |         { | 
 |             resEntry->update(timeStamp, size, dumpId); | 
 |             return; | 
 |         } | 
 |     } | 
 |     // Get the id | 
 |     auto id = lastEntryId + 1; | 
 |     auto idString = std::to_string(id); | 
 |     auto objPath = std::filesystem::path(baseEntryPath) / idString; | 
 |  | 
 |     try | 
 |     { | 
 |         entries.insert(std::make_pair( | 
 |             id, std::make_unique<resource::Entry>( | 
 |                     bus, objPath.c_str(), id, timeStamp, size, dumpId, | 
 |                     std::string(), std::string(), | 
 |                     phosphor::dump::OperationStatus::Completed, *this))); | 
 |     } | 
 |     catch (const std::invalid_argument& e) | 
 |     { | 
 |         log<level::ERR>(fmt::format("Error in creating resource dump entry, " | 
 |                                     "errormsg({}),OBJECTPATH({}),ID({})," | 
 |                                     "TIMESTAMP({}),SIZE({}),SOURCEID({})", | 
 |                                     e.what(), objPath.c_str(), id, timeStamp, | 
 |                                     size, dumpId) | 
 |                             .c_str()); | 
 |         report<InternalFailure>(); | 
 |         return; | 
 |     } | 
 |     lastEntryId++; | 
 | } | 
 |  | 
 | sdbusplus::message::object_path | 
 |     Manager::createDump(phosphor::dump::DumpCreateParams params) | 
 | { | 
 |  | 
 |     using NotAllowed = | 
 |         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed; | 
 |     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON; | 
 |  | 
 |     // Allow creating resource dump only when the host is up. | 
 |     if (!phosphor::dump::isHostRunning()) | 
 |     { | 
 |         elog<NotAllowed>( | 
 |             Reason("Resource dump can be initiated only when the host is up")); | 
 |         return std::string(); | 
 |     } | 
 |  | 
 |     using InvalidArgument = | 
 |         sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument; | 
 |     using Argument = xyz::openbmc_project::Common::InvalidArgument; | 
 |     using CreateParameters = | 
 |         sdbusplus::com::ibm::Dump::server::Create::CreateParameters; | 
 |  | 
 |     auto id = lastEntryId + 1; | 
 |     auto idString = std::to_string(id); | 
 |     auto objPath = std::filesystem::path(baseEntryPath) / idString; | 
 |     std::time_t timeStamp = std::time(nullptr); | 
 |  | 
 |     std::string vspString; | 
 |     auto iter = params.find( | 
 |         sdbusplus::com::ibm::Dump::server::Create:: | 
 |             convertCreateParametersToString(CreateParameters::VSPString)); | 
 |     if (iter == params.end()) | 
 |     { | 
 |         // Host will generate a default dump if no resource selector string | 
 |         // is provided. The default dump will be a non-disruptive system dump. | 
 |         log<level::INFO>( | 
 |             "VSP string is not provided, a non-disruptive system dump will be " | 
 |             "generated by the host"); | 
 |     } | 
 |     else | 
 |     { | 
 |         try | 
 |         { | 
 |             vspString = std::get<std::string>(iter->second); | 
 |         } | 
 |         catch (const std::bad_variant_access& e) | 
 |         { | 
 |             // Exception will be raised if the input is not string | 
 |             log<level::ERR>( | 
 |                 fmt::format("An invalid  vsp string is passed errormsg({})", | 
 |                             e.what()) | 
 |                     .c_str()); | 
 |             elog<InvalidArgument>(Argument::ARGUMENT_NAME("VSP_STRING"), | 
 |                                   Argument::ARGUMENT_VALUE("INVALID INPUT")); | 
 |         } | 
 |     } | 
 |  | 
 |     std::string pwd; | 
 |     iter = params.find( | 
 |         sdbusplus::com::ibm::Dump::server::Create:: | 
 |             convertCreateParametersToString(CreateParameters::Password)); | 
 |     if (iter == params.end()) | 
 |     { | 
 |         log<level::ERR>("Required argument password is missing"); | 
 |         elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSOWORD"), | 
 |                               Argument::ARGUMENT_VALUE("MISSING")); | 
 |     } | 
 |  | 
 |     try | 
 |     { | 
 |         pwd = std::get<std::string>(iter->second); | 
 |     } | 
 |     catch (const std::bad_variant_access& e) | 
 |     { | 
 |         // Exception will be raised if the input is not string | 
 |         log<level::ERR>( | 
 |             fmt::format("An invalid password string is passed errormsg({})", | 
 |                         e.what()) | 
 |                 .c_str()); | 
 |         elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSWORD"), | 
 |                               Argument::ARGUMENT_VALUE("INVALID INPUT")); | 
 |     } | 
 |  | 
 |     try | 
 |     { | 
 |         entries.insert(std::make_pair( | 
 |             id, std::make_unique<resource::Entry>( | 
 |                     bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID, | 
 |                     vspString, pwd, phosphor::dump::OperationStatus::InProgress, | 
 |                     *this))); | 
 |     } | 
 |     catch (const std::invalid_argument& e) | 
 |     { | 
 |         log<level::ERR>( | 
 |             fmt::format( | 
 |                 "Error in creating resource dump " | 
 |                 "entry,errormsg({}),OBJECTPATH({}), VSPSTRING({}), ID({})", | 
 |                 e.what(), objPath.c_str(), vspString, id) | 
 |                 .c_str()); | 
 |         elog<InternalFailure>(); | 
 |         return std::string(); | 
 |     } | 
 |     lastEntryId++; | 
 |     return objPath.string(); | 
 | } | 
 |  | 
 | } // namespace resource | 
 | } // namespace dump | 
 | } // namespace openpower |