Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 1 | #include "handler.hpp" |
| 2 | |
| 3 | #include <CLI/CLI.hpp> |
| 4 | |
| 5 | int main(int argc, char** argv) |
| 6 | { |
| 7 | |
| 8 | CLI::App app{"PLDM requester tool for OpenBMC"}; |
| 9 | |
| 10 | // TODO: To enable it later |
| 11 | // bool verbose_flag = false; |
| 12 | // app.add_flag("-v, --verbose", verbose_flag, "Output debug logs "); |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 13 | std::vector<std::string> rawCmd{}; |
| 14 | app.add_option("-r, --raw", rawCmd, |
| 15 | "Send a RAW PLDM request and print response"); |
| 16 | |
| 17 | auto base = app.add_subcommand("BASE", "PLDM Command Type = BASE"); |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 18 | std::vector<std::string> args{}; |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 19 | base->add_option("-c, --command", args, |
| 20 | "PLDM request command \n" |
| 21 | "[GetPLDMTypes] Get PLDM Type \n" |
| 22 | "[GetPLDMVersion] Get PLDM Version"); |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 23 | |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 24 | auto bios = app.add_subcommand("BIOS", "PLDM Command Type = BIOS"); |
| 25 | bios->add_option("-c, --command", args, "PLDM request command"); |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 26 | |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 27 | auto oem = app.add_subcommand("OEM", "PLDM Command Type = OEM"); |
| 28 | oem->add_option("-c, --command", args, "PLDM request command"); |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 29 | |
| 30 | CLI11_PARSE(app, argc, argv); |
| 31 | |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 32 | std::string cmdName; |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 33 | int rc = 0; |
| 34 | |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 35 | if (argc < 2) |
| 36 | { |
| 37 | std::cerr << "Run pldmtool --help for more information" << std::endl; |
| 38 | return -1; |
| 39 | } |
| 40 | |
| 41 | if (memcmp(argv[1], "--raw", strlen(argv[1])) != 0 && |
| 42 | memcmp(argv[1], "-r", strlen(argv[1])) != 0) |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 43 | { |
| 44 | // Parse args to program |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 45 | if (args.size() == 0) |
| 46 | { |
| 47 | std::cerr << "Run pldmtool --help for more information" |
| 48 | << std::endl; |
| 49 | return -1; |
| 50 | } |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 51 | cmdName = args[0]; |
| 52 | } |
| 53 | else |
| 54 | { |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 55 | if (rawCmd.size() == 0) |
| 56 | { |
| 57 | std::cerr << "Run pldmtool --help for more information" |
| 58 | << std::endl; |
| 59 | return -1; |
| 60 | } |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 61 | |
| 62 | // loop through the remaining argument list |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 63 | for (auto&& item : rawCmd) |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 64 | { |
| 65 | |
| 66 | if (item[0] == '0' && (item[1] == 'x' || item[1] == 'X')) |
| 67 | { |
| 68 | |
| 69 | // Erase 0x from input |
| 70 | item.erase(0, 2); |
| 71 | |
| 72 | // Check for hex input value validity |
| 73 | if (std::all_of(item.begin(), item.end(), ::isxdigit)) |
| 74 | { |
| 75 | |
| 76 | // Parse args to program |
| 77 | cmdName = "HandleRawOp"; |
| 78 | } |
| 79 | else |
| 80 | { |
| 81 | std::cerr << item << " contains non hex digits. Re-enter" |
| 82 | << std::endl; |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 83 | return -1; |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 84 | } |
| 85 | } |
| 86 | else |
| 87 | { |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 88 | std::cerr << item << " Input hex value starting with 0x " |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 89 | << std::endl; |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 90 | return -1; |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 91 | } |
| 92 | } |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 93 | args = rawCmd; |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 94 | } |
| 95 | |
| 96 | Handler handler; |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 97 | try |
| 98 | { |
| 99 | handler.dispatcher.at(cmdName)(std::move(args)); |
| 100 | } |
| 101 | catch (const std::out_of_range& e) |
| 102 | { |
| 103 | std::cerr << cmdName << " is not supported!" << std::endl; |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 104 | return -1; |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 105 | } |
George Liu | 15af858 | 2019-11-07 17:42:39 +0800 | [diff] [blame] | 106 | |
Lakshminarayana R. Kammath | 58229b2 | 2019-08-09 06:30:04 -0500 | [diff] [blame] | 107 | return rc; |
Lakshminarayana R. Kammath | 27693a4 | 2019-06-24 00:51:47 -0500 | [diff] [blame] | 108 | } |