1*693eaed0SAndrew Geissler #include <cassert> 2*693eaed0SAndrew Geissler #include <fstream> 3*693eaed0SAndrew Geissler #include <iostream> 4*693eaed0SAndrew Geissler #include <systemd_target_parser.hpp> 5*693eaed0SAndrew Geissler 6*693eaed0SAndrew Geissler void validateErrorsToMonitor(std::vector<std::string>& errorsToMonitor) 7*693eaed0SAndrew Geissler { 8*693eaed0SAndrew Geissler assert(errorsToMonitor.size()); 9*693eaed0SAndrew Geissler 10*693eaed0SAndrew Geissler const std::vector<std::string> validErrorsToMonitor = { 11*693eaed0SAndrew Geissler "default", "timeout", "failed", "dependency"}; 12*693eaed0SAndrew Geissler for (const auto& errorToMonitor : errorsToMonitor) 13*693eaed0SAndrew Geissler { 14*693eaed0SAndrew Geissler if (std::find(validErrorsToMonitor.begin(), validErrorsToMonitor.end(), 15*693eaed0SAndrew Geissler errorToMonitor) == validErrorsToMonitor.end()) 16*693eaed0SAndrew Geissler { 17*693eaed0SAndrew Geissler throw std::out_of_range("Found invalid error to monitor"); 18*693eaed0SAndrew Geissler } 19*693eaed0SAndrew Geissler } 20*693eaed0SAndrew Geissler } 21*693eaed0SAndrew Geissler 22*693eaed0SAndrew Geissler TargetErrorData parseFiles(const std::vector<std::string>& filePaths) 23*693eaed0SAndrew Geissler { 24*693eaed0SAndrew Geissler TargetErrorData systemdTargetMap; 25*693eaed0SAndrew Geissler for (const auto& jsonFile : filePaths) 26*693eaed0SAndrew Geissler { 27*693eaed0SAndrew Geissler if (gVerbose) 28*693eaed0SAndrew Geissler { 29*693eaed0SAndrew Geissler std::cout << "Parsing input file " << jsonFile << std::endl; 30*693eaed0SAndrew Geissler } 31*693eaed0SAndrew Geissler std::ifstream fileStream(jsonFile); 32*693eaed0SAndrew Geissler auto j = json::parse(fileStream); 33*693eaed0SAndrew Geissler 34*693eaed0SAndrew Geissler for (auto it = j["targets"].begin(); it != j["targets"].end(); ++it) 35*693eaed0SAndrew Geissler { 36*693eaed0SAndrew Geissler targetEntry entry; 37*693eaed0SAndrew Geissler if (gVerbose) 38*693eaed0SAndrew Geissler { 39*693eaed0SAndrew Geissler std::cout << "target: " << it.key() << " | " << it.value() 40*693eaed0SAndrew Geissler << std::endl; 41*693eaed0SAndrew Geissler } 42*693eaed0SAndrew Geissler 43*693eaed0SAndrew Geissler // Be unforgiving on invalid json files. Just throw or allow 44*693eaed0SAndrew Geissler // nlohmann to throw an exception if something is off 45*693eaed0SAndrew Geissler auto errorsToMonitor = it.value().find("errorsToMonitor"); 46*693eaed0SAndrew Geissler entry.errorsToMonitor = 47*693eaed0SAndrew Geissler errorsToMonitor->get<std::vector<std::string>>(); 48*693eaed0SAndrew Geissler 49*693eaed0SAndrew Geissler validateErrorsToMonitor(entry.errorsToMonitor); 50*693eaed0SAndrew Geissler 51*693eaed0SAndrew Geissler auto errorToLog = it.value().find("errorToLog"); 52*693eaed0SAndrew Geissler entry.errorToLog = errorToLog->get<std::string>(); 53*693eaed0SAndrew Geissler 54*693eaed0SAndrew Geissler systemdTargetMap[it.key()] = entry; 55*693eaed0SAndrew Geissler } 56*693eaed0SAndrew Geissler } 57*693eaed0SAndrew Geissler return systemdTargetMap; 58*693eaed0SAndrew Geissler } 59