1*c893f43dSJason Ling /*
2*c893f43dSJason Ling  * Copyright 2019 Google Inc.
3*c893f43dSJason Ling  *
4*c893f43dSJason Ling  * Licensed under the Apache License, Version 2.0 (the "License");
5*c893f43dSJason Ling  * you may not use this file except in compliance with the License.
6*c893f43dSJason Ling  * You may obtain a copy of the License at
7*c893f43dSJason Ling  *
8*c893f43dSJason Ling  *     http://www.apache.org/licenses/LICENSE-2.0
9*c893f43dSJason Ling  *
10*c893f43dSJason Ling  * Unless required by applicable law or agreed to in writing, software
11*c893f43dSJason Ling  * distributed under the License is distributed on an "AS IS" BASIS,
12*c893f43dSJason Ling  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*c893f43dSJason Ling  * See the License for the specific language governing permissions and
14*c893f43dSJason Ling  * limitations under the License.
15*c893f43dSJason Ling  */
16*c893f43dSJason Ling #include "buildjson.hpp"
17*c893f43dSJason Ling 
18*c893f43dSJason Ling #include "file_handler.hpp"
19*c893f43dSJason Ling #include "fs.hpp"
20*c893f43dSJason Ling 
21*c893f43dSJason Ling #include <nlohmann/json.hpp>
22*c893f43dSJason Ling #include <sdbusplus/bus.hpp>
23*c893f43dSJason Ling 
24*c893f43dSJason Ling #include <algorithm>
25*c893f43dSJason Ling #include <cstdio>
26*c893f43dSJason Ling #include <exception>
27*c893f43dSJason Ling #include <fstream>
28*c893f43dSJason Ling #include <string>
29*c893f43dSJason Ling #include <vector>
30*c893f43dSJason Ling 
31*c893f43dSJason Ling namespace ipmi_flash
32*c893f43dSJason Ling {
33*c893f43dSJason Ling 
34*c893f43dSJason Ling std::unique_ptr<TriggerableActionInterface>
35*c893f43dSJason Ling     buildFileSystemd(const nlohmann::json& data)
36*c893f43dSJason Ling {
37*c893f43dSJason Ling     /* This type of action requires a path and unit, and optionally a mode. */
38*c893f43dSJason Ling     const auto& path = data.at("path");
39*c893f43dSJason Ling     const auto& unit = data.at("unit");
40*c893f43dSJason Ling 
41*c893f43dSJason Ling     /* the mode parameter is optional. */
42*c893f43dSJason Ling     std::string systemdMode = "replace";
43*c893f43dSJason Ling     const auto& mode = data.find("mode");
44*c893f43dSJason Ling     if (mode != data.end())
45*c893f43dSJason Ling     {
46*c893f43dSJason Ling         systemdMode = data.at("mode").get<std::string>();
47*c893f43dSJason Ling     }
48*c893f43dSJason Ling 
49*c893f43dSJason Ling     return SystemdWithStatusFile::CreateSystemdWithStatusFile(
50*c893f43dSJason Ling         sdbusplus::bus::new_default(), path, unit, systemdMode);
51*c893f43dSJason Ling }
52*c893f43dSJason Ling 
53*c893f43dSJason Ling std::unique_ptr<TriggerableActionInterface>
54*c893f43dSJason Ling     buildSystemd(const nlohmann::json& data)
55*c893f43dSJason Ling {
56*c893f43dSJason Ling     /* This type of action requires a unit, and optionally a mode. */
57*c893f43dSJason Ling     const auto& unit = data.at("unit");
58*c893f43dSJason Ling 
59*c893f43dSJason Ling     /* the mode parameter is optional. */
60*c893f43dSJason Ling     std::string systemdMode = "replace";
61*c893f43dSJason Ling     const auto& mode = data.find("mode");
62*c893f43dSJason Ling     if (mode != data.end())
63*c893f43dSJason Ling     {
64*c893f43dSJason Ling         systemdMode = data.at("mode").get<std::string>();
65*c893f43dSJason Ling     }
66*c893f43dSJason Ling 
67*c893f43dSJason Ling     return SystemdNoFile::CreateSystemdNoFile(sdbusplus::bus::new_default(),
68*c893f43dSJason Ling                                               unit, systemdMode);
69*c893f43dSJason Ling }
70*c893f43dSJason Ling 
71*c893f43dSJason Ling template <typename T>
72*c893f43dSJason Ling std::vector<HandlerConfig<T>>
73*c893f43dSJason Ling     HandlersBuilderIfc<T>::buildHandlerConfigs(const std::string& directory)
74*c893f43dSJason Ling {
75*c893f43dSJason Ling     std::vector<HandlerConfig<T>> output;
76*c893f43dSJason Ling 
77*c893f43dSJason Ling     std::vector<std::string> jsonPaths = GetJsonList(directory);
78*c893f43dSJason Ling 
79*c893f43dSJason Ling     for (const auto& path : jsonPaths)
80*c893f43dSJason Ling     {
81*c893f43dSJason Ling         std::ifstream jsonFile(path);
82*c893f43dSJason Ling         if (!jsonFile.is_open())
83*c893f43dSJason Ling         {
84*c893f43dSJason Ling             std::fprintf(stderr, "Unable to open json file: %s\n",
85*c893f43dSJason Ling                          path.c_str());
86*c893f43dSJason Ling             continue;
87*c893f43dSJason Ling         }
88*c893f43dSJason Ling 
89*c893f43dSJason Ling         auto data = nlohmann::json::parse(jsonFile, nullptr, false);
90*c893f43dSJason Ling         if (data.is_discarded())
91*c893f43dSJason Ling         {
92*c893f43dSJason Ling             std::fprintf(stderr, "Parsing json failed: %s\n", path.c_str());
93*c893f43dSJason Ling         }
94*c893f43dSJason Ling 
95*c893f43dSJason Ling         std::vector<HandlerConfig<T>> configs = buildHandlerFromJson(data);
96*c893f43dSJason Ling         std::move(configs.begin(), configs.end(), std::back_inserter(output));
97*c893f43dSJason Ling     }
98*c893f43dSJason Ling     return output;
99*c893f43dSJason Ling }
100*c893f43dSJason Ling 
101*c893f43dSJason Ling } // namespace ipmi_flash
102