Skip to content

Commit

Permalink
update config
Browse files Browse the repository at this point in the history
  • Loading branch information
dan-du-car committed Apr 16, 2024
1 parent 11d3242 commit 97ca2da
Show file tree
Hide file tree
Showing 8 changed files with 101 additions and 92 deletions.
33 changes: 4 additions & 29 deletions src/v2i-hub/RSUHealthMonitorPlugin/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,35 +17,10 @@
"default":"1",
"description": "Sending RSU SNMP GET request at every configured interval. Default every 1 second. Unit of measure: second."
},
{
"key":"RSUIp",//RSUConfiguration ->RSUS
"default":"192.168.XX.XX",
"description":"An IP address of the RSU the V2X hub is connected to."
},
{
"key":"SNMPPort",
"default":"161",
"description":"The SNMP port for sending message or command."
},
{
"key":"AuthPassPhrase",
"default":"dummy",
"description":"SNMP v3 authentication passphrase"
},
{
"key":"SecurityUser", // user
"default":"authOnlyUser",
"description":"SNMP Security Name"
},
{
"key":"SecurityLevel",
"default":"authPriv", //Make this constant
"description":"SNMP Security level"
},
{
"key":"RSUMIBVersion",//mibVersion
"default":"RSU4.1",
"description":"The version of RSU MIB (Management Information Base). E.G. RSU4.1 or RSU1218. Currently only support RSU4.1"
{
"key":"RSUConfigurationList",
"default":"{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }",
"description":"Configurations of the RSUs the V2X hub is connected to."
}
]
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,13 @@

namespace RSUHealthMonitor
{
class RSUConfigurationException : public std::exception
class RSUConfigurationException : public std::runtime_error
{
private:
std::string message;

public:
RSUConfigurationException(const char *msg) : message(msg){};
const char *what()
{
return message.c_str();
}
RSUConfigurationException(const char *msg) : runtime_error(msg){};
};

}
43 changes: 38 additions & 5 deletions src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ namespace RSUHealthMonitor
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
if (!reader->parse(rsuConfigsStr.c_str(), rsuConfigsStr.c_str() + length, &root, &err))
{
std::stringstream oss;
oss << "Parse RSUs raw string error: ";
oss << err.c_str();
throw RSUConfigurationException(oss.str().c_str());
std::stringstream ss;
ss << "Parse RSUs raw string error: " << err;
throw RSUConfigurationException(ss.str().c_str());
}
return root;
}

void RSUConfigurationList::parseRSUs(std::string rsuConfigsStr)
{
auto json = parseJson(rsuConfigsStr);
Expand Down Expand Up @@ -68,7 +68,8 @@ namespace RSUHealthMonitor

if (rsuArray[i].isMember(RSUMIBVersionKey))
{
config.mibVersion = rsuArray[i][RSUMIBVersionKey].asString();
auto _rsuMIBVersionStr = rsuArray[i][RSUMIBVersionKey].asString();
config.mibVersion = strToMibVersion(_rsuMIBVersionStr);
}
else
{
Expand All @@ -77,8 +78,40 @@ namespace RSUHealthMonitor
configs.push_back(config);
}
}

RSUMibVersion RSUConfigurationList::strToMibVersion(std::string &mibVersionStr)
{
boost::trim_left(mibVersionStr);
boost::trim_right(mibVersionStr);
// Support RSU MIB version 4.1
if (boost::iequals(mibVersionStr, RSU4_1_str))
{
return RSUMibVersion::RSUMIB_V_4_1;
}
else
{
std::stringstream ss;
ss << "Uknown RSU MIB version: " << mibVersionStr;
throw RSUConfigurationException(ss.str().c_str());
}
}

std::vector<RSUConfiguration> RSUConfigurationList::getConfigs()
{
return configs;
}

std::ostream &operator<<(std::ostream &os, const RSUMibVersion &mib)
{
const std::string nameMibs[] = {"UNKOWN MIB",
"RSU 4.1",
"NTCIP 1218"};
return os << nameMibs[mib];
}

std::ostream &operator<<(std::ostream &os, const RSUConfiguration &config)
{
os << RSUIpKey << ": " << config.rsuIp << ", " << SNMPPortKey << ": " << config.snmpPort << ", " << UserKey << ": " << config.user << ", " << AuthPassPhraseKey << ": " << config.authPassPhrase << ", " << SecurityLevelKey << ": " << config.securityLevel << ", " << RSUMIBVersionKey << ": " << config.mibVersion;
return os;
}
}
20 changes: 14 additions & 6 deletions src/v2i-hub/RSUHealthMonitorPlugin/src/RSUConfigurationList.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <vector>
#include <iostream>
#include <jsoncpp/json/json.h>
#include <boost/algorithm/string.hpp>
#include "RSUConfigurationException.h"

namespace RSUHealthMonitor
Expand All @@ -13,19 +14,25 @@ namespace RSUHealthMonitor
static constexpr const char *AuthPassPhraseKey = "AuthPassPhrase";
static constexpr const char *RSUMIBVersionKey = "RSUMIBVersion";
static constexpr const char *SecurityLevelKey = "SecurityLevel";
static constexpr const char *RSU4_1_str = "RSU4.1";
static constexpr const char *RSU1218_str = "RSU1218";

enum RSUMibVersion
{
UNKOWN_MIB_V = 0,
RSUMIB_V_4_1 = 1,
RSUMIB_V_1218 = 2
};

struct RSUConfiguration
{
std::string rsuIp;
uint16_t snmpPort;
std::string user;
std::string authPassPhrase;
std::string securityLevel = "authPriv";
std::string mibVersion;
friend std::ostream &operator<<(std::ostream &os, const RSUConfiguration &config)
{
os << RSUIpKey << ": " << config.rsuIp << ", " << SNMPPortKey << ": " << config.snmpPort << ", " << UserKey << ": " << config.user << ", " << AuthPassPhraseKey << ": " << config.authPassPhrase << ", " << SecurityLevelKey << ": " << config.securityLevel << ", " << RSUMIBVersionKey << ": " << config.mibVersion;
return os;
}
RSUMibVersion mibVersion;
friend std::ostream &operator<<(std::ostream &os, const RSUConfiguration &config);
};

class RSUConfigurationList
Expand All @@ -38,6 +45,7 @@ namespace RSUHealthMonitor
* @return JSON::Value A JSON object that includes RSUS information.
*/
Json::Value parseJson(std::string rsuConfigsStr);
RSUMibVersion strToMibVersion(std::string &mibVersionStr);

public:
RSUConfigurationList() = default;
Expand Down
41 changes: 16 additions & 25 deletions src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,44 +10,35 @@ namespace RSUHealthMonitor
{
_rsuWorker = std::make_shared<RSUHealthMonitorWorker>();
_rsuStatusTimer = make_unique<ThreadTimer>();
_rsuConfigListPtr = std::make_shared<RSUConfigurationList>();
UpdateConfigSettings();

// Send SNMP call to RSU periodically at configurable interval.
_timerThId = _rsuStatusTimer->AddPeriodicTick([this]()
{
// Periodic SNMP call to get RSU status based on RSU MIB version 4.1
auto rsuStatusJson = _rsuWorker->getRSUStatus(_rsuMibVersion, _rsuIp, _snmpPort, _securityUser, _authPassPhrase, _securityLevel, SEC_TO_MICRO);
PLOG(logINFO) << "Updating _interval: " << _interval;
//Broadcast RSU status periodically at _interval
BroadcastRSUStatus(rsuStatusJson); },
this->monitorRSUs();
PLOG(logINFO) << "Updating RSU _interval: " << _interval; },
std::chrono::milliseconds(_interval * SEC_TO_MILLI));
_rsuStatusTimer->Start();
}

void RSUHealthMonitorPlugin::monitorRSUs()
{
for (auto rsuConfig : _rsuConfigListPtr->getConfigs())
{
auto rsuStatusJson = _rsuWorker->getRSUStatus(rsuConfig.mibVersion, rsuConfig.rsuIp, rsuConfig.snmpPort, rsuConfig.user, rsuConfig.authPassPhrase, rsuConfig.securityLevel, SEC_TO_MICRO);
BroadcastRSUStatus(rsuStatusJson, rsuConfig.mibVersion);
}
}

void RSUHealthMonitorPlugin::UpdateConfigSettings()
{
PLOG(logINFO) << "Updating configuration settings.";

lock_guard<mutex> lock(_configMutex);
GetConfigValue<uint16_t>("Interval", _interval);
GetConfigValue<string>("RSUIp", _rsuIp);
GetConfigValue<uint16_t>("SNMPPort", _snmpPort);
GetConfigValue<string>("AuthPassPhrase", _authPassPhrase);
GetConfigValue<string>("SecurityUser", _securityUser);
GetConfigValue<string>("SecurityLevel", _securityLevel);
GetConfigValue<string>("RSUMIBVersion", _rsuMIBVersionStr);
boost::trim_left(_rsuMIBVersionStr);
boost::trim_right(_rsuMIBVersionStr);
// Support RSU MIB version 4.1
if (boost::iequals(_rsuMIBVersionStr, RSU4_1_str))
{
_rsuMibVersion = RSUMibVersion::RSUMIB_V_4_1;
}
else
{
_rsuMibVersion = RSUMibVersion::UNKOWN_MIB_V;
PLOG(logERROR) << "Uknown RSU MIB version: " << _rsuMIBVersionStr;
}
GetConfigValue<string>("RSUConfigurationList", _rsuConfigListStr);
_rsuConfigListPtr->parseRSUs(_rsuConfigListStr);

try
{
Expand All @@ -65,13 +56,13 @@ namespace RSUHealthMonitor
UpdateConfigSettings();
}

void RSUHealthMonitorPlugin::BroadcastRSUStatus(const Json::Value &rsuStatusJson)
void RSUHealthMonitorPlugin::BroadcastRSUStatus(const Json::Value &rsuStatusJson, const RSUMibVersion &mibVersion)
{
// Broadcast the RSU status info when there are RSU responses.
if (!rsuStatusJson.empty() && _rsuWorker)
{
auto rsuStatusFields = _rsuWorker->getJsonKeys(rsuStatusJson);
auto configTbl = _rsuWorker->GetRSUStatusConfig(_rsuMibVersion);
auto configTbl = _rsuWorker->GetRSUStatusConfig(mibVersion);

// Only broadcast RSU status when all required fields are present.
if (_rsuWorker->validateAllRequiredFieldsPresent(configTbl, rsuStatusFields))
Expand Down
22 changes: 12 additions & 10 deletions src/v2i-hub/RSUHealthMonitorPlugin/src/RSUHealthMonitorPlugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <jsoncpp/json/json.h>
#include "RSUStatusMessage.h"
#include "RSUHealthMonitorWorker.h"
#include "RSUConfigurationList.h"

using namespace tmx::utils;
using namespace std;
Expand All @@ -17,15 +18,15 @@ namespace RSUHealthMonitor
private:
mutex _configMutex;
uint16_t _interval;
string _rsuIp;
uint16_t _snmpPort;
string _authPassPhrase;
string _securityUser;
string _securityLevel;
string _rsuMIBVersionStr;
RSUMibVersion _rsuMibVersion;
const char *RSU4_1_str = "RSU4.1";
const char *RSU1218_str = "RSU1218";
// string _rsuIp;
// uint16_t _snmpPort;
// string _authPassPhrase;
// string _securityUser;
// string _securityLevel;
// string _rsuMIBVersionStr;
// RSUMibVersion _rsuMibVersion;
string _rsuConfigListStr;
shared_ptr<RSUConfigurationList> _rsuConfigListPtr;
shared_ptr<RSUHealthMonitorWorker> _rsuWorker;
unique_ptr<ThreadTimer> _rsuStatusTimer;
uint _timerThId;
Expand All @@ -35,12 +36,13 @@ namespace RSUHealthMonitor
* @brief Broadcast RSU status
* @param Json::Value RSU status in JSON format
*/
void BroadcastRSUStatus(const Json::Value& rsuStatusJson);
void BroadcastRSUStatus(const Json::Value &rsuStatusJson, const RSUMibVersion &mibVersion);

public:
explicit RSUHealthMonitorPlugin(const std::string &name);
void UpdateConfigSettings();
void OnConfigChanged(const char *key, const char *value) override;
void monitorRSUs();
};

} // namespace RSUHealthMonitorPlugin
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "SNMPClient.h"
#include <boost/algorithm/string/predicate.hpp>
#include "RSUStatusMessage.h"
#include "RSUConfigurationList.h"

using namespace std;
using namespace tmx::utils;
Expand All @@ -19,12 +20,6 @@ using namespace tmx::messages;

namespace RSUHealthMonitor
{
enum class RSUMibVersion
{
UNKOWN_MIB_V = 0,
RSUMIB_V_4_1 = 1,
RSUMIB_V_1218 = 2
};

struct RSUFieldOIDStruct
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,51 @@ namespace RSUHealthMonitor
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}

TEST_F(test_RSUConfigurationList, parseAndGetConfigs_missing_RSUS)
TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_RSUS)
{
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
std::string rsuConfigsStr = "{ \"ERROR\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }";
ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException);
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}

TEST_F(test_RSUConfigurationList, parseAndGetConfigs_missing_SNMPPORT)
TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_SNMPPORT)
{
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort_Missing\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }";
ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException);
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}

TEST_F(test_RSUConfigurationList, parseAndGetConfigs_missing_AuthPassPhrase)
TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_AuthPassPhrase)
{
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase_Missing\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }";
ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException);
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}

TEST_F(test_RSUConfigurationList, parseAndGetConfigs_missing_User)
TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_User)
{
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User_Missing\": \"authOnlyUser\", \"RSUMIBVersion\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }";
ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException);
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}
TEST_F(test_RSUConfigurationList, parseAndGetConfigs_missing_MibVersion)

TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Missing_MibVersion)
{
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion_Missing\": \"RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }";
ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException);
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}

TEST_F(test_RSUConfigurationList, parseAndGetConfigs_Invalid_MibVersion)
{
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
std::string rsuConfigsStr = "{ \"RSUS\": [ { \"RSUIp\": \"192.168.XX.XX\", \"SNMPPort\": \"161\", \"AuthPassPhrase\": \"dummy\", \"User\": \"authOnlyUser\", \"RSUMIBVersion\": \"INVALID_RSU4.1\" },{ \"RSUIp\": \"192.168.00.XX\", \"SNMPPort\": \"162\", \"AuthPassPhrase\": \"tester\", \"User\": \"authPrivUser\", \"RSUMIBVersion\": \"RSU4.1\" }] }";
ASSERT_THROW(rsuConfigList->parseRSUs(rsuConfigsStr), RSUHealthMonitor::RSUConfigurationException);
ASSERT_EQ(0, rsuConfigList->getConfigs().size());
}
}

0 comments on commit 97ca2da

Please sign in to comment.