xref: /openbmc/openpower-debug-collector/dump/dump_collect_main.cpp (revision 858d1aafe118988922f7d2efa322444307c8662e)
1 #include "sbe_consts.hpp"
2 #include "sbe_dump_collector.hpp"
3 
4 #include <CLI/App.hpp>
5 #include <CLI/Config.hpp>
6 #include <CLI/Formatter.hpp>
7 
8 #include <filesystem>
9 #include <iostream>
10 
11 int main(int argc, char** argv)
12 {
13     using namespace openpower::dump::sbe_chipop;
14     using std::filesystem::path;
15     using namespace openpower::dump::SBE;
16 
17     CLI::App app{"Dump Collector Application", "dump-collect"};
18     app.description(
19         "Collects dumps from the Self Boot Engine (SBE) based on "
20         "provided parameters.\nSupports different types of dumps and requires "
21         "specific options based on the dump type.");
22 
23     int type = 0;
24     uint32_t id;
25     std::string pathStr;
26     std::optional<uint64_t> failingUnit;
27 
28     app.add_option("--type, -t", type, "Type of the dump")
29         ->required()
30         ->check(
31             CLI::IsMember({SBE_DUMP_TYPE_HARDWARE, SBE_DUMP_TYPE_HOSTBOOT}));
32 
33     app.add_option("--id, -i", id, "ID of the dump")->required();
34 
35     app.add_option("--path, -p", pathStr,
36                    "Path to store the collected dump files")
37         ->required();
38 
39     app.add_option("--failingunit, -f", failingUnit, "ID of the failing unit");
40 
41     try
42     {
43         CLI11_PARSE(app, argc, argv);
44     }
45     catch (const CLI::ParseError& e)
46     {
47         return app.exit(e);
48     }
49 
50     if (type == SBE_DUMP_TYPE_HARDWARE && !failingUnit.has_value())
51     {
52         std::cerr << "Failing unit ID is required for Hardware type dumps\n";
53         return EXIT_FAILURE;
54     }
55 
56     // Directory creation should happen here, after successful parsing
57     std::filesystem::path dirPath{pathStr};
58     if (!std::filesystem::exists(dirPath))
59     {
60         std::filesystem::create_directories(dirPath);
61     }
62 
63     SbeDumpCollector dumpCollector;
64 
65     auto failingUnitId = 0xFFFFFF; // Default or unspecified value
66     if (failingUnit.has_value())
67     {
68         failingUnitId = failingUnit.value();
69     }
70 
71     try
72     {
73         dumpCollector.collectDump(type, id, failingUnitId, pathStr);
74     }
75     catch (const std::exception& e)
76     {
77         std::cerr << "Failed to collect dump: " << e.what() << std::endl;
78         std::exit(EXIT_FAILURE);
79     }
80 
81     return 0;
82 }
83