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