1 #include <cassert> 2 #include <fstream> 3 #include <iostream> 4 #include <systemd_target_parser.hpp> 5 6 void validateErrorsToMonitor(std::vector<std::string>& errorsToMonitor) 7 { 8 assert(errorsToMonitor.size()); 9 10 const std::vector<std::string> validErrorsToMonitor = { 11 "default", "timeout", "failed", "dependency"}; 12 for (const auto& errorToMonitor : errorsToMonitor) 13 { 14 if (std::find(validErrorsToMonitor.begin(), validErrorsToMonitor.end(), 15 errorToMonitor) == validErrorsToMonitor.end()) 16 { 17 throw std::out_of_range("Found invalid error to monitor"); 18 } 19 } 20 // See if default was in the errors to monitor, if so replace with defaults 21 auto errorItr = 22 std::find(errorsToMonitor.begin(), errorsToMonitor.end(), "default"); 23 if (errorItr != errorsToMonitor.end()) 24 { 25 // Verify default is the only entry 26 if (errorsToMonitor.size() != 1) 27 { 28 throw std::invalid_argument( 29 "default must be only error to monitor"); 30 } 31 // delete "default" and insert defaults 32 errorsToMonitor.erase(errorItr); 33 errorsToMonitor.push_back("timeout"); 34 errorsToMonitor.push_back("failed"); 35 errorsToMonitor.push_back("dependency"); 36 } 37 } 38 39 TargetErrorData parseFiles(const std::vector<std::string>& filePaths) 40 { 41 TargetErrorData systemdTargetMap; 42 for (const auto& jsonFile : filePaths) 43 { 44 if (gVerbose) 45 { 46 std::cout << "Parsing input file " << jsonFile << std::endl; 47 } 48 std::ifstream fileStream(jsonFile); 49 auto j = json::parse(fileStream); 50 51 for (auto it = j["targets"].begin(); it != j["targets"].end(); ++it) 52 { 53 targetEntry entry; 54 if (gVerbose) 55 { 56 std::cout << "target: " << it.key() << " | " << it.value() 57 << std::endl; 58 } 59 60 // Be unforgiving on invalid json files. Just throw or allow 61 // nlohmann to throw an exception if something is off 62 auto errorsToMonitor = it.value().find("errorsToMonitor"); 63 entry.errorsToMonitor = 64 errorsToMonitor->get<std::vector<std::string>>(); 65 66 validateErrorsToMonitor(entry.errorsToMonitor); 67 68 auto errorToLog = it.value().find("errorToLog"); 69 entry.errorToLog = errorToLog->get<std::string>(); 70 71 systemdTargetMap[it.key()] = entry; 72 } 73 } 74 return systemdTargetMap; 75 } 76