blob: 92e1472d6493fe8f453db3492e8281e547e0a4e6 [file] [log] [blame]
Wludzik, Jozef76833cb2020-12-21 14:42:41 +01001#include "trigger.hpp"
2
Krzysztof Grobelnydcc4e192021-03-08 09:09:34 +00003#include "types/report_types.hpp"
4#include "types/trigger_types.hpp"
Cezary Zwolak4416fce2021-03-17 03:21:06 +01005#include "utils/conversion_trigger.hpp"
Cezary Zwolaka4e67612021-02-18 13:16:16 +01006#include "utils/transform.hpp"
7
8#include <phosphor-logging/log.hpp>
9
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010010Trigger::Trigger(
11 boost::asio::io_context& ioc,
12 const std::shared_ptr<sdbusplus::asio::object_server>& objServer,
Szymon Dompke20013012021-07-23 09:54:20 +020013 const std::string& nameIn, const std::vector<std::string>& triggerActionsIn,
14 const std::vector<std::string>& reportNamesIn,
Cezary Zwolak4416fce2021-03-17 03:21:06 +010015 const std::vector<LabeledSensorInfo>& LabeledSensorsInfoIn,
16 const LabeledTriggerThresholdParams& labeledThresholdParamsIn,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010017 std::vector<std::shared_ptr<interfaces::Threshold>>&& thresholdsIn,
Cezary Zwolaka4e67612021-02-18 13:16:16 +010018 interfaces::TriggerManager& triggerManager,
19 interfaces::JsonStorage& triggerStorageIn) :
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010020 name(nameIn),
Szymon Dompke20013012021-07-23 09:54:20 +020021 triggerActions(std::move(triggerActionsIn)), path(triggerDir + name),
22 reportNames(reportNamesIn), labeledSensorsInfo(LabeledSensorsInfoIn),
Cezary Zwolak4416fce2021-03-17 03:21:06 +010023 labeledThresholdParams(labeledThresholdParamsIn),
24 thresholds(std::move(thresholdsIn)),
Cezary Zwolaka4e67612021-02-18 13:16:16 +010025 fileName(std::to_string(std::hash<std::string>{}(name))),
26 triggerStorage(triggerStorageIn)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010027{
28 deleteIface = objServer->add_unique_interface(
29 path, deleteIfaceName, [this, &ioc, &triggerManager](auto& dbusIface) {
30 dbusIface.register_method("Delete", [this, &ioc, &triggerManager] {
Cezary Zwolaka4e67612021-02-18 13:16:16 +010031 if (persistent)
32 {
33 triggerStorage.remove(fileName);
34 }
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010035 boost::asio::post(ioc, [this, &triggerManager] {
36 triggerManager.removeTrigger(this);
37 });
38 });
39 });
40
41 triggerIface = objServer->add_unique_interface(
Szymon Dompke20013012021-07-23 09:54:20 +020042 path, triggerIfaceName, [this](auto& dbusIface) {
Cezary Zwolaka4e67612021-02-18 13:16:16 +010043 persistent = storeConfiguration();
44 dbusIface.register_property_rw(
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010045 "Persistent", persistent,
46 sdbusplus::vtable::property_::emits_change,
Cezary Zwolaka4e67612021-02-18 13:16:16 +010047 [this](bool newVal, const auto&) {
48 if (newVal == persistent)
49 {
50 return true;
51 }
52 if (newVal)
53 {
54 persistent = storeConfiguration();
55 }
56 else
57 {
58 triggerStorage.remove(fileName);
59 persistent = false;
60 }
61 return true;
62 },
63 [this](const auto&) { return persistent; });
64
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010065 dbusIface.register_property_r(
Cezary Zwolak4416fce2021-03-17 03:21:06 +010066 "Thresholds", TriggerThresholdParams{},
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010067 sdbusplus::vtable::property_::emits_change,
Cezary Zwolak4416fce2021-03-17 03:21:06 +010068 [this](const auto&) {
69 return std::visit(
70 utils::FromLabeledThresholdParamConversion(),
71 labeledThresholdParams);
72 });
73
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010074 dbusIface.register_property_r(
Cezary Zwolak4416fce2021-03-17 03:21:06 +010075 "Sensors", SensorsInfo{},
76 sdbusplus::vtable::property_::emits_change,
77 [this](const auto&) {
78 return utils::fromLabeledSensorsInfo(labeledSensorsInfo);
79 });
80
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010081 dbusIface.register_property_r(
82 "ReportNames", reportNames,
83 sdbusplus::vtable::property_::emits_change,
84 [](const auto& x) { return x; });
Szymon Dompke20013012021-07-23 09:54:20 +020085
86 dbusIface.register_property_r(
87 "Discrete", false, sdbusplus::vtable::property_::const_,
88 [this](const auto& x) {
89 return isTriggerThresholdDiscrete(labeledThresholdParams);
90 });
91
92 dbusIface.register_property_r("TriggerActions", triggerActions,
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010093 sdbusplus::vtable::property_::const_,
Szymon Dompke20013012021-07-23 09:54:20 +020094 [this](const auto& x) { return x; });
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010095 });
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010096
97 for (const auto& threshold : thresholds)
98 {
99 threshold->initialize();
100 }
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100101}
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100102
103bool Trigger::storeConfiguration() const
104{
105 try
106 {
107 nlohmann::json data;
108
109 data["Version"] = triggerVersion;
110 data["Name"] = name;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100111 data["ThresholdParamsDiscriminator"] = labeledThresholdParams.index();
Szymon Dompke20013012021-07-23 09:54:20 +0200112 data["TriggerActions"] = triggerActions;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100113 data["ThresholdParams"] =
114 utils::labeledThresholdParamsToJson(labeledThresholdParams);
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100115 data["ReportNames"] = reportNames;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100116 data["Sensors"] = labeledSensorsInfo;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100117
118 triggerStorage.store(fileName, data);
119 }
120 catch (const std::exception& e)
121 {
122 phosphor::logging::log<phosphor::logging::level::ERR>(
123 "Failed to store a trigger in storage",
124 phosphor::logging::entry("EXCEPTION_MSG=%s", e.what()));
125 return false;
126 }
127 return true;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100128}