blob: 9aaebeeb5510bf59bf1b1ba85594894c04de38db [file] [log] [blame]
Deepak Kodihalli76794492017-02-16 23:48:18 -06001#pragma once
2
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -06003#include "const.hpp"
Deepak Kodihalli76794492017-02-16 23:48:18 -06004#include "types.hpp"
5
SunnySrivastava1984d076da82020-03-05 05:33:35 -06006#include <iostream>
7
8using namespace std;
SunnySrivastava19849094d4f2020-08-05 09:32:29 -05009
Deepak Kodihalli76794492017-02-16 23:48:18 -060010namespace openpower
11{
12namespace vpd
13{
SunnySrivastava1984945a02d2020-05-06 01:55:41 -050014
Santosh Puranikbd011b22020-01-23 04:05:25 -060015/** @brief Return the hex representation of the incoming byte
16 *
17 * @param [in] c - The input byte
18 * @returns The hex representation of the byte as a character.
19 */
20constexpr auto toHex(size_t c)
21{
22 constexpr auto map = "0123456789abcdef";
23 return map[c];
24}
Deepak Kodihalli76794492017-02-16 23:48:18 -060025
26namespace inventory
27{
SunnySrivastava19849094d4f2020-08-05 09:32:29 -050028/** @brief Api to obtain a dictionary of path -> services
29 * where path is in subtree and services is of the type
30 * returned by the GetObject method.
31 *
32 * @param [in] root - Root path for object subtree
33 * @param [in] depth - Maximum subtree depth required
34 * @param [in] interfaces - Array to interfaces for which
35 * result is required.
36 * @return A dictionary of Path -> services
37 */
38MapperResponse
39 getObjectSubtreeForInterfaces(const std::string& root, const int32_t depth,
40 const std::vector<std::string>& interfaces);
41
Deepak Kodihalli76794492017-02-16 23:48:18 -060042} // namespace inventory
43
SunnySrivastava1984f6d541e2020-02-04 12:50:40 -060044/**@brief This API reads 2 Bytes of data and swap the read data
45 * @param[in] iterator- Pointer pointing to the data to be read
46 * @return returns 2 Byte data read at the given pointer
47 */
48openpower::vpd::constants::LE2ByteData
49 readUInt16LE(Binary::const_iterator iterator);
50
SunnySrivastava1984d076da82020-03-05 05:33:35 -060051/** @brief Encodes a keyword for D-Bus.
52 * @param[in] kw - kwd data in string format
53 * @param[in] encoding - required for kwd data
54 */
55string encodeKeyword(const string& kw, const string& encoding);
SunnySrivastava198443306542020-04-01 02:50:20 -050056
57/** @brief Reads a property from the inventory manager given object path,
58 * intreface and property.
59 * @param[in] obj - object path
60 * @param[in] inf - interface
61 * @param[in] prop - property whose value is fetched
62 * @return [out] - value of the property
63 */
64string readBusProperty(const string& obj, const string& inf,
65 const string& prop);
SunnySrivastava1984a20be8e2020-08-26 02:00:50 -050066
67/**
68 * @brief API to create PEL entry
Sunny Srivastava0746eee2021-03-22 13:36:54 -050069 * @param[in] additionalData - Map holding the additional data
70 * @param[in] sev - Severity
71 * @param[in] errIntf - error interface
SunnySrivastava1984a20be8e2020-08-26 02:00:50 -050072 */
73void createPEL(const std::map<std::string, std::string>& additionalData,
Sunny Srivastava0746eee2021-03-22 13:36:54 -050074 const constants::PelSeverity& sev, const std::string& errIntf);
SunnySrivastava19849094d4f2020-08-05 09:32:29 -050075
PriyangaRamasamyc0a534f2020-08-24 21:29:18 +053076/**
77 * @brief getVpdFilePath
78 * Get vpd file path corresponding to the given object path.
79 * @param[in] - json file path
80 * @param[in] - Object path
81 * @return - Vpd file path
82 */
83inventory::VPDfilepath getVpdFilePath(const string& jsonFile,
84 const std::string& ObjPath);
85
86/**
87 * @brief isPathInJson
88 * API which checks for the presence of the given eeprom path in the given json.
89 * @param[in] - eepromPath
90 * @return - true if the eeprom is present in the json; false otherwise
91 */
92bool isPathInJson(const std::string& eepromPath);
93
94/**
95 * @brief isRecKwInDbusJson
96 * API which checks whether the given keyword under the given record is to be
97 * published on dbus or not. Checks against the keywords present in
98 * dbus_property.json.
99 * @param[in] - record name
100 * @param[in] - keyword name
101 * @return - true if the record-keyword pair is present in dbus_property.json;
102 * false otherwise.
103 */
104bool isRecKwInDbusJson(const std::string& record, const std::string& keyword);
105
Sunny Srivastava6c71c9d2021-04-15 04:43:54 -0500106/**
107 * @brief Check the type of VPD.
108 *
109 * Checks the type of vpd based on the start tag.
110 * @param[in] vector - Vpd data in vector format
111 *
112 * @return enum of type vpdType
113 */
114constants::vpdType vpdTypeCheck(const Binary& vector);
115
SunnySrivastava19849a195542020-09-07 06:04:50 -0500116/*
117 * @brief This method does nothing. Just an empty function to return null
118 * at the end of variadic template args
119 */
120inline string getCommand()
121{
122 return "";
123}
124
125/**
126 * @brief This function to arrange all arguments to make commandy
127 * @param[in] arguments to create the command
128 * @return cmd - command string
129 */
130template <typename T, typename... Types>
131inline string getCommand(T arg1, Types... args)
132{
133 string cmd = " " + arg1 + getCommand(args...);
134
135 return cmd;
136}
137
138/**
139 * @brief This API takes arguments, creates a shell command line and executes
140 * them.
141 * @param[in] arguments for command
142 * @returns output of that command
143 */
144template <typename T, typename... Types>
145inline vector<string> executeCmd(T&& path, Types... args)
146{
147 vector<string> stdOutput;
148 array<char, 128> buffer;
149
150 string cmd = path + getCommand(args...);
151
152 unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd.c_str(), "r"), pclose);
153 if (!pipe)
154 {
155 throw runtime_error("popen() failed!");
156 }
157 while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr)
158 {
159 stdOutput.emplace_back(buffer.data());
160 }
161
162 return stdOutput;
163}
164
Patrick Venturec83c4dc2018-11-01 16:29:18 -0700165} // namespace vpd
166} // namespace openpower