| #include "command_table.hpp" |
| |
| #include <iomanip> |
| #include <iostream> |
| |
| #include <host-ipmid/ipmid-api.h> |
| #include "message_handler.hpp" |
| #include "sessions_manager.hpp" |
| |
| namespace command |
| { |
| |
| void Table::registerCommand(CommandID inCommand, std::unique_ptr<Entry>&& entry) |
| { |
| std::cout << "I> Registering Command" << std::hex |
| << inCommand.command << "\n"; |
| |
| commandTable[inCommand.command] = std::move(entry); |
| } |
| |
| std::vector<uint8_t> Table::executeCommand(uint32_t inCommand, |
| std::vector<uint8_t>& commandData, |
| const message::Handler& handler) |
| { |
| using namespace std::chrono_literals; |
| |
| std::vector<uint8_t> response; |
| |
| auto iterator = commandTable.find(inCommand); |
| |
| if (iterator == commandTable.end()) |
| { |
| std::cerr << "E> Table:: Command Not found: 0x" << std::hex << inCommand |
| << "\n"; |
| |
| response.resize(1); |
| response[0] = IPMI_CC_INVALID; |
| } |
| else |
| { |
| auto start = std::chrono::steady_clock::now(); |
| |
| response = iterator->second->executeCommand(commandData, handler); |
| |
| auto end = std::chrono::steady_clock::now(); |
| |
| auto elapsedSeconds = std::chrono::duration_cast<std::chrono::seconds> |
| (end - start); |
| |
| // If command time execution time exceeds 2 seconds, log a time |
| // exceeded message |
| if (elapsedSeconds > 2s) |
| { |
| std::cerr << "E> IPMI command timed out:Elapsed time = " |
| << elapsedSeconds.count() << "s" << "\n"; |
| } |
| } |
| return response; |
| } |
| |
| std::vector<uint8_t> NetIpmidEntry::executeCommand( |
| std::vector<uint8_t>& commandData, |
| const message::Handler& handler) |
| { |
| std::vector<uint8_t> errResponse; |
| |
| // Check if the command qualifies to be run prior to establishing a session |
| if (!sessionless && (handler.sessionID == session::SESSION_ZERO)) |
| { |
| errResponse.resize(1); |
| errResponse[0] = IPMI_CC_INSUFFICIENT_PRIVILEGE; |
| std::cerr << "E> Table::Not enough privileges for command 0x" |
| << std::hex << command.command << "\n"; |
| return errResponse; |
| } |
| |
| return functor(commandData, handler); |
| } |
| |
| } // namespace command |