1 /* 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 18 #include "dbus_singleton.hpp" 19 20 #include <boost/system/error_code.hpp> // IWYU pragma: keep 21 #include <sdbusplus/message/native_types.hpp> 22 23 #include <array> 24 #include <cstddef> 25 #include <cstdint> 26 #include <filesystem> 27 #include <regex> 28 #include <sstream> 29 #include <string> 30 #include <tuple> 31 #include <utility> 32 #include <variant> 33 #include <vector> 34 35 // IWYU pragma: no_include <stddef.h> 36 // IWYU pragma: no_include <stdint.h> 37 // IWYU pragma: no_include <boost/system/detail/error_code.hpp> 38 39 namespace dbus 40 { 41 42 namespace utility 43 { 44 45 // clang-format off 46 using DbusVariantType = std::variant< 47 std::vector<std::tuple<std::string, std::string, std::string>>, 48 std::vector<std::string>, 49 std::vector<double>, 50 std::string, 51 int64_t, 52 uint64_t, 53 double, 54 int32_t, 55 uint32_t, 56 int16_t, 57 uint16_t, 58 uint8_t, 59 bool, 60 sdbusplus::message::unix_fd, 61 std::vector<uint32_t>, 62 std::vector<uint16_t>, 63 sdbusplus::message::object_path, 64 std::tuple<uint64_t, std::vector<std::tuple<std::string, std::string, double, uint64_t>>>, 65 std::vector<std::tuple<std::string, std::string>>, 66 std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>, 67 std::vector<std::tuple<uint32_t, size_t>>, 68 std::vector<std::tuple<sdbusplus::message::object_path, std::string, 69 std::string, std::string>> 70 >; 71 72 // clang-format on 73 using DBusPropertiesMap = std::vector<std::pair<std::string, DbusVariantType>>; 74 using DBusInteracesMap = std::vector<std::pair<std::string, DBusPropertiesMap>>; 75 using ManagedObjectType = 76 std::vector<std::pair<sdbusplus::message::object_path, DBusInteracesMap>>; 77 78 // Map of service name to list of interfaces 79 using MapperServiceMap = 80 std::vector<std::pair<std::string, std::vector<std::string>>>; 81 82 // Map of object paths to MapperServiceMaps 83 using MapperGetSubTreeResponse = 84 std::vector<std::pair<std::string, MapperServiceMap>>; 85 86 using MapperGetObject = 87 std::vector<std::pair<std::string, std::vector<std::string>>>; 88 89 using MapperGetAncestorsResponse = std::vector< 90 std::pair<std::string, 91 std::vector<std::pair<std::string, std::vector<std::string>>>>>; 92 93 using MapperGetSubTreePathsResponse = std::vector<std::string>; 94 95 inline void escapePathForDbus(std::string& path) 96 { 97 const std::regex reg("[^A-Za-z0-9_/]"); 98 std::regex_replace(path.begin(), path.begin(), path.end(), reg, "_"); 99 } 100 101 // gets the string N strings deep into a path 102 // i.e. /0th/1st/2nd/3rd 103 inline bool getNthStringFromPath(const std::string& path, int index, 104 std::string& result) 105 { 106 if (index < 0) 107 { 108 return false; 109 } 110 111 std::filesystem::path p1(path); 112 int count = -1; 113 for (auto const& element : p1) 114 { 115 if (element.has_filename()) 116 { 117 ++count; 118 if (count == index) 119 { 120 result = element.stem().string(); 121 break; 122 } 123 } 124 } 125 return count >= index; 126 } 127 128 template <typename Callback> 129 inline void checkDbusPathExists(const std::string& path, Callback&& callback) 130 { 131 crow::connections::systemBus->async_method_call( 132 [callback{std::forward<Callback>(callback)}]( 133 const boost::system::error_code ec, 134 const dbus::utility::MapperGetObject& objectNames) { 135 callback(!ec && !objectNames.empty()); 136 }, 137 "xyz.openbmc_project.ObjectMapper", 138 "/xyz/openbmc_project/object_mapper", 139 "xyz.openbmc_project.ObjectMapper", "GetObject", path, 140 std::array<std::string, 0>()); 141 } 142 143 } // namespace utility 144 } // namespace dbus 145