From 39b1352d4ea3517bd2833a6ae50d8f756567bfad Mon Sep 17 00:00:00 2001 From: stephb9959 Date: Sun, 27 Nov 2022 14:35:49 -0800 Subject: [PATCH] https://telecominfraproject.atlassian.net/browse/WIFI-11755 Signed-off-by: stephb9959 --- Dockerfile | 2 +- src/RESTObjects/RESTAPI_GWobjects.cpp | 53 +++++++++++++++++++++++++++ src/RESTObjects/RESTAPI_GWobjects.h | 27 ++++++++++++++ src/framework/MicroService.cpp | 5 ++- src/framework/ow_constants.h | 2 + src/framework/utils.cpp | 29 +++++++++++++++ src/framework/utils.h | 4 +- 7 files changed, 118 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1044775..7aade03 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ARG DEBIAN_VERSION=11.5-slim -ARG POCO_VERSION=poco-tip-v1 +ARG POCO_VERSION=poco-tip-v2 ARG CPPKAFKA_VERSION=tip-v1 ARG JSON_VALIDATOR_VERSION=2.1.0 diff --git a/src/RESTObjects/RESTAPI_GWobjects.cpp b/src/RESTObjects/RESTAPI_GWobjects.cpp index 07ed9e1..4f00308 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.cpp +++ b/src/RESTObjects/RESTAPI_GWobjects.cpp @@ -304,6 +304,7 @@ namespace OpenWifi::GWObjects { field_to_json(Obj,"serialNumber",serialNumber); field_to_json(Obj,"timeout",timeout); field_to_json(Obj,"type",type); + field_to_json(Obj,"scriptId",scriptId); field_to_json(Obj,"script",script); field_to_json(Obj,"when",when); field_to_json(Obj,"signature", signature); @@ -317,6 +318,7 @@ namespace OpenWifi::GWObjects { field_from_json(Obj,"timeout",timeout); field_from_json(Obj,"type",type); field_from_json(Obj,"script",script); + field_from_json(Obj,"scriptId",scriptId); field_from_json(Obj,"when",when); field_from_json(Obj,"signature", signature); field_from_json(Obj,"deferred", deferred); @@ -422,5 +424,56 @@ namespace OpenWifi::GWObjects { } return false; } + + void ScriptEntry::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"id", id); + field_to_json(Obj,"name", name); + field_to_json(Obj,"description", description); + field_to_json(Obj,"uri", uri); + field_to_json(Obj,"content", content); + field_to_json(Obj,"version", version); + field_to_json(Obj,"type", type); + field_to_json(Obj,"created", created); + field_to_json(Obj,"modified", modified); + field_to_json(Obj,"author", author); + field_to_json(Obj,"restricted", restricted); + field_to_json(Obj,"deferred", deferred); + field_to_json(Obj,"timeout", timeout); + } + + bool ScriptEntry::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"id", id); + field_from_json(Obj,"name", name); + field_from_json(Obj,"description", description); + field_from_json(Obj,"uri", uri); + field_from_json(Obj,"content", content); + field_from_json(Obj,"version", version); + field_from_json(Obj,"type", type); + field_from_json(Obj,"created", created); + field_from_json(Obj,"modified", modified); + field_from_json(Obj,"author", author); + field_from_json(Obj,"restricted", restricted); + field_from_json(Obj,"deferred", deferred); + field_from_json(Obj,"timeout", timeout); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } + + void ScriptEntryList::to_json(Poco::JSON::Object &Obj) const { + field_to_json(Obj,"scripts",scripts); + } + + bool ScriptEntryList::from_json(const Poco::JSON::Object::Ptr &Obj) { + try { + field_from_json(Obj,"scripts",scripts); + return true; + } catch (const Poco::Exception &E) { + } + return false; + } + } diff --git a/src/RESTObjects/RESTAPI_GWobjects.h b/src/RESTObjects/RESTAPI_GWobjects.h index 8e53bd6..1f18171 100644 --- a/src/RESTObjects/RESTAPI_GWobjects.h +++ b/src/RESTObjects/RESTAPI_GWobjects.h @@ -216,11 +216,38 @@ namespace OpenWifi::GWObjects { void to_json(Poco::JSON::Object &Obj) const; }; + struct ScriptEntry { + std::string id; + std::string name; + std::string description; + std::string uri; + std::string content; + std::string version; + std::string type; + std::uint64_t created; + std::uint64_t modified; + std::string author; + Types::StringVec restricted; + bool deferred=false; + std::uint64_t timeout=30; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + + struct ScriptEntryList { + std::vector scripts; + + void to_json(Poco::JSON::Object &Obj) const; + bool from_json(const Poco::JSON::Object::Ptr &Obj); + }; + struct ScriptRequest { std::string serialNumber; uint64_t timeout=30; std::string type; std::string script; + std::string scriptId; std::uint64_t when; std::string signature; bool deferred; diff --git a/src/framework/MicroService.cpp b/src/framework/MicroService.cpp index 366db7f..721da32 100644 --- a/src/framework/MicroService.cpp +++ b/src/framework/MicroService.cpp @@ -245,7 +245,7 @@ namespace OpenWifi { Poco::Logger::root().setChannel(Splitter); } } - + Poco::Logger::root().information(fmt::format("Enabled console logs: asynch={} websocket={}",UseAsync,DisableWebSocketLogging)); } void MicroService::SetColorConsoleLogs(bool UseAsync, bool DisableWebSocketLogging, const std::string & FormatterPattern) { @@ -274,7 +274,7 @@ namespace OpenWifi { Poco::Logger::root().setChannel(Splitter); } } - + Poco::Logger::root().information(fmt::format("Enabled color console logs: asynch={} websocket={}",UseAsync,DisableWebSocketLogging)); } void MicroService::SetSQLLogs([[maybe_unused]] bool UseAsync,[[maybe_unused]] bool DisableWebSocketLogging,[[maybe_unused]] const std::string & FormatterPattern) { @@ -327,6 +327,7 @@ namespace OpenWifi { Poco::Logger::root().setChannel(Splitter); } } + Poco::Logger::root().information(fmt::format("Enabled file logs: asynch={} websocket={}",UseAsync,DisableWebSocketLogging)); } void DaemonPostInitialization(Poco::Util::Application &self); diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index a3abd85..803c330 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -229,6 +229,8 @@ namespace OpenWifi::RESTAPI::Errors { static const struct msg ApiKeyDoesNotExist{1150,"API Key does not exist."}; static const struct msg DeviceIsRestricted{1151,"Device is protected by regulation. This function is not allowed."}; + static const struct msg InvalidURI{1152,"Invalid URI."}; + static const struct msg InvalidScriptSelection{1153,"Only script or scriptId must be specified. Not both."}; } diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp index 25fcd63..2b0e16f 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -487,6 +487,25 @@ void ReplaceVariables( std::string & Content , const Types::StringPairVec & P) { return false; } +[[nodiscard]] bool wgetfile(const Poco::URI &uri, const std::string &FileName) { + try { + Poco::Net::HTTPSClientSession session(uri.getHost(), uri.getPort()); + + // send request + Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri.getPath(), Poco::Net::HTTPMessage::HTTP_1_1); + session.sendRequest(req); + + Poco::Net::HTTPResponse res; + std::istream &is = session.receiveResponse(res); + std::fstream os(FileName,std::ios_base::trunc | std::ios_base::binary | std::ios_base::out); + Poco::StreamCopier::copyStream(is,os); + return true; + } catch (...) { + + } + return false; +} + bool ExtractBase64CompressedData(const std::string &CompressedData, std::string &UnCompressedData, uint64_t compress_sz ) { std::istringstream ifs(CompressedData); @@ -531,4 +550,14 @@ bool ExtractBase64CompressedData(const std::string &CompressedData, return "*******"; } + [[nodiscard]] bool ValidateURI(const std::string &uri) { + try { + Poco::URI u(uri); + return true; + } catch (...) { + + } + return false; + } + } diff --git a/src/framework/utils.h b/src/framework/utils.h index 35fca16..a313f18 100644 --- a/src/framework/utils.h +++ b/src/framework/utils.h @@ -115,8 +115,10 @@ namespace OpenWifi::Utils { [[nodiscard]] std::string BinaryFileToHexString(const Poco::File &F); [[nodiscard]] std::string SecondsToNiceText(uint64_t Seconds); [[nodiscard]] bool wgets(const std::string &URL, std::string &Response); - [[nodiscard]] bool IsAlphaNumeric(const std::string &s); + [[nodiscard]] bool wgetfile(const Poco::URI &uri, const std::string &FileName); + [[nodiscard]] bool IsAlphaNumeric(const std::string &s); [[nodiscard]] std::string SanitizeToken(const std::string &Token); + [[nodiscard]] bool ValidateURI(const std::string &uri); template< typename T > std::string int_to_hex( T i )