diff --git a/src/framework/ALBserver.cpp b/src/framework/ALBserver.cpp index 1a08503..ac10319 100644 --- a/src/framework/ALBserver.cpp +++ b/src/framework/ALBserver.cpp @@ -26,7 +26,7 @@ namespace OpenWifi { Response.set("Connection", "keep-alive"); Response.setVersion(Poco::Net::HTTPMessage::HTTP_1_1); std::ostream &Answer = Response.send(); - Answer << "process Alive and kicking!"; + Answer << ALBHealthCheckServer()->CallbackText(); } catch (...) { } } diff --git a/src/framework/ALBserver.h b/src/framework/ALBserver.h index 6599ac8..c52a570 100644 --- a/src/framework/ALBserver.h +++ b/src/framework/ALBserver.h @@ -37,6 +37,8 @@ namespace OpenWifi { inline static std::atomic_uint64_t req_id_ = 1; }; + typedef std::string ALBHealthMessageCallback(); + class ALBHealthCheckServer : public SubSystemServer { public: ALBHealthCheckServer(); @@ -48,10 +50,22 @@ namespace OpenWifi { int Start() override; void Stop() override; + inline void RegisterExtendedHealthMessage(ALBHealthMessageCallback *F) { + Callback_=F; + }; + + inline std::string CallbackText() { + if(Callback_== nullptr) { + return "process Alive and kicking!"; + } else { + return Callback_(); + } + } private: std::unique_ptr Server_; std::unique_ptr Socket_; + ALBHealthMessageCallback *Callback_= nullptr; int Port_ = 0; mutable std::atomic_bool Running_ = false; }; diff --git a/src/framework/KafkaManager.cpp b/src/framework/KafkaManager.cpp index b8193b8..09527a5 100644 --- a/src/framework/KafkaManager.cpp +++ b/src/framework/KafkaManager.cpp @@ -213,7 +213,7 @@ namespace OpenWifi { } void KafkaProducer::Produce(const char *Topic, const std::string &Key, - const std::shared_ptr Payload) { + std::shared_ptr Payload) { std::lock_guard G(Mutex_); Queue_.enqueueNotification(new KafkaMessage(Topic, Key, Payload)); } diff --git a/src/framework/KafkaManager.h b/src/framework/KafkaManager.h index b78c072..3ef5940 100644 --- a/src/framework/KafkaManager.h +++ b/src/framework/KafkaManager.h @@ -18,8 +18,8 @@ namespace OpenWifi { class KafkaMessage : public Poco::Notification { public: - KafkaMessage(const char * Topic, const std::string &Key, const std::shared_ptr Payload) - : Topic_(Topic), Key_(Key), Payload_(std::move(Payload)) {} + KafkaMessage(const char * Topic, const std::string &Key, std::shared_ptr Payload) + : Topic_(Topic), Key_(Key), Payload_(Payload) {} inline const char * Topic() { return Topic_; } inline const std::string &Key() { return Key_; } @@ -36,7 +36,7 @@ namespace OpenWifi { void run() override; void Start(); void Stop(); - void Produce(const char *Topic, const std::string &Key, const std::shared_ptr Payload); + void Produce(const char *Topic, const std::string &Key, std::shared_ptr Payload); private: std::recursive_mutex Mutex_; @@ -92,9 +92,9 @@ namespace OpenWifi { void Stop() override; void PostMessage(const char *topic, const std::string &key, - const std::shared_ptr PayLoad, bool WrapMessage = true); - void Dispatch(const char *Topic, const std::string &Key, const std::shared_ptr Payload); - [[nodiscard]] const std::shared_ptr WrapSystemId(const std::shared_ptr PayLoad); + std::shared_ptr PayLoad, bool WrapMessage = true); + void Dispatch(const char *Topic, const std::string &Key, std::shared_ptr Payload); + [[nodiscard]] const std::shared_ptr WrapSystemId(std::shared_ptr PayLoad); [[nodiscard]] inline bool Enabled() const { return KafkaEnabled_; } uint64_t RegisterTopicWatcher(const std::string &Topic, Types::TopicNotifyFunction &F); void UnregisterTopicWatcher(const std::string &Topic, uint64_t Id); diff --git a/src/framework/MicroService.cpp b/src/framework/MicroService.cpp index 31d6837..5d517d9 100644 --- a/src/framework/MicroService.cpp +++ b/src/framework/MicroService.cpp @@ -129,6 +129,8 @@ namespace OpenWifi { } } else { poco_error(logger(), "Bad bus message."); + std::ostringstream os; + Object->stringify(std::cout); } auto i = Services_.begin(); diff --git a/src/framework/MicroServiceFuncs.cpp b/src/framework/MicroServiceFuncs.cpp index 367d464..6664981 100644 --- a/src/framework/MicroServiceFuncs.cpp +++ b/src/framework/MicroServiceFuncs.cpp @@ -5,6 +5,8 @@ #include "framework/MicroServiceFuncs.h" #include "framework/MicroService.h" +#include "framework/ALBserver.h" + namespace OpenWifi { const std::string &MicroServiceDataDirectory() { return MicroService::instance().DataDir(); } @@ -123,4 +125,8 @@ namespace OpenWifi { return MicroService::instance().AllowExternalMicroServices(); } + void MicroServiceALBCallback( std::string Callback()) { + return ALBHealthCheckServer()->RegisterExtendedHealthMessage(Callback); + } + } // namespace OpenWifi diff --git a/src/framework/MicroServiceFuncs.h b/src/framework/MicroServiceFuncs.h index b266156..9c618b8 100644 --- a/src/framework/MicroServiceFuncs.h +++ b/src/framework/MicroServiceFuncs.h @@ -53,4 +53,5 @@ namespace OpenWifi { std::string MicroServiceGetPublicAPIEndPoint(); void MicroServiceDeleteOverrideConfiguration(); bool AllowExternalMicroServices(); + void MicroServiceALBCallback( std::string Callback()); } // namespace OpenWifi diff --git a/src/framework/OpenWifiTypes.h b/src/framework/OpenWifiTypes.h index 7be530d..39f90ac 100644 --- a/src/framework/OpenWifiTypes.h +++ b/src/framework/OpenWifiTypes.h @@ -28,6 +28,9 @@ namespace OpenWifi::Types { typedef std::string UUID_t; typedef std::vector UUIDvec_t; typedef std::map> Counted3DMapSII; + typedef std::vector IntList; + typedef std::vector UIntList; + typedef std::vector DoubleList; struct MicroServiceMeta { uint64_t Id = 0; diff --git a/src/framework/RESTAPI_utils.h b/src/framework/RESTAPI_utils.h index 72c0afc..27651be 100644 --- a/src/framework/RESTAPI_utils.h +++ b/src/framework/RESTAPI_utils.h @@ -102,6 +102,20 @@ namespace OpenWifi::RESTAPI_utils { Obj.set(Field, A); } + inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::DoubleList &V) { + Poco::JSON::Array A; + for (const auto &i : V) + A.add(i); + Obj.set(Field, A); + } + + inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::IntList &V) { + Poco::JSON::Array A; + for (const auto &i : V) + A.add(i); + Obj.set(Field, A); + } + inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::TagList &V) { Poco::JSON::Array A; for (const auto &i : V) @@ -284,6 +298,28 @@ namespace OpenWifi::RESTAPI_utils { } } + inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, + Types::DoubleList &Value) { + if (Obj->isArray(Field) && !Obj->isNull(Field)) { + Value.clear(); + Poco::JSON::Array::Ptr A = Obj->getArray(Field); + for (const auto &i : *A) { + Value.push_back(i); + } + } + } + + inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, + Types::IntList &Value) { + if (Obj->isArray(Field) && !Obj->isNull(Field)) { + Value.clear(); + Poco::JSON::Array::Ptr A = Obj->getArray(Field); + for (const auto &i : *A) { + Value.push_back(i); + } + } + } + template void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, std::vector &Value) { diff --git a/src/framework/StorageClass.h b/src/framework/StorageClass.h index 2255de5..cfb5530 100644 --- a/src/framework/StorageClass.h +++ b/src/framework/StorageClass.h @@ -22,9 +22,8 @@ namespace OpenWifi { class StorageClass : public SubSystemServer { public: - StorageClass() noexcept : SubSystemServer("StorageClass", "STORAGE-SVR", "storage") {} - int Start() override { + inline int Start() override { std::lock_guard Guard(Mutex_); Logger().notice("Starting."); @@ -40,17 +39,22 @@ namespace OpenWifi { return 0; } - void Stop() override { Pool_->shutdown(); } + inline void Stop() override { Pool_->shutdown(); } DBType Type() const { return dbType_; }; + StorageClass() noexcept : SubSystemServer("StorageClass", "STORAGE-SVR", "storage") { + + } + private: inline int Setup_SQLite(); inline int Setup_MySQL(); inline int Setup_PostgreSQL(); - protected: - std::unique_ptr Pool_; + + protected: + std::shared_ptr Pool_; Poco::Data::SQLite::Connector SQLiteConn_; Poco::Data::PostgreSQL::Connector PostgresConn_; Poco::Data::MySQL::Connector MySQLConn_; @@ -81,7 +85,7 @@ namespace OpenWifi { // Poco::Data::SessionPool(SQLiteConn_.name(), DBName, 8, // (int)NumSessions, // (int)IdleTime)); - Pool_ = std::make_unique(SQLiteConn_.name(), DBName, 8, + Pool_ = std::make_shared(SQLiteConn_.name(), DBName, 8, (int)NumSessions, (int)IdleTime); return 0; } @@ -102,7 +106,7 @@ namespace OpenWifi { ";compress=true;auto-reconnect=true"; Poco::Data::MySQL::Connector::registerConnector(); - Pool_ = std::make_unique(MySQLConn_.name(), ConnectionStr, 8, + Pool_ = std::make_shared(MySQLConn_.name(), ConnectionStr, 8, NumSessions, IdleTime); return 0; @@ -126,7 +130,7 @@ namespace OpenWifi { " connect_timeout=" + ConnectionTimeout; Poco::Data::PostgreSQL::Connector::registerConnector(); - Pool_ = std::make_unique(PostgresConn_.name(), ConnectionStr, 8, + Pool_ = std::make_shared(PostgresConn_.name(), ConnectionStr, 8, NumSessions, IdleTime); return 0; diff --git a/src/framework/utils.cpp b/src/framework/utils.cpp index c2f4358..a0f4c11 100644 --- a/src/framework/utils.cpp +++ b/src/framework/utils.cpp @@ -132,6 +132,15 @@ namespace OpenWifi::Utils { return std::regex_match(Hostname, HostNameRegex); } + [[nodiscard]] bool ValidNumber(const std::string &number, bool isSigned) + { + static std::regex IntRegex("^-?[0-9]\\d*(\\.\\d+)?$"); + if(!isSigned) { + IntRegex = "^[0-9]\\d*(\\.\\d+)?$"; + } + return std::regex_match(number, IntRegex); + } + [[nodiscard]] std::string ToHex(const std::vector &B) { std::string R; R.reserve(B.size() * 2); diff --git a/src/framework/utils.h b/src/framework/utils.h index b464989..3979dca 100644 --- a/src/framework/utils.h +++ b/src/framework/utils.h @@ -73,6 +73,7 @@ namespace OpenWifi::Utils { [[nodiscard]] bool ValidSerialNumbers(const std::vector &Serial); [[nodiscard]] bool ValidUUID(const std::string &UUID); [[nodiscard]] bool ValidHostname(const std::string &hostname); + [[nodiscard]] bool ValidNumber(const std::string &number, bool isSigned); template std::string ComputeHash(Args &&...args) { Poco::SHA2Engine E;