Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIFI-13541 Feat: Auto push config on venue change and capabilities message. #99

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/AutoDiscovery.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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) {
Expand Down
26 changes: 10 additions & 16 deletions src/RESTAPI/RESTAPI_inventory_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
Expand Down
36 changes: 36 additions & 0 deletions src/Tasks/VenueConfigUpdater.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading