blob: 6289a0542e051359b79d1980c828911700b8dd0c [file] [log] [blame]
Wludzik, Jozef76833cb2020-12-21 14:42:41 +01001#include "trigger.hpp"
2
Cezary Zwolak4416fce2021-03-17 03:21:06 +01003#include "interfaces/trigger_types.hpp"
Krzysztof Grobelny9f9ff902021-03-05 14:57:53 +00004#include "interfaces/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,
Cezary Zwolaka4e67612021-02-18 13:16:16 +010013 const std::string& nameIn, const bool isDiscreteIn,
14 const bool logToJournalIn, const bool logToRedfishIn,
Cezary Zwolak4416fce2021-03-17 03:21:06 +010015 const bool updateReportIn, const std::vector<std::string>& reportNamesIn,
16 const std::vector<LabeledSensorInfo>& LabeledSensorsInfoIn,
17 const LabeledTriggerThresholdParams& labeledThresholdParamsIn,
Wludzik, Jozef1477fe62021-01-02 11:56:10 +010018 std::vector<std::shared_ptr<interfaces::Threshold>>&& thresholdsIn,
Cezary Zwolaka4e67612021-02-18 13:16:16 +010019 interfaces::TriggerManager& triggerManager,
20 interfaces::JsonStorage& triggerStorageIn) :
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010021 name(nameIn),
Cezary Zwolaka4e67612021-02-18 13:16:16 +010022 isDiscrete(isDiscreteIn), logToJournal(logToJournalIn),
23 logToRedfish(logToRedfishIn), updateReport(updateReportIn),
Cezary Zwolak4416fce2021-03-17 03:21:06 +010024 path(triggerDir + name), reportNames(reportNamesIn),
25 labeledSensorsInfo(LabeledSensorsInfoIn),
26 labeledThresholdParams(labeledThresholdParamsIn),
27 thresholds(std::move(thresholdsIn)),
Cezary Zwolaka4e67612021-02-18 13:16:16 +010028 fileName(std::to_string(std::hash<std::string>{}(name))),
29 triggerStorage(triggerStorageIn)
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010030{
31 deleteIface = objServer->add_unique_interface(
32 path, deleteIfaceName, [this, &ioc, &triggerManager](auto& dbusIface) {
33 dbusIface.register_method("Delete", [this, &ioc, &triggerManager] {
Cezary Zwolaka4e67612021-02-18 13:16:16 +010034 if (persistent)
35 {
36 triggerStorage.remove(fileName);
37 }
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010038 boost::asio::post(ioc, [this, &triggerManager] {
39 triggerManager.removeTrigger(this);
40 });
41 });
42 });
43
44 triggerIface = objServer->add_unique_interface(
45 path, triggerIfaceName,
Cezary Zwolaka4e67612021-02-18 13:16:16 +010046 [this, isDiscreteIn, logToJournalIn, logToRedfishIn,
47 updateReportIn](auto& dbusIface) {
48 persistent = storeConfiguration();
49 dbusIface.register_property_rw(
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010050 "Persistent", persistent,
51 sdbusplus::vtable::property_::emits_change,
Cezary Zwolaka4e67612021-02-18 13:16:16 +010052 [this](bool newVal, const auto&) {
53 if (newVal == persistent)
54 {
55 return true;
56 }
57 if (newVal)
58 {
59 persistent = storeConfiguration();
60 }
61 else
62 {
63 triggerStorage.remove(fileName);
64 persistent = false;
65 }
66 return true;
67 },
68 [this](const auto&) { return persistent; });
69
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010070 dbusIface.register_property_r(
Cezary Zwolak4416fce2021-03-17 03:21:06 +010071 "Thresholds", TriggerThresholdParams{},
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010072 sdbusplus::vtable::property_::emits_change,
Cezary Zwolak4416fce2021-03-17 03:21:06 +010073 [this](const auto&) {
74 return std::visit(
75 utils::FromLabeledThresholdParamConversion(),
76 labeledThresholdParams);
77 });
78
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010079 dbusIface.register_property_r(
Cezary Zwolak4416fce2021-03-17 03:21:06 +010080 "Sensors", SensorsInfo{},
81 sdbusplus::vtable::property_::emits_change,
82 [this](const auto&) {
83 return utils::fromLabeledSensorsInfo(labeledSensorsInfo);
84 });
85
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010086 dbusIface.register_property_r(
Cezary Zwolak4416fce2021-03-17 03:21:06 +010087
Wludzik, Jozef76833cb2020-12-21 14:42:41 +010088 "ReportNames", reportNames,
89 sdbusplus::vtable::property_::emits_change,
90 [](const auto& x) { return x; });
91 dbusIface.register_property_r("Discrete", isDiscrete,
92 sdbusplus::vtable::property_::const_,
93 [](const auto& x) { return x; });
94 dbusIface.register_property_r("LogToJournal", logToJournal,
95 sdbusplus::vtable::property_::const_,
96 [](const auto& x) { return x; });
97 dbusIface.register_property_r("LogToRedfish", logToRedfish,
98 sdbusplus::vtable::property_::const_,
99 [](const auto& x) { return x; });
100 dbusIface.register_property_r("UpdateReport", updateReport,
101 sdbusplus::vtable::property_::const_,
102 [](const auto& x) { return x; });
103 });
Wludzik, Jozef1477fe62021-01-02 11:56:10 +0100104
105 for (const auto& threshold : thresholds)
106 {
107 threshold->initialize();
108 }
Wludzik, Jozef76833cb2020-12-21 14:42:41 +0100109}
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100110
111bool Trigger::storeConfiguration() const
112{
113 try
114 {
115 nlohmann::json data;
116
117 data["Version"] = triggerVersion;
118 data["Name"] = name;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100119 data["ThresholdParamsDiscriminator"] = labeledThresholdParams.index();
120 data["IsDiscrete"] = labeledThresholdParams.index() == 1;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100121 data["LogToJournal"] = logToJournal;
122 data["LogToRedfish"] = logToRedfish;
123 data["UpdateReport"] = updateReport;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100124 data["ThresholdParams"] =
125 utils::labeledThresholdParamsToJson(labeledThresholdParams);
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100126 data["ReportNames"] = reportNames;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100127 data["Sensors"] = labeledSensorsInfo;
Cezary Zwolaka4e67612021-02-18 13:16:16 +0100128
129 triggerStorage.store(fileName, data);
130 }
131 catch (const std::exception& e)
132 {
133 phosphor::logging::log<phosphor::logging::level::ERR>(
134 "Failed to store a trigger in storage",
135 phosphor::logging::entry("EXCEPTION_MSG=%s", e.what()));
136 return false;
137 }
138 return true;
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100139}