blob: 393ffe3a528ec73fd163de4bfff51cb04276c6a9 [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"
19
Nan Zhoud5c80ad2022-07-11 01:16:31 +000020#include <boost/system/error_code.hpp> // IWYU pragma: keep
21#include <sdbusplus/message/native_types.hpp>
James Feist5b4aa862018-08-16 14:07:01 -070022
Nan Zhou80d37e72022-06-21 17:46:14 +000023#include <array>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000024#include <cstddef>
25#include <cstdint>
Manojkiran Eda17a897d2020-09-12 15:31:58 +053026#include <filesystem>
George Liu21384832022-11-09 11:21:15 +080027#include <functional>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050028#include <regex>
George Liu21384832022-11-09 11:21:15 +080029#include <span>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000030#include <sstream>
Nan Zhou80d37e72022-06-21 17:46:14 +000031#include <string>
32#include <tuple>
Nan Zhoud5c80ad2022-07-11 01:16:31 +000033#include <utility>
Ed Tanous40681292022-02-22 10:11:43 -080034#include <variant>
Nan Zhou80d37e72022-06-21 17:46:14 +000035#include <vector>
Gunnar Mills1214b7e2020-06-04 10:11:30 -050036
Nan Zhoud5c80ad2022-07-11 01:16:31 +000037// IWYU pragma: no_include <stddef.h>
38// IWYU pragma: no_include <stdint.h>
39// IWYU pragma: no_include <boost/system/detail/error_code.hpp>
40
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,
66 std::tuple<uint64_t, std::vector<std::tuple<std::string, std::string, double, uint64_t>>>,
67 std::vector<std::tuple<std::string, std::string>>,
68 std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>,
69 std::vector<std::tuple<uint32_t, size_t>>,
70 std::vector<std::tuple<sdbusplus::message::object_path, std::string,
71 std::string, std::string>>
72 >;
James Feist5b4aa862018-08-16 14:07:01 -070073
Ed Tanousd1a64812021-12-13 12:14:05 -080074// clang-format on
Ed Tanous711ac7a2021-12-20 09:34:41 -080075using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>;
76using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>;
Zbigniew Kurzynski755a33c2020-02-28 14:06:37 +010077using ManagedObjectType =
78 std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>;
James Feist5b4aa862018-08-16 14:07:01 -070079
Shantappa Teekappanavar5df6eda2022-01-18 12:29:28 -060080// Map of service name to list of interfaces
81using MapperServiceMap =
82 std::vector<std::pair<std::string, std::vector<std::string>>>;
83
84// Map of object paths to MapperServiceMaps
85using MapperGetSubTreeResponse =
86 std::vector<std::pair<std::string, MapperServiceMap>>;
87
Ed Tanousb9d36b42022-02-26 21:42:46 -080088using MapperGetObject =
89 std::vector<std::pair<std::string, std::vector<std::string>>>;
90
91using MapperGetAncestorsResponse = std::vector<
92 std::pair<std::string,
93 std::vector<std::pair<std::string, std::vector<std::string>>>>>;
94
95using MapperGetSubTreePathsResponse = std::vector<std::string>;
96
James Feist5b4aa862018-08-16 14:07:01 -070097inline void escapePathForDbus(std::string& path)
98{
99 const std::regex reg("[^A-Za-z0-9_/]");
100 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_");
101}
102
103// gets the string N strings deep into a path
104// i.e. /0th/1st/2nd/3rd
105inline bool getNthStringFromPath(const std::string& path, int index,
106 std::string& result)
107{
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530108 if (index < 0)
James Feist5b4aa862018-08-16 14:07:01 -0700109 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530110 return false;
111 }
112
113 std::filesystem::path p1(path);
114 int count = -1;
115 for (auto const& element : p1)
116 {
117 if (element.has_filename())
James Feist5b4aa862018-08-16 14:07:01 -0700118 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530119 ++count;
James Feist5b4aa862018-08-16 14:07:01 -0700120 if (count == index)
121 {
Manojkiran Eda17a897d2020-09-12 15:31:58 +0530122 result = element.stem().string();
James Feist5b4aa862018-08-16 14:07:01 -0700123 break;
124 }
125 }
126 }
Ed Tanousdcf2ebc2022-01-25 10:07:45 -0800127 return count >= index;
James Feist5b4aa862018-08-16 14:07:01 -0700128}
129
Ratan Gupta22c33712019-05-03 21:50:28 +0530130template <typename Callback>
131inline void checkDbusPathExists(const std::string& path, Callback&& callback)
132{
Ratan Gupta22c33712019-05-03 21:50:28 +0530133 crow::connections::systemBus->async_method_call(
Ed Tanousf94c4ec2022-01-06 12:44:41 -0800134 [callback{std::forward<Callback>(callback)}](
135 const boost::system::error_code ec,
Ed Tanousb9d36b42022-02-26 21:42:46 -0800136 const dbus::utility::MapperGetObject& objectNames) {
Ed Tanous002d39b2022-05-31 08:59:27 -0700137 callback(!ec && !objectNames.empty());
Ratan Gupta22c33712019-05-03 21:50:28 +0530138 },
139 "xyz.openbmc_project.ObjectMapper",
140 "/xyz/openbmc_project/object_mapper",
141 "xyz.openbmc_project.ObjectMapper", "GetObject", path,
142 std::array<std::string, 0>());
143}
144
George Liu21384832022-11-09 11:21:15 +0800145inline void
146 getSubTree(const std::string& path, std::span<std::string> interfaces,
147 std::function<void(const boost::system::error_code&,
148 const MapperGetSubTreeResponse&)>&& callback)
149{
150 crow::connections::systemBus->async_method_call(
151 [callback{std::move(callback)}](
152 const boost::system::error_code ec,
153 const MapperGetSubTreeResponse& subtree) { callback(ec, subtree); },
154 "xyz.openbmc_project.ObjectMapper",
155 "/xyz/openbmc_project/object_mapper",
156 "xyz.openbmc_project.ObjectMapper", "GetSubTree", path, 0, interfaces);
157}
158
159inline void getSubTreePaths(
160 const std::string& path, std::span<std::string> interfaces,
161 std::function<void(const boost::system::error_code&,
162 const MapperGetSubTreePathsResponse&)>&& callback)
163{
164 crow::connections::systemBus->async_method_call(
165 [callback{std::move(callback)}](
166 const boost::system::error_code ec,
167 const MapperGetSubTreePathsResponse& subtreePaths) {
168 callback(ec, subtreePaths);
169 },
170 "xyz.openbmc_project.ObjectMapper",
171 "/xyz/openbmc_project/object_mapper",
172 "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", path, 0,
173 interfaces);
174}
175
James Feist5b4aa862018-08-16 14:07:01 -0700176} // namespace utility
177} // namespace dbus