blob: 41917386bf362c5284932ab36a993a8b09166851 [file] [log] [blame]
Wludzik, Jozef76833cb2020-12-21 14:42:41 +01001#include "trigger_manager.hpp"
2
3TriggerManager::TriggerManager(
4 std::unique_ptr<interfaces::TriggerFactory> triggerFactoryIn,
5 const std::shared_ptr<sdbusplus::asio::object_server>& objServer) :
6 triggerFactory(std::move(triggerFactoryIn))
7{
8 managerIface = objServer->add_unique_interface(
9 triggerManagerPath, triggerManagerIfaceName, [this](auto& iface) {
10 iface.register_method(
11 "AddTrigger",
12 [this](
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010013 boost::asio::yield_context& yield, const std::string& name,
14 bool isDiscrete, bool logToJournal, bool logToRedfish,
15 bool updateReport,
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010016 const std::vector<std::pair<sdbusplus::message::object_path,
17 std::string>>& sensors,
18 const std::vector<std::string>& reportNames,
19 const TriggerThresholdParams& thresholds) {
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010020 if (isDiscrete)
21 {
22 throw sdbusplus::exception::SdBusError(
23 static_cast<int>(std::errc::not_supported),
24 "Only numeric threshold is supported");
25 }
26
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010027 if (triggers.size() >= maxTriggers)
28 {
29 throw sdbusplus::exception::SdBusError(
30 static_cast<int>(std::errc::too_many_files_open),
31 "Reached maximal trigger count");
32 }
33
34 for (const auto& trigger : triggers)
35 {
36 if (trigger->getName() == name)
37 {
38 throw sdbusplus::exception::SdBusError(
39 static_cast<int>(std::errc::file_exists),
40 "Duplicate trigger");
41 }
42 }
43
44 triggers.emplace_back(triggerFactory->make(
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010045 yield, name, isDiscrete, logToJournal, logToRedfish,
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010046 updateReport, sensors, reportNames, thresholds, *this));
47 return triggers.back()->getPath();
48 });
49 });
50}
51
52void TriggerManager::removeTrigger(const interfaces::Trigger* trigger)
53{
54 triggers.erase(
55 std::remove_if(triggers.begin(), triggers.end(),
56 [trigger](const auto& x) { return trigger == x.get(); }),
57 triggers.end());
58}