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