xref: /openbmc/phosphor-bmc-code-mgmt/bmc/utils.hpp (revision cab87e9cdeeb3e166d6d577511f6be4dc7721aca)
1*cab87e9cSJagpal Singh Gill #include "config.h"
2*cab87e9cSJagpal Singh Gill 
3*cab87e9cSJagpal Singh Gill #include <sdbusplus/server.hpp>
4*cab87e9cSJagpal Singh Gill 
5*cab87e9cSJagpal Singh Gill #include <fstream>
6*cab87e9cSJagpal Singh Gill #include <map>
7*cab87e9cSJagpal Singh Gill #include <string>
8*cab87e9cSJagpal Singh Gill 
9*cab87e9cSJagpal Singh Gill namespace utils
10*cab87e9cSJagpal Singh Gill {
11*cab87e9cSJagpal Singh Gill 
12*cab87e9cSJagpal Singh Gill using PropertyValue = std::variant<std::string>;
13*cab87e9cSJagpal Singh Gill 
14*cab87e9cSJagpal Singh Gill /**
15*cab87e9cSJagpal Singh Gill  * @brief Get the bus service
16*cab87e9cSJagpal Singh Gill  *
17*cab87e9cSJagpal Singh Gill  * @return the bus service as a string
18*cab87e9cSJagpal Singh Gill  **/
19*cab87e9cSJagpal Singh Gill std::string getService(sdbusplus::bus_t& bus, const std::string& path,
20*cab87e9cSJagpal Singh Gill                        const std::string& interface);
21*cab87e9cSJagpal Singh Gill 
22*cab87e9cSJagpal Singh Gill /** @brief Get property(type: variant)
23*cab87e9cSJagpal Singh Gill  *
24*cab87e9cSJagpal Singh Gill  *  @param[in] bus              -   bus handler
25*cab87e9cSJagpal Singh Gill  *  @param[in] objectPath       -   D-Bus object path
26*cab87e9cSJagpal Singh Gill  *  @param[in] interface        -   D-Bus interface
27*cab87e9cSJagpal Singh Gill  *  @param[in] propertyName     -   D-Bus property name
28*cab87e9cSJagpal Singh Gill  *
29*cab87e9cSJagpal Singh Gill  *  @return The value of the property(type: variant)
30*cab87e9cSJagpal Singh Gill  *
31*cab87e9cSJagpal Singh Gill  *  @throw sdbusplus::exception_t when it fails
32*cab87e9cSJagpal Singh Gill  */
33*cab87e9cSJagpal Singh Gill template <typename T>
getProperty(sdbusplus::bus_t & bus,const std::string & objectPath,const std::string & interface,const std::string & propertyName)34*cab87e9cSJagpal Singh Gill T getProperty(sdbusplus::bus_t& bus, const std::string& objectPath,
35*cab87e9cSJagpal Singh Gill               const std::string& interface, const std::string& propertyName)
36*cab87e9cSJagpal Singh Gill {
37*cab87e9cSJagpal Singh Gill     std::variant<T> value{};
38*cab87e9cSJagpal Singh Gill     auto service = getService(bus, objectPath, interface);
39*cab87e9cSJagpal Singh Gill     if (service.empty())
40*cab87e9cSJagpal Singh Gill     {
41*cab87e9cSJagpal Singh Gill         return std::get<T>(value);
42*cab87e9cSJagpal Singh Gill     }
43*cab87e9cSJagpal Singh Gill 
44*cab87e9cSJagpal Singh Gill     auto method = bus.new_method_call(service.c_str(), objectPath.c_str(),
45*cab87e9cSJagpal Singh Gill                                       "org.freedesktop.DBus.Properties", "Get");
46*cab87e9cSJagpal Singh Gill     method.append(interface, propertyName);
47*cab87e9cSJagpal Singh Gill 
48*cab87e9cSJagpal Singh Gill     auto reply = bus.call(method);
49*cab87e9cSJagpal Singh Gill     reply.read(value);
50*cab87e9cSJagpal Singh Gill 
51*cab87e9cSJagpal Singh Gill     return std::get<T>(value);
52*cab87e9cSJagpal Singh Gill }
53*cab87e9cSJagpal Singh Gill 
54*cab87e9cSJagpal Singh Gill /** @brief Set D-Bus property
55*cab87e9cSJagpal Singh Gill  *
56*cab87e9cSJagpal Singh Gill  *  @param[in] bus              -   bus handler
57*cab87e9cSJagpal Singh Gill  *  @param[in] objectPath       -   D-Bus object path
58*cab87e9cSJagpal Singh Gill  *  @param[in] interface        -   D-Bus interface
59*cab87e9cSJagpal Singh Gill  *  @param[in] propertyName     -   D-Bus property name
60*cab87e9cSJagpal Singh Gill  *  @param[in] value            -   The value to be set
61*cab87e9cSJagpal Singh Gill  *
62*cab87e9cSJagpal Singh Gill  *  @throw sdbusplus::exception_t when it fails
63*cab87e9cSJagpal Singh Gill  */
64*cab87e9cSJagpal Singh Gill void setProperty(sdbusplus::bus_t& bus, const std::string& objectPath,
65*cab87e9cSJagpal Singh Gill                  const std::string& interface, const std::string& propertyName,
66*cab87e9cSJagpal Singh Gill                  const PropertyValue& value);
67*cab87e9cSJagpal Singh Gill 
68*cab87e9cSJagpal Singh Gill /**
69*cab87e9cSJagpal Singh Gill  * @brief Merge more files
70*cab87e9cSJagpal Singh Gill  *
71*cab87e9cSJagpal Singh Gill  * @param[in] srcFiles - source files
72*cab87e9cSJagpal Singh Gill  * @param[out] dstFile - destination file
73*cab87e9cSJagpal Singh Gill  * @return
74*cab87e9cSJagpal Singh Gill  **/
75*cab87e9cSJagpal Singh Gill void mergeFiles(const std::vector<std::string>& srcFiles,
76*cab87e9cSJagpal Singh Gill                 const std::string& dstFile);
77*cab87e9cSJagpal Singh Gill 
78*cab87e9cSJagpal Singh Gill namespace internal
79*cab87e9cSJagpal Singh Gill {
80*cab87e9cSJagpal Singh Gill 
81*cab87e9cSJagpal Singh Gill /**
82*cab87e9cSJagpal Singh Gill  * @brief Construct an argument vector to be used with an exec command, which
83*cab87e9cSJagpal Singh Gill  *        requires the name of the executable to be the first argument, and a
84*cab87e9cSJagpal Singh Gill  *        null terminator to be the last.
85*cab87e9cSJagpal Singh Gill  * @param[in] name - Name of the executable
86*cab87e9cSJagpal Singh Gill  * @param[in] args - Optional arguments
87*cab87e9cSJagpal Singh Gill  * @return char* vector
88*cab87e9cSJagpal Singh Gill  */
89*cab87e9cSJagpal Singh Gill template <typename... Arg>
constructArgv(const char * name,Arg &&...args)90*cab87e9cSJagpal Singh Gill constexpr auto constructArgv(const char* name, Arg&&... args)
91*cab87e9cSJagpal Singh Gill {
92*cab87e9cSJagpal Singh Gill     std::vector<char*> argV{
93*cab87e9cSJagpal Singh Gill         {const_cast<char*>(name), const_cast<char*>(args)..., nullptr}};
94*cab87e9cSJagpal Singh Gill     return argV;
95*cab87e9cSJagpal Singh Gill }
96*cab87e9cSJagpal Singh Gill 
97*cab87e9cSJagpal Singh Gill /**
98*cab87e9cSJagpal Singh Gill  * @brief Helper function to execute command in child process
99*cab87e9cSJagpal Singh Gill  * @param[in] args - Executable plus optional arguments
100*cab87e9cSJagpal Singh Gill  * @return 0 and command output on success
101*cab87e9cSJagpal Singh Gill  */
102*cab87e9cSJagpal Singh Gill std::pair<int, std::string> executeCmd(char** args);
103*cab87e9cSJagpal Singh Gill 
104*cab87e9cSJagpal Singh Gill } // namespace internal
105*cab87e9cSJagpal Singh Gill 
106*cab87e9cSJagpal Singh Gill /**
107*cab87e9cSJagpal Singh Gill  * @brief Execute command in child process
108*cab87e9cSJagpal Singh Gill  * @param[in] path - Fully qualified name of the executable to run
109*cab87e9cSJagpal Singh Gill  * @param[in] args - Optional arguments
110*cab87e9cSJagpal Singh Gill  * @return 0 and command output on success
111*cab87e9cSJagpal Singh Gill  */
112*cab87e9cSJagpal Singh Gill template <typename... Arg>
execute(const char * path,Arg &&...args)113*cab87e9cSJagpal Singh Gill std::pair<int, std::string> execute(const char* path, Arg&&... args)
114*cab87e9cSJagpal Singh Gill {
115*cab87e9cSJagpal Singh Gill     auto argArray = internal::constructArgv(path, std::forward<Arg>(args)...);
116*cab87e9cSJagpal Singh Gill 
117*cab87e9cSJagpal Singh Gill     return internal::executeCmd(argArray.data());
118*cab87e9cSJagpal Singh Gill }
119*cab87e9cSJagpal Singh Gill 
120*cab87e9cSJagpal Singh Gill } // namespace utils
121