1 #pragma once 2 3 #include "associations.hpp" 4 #include "types.hpp" 5 6 #include <boost/container/flat_map.hpp> 7 #include <boost/container/flat_set.hpp> 8 #include <cassert> 9 #include <string> 10 11 /** @brief Define white list and black list data structure */ 12 using WhiteBlackList = boost::container::flat_set<std::string>; 13 14 /** @brief The old associations definitions interface */ 15 constexpr const char* orgOpenBMCAssocDefsInterface = "org.openbmc.Associations"; 16 /** @brief The new associations definitions interface */ 17 constexpr const char* assocDefsInterface = 18 "xyz.openbmc_project.Association.Definitions"; 19 20 /** @brief Says if the interface is the association definition interface. 21 * Supports either the new or old interface. 22 * 23 * @param[in] iface - the interface to check 24 * @return bool - if the interface is one of the association definition 25 * ones. 26 */ 27 inline bool isAssocDefIface(std::string_view iface) 28 { 29 return (iface == assocDefsInterface) || 30 (iface == orgOpenBMCAssocDefsInterface); 31 } 32 33 /** @brief Returns the property name used by the defs iface. 34 * 35 * The old interface broke convention and used a lower case property 36 * name. This was resolved with the new interface. 37 * 38 * @param[in] iface - the interface to check 39 * @return std::string - the property name 40 */ 41 inline std::string getAssocDefPropName(std::string_view iface) 42 { 43 assert(isAssocDefIface(iface)); 44 return (iface == assocDefsInterface) ? "Associations" : "associations"; 45 } 46 47 /** @brief InterfacesAdded represents the dbus data from the signal 48 * 49 * There are 2 pairs 50 * pair1: D-bus Interface,vector[pair2] 51 * pair2: D-bus Method,vector[Associations] 52 */ 53 using InterfacesAdded = std::vector<std::pair< 54 std::string, 55 std::vector<std::pair< 56 std::string, sdbusplus::message::variant<std::vector<Association>>>>>>; 57 58 /** @brief Get well known name of input unique name 59 * 60 * If user passes in well known name then that will be returned. 61 * 62 * @param[in] owners - Current list of owners 63 * @param[in] request - The name to look up 64 * @param[out] wellKnown - The well known name if found 65 * 66 * @return True if well known name is found, false otherwise 67 */ 68 bool getWellKnown( 69 const boost::container::flat_map<std::string, std::string>& owners, 70 const std::string& request, std::string& well_known); 71 72 /** @brief Determine if dbus service is something to monitor 73 * 74 * mapper supports a whitelist and blacklist concept. If a whitelist is provided 75 * as input then only dbus objects matching that list is monitored. If a 76 * blacklist is provided then objects matching it will not be monitored. 77 * 78 * @param[in] processName - Dbus service name 79 * @param[in] whiteList - The white list 80 * @param[in] blackList - The black list 81 * 82 * @return True if input process_name should be monitored, false otherwise 83 */ 84 bool needToIntrospect(const std::string& processName, 85 const WhiteBlackList& whiteList, 86 const WhiteBlackList& blackList); 87 88 /** @brief Handle the removal of an existing name in objmgr data structures 89 * 90 * @param[in,out] nameOwners - Map of unique name to well known name 91 * @param[in] wellKnown - Well known name that has new owner 92 * @param[in] oldOwner - Old unique name 93 * @param[in,out] interfaceMap - Map of interfaces 94 * @param[in,out] assocMaps - The association maps 95 * @param[in,out] server - sdbus system object 96 * 97 */ 98 void processNameChangeDelete( 99 boost::container::flat_map<std::string, std::string>& nameOwners, 100 const std::string& wellKnown, const std::string& oldOwner, 101 interface_map_type& interfaceMap, AssociationMaps& assocMaps, 102 sdbusplus::asio::object_server& server); 103 104 /** @brief Handle an interfaces added signal 105 * 106 * @param[in,out] interfaceMap - Global map of interfaces 107 * @param[in] objPath - New path to process 108 * @param[in] interfacesAdded - New interfaces to process 109 * @param[in] wellKnown - Well known name that has new owner 110 * @param[in,out] assocMaps - The association maps 111 * @param[in,out] server - sdbus system object 112 * 113 */ 114 void processInterfaceAdded(interface_map_type& interfaceMap, 115 const sdbusplus::message::object_path& objPath, 116 const InterfacesAdded& intfAdded, 117 const std::string& wellKnown, 118 AssociationMaps& assocMaps, 119 sdbusplus::asio::object_server& server); 120