blob: 204affac37ecf1ca2ae4a66fafdc488c39f7f72d [file] [log] [blame]
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05001#include "utils.hpp"
2
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -06003#include <unistd.h>
4
Patrick Williamsc9bb6422021-08-27 06:18:35 -05005#include <phosphor-logging/lg2.hpp>
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05006
Jayashankar Padatha0135602019-04-22 16:22:58 +05307namespace utils
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05008{
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -05009
Patrick Williamsc9bb6422021-08-27 06:18:35 -050010PHOSPHOR_LOG2_USING;
Jayashankar Padatha0135602019-04-22 16:22:58 +053011
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050012std::string getService(sdbusplus::bus_t& bus, const std::string& path,
Jayashankar Padatha0135602019-04-22 16:22:58 +053013 const std::string& interface)
14{
15 auto method = bus.new_method_call(MAPPER_BUSNAME, MAPPER_PATH,
16 MAPPER_BUSNAME, "GetObject");
17
18 method.append(path);
19 method.append(std::vector<std::string>({interface}));
20
21 std::vector<std::pair<std::string, std::vector<std::string>>> response;
22
23 try
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -050024 {
Jayashankar Padatha0135602019-04-22 16:22:58 +053025 auto reply = bus.call(method);
26 reply.read(response);
27 if (response.empty())
28 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -050029 error(
30 "Empty response from mapper for getting service name: {PATH} {INTERFACE}",
31 "PATH", path, "INTERFACE", interface);
Jayashankar Padatha0135602019-04-22 16:22:58 +053032 return std::string{};
33 }
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -050034 }
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050035 catch (const sdbusplus::exception_t& e)
Jayashankar Padatha0135602019-04-22 16:22:58 +053036 {
Patrick Williamsc9bb6422021-08-27 06:18:35 -050037 error("Error in mapper method call for ({PATH}, {INTERFACE}: {ERROR}",
38 "ERROR", e, "PATH", path, "INTERFACE", interface);
Jayashankar Padatha0135602019-04-22 16:22:58 +053039 return std::string{};
40 }
41 return response[0].first;
Adriana Kobylak5ed9b2d2018-09-06 13:15:34 -050042}
43
Patrick Williamsbf2bb2b2022-07-22 19:26:52 -050044void setProperty(sdbusplus::bus_t& bus, const std::string& objectPath,
George Liufc025e12021-11-09 19:29:12 +080045 const std::string& interface, const std::string& propertyName,
46 const PropertyValue& value)
47{
48 auto service = getService(bus, objectPath, interface);
49 if (service.empty())
50 {
51 return;
52 }
53
54 auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
55 "org.freedesktop.DBus.Properties", "Set");
56 method.append(interface.c_str(), propertyName.c_str(), value);
57
58 bus.call_noreply(method);
59}
60
Lei YU0cd6d842021-12-27 11:56:02 +080061void mergeFiles(const std::vector<std::string>& srcFiles,
62 const std::string& dstFile)
George Liu0a06e972020-12-17 09:17:04 +080063{
64 std::ofstream outFile(dstFile, std::ios::out);
Lei YU0cd6d842021-12-27 11:56:02 +080065 for (const auto& file : srcFiles)
George Liu0a06e972020-12-17 09:17:04 +080066 {
67 std::ifstream inFile;
68 inFile.open(file, std::ios_base::in);
69 if (!inFile)
70 {
71 continue;
72 }
73
74 inFile.peek();
75 if (inFile.eof())
76 {
77 inFile.close();
78 continue;
79 }
80
81 outFile << inFile.rdbuf();
82 inFile.close();
83 }
84 outFile.close();
85}
86
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060087namespace internal
88{
89
90/* @brief Helper function to build a string from command arguments */
Isaac Kurthdeb86b42022-03-08 19:47:53 -060091static std::string buildCommandStr(char** args)
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060092{
Isaac Kurthdeb86b42022-03-08 19:47:53 -060093 std::string command = "";
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060094 for (int i = 0; args[i]; i++)
95 {
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060096 command += args[i];
Isaac Kurthdeb86b42022-03-08 19:47:53 -060097 command += " ";
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -060098 }
99 return command;
100}
101
Isaac Kurthdeb86b42022-03-08 19:47:53 -0600102std::pair<int, std::string> executeCmd(char** args)
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600103{
Isaac Kurthdeb86b42022-03-08 19:47:53 -0600104 std::array<char, 512> buffer;
105 std::string cmd = buildCommandStr(args);
106 std::stringstream result;
107 int rc;
108 FILE* pipe = popen(cmd.c_str(), "r");
109 if (!pipe)
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600110 {
Isaac Kurthdeb86b42022-03-08 19:47:53 -0600111 error("Failed to execute command: {COMMAND}", "COMMAND", cmd);
112 return {-1, std::string{}};
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600113 }
Isaac Kurthdeb86b42022-03-08 19:47:53 -0600114 while (fgets(buffer.data(), buffer.size(), pipe) != nullptr)
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600115 {
Isaac Kurthdeb86b42022-03-08 19:47:53 -0600116 result << buffer.data();
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600117 }
Isaac Kurthdeb86b42022-03-08 19:47:53 -0600118 rc = pclose(pipe);
119 return {rc, result.str()};
Adriana Kobylak8a5ccbb2021-01-20 10:57:05 -0600120}
121
122} // namespace internal
123
Jayashankar Padatha0135602019-04-22 16:22:58 +0530124} // namespace utils