1e426b589SAndrew Geissler #include "systemd_target_parser.hpp" 2e426b589SAndrew Geissler 3693eaed0SAndrew Geissler #include <cassert> 4693eaed0SAndrew Geissler #include <fstream> 5693eaed0SAndrew Geissler #include <iostream> 6693eaed0SAndrew Geissler validateErrorsToMonitor(std::vector<std::string> & errorsToMonitor)7693eaed0SAndrew Geisslervoid validateErrorsToMonitor(std::vector<std::string>& errorsToMonitor) 8693eaed0SAndrew Geissler { 9693eaed0SAndrew Geissler assert(errorsToMonitor.size()); 10693eaed0SAndrew Geissler 11693eaed0SAndrew Geissler const std::vector<std::string> validErrorsToMonitor = { 12693eaed0SAndrew Geissler "default", "timeout", "failed", "dependency"}; 13693eaed0SAndrew Geissler for (const auto& errorToMonitor : errorsToMonitor) 14693eaed0SAndrew Geissler { 15693eaed0SAndrew Geissler if (std::find(validErrorsToMonitor.begin(), validErrorsToMonitor.end(), 16693eaed0SAndrew Geissler errorToMonitor) == validErrorsToMonitor.end()) 17693eaed0SAndrew Geissler { 18693eaed0SAndrew Geissler throw std::out_of_range("Found invalid error to monitor"); 19693eaed0SAndrew Geissler } 20693eaed0SAndrew Geissler } 2175a2614fSAndrew Geissler // See if default was in the errors to monitor, if so replace with defaults 22*9e5cd389SPatrick Williams auto errorItr = std::find(errorsToMonitor.begin(), errorsToMonitor.end(), 23*9e5cd389SPatrick Williams "default"); 2475a2614fSAndrew Geissler if (errorItr != errorsToMonitor.end()) 2575a2614fSAndrew Geissler { 2675a2614fSAndrew Geissler // Verify default is the only entry 2775a2614fSAndrew Geissler if (errorsToMonitor.size() != 1) 2875a2614fSAndrew Geissler { 2975a2614fSAndrew Geissler throw std::invalid_argument( 3075a2614fSAndrew Geissler "default must be only error to monitor"); 3175a2614fSAndrew Geissler } 3275a2614fSAndrew Geissler // delete "default" and insert defaults 3375a2614fSAndrew Geissler errorsToMonitor.erase(errorItr); 3475a2614fSAndrew Geissler errorsToMonitor.push_back("timeout"); 3575a2614fSAndrew Geissler errorsToMonitor.push_back("failed"); 3675a2614fSAndrew Geissler errorsToMonitor.push_back("dependency"); 3775a2614fSAndrew Geissler } 38693eaed0SAndrew Geissler } 39693eaed0SAndrew Geissler parseFiles(const std::vector<std::string> & filePaths)40693eaed0SAndrew GeisslerTargetErrorData parseFiles(const std::vector<std::string>& filePaths) 41693eaed0SAndrew Geissler { 42693eaed0SAndrew Geissler TargetErrorData systemdTargetMap; 43693eaed0SAndrew Geissler for (const auto& jsonFile : filePaths) 44693eaed0SAndrew Geissler { 45693eaed0SAndrew Geissler if (gVerbose) 46693eaed0SAndrew Geissler { 47693eaed0SAndrew Geissler std::cout << "Parsing input file " << jsonFile << std::endl; 48693eaed0SAndrew Geissler } 49693eaed0SAndrew Geissler std::ifstream fileStream(jsonFile); 50693eaed0SAndrew Geissler auto j = json::parse(fileStream); 51693eaed0SAndrew Geissler 52693eaed0SAndrew Geissler for (auto it = j["targets"].begin(); it != j["targets"].end(); ++it) 53693eaed0SAndrew Geissler { 54693eaed0SAndrew Geissler targetEntry entry; 55693eaed0SAndrew Geissler if (gVerbose) 56693eaed0SAndrew Geissler { 57693eaed0SAndrew Geissler std::cout << "target: " << it.key() << " | " << it.value() 58693eaed0SAndrew Geissler << std::endl; 59693eaed0SAndrew Geissler } 60693eaed0SAndrew Geissler 61693eaed0SAndrew Geissler // Be unforgiving on invalid json files. Just throw or allow 62693eaed0SAndrew Geissler // nlohmann to throw an exception if something is off 63693eaed0SAndrew Geissler auto errorsToMonitor = it.value().find("errorsToMonitor"); 64693eaed0SAndrew Geissler entry.errorsToMonitor = 65693eaed0SAndrew Geissler errorsToMonitor->get<std::vector<std::string>>(); 66693eaed0SAndrew Geissler 67693eaed0SAndrew Geissler validateErrorsToMonitor(entry.errorsToMonitor); 68693eaed0SAndrew Geissler 69693eaed0SAndrew Geissler auto errorToLog = it.value().find("errorToLog"); 70693eaed0SAndrew Geissler entry.errorToLog = errorToLog->get<std::string>(); 71693eaed0SAndrew Geissler 72693eaed0SAndrew Geissler systemdTargetMap[it.key()] = entry; 73693eaed0SAndrew Geissler } 74693eaed0SAndrew Geissler } 75693eaed0SAndrew Geissler return systemdTargetMap; 76693eaed0SAndrew Geissler } 77