blob: 3c7eaa6656e1903c626ea5fd246367902942de80 [file] [log] [blame]
#include "config.h"
#include "snmp_conf_manager.hpp"
#include "snmp_util.hpp"
#include "xyz/openbmc_project/Common/error.hpp"
#include <phosphor-logging/elog-errors.hpp>
#include <phosphor-logging/log.hpp>
#include <experimental/filesystem>
#include <arpa/inet.h>
namespace phosphor
{
namespace network
{
namespace snmp
{
using namespace phosphor::logging;
using namespace sdbusplus::xyz::openbmc_project::Common::Error;
using Argument = xyz::openbmc_project::Common::InvalidArgument;
ConfManager::ConfManager(sdbusplus::bus::bus& bus, const char* objPath) :
details::CreateIface(bus, objPath, true), bus(bus), objectPath(objPath)
{
}
void ConfManager::client(std::string address, uint16_t port)
{
auto clientEntry = this->clients.find(address);
if (clientEntry != this->clients.end())
{
// address is already there
return;
}
try
{
// just to check whether given address is valid or not.
resolveAddress(address);
}
catch (InternalFailure& e)
{
log<level::ERR>("Not a valid address"),
entry("ADDRESS=%s", address.c_str());
elog<InvalidArgument>(Argument::ARGUMENT_NAME("Address"),
Argument::ARGUMENT_VALUE(address.c_str()));
}
// create the D-Bus object
std::experimental::filesystem::path objPath;
objPath /= objectPath;
objPath /= generateId(address, port);
this->clients.emplace(
address, std::make_unique<phosphor::network::snmp::Client>(
bus, objPath.string().c_str(), *this, address, port));
}
std::string ConfManager::generateId(const std::string& address, uint16_t port)
{
std::stringstream hexId;
std::string hashString = address;
hashString += std::to_string(port);
// Only want 8 hex digits.
hexId << std::hex << ((std::hash<std::string>{}(hashString)) & 0xFFFFFFFF);
return hexId.str();
}
void ConfManager::deleteSNMPClient(const std::string& address)
{
auto it = clients.find(address);
if (it == clients.end())
{
log<level::ERR>("Unable to delete the snmp client.",
entry("ADDRESS=%s", address.c_str()));
return;
}
this->clients.erase(it);
}
} // namespace snmp
} // namespace network
} // namespace phosphor