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 Geissler void 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 Geissler TargetErrorData 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