162337a92SDhruvaraj Subhashchandran #include "config.h"
262337a92SDhruvaraj Subhashchandran 
362337a92SDhruvaraj Subhashchandran #include "dump_manager_resource.hpp"
462337a92SDhruvaraj Subhashchandran 
562337a92SDhruvaraj Subhashchandran #include "dump_utils.hpp"
662337a92SDhruvaraj Subhashchandran #include "resource_dump_entry.hpp"
762337a92SDhruvaraj Subhashchandran #include "xyz/openbmc_project/Common/error.hpp"
862337a92SDhruvaraj Subhashchandran 
9858fbb2eSGeorge Liu #include <fmt/core.h>
10858fbb2eSGeorge Liu 
1162337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog-errors.hpp>
1262337a92SDhruvaraj Subhashchandran #include <phosphor-logging/elog.hpp>
1362337a92SDhruvaraj Subhashchandran 
14341d683dSDhruvaraj Subhashchandran namespace openpower
1562337a92SDhruvaraj Subhashchandran {
1662337a92SDhruvaraj Subhashchandran namespace dump
1762337a92SDhruvaraj Subhashchandran {
1862337a92SDhruvaraj Subhashchandran namespace resource
1962337a92SDhruvaraj Subhashchandran {
2062337a92SDhruvaraj Subhashchandran 
2162337a92SDhruvaraj Subhashchandran using namespace phosphor::logging;
2262337a92SDhruvaraj Subhashchandran using InternalFailure =
2362337a92SDhruvaraj Subhashchandran     sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
2462337a92SDhruvaraj Subhashchandran 
2562337a92SDhruvaraj Subhashchandran void Manager::notify(uint32_t dumpId, uint64_t size)
2662337a92SDhruvaraj Subhashchandran {
2762337a92SDhruvaraj Subhashchandran     // Get the timestamp
2862337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
2962337a92SDhruvaraj Subhashchandran 
3062337a92SDhruvaraj Subhashchandran     // If there is an entry with this sourceId or an invalid id
3162337a92SDhruvaraj Subhashchandran     // update that.
3262337a92SDhruvaraj Subhashchandran     // If host is sending the source id before the completion
3362337a92SDhruvaraj Subhashchandran     // the source id will be updated by the transport layer with host.
3462337a92SDhruvaraj Subhashchandran     // if not the source id will stay as invalid one.
3562337a92SDhruvaraj Subhashchandran     for (auto& entry : entries)
3662337a92SDhruvaraj Subhashchandran     {
37341d683dSDhruvaraj Subhashchandran         openpower::dump::resource::Entry* resEntry =
38341d683dSDhruvaraj Subhashchandran             dynamic_cast<openpower::dump::resource::Entry*>(entry.second.get());
3962337a92SDhruvaraj Subhashchandran         if ((resEntry->status() ==
4062337a92SDhruvaraj Subhashchandran              phosphor::dump::OperationStatus::InProgress) &&
4162337a92SDhruvaraj Subhashchandran             ((resEntry->sourceDumpId() == dumpId) ||
4262337a92SDhruvaraj Subhashchandran              (resEntry->sourceDumpId() == INVALID_SOURCE_ID)))
4362337a92SDhruvaraj Subhashchandran         {
4462337a92SDhruvaraj Subhashchandran             resEntry->update(timeStamp, size, dumpId);
4562337a92SDhruvaraj Subhashchandran             return;
4662337a92SDhruvaraj Subhashchandran         }
4762337a92SDhruvaraj Subhashchandran     }
4862337a92SDhruvaraj Subhashchandran     // Get the id
4962337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
5062337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
513fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
5262337a92SDhruvaraj Subhashchandran 
5362337a92SDhruvaraj Subhashchandran     try
5462337a92SDhruvaraj Subhashchandran     {
5562337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
5662337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
5762337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, size, dumpId,
5862337a92SDhruvaraj Subhashchandran                     std::string(), std::string(),
5962337a92SDhruvaraj Subhashchandran                     phosphor::dump::OperationStatus::Completed, *this)));
6062337a92SDhruvaraj Subhashchandran     }
6162337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
6262337a92SDhruvaraj Subhashchandran     {
63858fbb2eSGeorge Liu         log<level::ERR>(fmt::format("Error in creating resource dump entry, "
64858fbb2eSGeorge Liu                                     "errormsg({}),OBJECTPATH({}),ID({}),"
65858fbb2eSGeorge Liu                                     "TIMESTAMP({}),SIZE({}),SOURCEID({})",
66363af249SGeorge Liu                                     e.what(), objPath.c_str(), id, timeStamp,
67363af249SGeorge Liu                                     size, dumpId)
68858fbb2eSGeorge Liu                             .c_str());
6962337a92SDhruvaraj Subhashchandran         report<InternalFailure>();
7062337a92SDhruvaraj Subhashchandran         return;
7162337a92SDhruvaraj Subhashchandran     }
7262337a92SDhruvaraj Subhashchandran     lastEntryId++;
7362337a92SDhruvaraj Subhashchandran }
7462337a92SDhruvaraj Subhashchandran 
7562337a92SDhruvaraj Subhashchandran sdbusplus::message::object_path
76*ddc3366eSDhruvaraj Subhashchandran     Manager::createDump(phosphor::dump::DumpCreateParams params)
7762337a92SDhruvaraj Subhashchandran {
7862337a92SDhruvaraj Subhashchandran 
7962337a92SDhruvaraj Subhashchandran     using NotAllowed =
8062337a92SDhruvaraj Subhashchandran         sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
8162337a92SDhruvaraj Subhashchandran     using Reason = xyz::openbmc_project::Common::NotAllowed::REASON;
8262337a92SDhruvaraj Subhashchandran 
8362337a92SDhruvaraj Subhashchandran     // Allow creating resource dump only when the host is up.
8462337a92SDhruvaraj Subhashchandran     if (!phosphor::dump::isHostRunning())
8562337a92SDhruvaraj Subhashchandran     {
8662337a92SDhruvaraj Subhashchandran         elog<NotAllowed>(
8762337a92SDhruvaraj Subhashchandran             Reason("Resource dump can be initiated only when the host is up"));
8862337a92SDhruvaraj Subhashchandran         return std::string();
8962337a92SDhruvaraj Subhashchandran     }
90*ddc3366eSDhruvaraj Subhashchandran 
91*ddc3366eSDhruvaraj Subhashchandran     using InvalidArgument =
92*ddc3366eSDhruvaraj Subhashchandran         sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
93*ddc3366eSDhruvaraj Subhashchandran     using Argument = xyz::openbmc_project::Common::InvalidArgument;
9462337a92SDhruvaraj Subhashchandran     using CreateParameters =
9562337a92SDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::CreateParameters;
9662337a92SDhruvaraj Subhashchandran 
9762337a92SDhruvaraj Subhashchandran     auto id = lastEntryId + 1;
9862337a92SDhruvaraj Subhashchandran     auto idString = std::to_string(id);
993fc6df48SJayanth Othayoth     auto objPath = std::filesystem::path(baseEntryPath) / idString;
10062337a92SDhruvaraj Subhashchandran     std::time_t timeStamp = std::time(nullptr);
10162337a92SDhruvaraj Subhashchandran 
102*ddc3366eSDhruvaraj Subhashchandran     std::string vspString;
103*ddc3366eSDhruvaraj Subhashchandran     auto iter = params.find(
104*ddc3366eSDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::
105*ddc3366eSDhruvaraj Subhashchandran             convertCreateParametersToString(CreateParameters::VSPString));
106*ddc3366eSDhruvaraj Subhashchandran     if (iter == params.end())
107*ddc3366eSDhruvaraj Subhashchandran     {
108*ddc3366eSDhruvaraj Subhashchandran         // Host will generate a default dump if no resource selector string
109*ddc3366eSDhruvaraj Subhashchandran         // is provided. The default dump will be a non-disruptive system dump.
110*ddc3366eSDhruvaraj Subhashchandran         log<level::INFO>(
111*ddc3366eSDhruvaraj Subhashchandran             "VSP string is not provided, a non-disruptive system dump will be "
112*ddc3366eSDhruvaraj Subhashchandran             "generated by the host");
113*ddc3366eSDhruvaraj Subhashchandran     }
114*ddc3366eSDhruvaraj Subhashchandran     else
115*ddc3366eSDhruvaraj Subhashchandran     {
116*ddc3366eSDhruvaraj Subhashchandran         try
117*ddc3366eSDhruvaraj Subhashchandran         {
118*ddc3366eSDhruvaraj Subhashchandran             vspString = std::get<std::string>(iter->second);
119*ddc3366eSDhruvaraj Subhashchandran         }
120*ddc3366eSDhruvaraj Subhashchandran         catch (const std::bad_variant_access& e)
121*ddc3366eSDhruvaraj Subhashchandran         {
122*ddc3366eSDhruvaraj Subhashchandran             // Exception will be raised if the input is not string
123*ddc3366eSDhruvaraj Subhashchandran             log<level::ERR>(
124*ddc3366eSDhruvaraj Subhashchandran                 fmt::format("An invalid  vsp string is passed errormsg({})",
125*ddc3366eSDhruvaraj Subhashchandran                             e.what())
126*ddc3366eSDhruvaraj Subhashchandran                     .c_str());
127*ddc3366eSDhruvaraj Subhashchandran             elog<InvalidArgument>(Argument::ARGUMENT_NAME("VSP_STRING"),
128*ddc3366eSDhruvaraj Subhashchandran                                   Argument::ARGUMENT_VALUE("INVALID INPUT"));
129*ddc3366eSDhruvaraj Subhashchandran         }
130*ddc3366eSDhruvaraj Subhashchandran     }
131*ddc3366eSDhruvaraj Subhashchandran 
132*ddc3366eSDhruvaraj Subhashchandran     std::string pwd;
133*ddc3366eSDhruvaraj Subhashchandran     iter = params.find(
134*ddc3366eSDhruvaraj Subhashchandran         sdbusplus::com::ibm::Dump::server::Create::
135*ddc3366eSDhruvaraj Subhashchandran             convertCreateParametersToString(CreateParameters::Password));
136*ddc3366eSDhruvaraj Subhashchandran     if (iter == params.end())
137*ddc3366eSDhruvaraj Subhashchandran     {
138*ddc3366eSDhruvaraj Subhashchandran         log<level::ERR>("Required argument password is missing");
139*ddc3366eSDhruvaraj Subhashchandran         elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSOWORD"),
140*ddc3366eSDhruvaraj Subhashchandran                               Argument::ARGUMENT_VALUE("MISSING"));
141*ddc3366eSDhruvaraj Subhashchandran     }
142*ddc3366eSDhruvaraj Subhashchandran 
143*ddc3366eSDhruvaraj Subhashchandran     try
144*ddc3366eSDhruvaraj Subhashchandran     {
145*ddc3366eSDhruvaraj Subhashchandran         pwd = std::get<std::string>(iter->second);
146*ddc3366eSDhruvaraj Subhashchandran     }
147*ddc3366eSDhruvaraj Subhashchandran     catch (const std::bad_variant_access& e)
148*ddc3366eSDhruvaraj Subhashchandran     {
149*ddc3366eSDhruvaraj Subhashchandran         // Exception will be raised if the input is not string
150*ddc3366eSDhruvaraj Subhashchandran         log<level::ERR>(
151*ddc3366eSDhruvaraj Subhashchandran             fmt::format("An invalid password string is passed errormsg({})",
152*ddc3366eSDhruvaraj Subhashchandran                         e.what())
153*ddc3366eSDhruvaraj Subhashchandran                 .c_str());
154*ddc3366eSDhruvaraj Subhashchandran         elog<InvalidArgument>(Argument::ARGUMENT_NAME("PASSWORD"),
155*ddc3366eSDhruvaraj Subhashchandran                               Argument::ARGUMENT_VALUE("INVALID INPUT"));
156*ddc3366eSDhruvaraj Subhashchandran     }
15762337a92SDhruvaraj Subhashchandran 
15862337a92SDhruvaraj Subhashchandran     try
15962337a92SDhruvaraj Subhashchandran     {
16062337a92SDhruvaraj Subhashchandran         entries.insert(std::make_pair(
16162337a92SDhruvaraj Subhashchandran             id, std::make_unique<resource::Entry>(
16262337a92SDhruvaraj Subhashchandran                     bus, objPath.c_str(), id, timeStamp, 0, INVALID_SOURCE_ID,
16362337a92SDhruvaraj Subhashchandran                     vspString, pwd, phosphor::dump::OperationStatus::InProgress,
16462337a92SDhruvaraj Subhashchandran                     *this)));
16562337a92SDhruvaraj Subhashchandran     }
16662337a92SDhruvaraj Subhashchandran     catch (const std::invalid_argument& e)
16762337a92SDhruvaraj Subhashchandran     {
168858fbb2eSGeorge Liu         log<level::ERR>(
169858fbb2eSGeorge Liu             fmt::format(
170858fbb2eSGeorge Liu                 "Error in creating resource dump "
171858fbb2eSGeorge Liu                 "entry,errormsg({}),OBJECTPATH({}), VSPSTRING({}), ID({})",
172363af249SGeorge Liu                 e.what(), objPath.c_str(), vspString, id)
173858fbb2eSGeorge Liu                 .c_str());
17462337a92SDhruvaraj Subhashchandran         elog<InternalFailure>();
17562337a92SDhruvaraj Subhashchandran         return std::string();
17662337a92SDhruvaraj Subhashchandran     }
17762337a92SDhruvaraj Subhashchandran     lastEntryId++;
17862337a92SDhruvaraj Subhashchandran     return objPath.string();
17962337a92SDhruvaraj Subhashchandran }
18062337a92SDhruvaraj Subhashchandran 
18162337a92SDhruvaraj Subhashchandran } // namespace resource
18262337a92SDhruvaraj Subhashchandran } // namespace dump
183341d683dSDhruvaraj Subhashchandran } // namespace openpower
184