13b025e69SAndrew Geissler #pragma once 23b025e69SAndrew Geissler 32067926aSAndrew Geissler #include "associations.hpp" 4*35396c10SMatt Spinler #include "types.hpp" 52067926aSAndrew Geissler 63b025e69SAndrew Geissler #include <boost/container/flat_map.hpp> 782815dacSAndrew Geissler #include <boost/container/flat_set.hpp> 88f876a5aSMatt Spinler #include <cassert> 93b025e69SAndrew Geissler #include <string> 103b025e69SAndrew Geissler 1182815dacSAndrew Geissler /** @brief Define white list and black list data structure */ 1282815dacSAndrew Geissler using WhiteBlackList = boost::container::flat_set<std::string>; 1382815dacSAndrew Geissler 148f876a5aSMatt Spinler /** @brief The old associations definitions interface */ 158f876a5aSMatt Spinler constexpr const char* orgOpenBMCAssocDefsInterface = "org.openbmc.Associations"; 168f876a5aSMatt Spinler /** @brief The new associations definitions interface */ 178f876a5aSMatt Spinler constexpr const char* assocDefsInterface = 188f876a5aSMatt Spinler "xyz.openbmc_project.Association.Definitions"; 198f876a5aSMatt Spinler 208f876a5aSMatt Spinler /** @brief Says if the interface is the association definition interface. 218f876a5aSMatt Spinler * Supports either the new or old interface. 228f876a5aSMatt Spinler * 238f876a5aSMatt Spinler * @param[in] iface - the interface to check 248f876a5aSMatt Spinler * @return bool - if the interface is one of the association definition 258f876a5aSMatt Spinler * ones. 268f876a5aSMatt Spinler */ 278f876a5aSMatt Spinler inline bool isAssocDefIface(std::string_view iface) 288f876a5aSMatt Spinler { 298f876a5aSMatt Spinler return (iface == assocDefsInterface) || 308f876a5aSMatt Spinler (iface == orgOpenBMCAssocDefsInterface); 318f876a5aSMatt Spinler } 328f876a5aSMatt Spinler 338f876a5aSMatt Spinler /** @brief Returns the property name used by the defs iface. 348f876a5aSMatt Spinler * 358f876a5aSMatt Spinler * The old interface broke convention and used a lower case property 368f876a5aSMatt Spinler * name. This was resolved with the new interface. 378f876a5aSMatt Spinler * 388f876a5aSMatt Spinler * @param[in] iface - the interface to check 398f876a5aSMatt Spinler * @return std::string - the property name 408f876a5aSMatt Spinler */ 418f876a5aSMatt Spinler inline std::string getAssocDefPropName(std::string_view iface) 428f876a5aSMatt Spinler { 438f876a5aSMatt Spinler assert(isAssocDefIface(iface)); 448f876a5aSMatt Spinler return (iface == assocDefsInterface) ? "Associations" : "associations"; 458f876a5aSMatt Spinler } 462067926aSAndrew Geissler 4770461896SAndrew Geissler /** @brief InterfacesAdded represents the dbus data from the signal 4870461896SAndrew Geissler * 4970461896SAndrew Geissler * There are 2 pairs 5070461896SAndrew Geissler * pair1: D-bus Interface,vector[pair2] 5170461896SAndrew Geissler * pair2: D-bus Method,vector[Associations] 5270461896SAndrew Geissler */ 5370461896SAndrew Geissler using InterfacesAdded = std::vector<std::pair< 5470461896SAndrew Geissler std::string, 5570461896SAndrew Geissler std::vector<std::pair< 5670461896SAndrew Geissler std::string, sdbusplus::message::variant<std::vector<Association>>>>>>; 5770461896SAndrew Geissler 583b025e69SAndrew Geissler /** @brief Get well known name of input unique name 593b025e69SAndrew Geissler * 603b025e69SAndrew Geissler * If user passes in well known name then that will be returned. 613b025e69SAndrew Geissler * 623b025e69SAndrew Geissler * @param[in] owners - Current list of owners 633b025e69SAndrew Geissler * @param[in] request - The name to look up 643b025e69SAndrew Geissler * @param[out] wellKnown - The well known name if found 653b025e69SAndrew Geissler * 663b025e69SAndrew Geissler * @return True if well known name is found, false otherwise 673b025e69SAndrew Geissler */ 683b025e69SAndrew Geissler bool getWellKnown( 693b025e69SAndrew Geissler const boost::container::flat_map<std::string, std::string>& owners, 7082815dacSAndrew Geissler const std::string& request, std::string& well_known); 7182815dacSAndrew Geissler 7282815dacSAndrew Geissler /** @brief Determine if dbus service is something to monitor 7382815dacSAndrew Geissler * 7482815dacSAndrew Geissler * mapper supports a whitelist and blacklist concept. If a whitelist is provided 7582815dacSAndrew Geissler * as input then only dbus objects matching that list is monitored. If a 7682815dacSAndrew Geissler * blacklist is provided then objects matching it will not be monitored. 7782815dacSAndrew Geissler * 7882815dacSAndrew Geissler * @param[in] processName - Dbus service name 7982815dacSAndrew Geissler * @param[in] whiteList - The white list 8082815dacSAndrew Geissler * @param[in] blackList - The black list 8182815dacSAndrew Geissler * 8282815dacSAndrew Geissler * @return True if input process_name should be monitored, false otherwise 8382815dacSAndrew Geissler */ 8482815dacSAndrew Geissler bool needToIntrospect(const std::string& processName, 8582815dacSAndrew Geissler const WhiteBlackList& whiteList, 8682815dacSAndrew Geissler const WhiteBlackList& blackList); 872067926aSAndrew Geissler 882067926aSAndrew Geissler /** @brief Handle the removal of an existing name in objmgr data structures 892067926aSAndrew Geissler * 902067926aSAndrew Geissler * @param[in,out] nameOwners - Map of unique name to well known name 912067926aSAndrew Geissler * @param[in] wellKnown - Well known name that has new owner 922067926aSAndrew Geissler * @param[in] oldOwner - Old unique name 932067926aSAndrew Geissler * @param[in,out] interfaceMap - Map of interfaces 942067926aSAndrew Geissler * @param[in,out] assocOwners - Owners of associations 952067926aSAndrew Geissler * @param[in,out] assocInterfaces - Associations endpoints 962067926aSAndrew Geissler * @param[in,out] server - sdbus system object 972067926aSAndrew Geissler * 982067926aSAndrew Geissler */ 992067926aSAndrew Geissler void processNameChangeDelete( 1002067926aSAndrew Geissler boost::container::flat_map<std::string, std::string>& nameOwners, 1012067926aSAndrew Geissler const std::string& wellKnown, const std::string& oldOwner, 1022067926aSAndrew Geissler interface_map_type& interfaceMap, AssociationOwnersType& assocOwners, 1032067926aSAndrew Geissler AssociationInterfaces& assocInterfaces, 1042067926aSAndrew Geissler sdbusplus::asio::object_server& server); 10570461896SAndrew Geissler 10670461896SAndrew Geissler /** @brief Handle an interfaces added signal 10770461896SAndrew Geissler * 10870461896SAndrew Geissler * @param[in,out] interfaceMap - Global map of interfaces 10970461896SAndrew Geissler * @param[in] objPath - New path to process 11070461896SAndrew Geissler * @param[in] interfacesAdded - New interfaces to process 11170461896SAndrew Geissler * @param[in] wellKnown - Well known name that has new owner 11270461896SAndrew Geissler * @param[in,out] assocOwners - Owners of associations 11370461896SAndrew Geissler * @param[in,out] assocInterfaces - Associations endpoints 11470461896SAndrew Geissler * @param[in,out] server - sdbus system object 11570461896SAndrew Geissler * 11670461896SAndrew Geissler */ 11770461896SAndrew Geissler void processInterfaceAdded(interface_map_type& interfaceMap, 11870461896SAndrew Geissler const sdbusplus::message::object_path& objPath, 11970461896SAndrew Geissler const InterfacesAdded& intfAdded, 12070461896SAndrew Geissler const std::string& wellKnown, 12170461896SAndrew Geissler AssociationOwnersType& assocOwners, 12270461896SAndrew Geissler AssociationInterfaces& assocInterfaces, 12370461896SAndrew Geissler sdbusplus::asio::object_server& server); 124