mirror of
https://github.com/Telecominfraproject/wlan-cloud-owprov.git
synced 2025-10-29 17:52:28 +00:00
Auto push config on venue change and capabilities message. (#9)
Signed-off-by: Adam Capparelli <adam.capparelli@mail.utoronto.ca> Co-authored-by: Adam Capparelli <adam.capparelli@mail.utoronto.ca>
This commit is contained in:
committed by
Ivan Chvets
parent
4b07db924d
commit
da23ff1192
@@ -5,6 +5,7 @@
|
||||
#include "AutoDiscovery.h"
|
||||
#include "Poco/JSON/Parser.h"
|
||||
#include "StorageService.h"
|
||||
#include "Tasks/VenueConfigUpdater.h"
|
||||
#include "framework/KafkaManager.h"
|
||||
#include "framework/KafkaTopics.h"
|
||||
#include "framework/ow_constants.h"
|
||||
@@ -107,6 +108,11 @@ namespace OpenWifi {
|
||||
if (!SerialNumber.empty() && Connected) {
|
||||
StorageService()->InventoryDB().CreateFromConnection(
|
||||
SerialNumber, ConnectedIP, Compatible, Locale, isConnection);
|
||||
// Now that the entry has been created, we can try to push a config if
|
||||
// the connection was a capabilities message.
|
||||
if (isConnection){
|
||||
ComputeAndPushConfig(SerialNumber, Compatible, Logger());
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (const Poco::Exception &E) {
|
||||
|
||||
@@ -14,28 +14,13 @@
|
||||
#include "RESTAPI/RESTAPI_db_helpers.h"
|
||||
#include "SerialNumberCache.h"
|
||||
#include "StorageService.h"
|
||||
#include "Tasks/VenueConfigUpdater.h"
|
||||
#include "framework/utils.h"
|
||||
#include "sdks/SDK_gw.h"
|
||||
#include "sdks/SDK_sec.h"
|
||||
|
||||
namespace OpenWifi {
|
||||
|
||||
void GetRejectedLines(const Poco::JSON::Object::Ptr &Response, Types::StringVec &Warnings) {
|
||||
try {
|
||||
if (Response->has("results")) {
|
||||
auto Results = Response->get("results").extract<Poco::JSON::Object::Ptr>();
|
||||
auto Status = Results->get("status").extract<Poco::JSON::Object::Ptr>();
|
||||
auto Rejected = Status->getArray("rejected");
|
||||
std::transform(
|
||||
Rejected->begin(), Rejected->end(), std::back_inserter(Warnings),
|
||||
[](auto i) -> auto { return i.toString(); });
|
||||
// for(const auto &i:*Rejected)
|
||||
// Warnings.push_back(i.toString());
|
||||
}
|
||||
} catch (...) {
|
||||
}
|
||||
}
|
||||
|
||||
void RESTAPI_inventory_handler::DoGet() {
|
||||
|
||||
ProvObjects::InventoryTag Existing;
|
||||
@@ -314,6 +299,8 @@ namespace OpenWifi {
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
std::string previous_venue = Existing.venue;
|
||||
|
||||
auto RemoveSubscriber = GetParameter("removeSubscriber");
|
||||
if (!RemoveSubscriber.empty()) {
|
||||
if (Existing.subscriber == RemoveSubscriber) {
|
||||
@@ -471,6 +458,13 @@ namespace OpenWifi {
|
||||
SDK::GW::Device::SetOwnerShip(this, SerialNumber, Existing.entity, Existing.venue,
|
||||
Existing.subscriber);
|
||||
|
||||
// Attempt an automatic config push when the venue is set and different than what is
|
||||
// in DB.
|
||||
poco_information(Logger(), fmt::format("New Venue {} Old Venue {}", NewObject.venue, previous_venue));
|
||||
if (!NewObject.venue.empty() && NewObject.venue != previous_venue) {
|
||||
ComputeAndPushConfig(SerialNumber, NewObject.deviceType, Logger());
|
||||
}
|
||||
|
||||
ProvObjects::InventoryTag NewObjectCreated;
|
||||
DB_.GetRecord("id", Existing.info.id, NewObjectCreated);
|
||||
Poco::JSON::Object Answer;
|
||||
|
||||
@@ -28,6 +28,42 @@ namespace OpenWifi {
|
||||
}
|
||||
}
|
||||
|
||||
[[maybe_unused]] static void ComputeAndPushConfig(const std::string &SerialNumber, const std::string &DeviceType, Poco::Logger &Logger) {
|
||||
/*
|
||||
Generic Helper to compute a device's config and push it down to the device.
|
||||
*/
|
||||
poco_information(Logger, fmt::format("Attempting to push venue config for device {}", SerialNumber));
|
||||
auto DeviceConfig = std::make_shared<APConfig>(SerialNumber,
|
||||
DeviceType, Logger, false);
|
||||
auto Configuration = Poco::makeShared<Poco::JSON::Object>();
|
||||
try {
|
||||
if (DeviceConfig->Get(Configuration)) {
|
||||
std::ostringstream OS;
|
||||
Configuration->stringify(OS);
|
||||
auto Response = Poco::makeShared<Poco::JSON::Object>();
|
||||
poco_debug(Logger,
|
||||
fmt::format("{}: Pushing configuration.", SerialNumber));
|
||||
if (SDK::GW::Device::Configure(nullptr, SerialNumber, Configuration,
|
||||
Response)) {
|
||||
Logger.debug(
|
||||
fmt::format("{}: Configuration pushed.", SerialNumber));
|
||||
poco_information(Logger,
|
||||
fmt::format("{}: Updated.", SerialNumber));
|
||||
} else {
|
||||
poco_information(Logger,
|
||||
fmt::format("{}: Not updated.", SerialNumber));
|
||||
}
|
||||
} else {
|
||||
poco_debug(Logger,
|
||||
fmt::format("{}: Configuration is bad.", SerialNumber));
|
||||
}
|
||||
} catch (...) {
|
||||
poco_debug(Logger,
|
||||
fmt::format("{}: Configuration is bad (caused an exception).",
|
||||
SerialNumber));
|
||||
}
|
||||
}
|
||||
|
||||
class VenueDeviceConfigUpdater : public Poco::Runnable {
|
||||
public:
|
||||
VenueDeviceConfigUpdater(const std::string &UUID, const std::string &venue, Poco::Logger &L)
|
||||
|
||||
Reference in New Issue
Block a user