blob: 65501605bec27ab64666d64d8b6b4eb50695bece [file] [log] [blame]
#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