blob: efeb2a0425eccc5d2de05f35fad02b92688fab8a [file] [log] [blame]
James Feist5b4aa862018-08-16 14:07:01 -07001/*
Ed Tanous6be832e2024-09-10 11:44:48 -07002Copyright (c) 2018 Intel Corporation
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
James Feist5b4aa862018-08-16 14:07:01 -070015 */
16#pragma once
17
Ed Tanous95c63072024-03-26 13:19:52 -070018#include "boost_formatters.hpp"
Nan Zhou80d37e72022-06-21 17:46:14 +000019#include "dbus_singleton.hpp"
Ed Tanous863c1c22022-02-21 21:33:06 -080020#include "logging.hpp"
Nan Zhou80d37e72022-06-21 17:46:14 +000021
Ed Tanous478b7ad2024-07-15 19:11:54 -070022#include <boost/system/error_code.hpp>
George Liua4eb7612023-02-11 15:49:46 +080023#include <sdbusplus/asio/property.hpp>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000024#include <sdbusplus/message/native_types.hpp>
James Feist5b4aa862018-08-16 14:07:01 -070025
Nan Zhou80d37e72022-06-21 17:46:14 +000026#include <array>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000027#include <cstddef>
28#include <cstdint>
Manojkiran Eda17a897d2020-09-12 15:31:58 +053029#include <filesystem>
George Liu21384832022-11-09 11:21:15 +080030#include <functional>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050031#include <regex>
George Liu21384832022-11-09 11:21:15 +080032#include <span>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000033#include <sstream>
Nan Zhou80d37e72022-06-21 17:46:14 +000034#include <string>
George Liu7a1dbc42022-12-07 16:03:22 +080035#include <string_view>
Nan Zhou80d37e72022-06-21 17:46:14 +000036#include <tuple>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000037#include <utility>
Ed Tanous40681292022-02-22 10:11:43 -080038#include <variant>
Nan Zhou80d37e72022-06-21 17:46:14 +000039#include <vector>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050040
James Feist5b4aa862018-08-16 14:07:01 -070041namespace dbus
42{
43
44namespace utility
45{
46
Ed Tanousd1a64812021-12-13 12:14:05 -080047// clang-format off
Ed Tanous40681292022-02-22 10:11:43 -080048using DbusVariantType = std::variant<
Ed Tanousd1a64812021-12-13 12:14:05 -080049 std::vector<std::tuple<std::string, std::string, std::string>>,
50 std::vector<std::string>,
51 std::vector<double>,
52 std::string,
53 int64_t,
54 uint64_t,
55 double,
56 int32_t,
57 uint32_t,
58 int16_t,
59 uint16_t,
60 uint8_t,
61 bool,
Ed Tanousd1a64812021-12-13 12:14:05 -080062 sdbusplus::message::unix_fd,
63 std::vector<uint32_t>,
64 std::vector<uint16_t>,
65 sdbusplus::message::object_path,
Krzysztof Grobelny479e8992021-06-17 13:37:57 +000066 std::tuple<uint64_t, std::vector<std::tuple<std::string, double, uint64_t>>>,
Szymon Dompkef19ab442022-03-07 14:28:06 +010067 std::vector<sdbusplus::message::object_path>,
Ed Tanousd1a64812021-12-13 12:14:05 -080068 std::vector<std::tuple<std::string, std::string>>,
69 std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>,
70 std::vector<std::tuple<uint32_t, size_t>>,
Krzysztof Grobelny479e8992021-06-17 13:37:57 +000071 std::vector<std::tuple<
72 std::vector<std::tuple<sdbusplus::message::object_path, std::string>>,
73 std::string, std::string, uint64_t>>
Ed Tanousd1a64812021-12-13 12:14:05 -080074 >;
James Feist5b4aa862018-08-16 14:07:01 -070075
Ed Tanousd1a64812021-12-13 12:14:05 -080076// clang-format on
Ed Tanous711ac7a2021-12-20 09:34:41 -080077using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>;
Michael Shen80f79a42023-08-24 13:41:53 +000078using DBusInterfacesMap =
79 std::vector<std::pair<std::string, DBusPropertiesMap>>;
Zbigniew Kurzynski755a33c2020-02-28 14:06:37 +010080using ManagedObjectType =
Michael Shen80f79a42023-08-24 13:41:53 +000081 std::vector<std::pair<sdbusplus::message::object_path, DBusInterfacesMap>>;
James Feist5b4aa862018-08-16 14:07:01 -070082
Shantappa Teekappanavar5df6eda2022-01-18 12:29:28 -060083// Map of service name to list of interfaces
84using MapperServiceMap =
85 std::vector<std::pair<std::string, std::vector<std::string>>>;
86
87// Map of object paths to MapperServiceMaps
88using MapperGetSubTreeResponse =
89 std::vector<std::pair<std::string, MapperServiceMap>>;
90
Ed Tanousb9d36b42022-02-26 21:42:46 -080091using MapperGetObject =
92 std::vector<std::pair<std::string, std::vector<std::string>>>;
93
94using MapperGetAncestorsResponse = std::vector<
95 std::pair<std::string,
96 std::vector<std::pair<std::string, std::vector<std::string>>>>>;
97
98using MapperGetSubTreePathsResponse = std::vector<std::string>;
99
George Liua4eb7612023-02-11 15:49:46 +0800100using MapperEndPoints = std::vector<std::string>;
101
James Feist5b4aa862018-08-16 14:07:01 -0700102inline void escapePathForDbus(std::string& path)
103{
Ed Tanous4b242742023-05-11 09:51:51 -0700104 const static std::regex reg("[^A-Za-z0-9_/]");
James Feist5b4aa862018-08-16 14:07:01 -0700105 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
106}
107
Ed Tanous863c1c22022-02-21 21:33:06 -0800108inline void logError(const boost::system::error_code& ec)
109{
110 if (ec)
111 {
Ed Tanous62598e32023-07-17 17:06:25 -0700112 BMCWEB_LOG_ERROR("DBus error: {}, cannot call method", ec);
Ed Tanous863c1c22022-02-21 21:33:06 -0800113 }
114}
115
James Feist5b4aa862018-08-16 14:07:01 -0700116// gets the string N strings deep into a path
117// i.e. /0th/1st/2nd/3rd
118inline bool getNthStringFromPath(const std::string& path, int index,
119 std::string& result)
120{
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530121 if (index < 0)
James Feist5b4aa862018-08-16 14:07:01 -0700122 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530123 return false;
124 }
125
126 std::filesystem::path p1(path);
127 int count = -1;
Patrick Williams89492a12023-05-10 07:51:34 -0500128 for (const auto& element : p1)
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530129 {
130 if (element.has_filename())
James Feist5b4aa862018-08-16 14:07:01 -0700131 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530132 ++count;
James Feist5b4aa862018-08-16 14:07:01 -0700133 if (count == index)
134 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530135 result = element.stem().string();
James Feist5b4aa862018-08-16 14:07:01 -0700136 break;
137 }
138 }
139 }
Ed Tanousdcf2ebc2022-01-25 10:07:45 -0800140 return count >= index;
James Feist5b4aa862018-08-16 14:07:01 -0700141}
142
Ratan Gupta22c33712019-05-03 21:50:28 +0530143template <typename Callback>
144inline void checkDbusPathExists(const std::string& path, Callback&& callback)
145{
Ratan Gupta22c33712019-05-03 21:50:28 +0530146 crow::connections::systemBus->async_method_call(
Ed Tanous8cb2c022024-03-27 16:31:46 -0700147 [callback = std::forward<Callback>(callback)](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800148 const boost::system::error_code& ec,
Ed Tanousb9d36b42022-02-26 21:42:46 -0800149 const dbus::utility::MapperGetObject& objectNames) {
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400150 callback(!ec && !objectNames.empty());
151 },
Ratan Gupta22c33712019-05-03 21:50:28 +0530152 "xyz.openbmc_project.ObjectMapper",
153 "/xyz/openbmc_project/object_mapper",
154 "xyz.openbmc_project.ObjectMapper", "GetObject", path,
155 std::array<std::string, 0>());
156}
157
George Liu21384832022-11-09 11:21:15 +0800158inline void
George Liue99073f2022-12-09 11:06:16 +0800159 getSubTree(const std::string& path, int32_t depth,
160 std::span<const std::string_view> interfaces,
George Liu21384832022-11-09 11:21:15 +0800161 std::function<void(const boost::system::error_code&,
162 const MapperGetSubTreeResponse&)>&& callback)
163{
164 crow::connections::systemBus->async_method_call(
165 [callback{std::move(callback)}](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800166 const boost::system::error_code& ec,
George Liu21384832022-11-09 11:21:15 +0800167 const MapperGetSubTreeResponse& subtree) { callback(ec, subtree); },
168 "xyz.openbmc_project.ObjectMapper",
169 "/xyz/openbmc_project/object_mapper",
George Liue99073f2022-12-09 11:06:16 +0800170 "xyz.openbmc_project.ObjectMapper", "GetSubTree", path, depth,
171 interfaces);
George Liu21384832022-11-09 11:21:15 +0800172}
173
174inline void getSubTreePaths(
George Liu7a1dbc42022-12-07 16:03:22 +0800175 const std::string& path, int32_t depth,
176 std::span<const std::string_view> interfaces,
George Liu21384832022-11-09 11:21:15 +0800177 std::function<void(const boost::system::error_code&,
178 const MapperGetSubTreePathsResponse&)>&& callback)
179{
180 crow::connections::systemBus->async_method_call(
181 [callback{std::move(callback)}](
Ed Tanous5e7e2dc2023-02-16 10:37:01 -0800182 const boost::system::error_code& ec,
George Liu21384832022-11-09 11:21:15 +0800183 const MapperGetSubTreePathsResponse& subtreePaths) {
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400184 callback(ec, subtreePaths);
185 },
George Liu21384832022-11-09 11:21:15 +0800186 "xyz.openbmc_project.ObjectMapper",
187 "/xyz/openbmc_project/object_mapper",
George Liu7a1dbc42022-12-07 16:03:22 +0800188 "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", path, depth,
George Liu21384832022-11-09 11:21:15 +0800189 interfaces);
190}
191
Willy Tu8d018362023-04-14 09:14:16 -0700192inline void getAssociatedSubTree(
193 const sdbusplus::message::object_path& associatedPath,
194 const sdbusplus::message::object_path& path, int32_t depth,
195 std::span<const std::string_view> interfaces,
196 std::function<void(const boost::system::error_code&,
197 const MapperGetSubTreeResponse&)>&& callback)
198{
199 crow::connections::systemBus->async_method_call(
200 [callback{std::move(callback)}](
201 const boost::system::error_code& ec,
202 const MapperGetSubTreeResponse& subtree) { callback(ec, subtree); },
203 "xyz.openbmc_project.ObjectMapper",
204 "/xyz/openbmc_project/object_mapper",
205 "xyz.openbmc_project.ObjectMapper", "GetAssociatedSubTree",
206 associatedPath, path, depth, interfaces);
207}
208
209inline void getAssociatedSubTreePaths(
210 const sdbusplus::message::object_path& associatedPath,
211 const sdbusplus::message::object_path& path, int32_t depth,
212 std::span<const std::string_view> interfaces,
213 std::function<void(const boost::system::error_code&,
214 const MapperGetSubTreePathsResponse&)>&& callback)
215{
216 crow::connections::systemBus->async_method_call(
217 [callback{std::move(callback)}](
218 const boost::system::error_code& ec,
219 const MapperGetSubTreePathsResponse& subtreePaths) {
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400220 callback(ec, subtreePaths);
221 },
Willy Tu8d018362023-04-14 09:14:16 -0700222 "xyz.openbmc_project.ObjectMapper",
223 "/xyz/openbmc_project/object_mapper",
224 "xyz.openbmc_project.ObjectMapper", "GetAssociatedSubTreePaths",
225 associatedPath, path, depth, interfaces);
226}
227
Lakshmi Yadlapati64d8e802024-06-26 17:41:19 -0500228inline void getAssociatedSubTreeById(
229 const std::string& id, const std::string& path,
230 std::span<const std::string_view> subtreeInterfaces,
231 std::string_view association,
232 std::span<const std::string_view> endpointInterfaces,
233 std::function<void(const boost::system::error_code&,
234 const MapperGetSubTreeResponse&)>&& callback)
235{
236 crow::connections::systemBus->async_method_call(
237 [callback{std::move(callback)}](
238 const boost::system::error_code& ec,
239 const MapperGetSubTreeResponse& subtree) { callback(ec, subtree); },
240 "xyz.openbmc_project.ObjectMapper",
241 "/xyz/openbmc_project/object_mapper",
242 "xyz.openbmc_project.ObjectMapper", "GetAssociatedSubTreeById", id,
243 path, subtreeInterfaces, association, endpointInterfaces);
244}
245
246inline void getAssociatedSubTreePathsById(
247 const std::string& id, const std::string& path,
248 std::span<const std::string_view> subtreeInterfaces,
249 std::string_view association,
250 std::span<const std::string_view> endpointInterfaces,
251 std::function<void(const boost::system::error_code&,
252 const MapperGetSubTreePathsResponse&)>&& callback)
253{
254 crow::connections::systemBus->async_method_call(
255 [callback{std::move(callback)}](
256 const boost::system::error_code& ec,
257 const MapperGetSubTreePathsResponse& subtreePaths) {
258 callback(ec, subtreePaths);
259 },
260 "xyz.openbmc_project.ObjectMapper",
261 "/xyz/openbmc_project/object_mapper",
262 "xyz.openbmc_project.ObjectMapper", "GetAssociatedSubTreePathsById", id,
263 path, subtreeInterfaces, association, endpointInterfaces);
264}
265
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400266inline void getDbusObject(
267 const std::string& path, std::span<const std::string_view> interfaces,
268 std::function<void(const boost::system::error_code&,
269 const MapperGetObject&)>&& callback)
George Liu2b731192023-01-11 16:27:13 +0800270{
271 crow::connections::systemBus->async_method_call(
272 [callback{std::move(callback)}](const boost::system::error_code& ec,
273 const MapperGetObject& object) {
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400274 callback(ec, object);
275 },
George Liu2b731192023-01-11 16:27:13 +0800276 "xyz.openbmc_project.ObjectMapper",
277 "/xyz/openbmc_project/object_mapper",
278 "xyz.openbmc_project.ObjectMapper", "GetObject", path, interfaces);
279}
280
George Liua4eb7612023-02-11 15:49:46 +0800281inline void getAssociationEndPoints(
282 const std::string& path,
283 std::function<void(const boost::system::error_code&,
284 const MapperEndPoints&)>&& callback)
285{
286 sdbusplus::asio::getProperty<MapperEndPoints>(
287 *crow::connections::systemBus, "xyz.openbmc_project.ObjectMapper", path,
288 "xyz.openbmc_project.Association", "endpoints", std::move(callback));
289}
290
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400291inline void getManagedObjects(
292 const std::string& service, const sdbusplus::message::object_path& path,
293 std::function<void(const boost::system::error_code&,
294 const ManagedObjectType&)>&& callback)
George Liuf5892d02023-03-01 10:37:08 +0800295{
296 crow::connections::systemBus->async_method_call(
297 [callback{std::move(callback)}](const boost::system::error_code& ec,
298 const ManagedObjectType& objects) {
Patrick Williamsbd79bce2024-08-16 15:22:20 -0400299 callback(ec, objects);
300 },
George Liuf5892d02023-03-01 10:37:08 +0800301 service, path, "org.freedesktop.DBus.ObjectManager",
302 "GetManagedObjects");
303}
304
James Feist5b4aa862018-08-16 14:07:01 -0700305} // namespace utility
306} // namespace dbus