trigger.cpp (94f71c5190b64bb47aa34cdce4eb4cca71d36faa) trigger.cpp (b4ef22e4d365bde35a7fce7950033c9271c68ce7)
1#include "trigger.hpp"
2
3#include "trigger_manager.hpp"
4#include "types/report_types.hpp"
5#include "types/trigger_types.hpp"
6#include "utils/conversion_trigger.hpp"
7#include "utils/transform.hpp"
8
9#include <phosphor-logging/log.hpp>
10
11Trigger::Trigger(
12 boost::asio::io_context& ioc,
13 const std::shared_ptr<sdbusplus::asio::object_server>& objServer,
14 const std::string& idIn, const std::string& nameIn,
15 const std::vector<TriggerAction>& triggerActionsIn,
16 const std::shared_ptr<std::vector<std::string>> reportIdsIn,
17 std::vector<std::shared_ptr<interfaces::Threshold>>&& thresholdsIn,
18 interfaces::TriggerManager& triggerManager,
19 interfaces::JsonStorage& triggerStorageIn,
1#include "trigger.hpp"
2
3#include "trigger_manager.hpp"
4#include "types/report_types.hpp"
5#include "types/trigger_types.hpp"
6#include "utils/conversion_trigger.hpp"
7#include "utils/transform.hpp"
8
9#include <phosphor-logging/log.hpp>
10
11Trigger::Trigger(
12 boost::asio::io_context& ioc,
13 const std::shared_ptr<sdbusplus::asio::object_server>& objServer,
14 const std::string& idIn, const std::string& nameIn,
15 const std::vector<TriggerAction>& triggerActionsIn,
16 const std::shared_ptr<std::vector<std::string>> reportIdsIn,
17 std::vector<std::shared_ptr<interfaces::Threshold>>&& thresholdsIn,
18 interfaces::TriggerManager& triggerManager,
19 interfaces::JsonStorage& triggerStorageIn,
20 const interfaces::TriggerFactory& triggerFactory, Sensors sensorsIn) :
20 const interfaces::TriggerFactory& triggerFactory, Sensors sensorsIn,
21 interfaces::ReportManager& reportManagerIn) :
21 id(idIn),
22 name(nameIn), triggerActions(std::move(triggerActionsIn)),
23 path(triggerDir + id), reportIds(std::move(reportIdsIn)),
24 thresholds(std::move(thresholdsIn)),
25 fileName(std::to_string(std::hash<std::string>{}(id))),
22 id(idIn),
23 name(nameIn), triggerActions(std::move(triggerActionsIn)),
24 path(triggerDir + id), reportIds(std::move(reportIdsIn)),
25 thresholds(std::move(thresholdsIn)),
26 fileName(std::to_string(std::hash<std::string>{}(id))),
26 triggerStorage(triggerStorageIn), sensors(std::move(sensorsIn))
27 triggerStorage(triggerStorageIn), sensors(std::move(sensorsIn)),
28 reportManager(reportManagerIn)
27{
28 deleteIface = objServer->add_unique_interface(
29 path, deleteIfaceName, [this, &ioc, &triggerManager](auto& dbusIface) {
30 dbusIface.register_method("Delete", [this, &ioc, &triggerManager] {
31 if (persistent)
32 {
33 triggerStorage.remove(fileName);
34 }
29{
30 deleteIface = objServer->add_unique_interface(
31 path, deleteIfaceName, [this, &ioc, &triggerManager](auto& dbusIface) {
32 dbusIface.register_method("Delete", [this, &ioc, &triggerManager] {
33 if (persistent)
34 {
35 triggerStorage.remove(fileName);
36 }
37 for (const auto& reportId : *reportIds)
38 {
39 reportManager.updateTriggerIds(reportId, id,
40 TriggerIdUpdate::Remove);
41 }
35 boost::asio::post(ioc, [this, &triggerManager] {
36 triggerManager.removeTrigger(this);
37 });
38 });
39 });
40
41 triggerIface = objServer->add_unique_interface(
42 path, triggerIfaceName, [this, &triggerFactory](auto& dbusIface) {

--- 58 unchanged lines hidden (view full) ---

101 return sensor->getLabeledSensorInfo();
102 }));
103 });
104
105 dbusIface.register_property_rw(
106 "ReportNames", std::vector<std::string>{},
107 sdbusplus::vtable::property_::emits_change,
108 [this](auto newVal, auto& oldVal) {
42 boost::asio::post(ioc, [this, &triggerManager] {
43 triggerManager.removeTrigger(this);
44 });
45 });
46 });
47
48 triggerIface = objServer->add_unique_interface(
49 path, triggerIfaceName, [this, &triggerFactory](auto& dbusIface) {

--- 58 unchanged lines hidden (view full) ---

108 return sensor->getLabeledSensorInfo();
109 }));
110 });
111
112 dbusIface.register_property_rw(
113 "ReportNames", std::vector<std::string>{},
114 sdbusplus::vtable::property_::emits_change,
115 [this](auto newVal, auto& oldVal) {
116 TriggerManager::verifyReportIds(newVal);
117 updateTriggerIdsInReports(newVal);
109 reportIds->clear();
110 std::copy(newVal.begin(), newVal.end(),
111 std::back_inserter(*reportIds));
112 oldVal = std::move(newVal);
113 return 1;
114 },
115 [this](const auto&) { return *reportIds; });
116

--- 23 unchanged lines hidden (view full) ---

140 });
141 });
142 });
143
144 for (const auto& threshold : thresholds)
145 {
146 threshold->initialize();
147 }
118 reportIds->clear();
119 std::copy(newVal.begin(), newVal.end(),
120 std::back_inserter(*reportIds));
121 oldVal = std::move(newVal);
122 return 1;
123 },
124 [this](const auto&) { return *reportIds; });
125

--- 23 unchanged lines hidden (view full) ---

149 });
150 });
151 });
152
153 for (const auto& threshold : thresholds)
154 {
155 threshold->initialize();
156 }
157
158 for (const auto& reportId : *reportIds)
159 {
160 reportManager.updateTriggerIds(reportId, id, TriggerIdUpdate::Add);
161 }
148}
149
150bool Trigger::storeConfiguration() const
151{
152 try
153 {
154 nlohmann::json data;
155

--- 25 unchanged lines hidden (view full) ---

181 {
182 phosphor::logging::log<phosphor::logging::level::ERR>(
183 "Failed to store a trigger in storage",
184 phosphor::logging::entry("EXCEPTION_MSG=%s", e.what()));
185 return false;
186 }
187 return true;
188}
162}
163
164bool Trigger::storeConfiguration() const
165{
166 try
167 {
168 nlohmann::json data;
169

--- 25 unchanged lines hidden (view full) ---

195 {
196 phosphor::logging::log<phosphor::logging::level::ERR>(
197 "Failed to store a trigger in storage",
198 phosphor::logging::entry("EXCEPTION_MSG=%s", e.what()));
199 return false;
200 }
201 return true;
202}
203
204void Trigger::updateTriggerIdsInReports(
205 const std::vector<std::string>& newReportIds)
206{
207 std::vector<std::string> toBeRemoved, toBeAdded;
208 size_t maxSize = std::max(reportIds->size(), newReportIds.size());
209 toBeRemoved.reserve(maxSize);
210 toBeAdded.reserve(maxSize);
211 std::set_difference(reportIds->begin(), reportIds->end(),
212 newReportIds.begin(), newReportIds.end(),
213 std::back_inserter(toBeRemoved));
214 std::set_difference(newReportIds.begin(), newReportIds.end(),
215 reportIds->begin(), reportIds->end(),
216 std::back_inserter(toBeAdded));
217 for (auto& reportId : toBeRemoved)
218 {
219 reportManager.updateTriggerIds(reportId, id, TriggerIdUpdate::Remove);
220 }
221 for (auto& reportId : toBeAdded)
222 {
223 reportManager.updateTriggerIds(reportId, id, TriggerIdUpdate::Add);
224 }
225}