blob: f8e53f44af2ad51e2f364efd360c18be1fd0ca6a [file] [log] [blame]
James Feist5b4aa862018-08-16 14:07:01 -07001/*
2 // Copyright (c) 2018 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16#pragma once
17
Nan Zhou80d37e72022-06-21 17:46:14 +000018#include "dbus_singleton.hpp"
Ed Tanous863c1c22022-02-21 21:33:06 -080019#include "logging.hpp"
Nan Zhou80d37e72022-06-21 17:46:14 +000020
Nan Zhoud5c80ad2022-07-11 01:16:31 +000021#include <boost/system/error_code.hpp> // IWYU pragma: keep
George Liua4eb7612023-02-11 15:49:46 +080022#include <sdbusplus/asio/property.hpp>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000023#include <sdbusplus/message/native_types.hpp>
James Feist5b4aa862018-08-16 14:07:01 -070024
Nan Zhou80d37e72022-06-21 17:46:14 +000025#include <array>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000026#include <cstddef>
27#include <cstdint>
Manojkiran Eda17a897d2020-09-12 15:31:58 +053028#include <filesystem>
George Liu21384832022-11-09 11:21:15 +080029#include <functional>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050030#include <regex>
George Liu21384832022-11-09 11:21:15 +080031#include <span>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000032#include <sstream>
Nan Zhou80d37e72022-06-21 17:46:14 +000033#include <string>
George Liu7a1dbc42022-12-07 16:03:22 +080034#include <string_view>
Nan Zhou80d37e72022-06-21 17:46:14 +000035#include <tuple>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000036#include <utility>
Ed Tanous40681292022-02-22 10:11:43 -080037#include <variant>
Nan Zhou80d37e72022-06-21 17:46:14 +000038#include <vector>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050039
Nan Zhoud5c80ad2022-07-11 01:16:31 +000040// IWYU pragma: no_include <stddef.h>
41// IWYU pragma: no_include <stdint.h>
42// IWYU pragma: no_include <boost/system/detail/error_code.hpp>
43
James Feist5b4aa862018-08-16 14:07:01 -070044namespace dbus
45{
46
47namespace utility
48{
49
Ed Tanousd1a64812021-12-13 12:14:05 -080050// clang-format off
Ed Tanous40681292022-02-22 10:11:43 -080051using DbusVariantType = std::variant<
Ed Tanousd1a64812021-12-13 12:14:05 -080052 std::vector<std::tuple<std::string, std::string, std::string>>,
53 std::vector<std::string>,
54 std::vector<double>,
55 std::string,
56 int64_t,
57 uint64_t,
58 double,
59 int32_t,
60 uint32_t,
61 int16_t,
62 uint16_t,
63 uint8_t,
64 bool,
Ed Tanousd1a64812021-12-13 12:14:05 -080065 sdbusplus::message::unix_fd,
66 std::vector<uint32_t>,
67 std::vector<uint16_t>,
68 sdbusplus::message::object_path,
Krzysztof Grobelny479e8992021-06-17 13:37:57 +000069 std::tuple<uint64_t, std::vector<std::tuple<std::string, double, uint64_t>>>,
Szymon Dompkef19ab442022-03-07 14:28:06 +010070 std::vector<sdbusplus::message::object_path>,
Ed Tanousd1a64812021-12-13 12:14:05 -080071 std::vector<std::tuple<std::string, std::string>>,
72 std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>,
73 std::vector<std::tuple<uint32_t, size_t>>,
Krzysztof Grobelny479e8992021-06-17 13:37:57 +000074 std::vector<std::tuple<
75 std::vector<std::tuple<sdbusplus::message::object_path, std::string>>,
76 std::string, std::string, uint64_t>>
Ed Tanousd1a64812021-12-13 12:14:05 -080077 >;
James Feist5b4aa862018-08-16 14:07:01 -070078
Ed Tanousd1a64812021-12-13 12:14:05 -080079// clang-format on
Ed Tanous711ac7a2021-12-20 09:34:41 -080080using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>;
81using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>;
Zbigniew Kurzynski755a33c2020-02-28 14:06:37 +010082using ManagedObjectType =
83 std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;
James Feist5b4aa862018-08-16 14:07:01 -070084
Shantappa Teekappanavar5df6eda2022-01-18 12:29:28 -060085// Map of service name to list of interfaces
86using MapperServiceMap =
87 std::vector<std::pair<std::string, std::vector<std::string>>>;
88
89// Map of object paths to MapperServiceMaps
90using MapperGetSubTreeResponse =
91 std::vector<std::pair<std::string, MapperServiceMap>>;
92
Ed Tanousb9d36b42022-02-26 21:42:46 -080093using MapperGetObject =
94 std::vector<std::pair<std::string, std::vector<std::string>>>;
95
96using MapperGetAncestorsResponse = std::vector<
97 std::pair<std::string,
98 std::vector<std::pair<std::string, std::vector<std::string>>>>>;
99
100using MapperGetSubTreePathsResponse = std::vector<std::string>;
101
George Liua4eb7612023-02-11 15:49:46 +0800102using MapperEndPoints = std::vector<std::string>;
103
James Feist5b4aa862018-08-16 14:07:01 -0700104inline void escapePathForDbus(std::string& path)
105{
Ed Tanous4b242742023-05-11 09:51:51 -0700106 const static std::regex reg("[^A-Za-z0-9_/]");
James Feist5b4aa862018-08-16 14:07:01 -0700107 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
108}
109
Ed Tanous863c1c22022-02-21 21:33:06 -0800110inline void logError(const boost::system::error_code& ec)
111{
112 if (ec)
113 {
114 BMCWEB_LOG_ERROR << "DBus error: " << ec << ", cannot call method";
115 }
116}
117
James Feist5b4aa862018-08-16 14:07:01 -0700118// gets the string N strings deep into a path
119// i.e. /0th/1st/2nd/3rd
120inline bool getNthStringFromPath(const std::string& path, int index,
121 std::string& result)
122{
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530123 if (index < 0)
James Feist5b4aa862018-08-16 14:07:01 -0700124 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530125 return false;
126 }
127
128 std::filesystem::path p1(path);
129 int count = -1;
Patrick Williams89492a12023-05-10 07:51:34 -0500130 for (const auto& element : p1)
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530131 {
132 if (element.has_filename())
James Feist5b4aa862018-08-16 14:07:01 -0700133 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530134 ++count;
James Feist5b4aa862018-08-16 14:07:01 -0700135 if (count == index)
136 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530137 result = element.stem().string();
James Feist5b4aa862018-08-16 14:07:01 -0700138 break;
139 }
140 }
141 }
Ed Tanousdcf2ebc2022-01-25 10:07:45 -0800142 return count >= index;
James Feist5b4aa862018-08-16 14:07:01 -0700143}
144
Ratan Gupta22c33712019-05-03 21:50:28 +0530145template <typename Callback>
146inline void checkDbusPathExists(const std::string& path, Callback&& callback)
147{
Ratan Gupta22c33712019-05-03 21:50:28 +0530148 crow::connections::systemBus->async_method_call(
Ed Tanousf94c4ec2022-01-06 12:44:41 -0800149 [callback{std::forward<Callback>(callback)}](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800150 const boost::system::error_code& ec,
Ed Tanousb9d36b42022-02-26 21:42:46 -0800151 const dbus::utility::MapperGetObject& objectNames) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700152 callback(!ec && !objectNames.empty());
Ratan Gupta22c33712019-05-03 21:50:28 +0530153 },
154 "xyz.openbmc_project.ObjectMapper",
155 "/xyz/openbmc_project/object_mapper",
156 "xyz.openbmc_project.ObjectMapper", "GetObject", path,
157 std::array<std::string, 0>());
158}
159
George Liu21384832022-11-09 11:21:15 +0800160inline void
George Liue99073f2022-12-09 11:06:16 +0800161 getSubTree(const std::string& path, int32_t depth,
162 std::span<const std::string_view> interfaces,
George Liu21384832022-11-09 11:21:15 +0800163 std::function<void(const boost::system::error_code&,
164 const MapperGetSubTreeResponse&)>&& callback)
165{
166 crow::connections::systemBus->async_method_call(
167 [callback{std::move(callback)}](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800168 const boost::system::error_code& ec,
George Liu21384832022-11-09 11:21:15 +0800169 const MapperGetSubTreeResponse& subtree) { callback(ec, subtree); },
170 "xyz.openbmc_project.ObjectMapper",
171 "/xyz/openbmc_project/object_mapper",
George Liue99073f2022-12-09 11:06:16 +0800172 "xyz.openbmc_project.ObjectMapper", "GetSubTree", path, depth,
173 interfaces);
George Liu21384832022-11-09 11:21:15 +0800174}
175
176inline void getSubTreePaths(
George Liu7a1dbc42022-12-07 16:03:22 +0800177 const std::string& path, int32_t depth,
178 std::span<const std::string_view> interfaces,
George Liu21384832022-11-09 11:21:15 +0800179 std::function<void(const boost::system::error_code&,
180 const MapperGetSubTreePathsResponse&)>&& callback)
181{
182 crow::connections::systemBus->async_method_call(
183 [callback{std::move(callback)}](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800184 const boost::system::error_code& ec,
George Liu21384832022-11-09 11:21:15 +0800185 const MapperGetSubTreePathsResponse& subtreePaths) {
186 callback(ec, subtreePaths);
187 },
188 "xyz.openbmc_project.ObjectMapper",
189 "/xyz/openbmc_project/object_mapper",
George Liu7a1dbc42022-12-07 16:03:22 +0800190 "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", path, depth,
George Liu21384832022-11-09 11:21:15 +0800191 interfaces);
192}
193
Willy Tu8d018362023-04-14 09:14:16 -0700194inline void getAssociatedSubTree(
195 const sdbusplus::message::object_path& associatedPath,
196 const sdbusplus::message::object_path& path, int32_t depth,
197 std::span<const std::string_view> interfaces,
198 std::function<void(const boost::system::error_code&,
199 const MapperGetSubTreeResponse&)>&& callback)
200{
201 crow::connections::systemBus->async_method_call(
202 [callback{std::move(callback)}](
203 const boost::system::error_code& ec,
204 const MapperGetSubTreeResponse& subtree) { callback(ec, subtree); },
205 "xyz.openbmc_project.ObjectMapper",
206 "/xyz/openbmc_project/object_mapper",
207 "xyz.openbmc_project.ObjectMapper", "GetAssociatedSubTree",
208 associatedPath, path, depth, interfaces);
209}
210
211inline void getAssociatedSubTreePaths(
212 const sdbusplus::message::object_path& associatedPath,
213 const sdbusplus::message::object_path& path, int32_t depth,
214 std::span<const std::string_view> interfaces,
215 std::function<void(const boost::system::error_code&,
216 const MapperGetSubTreePathsResponse&)>&& callback)
217{
218 crow::connections::systemBus->async_method_call(
219 [callback{std::move(callback)}](
220 const boost::system::error_code& ec,
221 const MapperGetSubTreePathsResponse& subtreePaths) {
222 callback(ec, subtreePaths);
223 },
224 "xyz.openbmc_project.ObjectMapper",
225 "/xyz/openbmc_project/object_mapper",
226 "xyz.openbmc_project.ObjectMapper", "GetAssociatedSubTreePaths",
227 associatedPath, path, depth, interfaces);
228}
229
George Liu2b731192023-01-11 16:27:13 +0800230inline void
231 getDbusObject(const std::string& path,
232 std::span<const std::string_view> interfaces,
233 std::function<void(const boost::system::error_code&,
234 const MapperGetObject&)>&& callback)
235{
236 crow::connections::systemBus->async_method_call(
237 [callback{std::move(callback)}](const boost::system::error_code& ec,
238 const MapperGetObject& object) {
239 callback(ec, object);
240 },
241 "xyz.openbmc_project.ObjectMapper",
242 "/xyz/openbmc_project/object_mapper",
243 "xyz.openbmc_project.ObjectMapper", "GetObject", path, interfaces);
244}
245
George Liua4eb7612023-02-11 15:49:46 +0800246inline void getAssociationEndPoints(
247 const std::string& path,
248 std::function<void(const boost::system::error_code&,
249 const MapperEndPoints&)>&& callback)
250{
251 sdbusplus::asio::getProperty<MapperEndPoints>(
252 *crow::connections::systemBus, "xyz.openbmc_project.ObjectMapper", path,
253 "xyz.openbmc_project.Association", "endpoints", std::move(callback));
254}
255
George Liuf5892d02023-03-01 10:37:08 +0800256inline void
257 getManagedObjects(const std::string& service,
258 const sdbusplus::message::object_path& path,
259 std::function<void(const boost::system::error_code&,
260 const ManagedObjectType&)>&& callback)
261{
262 crow::connections::systemBus->async_method_call(
263 [callback{std::move(callback)}](const boost::system::error_code& ec,
264 const ManagedObjectType& objects) {
265 callback(ec, objects);
266 },
267 service, path, "org.freedesktop.DBus.ObjectManager",
268 "GetManagedObjects");
269}
270
James Feist5b4aa862018-08-16 14:07:01 -0700271} // namespace utility
272} // namespace dbus