1 #pragma once
2
3 #include "constants.hpp"
4 #include "logger.hpp"
5
6 #include <algorithm>
7 #include <cstdio>
8 #include <cstdlib>
9 #include <vector>
10
11 /**
12 * @brief Namespace to host common utility methods.
13 *
14 * A method qualifies as a common utility function if,
15 * A)It is being used by the utility namespace at the same level as well as
16 * other files directly.
17 * B) The utility should be a leaf node and should not be dependent on any other
18 * utility.
19 * *******************
20 * | Commmon Utility | - - - - - - -
21 * ******************* |
22 * /\ |
23 * / \ |
24 * **************** **************** |
25 * | json utility | | dbus utility | |
26 * **************** **************** |
27 * \ / |
28 * \ / |
29 * ************************ |
30 * | Vpd specific Utility | - - - - - - -
31 * ************************
32 */
33
34 namespace vpd
35 {
36
37 namespace commonUtility
38 {
39 /** @brief Return the hex representation of the incoming byte.
40 *
41 * @param [in] i_aByte - The input byte.
42 * @returns Hex representation of the byte as a character.
43 */
toHex(size_t i_aByte)44 constexpr auto toHex(size_t i_aByte)
45 {
46 constexpr auto l_map = "0123456789abcdef";
47 return l_map[i_aByte];
48 }
49
50 /**
51 * @brief API to return null at the end of variadic template args.
52 *
53 * @return empty string.
54 */
getCommand()55 inline std::string getCommand()
56 {
57 return "";
58 }
59
60 /**
61 * @brief API to arrange create command.
62 *
63 * @param[in] arguments to create the command
64 * @return Command string
65 */
66 template <typename T, typename... Types>
getCommand(T i_arg1,Types...i_args)67 inline std::string getCommand(T i_arg1, Types... i_args)
68 {
69 std::string l_cmd = " " + i_arg1 + getCommand(i_args...);
70
71 return l_cmd;
72 }
73
74 /**
75 * @brief API to create shell command and execute.
76 *
77 * @throw std::runtime_error.
78 *
79 * @param[in] arguments for command
80 * @returns output of that command
81 */
82 template <typename T, typename... Types>
executeCmd(T && i_path,Types...i_args)83 inline std::vector<std::string> executeCmd(T&& i_path, Types... i_args)
84 {
85 std::vector<std::string> l_cmdOutput;
86 std::array<char, constants::CMD_BUFFER_LENGTH> l_buffer;
87
88 std::string l_cmd = i_path + getCommand(i_args...);
89
90 std::unique_ptr<FILE, decltype(&pclose)> l_cmdPipe(
91 popen(l_cmd.c_str(), "r"), pclose);
92
93 if (!l_cmdPipe)
94 {
95 logging::logMessage(
96 "popen failed with error " + std::string(strerror(errno)));
97 throw std::runtime_error("popen failed!");
98 }
99 while (fgets(l_buffer.data(), l_buffer.size(), l_cmdPipe.get()) != nullptr)
100 {
101 l_cmdOutput.emplace_back(l_buffer.data());
102 }
103
104 return l_cmdOutput;
105 }
106
107 /** @brief Converts string to lower case.
108 *
109 * @param [in] i_string - Input string.
110 */
toLower(std::string & i_string)111 inline void toLower(std::string& i_string)
112 {
113 std::transform(i_string.begin(), i_string.end(), i_string.begin(),
114 [](unsigned char l_char) { return std::tolower(l_char); });
115 }
116 } // namespace commonUtility
117 } // namespace vpd
118