blob: a9126672781cda035d3d35976b61b46a870e4220 [file] [log] [blame]
Matt Spinler8c0a63f2018-03-27 12:27:23 -05001/**
2 * Copyright © 2018 IBM Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <experimental/filesystem>
17#include <fstream>
18#include <nlohmann/json.hpp>
19#include <phosphor-logging/log.hpp>
20#include "policy_table.hpp"
21
22namespace ibm
23{
24namespace logging
25{
26namespace policy
27{
28
29namespace fs = std::experimental::filesystem;
30using namespace phosphor::logging;
31
32Table::Table(const std::string& jsonFile)
33{
34 if (fs::exists(jsonFile))
35 {
36 load(jsonFile);
37 }
38 else
39 {
40 log<level::INFO>("Policy table JSON file does not exist",
Matt Spinler259e7272018-03-29 10:57:17 -050041 entry("FILE=%s", jsonFile.c_str()));
Matt Spinler8c0a63f2018-03-27 12:27:23 -050042 }
43}
44
45void Table::load(const std::string& jsonFile)
46{
47 try
48 {
49 std::ifstream file{jsonFile};
50
51 auto json = nlohmann::json::parse(file, nullptr, true);
52
53 for (const auto& policy : json)
54 {
55 DetailsList detailsList;
56
57 for (const auto& details : policy["dtls"])
58 {
59 Details d;
60 d.modifier = details["mod"];
61 d.msg = details["msg"];
62 d.ceid = details["CEID"];
63 detailsList.emplace_back(std::move(d));
64 }
65 policies.emplace(policy["err"], std::move(detailsList));
66 }
67
68 loaded = true;
69 }
70 catch (std::exception& e)
71 {
72 log<level::ERR>("Failed loading policy table json file",
Matt Spinler259e7272018-03-29 10:57:17 -050073 entry("FILE=%s", jsonFile.c_str()),
74 entry("ERROR=%s", e.what()));
Matt Spinler8c0a63f2018-03-27 12:27:23 -050075 loaded = false;
76 }
77}
78
Matt Spinler259e7272018-03-29 10:57:17 -050079optional_ns::optional<DetailsReference>
80 Table::find(const std::string& error, const std::string& modifier) const
Matt Spinler3c9e3012018-03-27 12:36:53 -050081{
Matt Spinler259e7272018-03-29 10:57:17 -050082 // First find the entry based on the error, and then find which
83 // underlying details object it is with the help of the modifier.
Matt Spinler3c9e3012018-03-27 12:36:53 -050084
85 auto policy = policies.find(error);
86
87 if (policy != policies.end())
88 {
Matt Spinler259e7272018-03-29 10:57:17 -050089 // Not all policy entries have a modifier defined, so if it is
90 // empty that will return as a match.
Matt Spinler3c9e3012018-03-27 12:36:53 -050091
92 auto details = std::find_if(
Matt Spinler259e7272018-03-29 10:57:17 -050093 policy->second.begin(), policy->second.end(),
94 [&modifier](const auto& d) {
95 return d.modifier.empty() || (modifier == d.modifier);
96 });
Matt Spinler3c9e3012018-03-27 12:36:53 -050097
98 if (details != policy->second.end())
99 {
100 return DetailsReference(*details);
101 }
102 }
103
104 return {};
105}
Matt Spinler8c0a63f2018-03-27 12:27:23 -0500106}
107}
108}