1 #include "op_dump_util.hpp"
2 
3 #include "dump_utils.hpp"
4 #include "xyz/openbmc_project/Common/error.hpp"
5 #include "xyz/openbmc_project/Dump/Create/error.hpp"
6 
7 #include <unistd.h>
8 
9 #include <phosphor-logging/elog-errors.hpp>
10 #include <phosphor-logging/elog.hpp>
11 #include <phosphor-logging/lg2.hpp>
12 
13 #include <filesystem>
14 
15 namespace openpower
16 {
17 namespace dump
18 {
19 namespace util
20 {
21 
isOPDumpsEnabled(sdbusplus::bus_t & bus)22 bool isOPDumpsEnabled(sdbusplus::bus_t& bus)
23 {
24     // Set isEnabled as true by default. In a field deployment, the system dump
25     // feature is usually enabled to facilitate effective debugging in the event
26     // of a failure. If due to some error, the settings service couldn't provide
27     // the actual value, the system assumes that the dump is enabled.
28     // This approach aligns with the principle of collecting as much data as
29     // possible for debugging in case of a system failure.
30     auto isEnabled = true;
31 
32     constexpr auto enable = "xyz.openbmc_project.Object.Enable";
33     constexpr auto policy = "/xyz/openbmc_project/dump/system_dump_policy";
34     constexpr auto property = "org.freedesktop.DBus.Properties";
35 
36     try
37     {
38         auto service = phosphor::dump::getService(bus, policy, enable);
39 
40         auto method =
41             bus.new_method_call(service.c_str(), policy, property, "Get");
42         method.append(enable, "Enabled");
43         auto reply = bus.call(method);
44         std::variant<bool> v;
45         reply.read(v);
46         isEnabled = std::get<bool>(v);
47     }
48     catch (const sdbusplus::exception::SdBusError& e)
49     {
50         lg2::error("Error: {ERROR} in getting dump policy, default is enabled",
51                    "ERROR", e);
52     }
53     return isEnabled;
54 }
55 
readBIOSAttribute(const std::string & attrName,sdbusplus::bus_t & bus)56 BIOSAttrValueType readBIOSAttribute(const std::string& attrName,
57                                     sdbusplus::bus_t& bus)
58 {
59     std::tuple<std::string, BIOSAttrValueType, BIOSAttrValueType> attrVal;
60     auto method = bus.new_method_call(
61         "xyz.openbmc_project.BIOSConfigManager",
62         "/xyz/openbmc_project/bios_config/manager",
63         "xyz.openbmc_project.BIOSConfig.Manager", "GetAttribute");
64     method.append(attrName);
65     try
66     {
67         auto result = bus.call(method);
68         result.read(std::get<0>(attrVal), std::get<1>(attrVal),
69                     std::get<2>(attrVal));
70     }
71     catch (const sdbusplus::exception::SdBusError& e)
72     {
73         lg2::error("Failed to read BIOS Attribute: {ATTRIBUTE_NAME}",
74                    "ATTRIBUTE_NAME", attrName);
75         throw;
76     }
77     return std::get<1>(attrVal);
78 }
79 
isSystemDumpInProgress(sdbusplus::bus_t & bus)80 bool isSystemDumpInProgress(sdbusplus::bus_t& bus)
81 {
82     try
83     {
84         auto dumpInProgress = std::get<std::string>(
85             readBIOSAttribute("pvm_sys_dump_active", bus));
86         if (dumpInProgress == "Enabled")
87         {
88             lg2::info("A system dump is already in progress");
89             return true;
90         }
91     }
92     catch (const std::bad_variant_access& ex)
93     {
94         lg2::error("Failed to read pvm_sys_dump_active property value due "
95                    "to bad variant access error:{ERROR}",
96                    "ERROR", ex);
97         return false;
98     }
99     catch (const std::exception& ex)
100     {
101         lg2::error("Failed to read pvm_sys_dump_active error:{ERROR}", "ERROR",
102                    ex);
103         return false;
104     }
105 
106     lg2::info("Another system dump is not in progress");
107     return false;
108 }
109 
110 } // namespace util
111 } // namespace dump
112 } // namespace openpower
113