Skip to content

Commit

Permalink
Auto push config on venue change and capabilities message. (#9)
Browse files Browse the repository at this point in the history
Signed-off-by: Adam Capparelli <[email protected]>
Co-authored-by: Adam Capparelli <[email protected]>
  • Loading branch information
2 people authored and Ivan Chvets committed Mar 21, 2024
1 parent 4b07db9 commit 35505a6
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 16 deletions.
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

0 comments on commit 35505a6

Please sign in to comment.