mirror of
https://github.com/Telecominfraproject/wlan-cloud-ucentralgw.git
synced 2025-11-03 12:17:56 +00:00
Compare commits
26 Commits
openapi-fi
...
fix_deadlo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
115f8c1df9 | ||
|
|
8e5eebec67 | ||
|
|
b3d55d38d5 | ||
|
|
75bcbd748c | ||
|
|
b6eba2a96d | ||
|
|
17082803d4 | ||
|
|
26b9a96506 | ||
|
|
5ce8dae9ec | ||
|
|
7da135c1e5 | ||
|
|
50ee4ba5cb | ||
|
|
3a8109d7ad | ||
|
|
56232966ec | ||
|
|
1ecf98d712 | ||
|
|
f5b60ced61 | ||
|
|
e4d141bb8e | ||
|
|
25b4288050 | ||
|
|
82430c2d5d | ||
|
|
7b68ec0536 | ||
|
|
839f4fec44 | ||
|
|
c4178209bb | ||
|
|
79ab67db50 | ||
|
|
00bc77feea | ||
|
|
4f00d77d2b | ||
|
|
c679d4ac40 | ||
|
|
4a150a9fcb | ||
|
|
83eb603f0a |
@@ -1,5 +1,5 @@
|
|||||||
cmake_minimum_required(VERSION 3.13)
|
cmake_minimum_required(VERSION 3.13)
|
||||||
project(owgw VERSION 3.1.0)
|
project(owgw VERSION 3.2.1)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 20)
|
set(CMAKE_CXX_STANDARD 20)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||||
|
|||||||
14
PROTOCOL.md
14
PROTOCOL.md
@@ -324,6 +324,20 @@ should respond with message indicating failure or success.
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If AP supports compressed configuration feature by inidcating `compress_cmd=true` in its capabilities, controller
|
||||||
|
will send a compressed configuration message where configuration payload (i.e. contents of `params`) is compressed
|
||||||
|
and encoded in base64 format:
|
||||||
|
```json
|
||||||
|
{ "jsonrpc" : "2.0",
|
||||||
|
"method" : "configure",
|
||||||
|
"params" : {
|
||||||
|
"compress_64" : "<b64 encoded zlib compressed payload>",
|
||||||
|
"compress_sz" : "<size of uncompressed data in bytes>"
|
||||||
|
},
|
||||||
|
"id" : <some number>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
The device should answer:
|
The device should answer:
|
||||||
```json
|
```json
|
||||||
{ "jsonrpc" : "2.0",
|
{ "jsonrpc" : "2.0",
|
||||||
|
|||||||
@@ -561,14 +561,14 @@ namespace OpenWifi {
|
|||||||
void AP_WS_Connection::OnSocketShutdown(
|
void AP_WS_Connection::OnSocketShutdown(
|
||||||
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
|
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ShutdownNotification> &pNf) {
|
||||||
poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
|
poco_trace(Logger_, fmt::format("SOCKET-SHUTDOWN({}): Closing.", CId_));
|
||||||
// std::lock_guard G(ConnectionMutex_);
|
std::lock_guard G(ConnectionMutex_);
|
||||||
return EndConnection();
|
return EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AP_WS_Connection::OnSocketError(
|
void AP_WS_Connection::OnSocketError(
|
||||||
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
|
[[maybe_unused]] const Poco::AutoPtr<Poco::Net::ErrorNotification> &pNf) {
|
||||||
poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
|
poco_trace(Logger_, fmt::format("SOCKET-ERROR({}): Closing.", CId_));
|
||||||
// std::lock_guard G(ConnectionMutex_);
|
std::lock_guard G(ConnectionMutex_);
|
||||||
return EndConnection();
|
return EndConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -655,6 +655,7 @@ namespace OpenWifi {
|
|||||||
fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
|
fmt::format("FRAME({}): Frame received (length={}, flags={}). Msg={}",
|
||||||
CId_, IncomingSize, flags, IncomingFrame.begin()));
|
CId_, IncomingSize, flags, IncomingFrame.begin()));
|
||||||
|
|
||||||
|
|
||||||
Poco::JSON::Parser parser;
|
Poco::JSON::Parser parser;
|
||||||
auto ParsedMessage = parser.parse(IncomingFrame.begin());
|
auto ParsedMessage = parser.parse(IncomingFrame.begin());
|
||||||
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
|
auto IncomingJSON = ParsedMessage.extract<Poco::JSON::Object::Ptr>();
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ namespace OpenWifi {
|
|||||||
if (request.find("Upgrade") != request.end() &&
|
if (request.find("Upgrade") != request.end() &&
|
||||||
Poco::icompare(request["Upgrade"], "websocket") == 0) {
|
Poco::icompare(request["Upgrade"], "websocket") == 0) {
|
||||||
Utils::SetThreadName("ws:conn-init");
|
Utils::SetThreadName("ws:conn-init");
|
||||||
session_id_++;
|
//session_id_++;
|
||||||
return new AP_WS_RequestHandler(Logger_, session_id_);
|
auto new_session_id = session_id_.fetch_add(1, std::memory_order_seq_cst) + 1;
|
||||||
|
return new AP_WS_RequestHandler(Logger_, new_session_id);
|
||||||
} else {
|
} else {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
@@ -514,11 +515,28 @@ namespace OpenWifi {
|
|||||||
Connection = SessionHint->second;
|
Connection = SessionHint->second;
|
||||||
Sessions_[sessionHash].erase(SessionHint);
|
Sessions_[sessionHash].erase(SessionHint);
|
||||||
}
|
}
|
||||||
|
std::atomic_bool duplicate_session = false;
|
||||||
|
{
|
||||||
auto deviceHash = MACHash::Hash(SerialNumber);
|
auto deviceHash = MACHash::Hash(SerialNumber);
|
||||||
std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]);
|
std::lock_guard DeviceLock(SerialNumbersMutex_[deviceHash]);
|
||||||
|
auto DeviceHint = SerialNumbers_[deviceHash].find(SerialNumber);
|
||||||
|
if (DeviceHint == SerialNumbers_[deviceHash].end()) {
|
||||||
|
// No duplicate connection go ahead and add new connection
|
||||||
SerialNumbers_[deviceHash][SerialNumber] = Connection;
|
SerialNumbers_[deviceHash][SerialNumber] = Connection;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
// Mark a duplicate session
|
||||||
|
duplicate_session = true;
|
||||||
|
poco_information(Logger(), fmt::format("[session ID: {}] Found a duplicate connection for device serial: {}", session_id, Utils::IntToSerialNumber(SerialNumber)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (duplicate_session.load()){
|
||||||
|
// This is only called if we have a duplicate session
|
||||||
|
// We remove the new incoming session that we just added a few lines above, forcing the destructor for this new session while not impacting the pointers to the old session.
|
||||||
|
std::lock_guard SessionLock(SessionMutex_[sessionHash]);
|
||||||
|
Sessions_[sessionHash].erase(session_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) {
|
bool AP_WS_Server::EndSession(uint64_t session_id, uint64_t SerialNumber) {
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ namespace OpenWifi {
|
|||||||
i >> cache;
|
i >> cache;
|
||||||
|
|
||||||
for (const auto &[Type, Platform] : cache.items()) {
|
for (const auto &[Type, Platform] : cache.items()) {
|
||||||
Platforms_[Type] = Poco::toLower(to_string(Platform));
|
Platforms_[Type] = Poco::toLower(Platform.get<std::string>());
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,8 +54,8 @@ namespace OpenWifi::RESTAPI_RPC {
|
|||||||
std::chrono::milliseconds WaitTimeInMs, Poco::JSON::Object *ObjectToReturn,
|
std::chrono::milliseconds WaitTimeInMs, Poco::JSON::Object *ObjectToReturn,
|
||||||
RESTAPIHandler *Handler, Poco::Logger &Logger, bool Deferred) {
|
RESTAPIHandler *Handler, Poco::Logger &Logger, bool Deferred) {
|
||||||
|
|
||||||
Logger.information(fmt::format("{},{}: New {} command. User={} Serial={}. ", Cmd.UUID,
|
Logger.information(fmt::format("{},{}: New {} command. User={} Serial={} Details={}. ", Cmd.UUID,
|
||||||
RPCID, Cmd.Command, Cmd.SubmittedBy, Cmd.SerialNumber));
|
RPCID, Cmd.Command, Cmd.SubmittedBy, Cmd.SerialNumber, Cmd.Details));
|
||||||
Cmd.Submitted = Utils::Now();
|
Cmd.Submitted = Utils::Now();
|
||||||
Cmd.Executed = 0;
|
Cmd.Executed = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -694,9 +694,31 @@ namespace OpenWifi {
|
|||||||
Params.stringify(ParamStream);
|
Params.stringify(ParamStream);
|
||||||
Cmd.Details = ParamStream.str();
|
Cmd.Details = ParamStream.str();
|
||||||
|
|
||||||
|
// retrieve capabilities and encode/compress parameters, if required
|
||||||
|
Poco::JSON::Object ConfigParams = Params;
|
||||||
|
GWObjects::Capabilities Caps;
|
||||||
|
if (StorageService()->GetDeviceCapabilities(SerialNumber_, Caps)) {
|
||||||
|
Poco::JSON::Object CapsJson;
|
||||||
|
Caps.to_json(CapsJson);
|
||||||
|
auto DeviceCaps = CapsJson.getObject(uCentralProtocol::CAPABILITIES);
|
||||||
|
if (DeviceCaps->has("compress_cmd") && DeviceCaps->get("compress_cmd")) {
|
||||||
|
// compressed command capability present and it is set, compress parameters
|
||||||
|
Poco::JSON::Object CompressedParams;
|
||||||
|
std::string CompressedBase64Data;
|
||||||
|
std::uint64_t UncompressedDataLen = ParamStream.str().length();
|
||||||
|
if (Utils::CompressAndEncodeBase64(ParamStream.str(), CompressedBase64Data)) {
|
||||||
|
// set compressed, base 64 encoded data and length of uncompressed data
|
||||||
|
CompressedParams.set(uCentralProtocol::COMPRESS_64, CompressedBase64Data);
|
||||||
|
CompressedParams.set(uCentralProtocol::COMPRESS_SZ, UncompressedDataLen);
|
||||||
|
ConfigParams = CompressedParams;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// AP_WS_Server()->SetPendingUUID(SerialNumber_, NewUUID);
|
// AP_WS_Server()->SetPendingUUID(SerialNumber_, NewUUID);
|
||||||
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::configure, true,
|
RESTAPI_RPC::WaitForCommand(CMD_RPC, APCommands::Commands::configure, true,
|
||||||
Cmd, Params, *Request, *Response, timeout,
|
Cmd, ConfigParams, *Request, *Response, timeout,
|
||||||
nullptr, this, Logger_);
|
nullptr, this, Logger_);
|
||||||
|
|
||||||
if(!Cmd.Executed) {
|
if(!Cmd.Executed) {
|
||||||
|
|||||||
@@ -22,9 +22,15 @@ namespace OpenWifi {
|
|||||||
|
|
||||||
std::string FileType;
|
std::string FileType;
|
||||||
std::string FileContent;
|
std::string FileContent;
|
||||||
if (!StorageService()->GetAttachedFileContent(UUID, SerialNumber, FileContent, FileType) || FileContent.empty()) {
|
int WaitingForFile = 0;
|
||||||
|
if (!StorageService()->GetAttachedFileContent(UUID, SerialNumber, FileContent, FileType, WaitingForFile) && !WaitingForFile) {
|
||||||
return NotFound();
|
return NotFound();
|
||||||
}
|
}
|
||||||
|
else if (WaitingForFile) {
|
||||||
|
// waiting for file to be uploaded, return Accepted
|
||||||
|
return Accepted();
|
||||||
|
}
|
||||||
|
|
||||||
if (FileType == "pcap") {
|
if (FileType == "pcap") {
|
||||||
SendFileContent(FileContent, "application/vnd.tcpdump.pcap", UUID + ".pcap");
|
SendFileContent(FileContent, "application/vnd.tcpdump.pcap", UUID + ".pcap");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,7 +243,7 @@ namespace OpenWifi {
|
|||||||
const std::string &Type);
|
const std::string &Type);
|
||||||
bool CancelWaitFile(std::string &UUID, std::string &ErrorText);
|
bool CancelWaitFile(std::string &UUID, std::string &ErrorText);
|
||||||
bool GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
|
bool GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
|
||||||
std::string &FileContent, std::string &Type);
|
std::string &FileContent, std::string &Type, int& WaitingForFile);
|
||||||
bool RemoveAttachedFile(std::string &UUID);
|
bool RemoveAttachedFile(std::string &UUID);
|
||||||
bool SetCommandResult(std::string &UUID, std::string &Result);
|
bool SetCommandResult(std::string &UUID, std::string &Result);
|
||||||
bool GetNewestCommands(std::string &SerialNumber, uint64_t HowMany,
|
bool GetNewestCommands(std::string &SerialNumber, uint64_t HowMany,
|
||||||
|
|||||||
@@ -376,6 +376,8 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"properties": {
|
"properties": {
|
||||||
"port-mirror": {
|
"port-mirror": {
|
||||||
"description": "Enable mirror of traffic from multiple minotor ports to a single analysis port.",
|
"description": "Enable mirror of traffic from multiple minotor ports to a single analysis port.",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"monitor-ports": {
|
"monitor-ports": {
|
||||||
@@ -390,6 +392,7 @@ static std::string DefaultAPSchema = R"foo(
|
|||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"loop-detection": {
|
"loop-detection": {
|
||||||
"description": "Enable loop detection on the L2 switches/bridge.",
|
"description": "Enable loop detection on the L2 switches/bridge.",
|
||||||
@@ -4652,18 +4655,24 @@ static std::string DefaultSWITCHSchema = R"foo(
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"port-mirror": {
|
"port-mirror": {
|
||||||
|
"description": "Enable mirror of traffic from multiple minotor ports to a single analysis port.",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"monitor-ports": {
|
"monitor-ports": {
|
||||||
|
"description": "The list of ports that we want to mirror.",
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"analysis-port": {
|
"analysis-port": {
|
||||||
|
"description": "The port that mirror'ed packets should be sent to.",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"loop-detection": {
|
"loop-detection": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
|
|||||||
@@ -431,6 +431,11 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Accepted() {
|
||||||
|
PrepareResponse(Poco::Net::HTTPResponse::HTTP_ACCEPTED);
|
||||||
|
Response->send();
|
||||||
|
}
|
||||||
|
|
||||||
inline void SendCompressedTarFile(const std::string &FileName, const std::string &Content) {
|
inline void SendCompressedTarFile(const std::string &FileName, const std::string &Content) {
|
||||||
Response->setStatus(Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK);
|
Response->setStatus(Poco::Net::HTTPResponse::HTTPStatus::HTTP_OK);
|
||||||
SetCommonHeaders();
|
SetCommonHeaders();
|
||||||
|
|||||||
@@ -611,6 +611,7 @@ namespace OpenWifi::uCentralProtocol {
|
|||||||
static const char *CFGPENDING = "cfgpending";
|
static const char *CFGPENDING = "cfgpending";
|
||||||
static const char *RECOVERY = "recovery";
|
static const char *RECOVERY = "recovery";
|
||||||
static const char *COMPRESS_64 = "compress_64";
|
static const char *COMPRESS_64 = "compress_64";
|
||||||
|
static const char *COMPRESS_SZ = "compress_sz";
|
||||||
static const char *CAPABILITIES = "capabilities";
|
static const char *CAPABILITIES = "capabilities";
|
||||||
static const char *REQUEST_UUID = "request_uuid";
|
static const char *REQUEST_UUID = "request_uuid";
|
||||||
static const char *SANITY = "sanity";
|
static const char *SANITY = "sanity";
|
||||||
|
|||||||
@@ -590,6 +590,26 @@ namespace OpenWifi::Utils {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Compress given data using utility function and encode it in base64 format.
|
||||||
|
//
|
||||||
|
bool CompressAndEncodeBase64(const std::string& UnCompressedData, std::string& CompressedBase64Data) {
|
||||||
|
|
||||||
|
unsigned long CompressedDataSize = UnCompressedData.size();
|
||||||
|
std::vector<Bytef> CompressedData(CompressedDataSize);
|
||||||
|
auto status = compress(&CompressedData[0], &CompressedDataSize,
|
||||||
|
(Bytef*) UnCompressedData.c_str(), UnCompressedData.size());
|
||||||
|
if (status == Z_OK) {
|
||||||
|
CompressedBase64Data = OpenWifi::Utils::base64encode(&CompressedData[0], CompressedDataSize);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// failed to compress data
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool IsAlphaNumeric(const std::string &s) {
|
bool IsAlphaNumeric(const std::string &s) {
|
||||||
return std::all_of(s.begin(), s.end(), [](char c) -> bool { return isalnum(c); });
|
return std::all_of(s.begin(), s.end(), [](char c) -> bool { return isalnum(c); });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -151,6 +151,8 @@ namespace OpenWifi::Utils {
|
|||||||
bool ExtractBase64CompressedData(const std::string &CompressedData,
|
bool ExtractBase64CompressedData(const std::string &CompressedData,
|
||||||
std::string &UnCompressedData, uint64_t compress_sz);
|
std::string &UnCompressedData, uint64_t compress_sz);
|
||||||
|
|
||||||
|
bool CompressAndEncodeBase64(const std::string& UnCompressedData, std::string& CompressedData);
|
||||||
|
|
||||||
inline bool match(const char* first, const char* second)
|
inline bool match(const char* first, const char* second)
|
||||||
{
|
{
|
||||||
// If we reach at the end of both strings, we are done
|
// If we reach at the end of both strings, we are done
|
||||||
|
|||||||
@@ -644,21 +644,7 @@ namespace OpenWifi {
|
|||||||
uint64_t Size = FileContent.str().size();
|
uint64_t Size = FileContent.str().size();
|
||||||
|
|
||||||
Poco::Data::Session Sess = Pool_->get();
|
Poco::Data::Session Sess = Pool_->get();
|
||||||
Sess.begin();
|
|
||||||
Poco::Data::Statement Statement(Sess);
|
|
||||||
|
|
||||||
std::string StatementStr;
|
|
||||||
|
|
||||||
// Get the existing command
|
|
||||||
|
|
||||||
StatementStr =
|
|
||||||
"UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?";
|
|
||||||
|
|
||||||
Statement << ConvertParams(StatementStr), Poco::Data::Keywords::use(WaitForFile),
|
|
||||||
Poco::Data::Keywords::use(Now), Poco::Data::Keywords::use(Size),
|
|
||||||
Poco::Data::Keywords::use(UUID);
|
|
||||||
Statement.execute();
|
|
||||||
Sess.commit();
|
|
||||||
if (Size < FileUploader()->MaxSize()) {
|
if (Size < FileUploader()->MaxSize()) {
|
||||||
|
|
||||||
Poco::Data::BLOB TheBlob;
|
Poco::Data::BLOB TheBlob;
|
||||||
@@ -680,7 +666,20 @@ namespace OpenWifi {
|
|||||||
} else {
|
} else {
|
||||||
poco_warning(Logger(), fmt::format("File {} is too large.", UUID));
|
poco_warning(Logger(), fmt::format("File {} is too large.", UUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update CommandList here to ensure that file us uploaded
|
||||||
|
Sess.begin();
|
||||||
|
Poco::Data::Statement Statement(Sess);
|
||||||
|
std::string StatementStr;
|
||||||
|
StatementStr =
|
||||||
|
"UPDATE CommandList SET WaitingForFile=?, AttachDate=?, AttachSize=? WHERE UUID=?";
|
||||||
|
|
||||||
|
Statement << ConvertParams(StatementStr), Poco::Data::Keywords::use(WaitForFile),
|
||||||
|
Poco::Data::Keywords::use(Now), Poco::Data::Keywords::use(Size),
|
||||||
|
Poco::Data::Keywords::use(UUID);
|
||||||
|
Statement.execute();
|
||||||
Sess.commit();
|
Sess.commit();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} catch (const Poco::Exception &E) {
|
} catch (const Poco::Exception &E) {
|
||||||
Logger().log(E);
|
Logger().log(E);
|
||||||
@@ -689,7 +688,7 @@ namespace OpenWifi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Storage::GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
|
bool Storage::GetAttachedFileContent(std::string &UUID, const std::string &SerialNumber,
|
||||||
std::string &FileContent, std::string &Type) {
|
std::string &FileContent, std::string &Type, int &WaitingForFile) {
|
||||||
try {
|
try {
|
||||||
Poco::Data::BLOB L;
|
Poco::Data::BLOB L;
|
||||||
/*
|
/*
|
||||||
@@ -702,10 +701,10 @@ namespace OpenWifi {
|
|||||||
Poco::Data::Statement Select1(Sess);
|
Poco::Data::Statement Select1(Sess);
|
||||||
|
|
||||||
std::string TmpSerialNumber;
|
std::string TmpSerialNumber;
|
||||||
std::string st1{"SELECT SerialNumber, Command FROM CommandList WHERE UUID=?"};
|
std::string st1{"SELECT SerialNumber, Command , WaitingForFile FROM CommandList WHERE UUID=?"};
|
||||||
std::string Command;
|
std::string Command;
|
||||||
Select1 << ConvertParams(st1), Poco::Data::Keywords::into(TmpSerialNumber),
|
Select1 << ConvertParams(st1), Poco::Data::Keywords::into(TmpSerialNumber),
|
||||||
Poco::Data::Keywords::into(Command), Poco::Data::Keywords::use(UUID);
|
Poco::Data::Keywords::into(Command), Poco::Data::Keywords::into(WaitingForFile), Poco::Data::Keywords::use(UUID);
|
||||||
Select1.execute();
|
Select1.execute();
|
||||||
|
|
||||||
if (TmpSerialNumber != SerialNumber) {
|
if (TmpSerialNumber != SerialNumber) {
|
||||||
|
|||||||
Reference in New Issue
Block a user