mirror of
				https://github.com/Telecominfraproject/wlan-cloud-owprov.git
				synced 2025-11-03 20:17:54 +00:00 
			
		
		
		
	Compare commits
	
		
			17 Commits
		
	
	
		
			v3.0.2-RC1
			...
			version_up
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6ce0f2fb51 | ||
| 
						 | 
					6f84eeb901 | ||
| 
						 | 
					c44dabe2f3 | ||
| 
						 | 
					c78888372c | ||
| 
						 | 
					4ae0b99f55 | ||
| 
						 | 
					41e172be25 | ||
| 
						 | 
					d7e05eac60 | ||
| 
						 | 
					fd25e19095 | ||
| 
						 | 
					3b8a8bafff | ||
| 
						 | 
					20785d82ce | ||
| 
						 | 
					1327b29d7b | ||
| 
						 | 
					226cd3e9e9 | ||
| 
						 | 
					de512f0e2c | ||
| 
						 | 
					7a845e2f8c | ||
| 
						 | 
					b0f925a7c0 | ||
| 
						 | 
					984c8fafac | ||
| 
						 | 
					da23ff1192 | 
@@ -1,5 +1,5 @@
 | 
				
			|||||||
cmake_minimum_required(VERSION 3.13)
 | 
					cmake_minimum_required(VERSION 3.13)
 | 
				
			||||||
project(owprov VERSION 3.0.2)
 | 
					project(owprov VERSION 3.2.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(CMAKE_CXX_STANDARD 17)
 | 
					set(CMAKE_CXX_STANDARD 17)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@
 | 
				
			|||||||
#include "AutoDiscovery.h"
 | 
					#include "AutoDiscovery.h"
 | 
				
			||||||
#include "Poco/JSON/Parser.h"
 | 
					#include "Poco/JSON/Parser.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					#include "Tasks/VenueConfigUpdater.h"
 | 
				
			||||||
#include "framework/KafkaManager.h"
 | 
					#include "framework/KafkaManager.h"
 | 
				
			||||||
#include "framework/KafkaTopics.h"
 | 
					#include "framework/KafkaTopics.h"
 | 
				
			||||||
#include "framework/ow_constants.h"
 | 
					#include "framework/ow_constants.h"
 | 
				
			||||||
@@ -107,6 +108,11 @@ namespace OpenWifi {
 | 
				
			|||||||
                        if (!SerialNumber.empty() && Connected) {
 | 
					                        if (!SerialNumber.empty() && Connected) {
 | 
				
			||||||
                            StorageService()->InventoryDB().CreateFromConnection(
 | 
					                            StorageService()->InventoryDB().CreateFromConnection(
 | 
				
			||||||
                                    SerialNumber, ConnectedIP, Compatible, Locale, isConnection);
 | 
					                                    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) {
 | 
									} catch (const Poco::Exception &E) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,28 +14,13 @@
 | 
				
			|||||||
#include "RESTAPI/RESTAPI_db_helpers.h"
 | 
					#include "RESTAPI/RESTAPI_db_helpers.h"
 | 
				
			||||||
#include "SerialNumberCache.h"
 | 
					#include "SerialNumberCache.h"
 | 
				
			||||||
#include "StorageService.h"
 | 
					#include "StorageService.h"
 | 
				
			||||||
 | 
					#include "Tasks/VenueConfigUpdater.h"
 | 
				
			||||||
#include "framework/utils.h"
 | 
					#include "framework/utils.h"
 | 
				
			||||||
#include "sdks/SDK_gw.h"
 | 
					#include "sdks/SDK_gw.h"
 | 
				
			||||||
#include "sdks/SDK_sec.h"
 | 
					#include "sdks/SDK_sec.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace OpenWifi {
 | 
					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() {
 | 
						void RESTAPI_inventory_handler::DoGet() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ProvObjects::InventoryTag Existing;
 | 
							ProvObjects::InventoryTag Existing;
 | 
				
			||||||
@@ -314,6 +299,8 @@ namespace OpenWifi {
 | 
				
			|||||||
			return NotFound();
 | 
								return NotFound();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							std::string previous_venue = Existing.venue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		auto RemoveSubscriber = GetParameter("removeSubscriber");
 | 
							auto RemoveSubscriber = GetParameter("removeSubscriber");
 | 
				
			||||||
		if (!RemoveSubscriber.empty()) {
 | 
							if (!RemoveSubscriber.empty()) {
 | 
				
			||||||
			if (Existing.subscriber == RemoveSubscriber) {
 | 
								if (Existing.subscriber == RemoveSubscriber) {
 | 
				
			||||||
@@ -471,6 +458,13 @@ namespace OpenWifi {
 | 
				
			|||||||
			SDK::GW::Device::SetOwnerShip(this, SerialNumber, Existing.entity, Existing.venue,
 | 
								SDK::GW::Device::SetOwnerShip(this, SerialNumber, Existing.entity, Existing.venue,
 | 
				
			||||||
										  Existing.subscriber);
 | 
															  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;
 | 
								ProvObjects::InventoryTag NewObjectCreated;
 | 
				
			||||||
			DB_.GetRecord("id", Existing.info.id, NewObjectCreated);
 | 
								DB_.GetRecord("id", Existing.info.id, NewObjectCreated);
 | 
				
			||||||
			Poco::JSON::Object Answer;
 | 
								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 {
 | 
						class VenueDeviceConfigUpdater : public Poco::Runnable {
 | 
				
			||||||
	  public:
 | 
						  public:
 | 
				
			||||||
		VenueDeviceConfigUpdater(const std::string &UUID, const std::string &venue, Poco::Logger &L)
 | 
							VenueDeviceConfigUpdater(const std::string &UUID, const std::string &venue, Poco::Logger &L)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,7 +28,6 @@ static const std::vector<std::string> GitJSONSchemaURLs = {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static std::string DefaultAPSchema = R"foo(
 | 
					static std::string DefaultAPSchema = R"foo(
 | 
				
			||||||
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    "$id": "https://openwrt.org/ucentral.schema.json",
 | 
					    "$id": "https://openwrt.org/ucentral.schema.json",
 | 
				
			||||||
    "$schema": "http://json-schema.org/draft-07/schema#",
 | 
					    "$schema": "http://json-schema.org/draft-07/schema#",
 | 
				
			||||||
@@ -354,14 +353,6 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                        10000
 | 
					                        10000
 | 
				
			||||||
                    ]
 | 
					                    ]
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
                "duplex": {
 | 
					 | 
				
			||||||
                    "description": "The duplex mode that shall be forced.",
 | 
					 | 
				
			||||||
                    "type": "string",
 | 
					 | 
				
			||||||
                    "enum": [
 | 
					 | 
				
			||||||
                        "half",
 | 
					 | 
				
			||||||
                        "full"
 | 
					 | 
				
			||||||
                    ]
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                "enabled": {
 | 
					                "enabled": {
 | 
				
			||||||
                    "description": "This allows forcing the port to down state by default.",
 | 
					                    "description": "This allows forcing the port to down state by default.",
 | 
				
			||||||
                    "type": "boolean",
 | 
					                    "type": "boolean",
 | 
				
			||||||
@@ -490,7 +481,59 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                "bss-color": {
 | 
					                "bss-color": {
 | 
				
			||||||
                    "description": "This enables BSS Coloring on the PHY. setting it to 0 disables the feature 1-63 sets the color and 64 will make hostapd pick a random color.",
 | 
					                    "description": "This enables BSS Coloring on the PHY. setting it to 0 disables the feature 1-63 sets the color and 64 will make hostapd pick a random color.",
 | 
				
			||||||
                    "type": "integer",
 | 
					                    "type": "integer",
 | 
				
			||||||
                    "default": 64
 | 
					                    "minimum": 0,
 | 
				
			||||||
 | 
					                    "maximum": 64,
 | 
				
			||||||
 | 
					                    "default": 0
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        "radio.he-6ghz": {
 | 
				
			||||||
 | 
					            "type": "object",
 | 
				
			||||||
 | 
					            "properties": {
 | 
				
			||||||
 | 
					                "power-type": {
 | 
				
			||||||
 | 
					                    "description": "This config is to set the 6 GHz Access Point type",
 | 
				
			||||||
 | 
					                    "type": "string",
 | 
				
			||||||
 | 
					                    "enum": [
 | 
				
			||||||
 | 
					                        "indoor-power-indoor",
 | 
				
			||||||
 | 
					                        "standard-power",
 | 
				
			||||||
 | 
					                        "very-low-power"
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                    "default": "very-low-power"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "controller": {
 | 
				
			||||||
 | 
					                    "description": "The URL of the AFC controller that the AP shall connect to.",
 | 
				
			||||||
 | 
					                    "type": "string"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "ca-certificate": {
 | 
				
			||||||
 | 
					                    "description": "The CA of the server. This enables mTLS.",
 | 
				
			||||||
 | 
					                    "type": "string",
 | 
				
			||||||
 | 
					                    "format": "uc-base64"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "serial-number": {
 | 
				
			||||||
 | 
					                    "description": "The serial number that the AP shall send to the AFC controller.",
 | 
				
			||||||
 | 
					                    "type": "string"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "certificate-ids": {
 | 
				
			||||||
 | 
					                    "description": "The certificate IDs that the AP shall send to the AFC controller.",
 | 
				
			||||||
 | 
					                    "type": "string"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "minimum-power": {
 | 
				
			||||||
 | 
					                    "description": "The minimum power that the AP shall request from to the AFC controller.",
 | 
				
			||||||
 | 
					                    "type": "number"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "frequency-ranges": {
 | 
				
			||||||
 | 
					                    "description": "The list of frequency ranges that the AP shall request from to the AFC controller.",
 | 
				
			||||||
 | 
					                    "type": "array",
 | 
				
			||||||
 | 
					                    "items": {
 | 
				
			||||||
 | 
					                        "type": "string"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "operating-classes": {
 | 
				
			||||||
 | 
					                    "description": "The list of frequency ranges that the AP shall request from to the AFC controller.",
 | 
				
			||||||
 | 
					                    "type": "array",
 | 
				
			||||||
 | 
					                    "items": {
 | 
				
			||||||
 | 
					                        "type": "number"
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@@ -635,6 +678,9 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                "he-settings": {
 | 
					                "he-settings": {
 | 
				
			||||||
                    "$ref": "#/$defs/radio.he"
 | 
					                    "$ref": "#/$defs/radio.he"
 | 
				
			||||||
                },
 | 
					                },
 | 
				
			||||||
 | 
					                "he-6ghz-settings": {
 | 
				
			||||||
 | 
					                    "$ref": "#/$defs/radio.he-6ghz"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
                "hostapd-iface-raw": {
 | 
					                "hostapd-iface-raw": {
 | 
				
			||||||
                    "description": "This array allows passing raw hostapd.conf lines.",
 | 
					                    "description": "This array allows passing raw hostapd.conf lines.",
 | 
				
			||||||
                    "type": "array",
 | 
					                    "type": "array",
 | 
				
			||||||
@@ -784,8 +830,19 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                },
 | 
					                },
 | 
				
			||||||
                "use-dns": {
 | 
					                "use-dns": {
 | 
				
			||||||
                    "description": "The DNS server sent to clients as DHCP option 6.",
 | 
					                    "description": "The DNS server sent to clients as DHCP option 6.",
 | 
				
			||||||
 | 
					                    "anyOf": [
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
                            "type": "string",
 | 
					                            "type": "string",
 | 
				
			||||||
                    "format": "uc-ip"
 | 
					                            "format": "ipv4"
 | 
				
			||||||
 | 
					                        },
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "array",
 | 
				
			||||||
 | 
					                            "items": {
 | 
				
			||||||
 | 
					                                "type": "string",
 | 
				
			||||||
 | 
					                                "format": "ipv4"
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    ]
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
@@ -1313,8 +1370,7 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                "domain-identifier": {
 | 
					                "domain-identifier": {
 | 
				
			||||||
                    "description": "Mobility Domain identifier (dot11FTMobilityDomainID, MDID).",
 | 
					                    "description": "Mobility Domain identifier (dot11FTMobilityDomainID, MDID).",
 | 
				
			||||||
                    "type": "string",
 | 
					                    "type": "string",
 | 
				
			||||||
                    "maxLength": 4,
 | 
					                    "format": "uc-mobility",
 | 
				
			||||||
                    "minLength": 4,
 | 
					 | 
				
			||||||
                    "examples": [
 | 
					                    "examples": [
 | 
				
			||||||
                        "abcd"
 | 
					                        "abcd"
 | 
				
			||||||
                    ]
 | 
					                    ]
 | 
				
			||||||
@@ -3701,6 +3757,42 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 | 
					        "service.fingerprint": {
 | 
				
			||||||
 | 
					            "description": "This section can be used to configure device fingerprinting.",
 | 
				
			||||||
 | 
					            "type": "object",
 | 
				
			||||||
 | 
					            "properties": {
 | 
				
			||||||
 | 
					                "mode": {
 | 
				
			||||||
 | 
					                    "description": "Enable this option if you would like to enable the MDNS server on the unit.",
 | 
				
			||||||
 | 
					                    "type": "string",
 | 
				
			||||||
 | 
					                    "enum": [
 | 
				
			||||||
 | 
					                        "polled",
 | 
				
			||||||
 | 
					                        "final",
 | 
				
			||||||
 | 
					                        "raw-data"
 | 
				
			||||||
 | 
					                    ],
 | 
				
			||||||
 | 
					                    "default": "final"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "minimum-age": {
 | 
				
			||||||
 | 
					                    "description": "The minimum age a fingerprint must have before it is reported.",
 | 
				
			||||||
 | 
					                    "type": "number",
 | 
				
			||||||
 | 
					                    "default": 60
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "maximum-age": {
 | 
				
			||||||
 | 
					                    "description": "The age at which fingerprints get flushed from the local state.",
 | 
				
			||||||
 | 
					                    "type": "number",
 | 
				
			||||||
 | 
					                    "default": 60
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "periodicity": {
 | 
				
			||||||
 | 
					                    "description": "This value defines the period at which entries get reported.",
 | 
				
			||||||
 | 
					                    "type": "number",
 | 
				
			||||||
 | 
					                    "default": 600
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "allow-wan": {
 | 
				
			||||||
 | 
					                    "description": "Allow fingerprinting devices found on the WAN port.",
 | 
				
			||||||
 | 
					                    "type": "boolean",
 | 
				
			||||||
 | 
					                    "default": false
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
        "service": {
 | 
					        "service": {
 | 
				
			||||||
            "description": "This section describes all of the services that may be present on the AP. Each service is then referenced via its name inside an interface, ssid, ...",
 | 
					            "description": "This section describes all of the services that may be present on the AP. Each service is then referenced via its name inside an interface, ssid, ...",
 | 
				
			||||||
            "type": "object",
 | 
					            "type": "object",
 | 
				
			||||||
@@ -3770,6 +3862,9 @@ static std::string DefaultAPSchema = R"foo(
 | 
				
			|||||||
                },
 | 
					                },
 | 
				
			||||||
                "rrm": {
 | 
					                "rrm": {
 | 
				
			||||||
                    "$ref": "#/$defs/service.rrm"
 | 
					                    "$ref": "#/$defs/service.rrm"
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                "fingerprint": {
 | 
				
			||||||
 | 
					                    "$ref": "#/$defs/service.fingerprint"
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,8 +107,17 @@ namespace OpenWifi {
 | 
				
			|||||||
					NewMessage.partition(0);
 | 
										NewMessage.partition(0);
 | 
				
			||||||
					NewMessage.payload(Msg->Payload());
 | 
										NewMessage.payload(Msg->Payload());
 | 
				
			||||||
					Producer.produce(NewMessage);
 | 
										Producer.produce(NewMessage);
 | 
				
			||||||
 | 
										if (Queue_.size() < 100) {
 | 
				
			||||||
 | 
											// use flush when internal queue is lightly loaded, i.e. flush after each
 | 
				
			||||||
 | 
											// message
 | 
				
			||||||
						Producer.flush();
 | 
											Producer.flush();
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
										else {
 | 
				
			||||||
 | 
											// use poll when internal queue is loaded to allow messages to be sent in
 | 
				
			||||||
 | 
											// batches
 | 
				
			||||||
 | 
											Producer.poll((std::chrono::milliseconds) 0);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			} catch (const cppkafka::HandleException &E) {
 | 
								} catch (const cppkafka::HandleException &E) {
 | 
				
			||||||
				poco_warning(Logger_,
 | 
									poco_warning(Logger_,
 | 
				
			||||||
							 fmt::format("Caught a Kafka exception (producer): {}", E.what()));
 | 
												 fmt::format("Caught a Kafka exception (producer): {}", E.what()));
 | 
				
			||||||
@@ -117,8 +126,13 @@ namespace OpenWifi {
 | 
				
			|||||||
			} catch (...) {
 | 
								} catch (...) {
 | 
				
			||||||
				poco_error(Logger_, "std::exception");
 | 
									poco_error(Logger_, "std::exception");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								if (Queue_.size() == 0) {
 | 
				
			||||||
 | 
									// message queue is empty, flush all previously sent messages
 | 
				
			||||||
 | 
									Producer.flush();
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
			Note = Queue_.waitDequeueNotification();
 | 
								Note = Queue_.waitDequeueNotification();
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							Producer.flush();
 | 
				
			||||||
		poco_information(Logger_, "Stopped...");
 | 
							poco_information(Logger_, "Stopped...");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user