diff --git a/BUILDING.md b/BUILDING.md index 8b44d6d..c2f639c 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -1,6 +1,6 @@ # Building from source -In order to build the OWSEC, you will need to install its dependencies, which includes the following: +In order to build OWSEC, you will need to install its dependencies, which includes the following: - cmake - boost - POCO 1.10.1 or later @@ -13,43 +13,43 @@ In order to build the OWSEC, you will need to install its dependencies, which in The build is done in 2 parts. The first part is to build a local copy of the framework tailored to your environment. This framework is called [Poco](https://github.com/pocoproject/poco). The version used in this project has a couple of fixes -from the master copy needed for cmake. Please use the version of this [Poco fix](https://github.com/AriliaWireless/poco). Building +from the master copy needed for cmake. Please use the version of this [Poco fix](https://github.com/Telecominfraproject/wlan-cloud-lib-poco). Building Poco may take several minutes depending on the platform you are building on. ## Ubuntu These instructions have proven to work on Ubuntu 20.4. ```bash -sudo apt install git cmake g++ libssl-dev libmariadb-dev -sudo apt install libpq-dev libaprutil1-dev apache2-dev libboost-all-dev -sudo apt install librdkafka-dev default-libmysqlclient-dev -sudo apt install nlohmann-json-dev +sudo apt install git cmake g++ libssl-dev libmariadb-dev \ + libpq-dev libaprutil1-dev apache2-dev libboost-all-dev \ + librdkafka-dev default-libmysqlclient-dev \ + nlohmann-json-dev -cd ~ -git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco cd poco mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. -cd ~ -git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch tip-v1 cppkafka cd cppkafka mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. -cd ~ -git clone https://github.com/AriliaWireless/valijson --branch tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-valijson --branch tip-v1 valijson cd valijson mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. git clone https://github.com/fmtlib/fmt --branch 9.0.0 /fmtlib cd fmtlib @@ -58,56 +58,59 @@ cd cmake-build cmake .. make make install +cd ../.. -cd ~ git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralsec cd wlan-cloud-ucentralsec mkdir cmake-build cd cmake-build cmake .. make -j 8 +cd ../.. ``` ## Fedora The following instructions have proven to work on Fedora 33 ```bash -sudo yum install cmake g++ openssl-devel mysql-devel mysql apr-util-devel boost boost-devel -sudo yum install yaml-cpp-devel lua-devel +sudo yum install cmake g++ openssl-devel mysql-devel mysql apr-util-devel boost boost-devel \ + yaml-cpp-devel lua-devel sudo dnf install postgresql.x86_64 librdkafka-devel sudo dnf install postgresql-devel json-devel -git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco cd poco mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. -git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch tip-v1 cppkafka cd cppkafka mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. -cd ~ -git clone https://github.com/AriliaWireless/valijson --branch tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-valijson --branch tip-v1 valijson cd valijson mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. -cd ~ git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralsec cd wlan-cloud-ucentralsec mkdir cmake-build cd cmake-build cmake .. make +cd ../.. ``` ## macOS Build @@ -126,7 +129,7 @@ brew install openssl \ nlohmann-json \ fmt -git clone https://github.com/AriliaWireless/poco --branch poco-tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco pushd poco mkdir cmake-build push cmake-build @@ -136,7 +139,7 @@ sudo cmake --build . --target install popd popd -git clone https://github.com/AriliaWireless/cppkafka --branch tip-v1 +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch tip-v1 cppkafka pushd cppkafka mkdir cmake-build pushd cmake-build @@ -146,10 +149,10 @@ sudo cmake --build . --target install popd popd -git clone https://github.com/AriliaWireless/valijson --branch tip-v1 -cd valijson +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-valijson --branch tip-v1 valijson +pushd valijson mkdir cmake-build -cd cmake-build +pushd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install @@ -172,20 +175,23 @@ support. You can build with only SQLite support by not installing the packages f adding -DSMALL_BUILD=1 on the cmake build line. ```bash -sudo apt install git cmake g++ libssl-dev libaprutil1-dev apache2-dev libboost-all-dev libyaml-cpp-dev -git clone https://github.com/stephb9959/poco +sudo apt install git cmake g++ libssl-dev libaprutil1-dev apache2-dev \ + libboost-all-dev libyaml-cpp-dev + +git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch poco-tip-v1 poco cd poco mkdir cmake-build cd cmake-build cmake .. cmake --build . --config Release sudo cmake --build . --target install +cd ../.. -cd ~ git clone https://github.com/Telecominfraproject/wlan-cloud-ucentralsec cd wlan-cloud-ucentralsec mkdir cmake-build cd cmake-build cmake -DSMALL_BUILD=1 .. make +cd ../.. ``` diff --git a/Dockerfile b/Dockerfile index 7d07aef..6a967c2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,8 +15,8 @@ FROM build-base AS poco-build ARG POCO_VERSION -ADD https://api.github.com/repos/AriliaWireless/poco/git/refs/tags/${POCO_VERSION} version.json -RUN git clone https://github.com/AriliaWireless/poco --branch ${POCO_VERSION} /poco +ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-poco/git/refs/tags/${POCO_VERSION} version.json +RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-poco --branch ${POCO_VERSION} /poco WORKDIR /poco RUN mkdir cmake-build @@ -29,8 +29,8 @@ FROM build-base AS cppkafka-build ARG CPPKAFKA_VERSION -ADD https://api.github.com/repos/AriliaWireless/cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json -RUN git clone https://github.com/AriliaWireless/cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka +ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-cppkafka/git/refs/tags/${CPPKAFKA_VERSION} version.json +RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-cppkafka --branch ${CPPKAFKA_VERSION} /cppkafka WORKDIR /cppkafka RUN mkdir cmake-build @@ -43,8 +43,8 @@ FROM build-base AS valijson-build ARG VALIJASON_VERSION -ADD https://api.github.com/repos/AriliaWireless/valijson/git/refs/tags/${VALIJASON_VERSION} version.json -RUN git clone https://github.com/AriliaWireless/valijson --branch ${VALIJASON_VERSION} /valijson +ADD https://api.github.com/repos/Telecominfraproject/wlan-cloud-lib-valijson/git/refs/tags/${VALIJASON_VERSION} version.json +RUN git clone https://github.com/Telecominfraproject/wlan-cloud-lib-valijson --branch ${VALIJASON_VERSION} /valijson WORKDIR /valijson RUN mkdir cmake-build diff --git a/build b/build index 62f9457..c793025 100644 --- a/build +++ b/build @@ -1 +1 @@ -6 \ No newline at end of file +7 \ No newline at end of file diff --git a/src/RESTObjects/RESTAPI_ProvObjects.cpp b/src/RESTObjects/RESTAPI_ProvObjects.cpp index 2a139f5..8cdb878 100644 --- a/src/RESTObjects/RESTAPI_ProvObjects.cpp +++ b/src/RESTObjects/RESTAPI_ProvObjects.cpp @@ -587,6 +587,9 @@ namespace OpenWifi::ProvObjects { field_to_json(Obj, "locale", locale); field_to_json(Obj, "realMacAddress", realMacAddress); field_to_json(Obj, "doNotAllowOverrides", doNotAllowOverrides); + field_to_json(Obj, "imported", imported); + field_to_json(Obj, "connected", connected); + field_to_json(Obj, "platform", platform); } bool InventoryTag::from_json(const Poco::JSON::Object::Ptr &Obj) { @@ -609,6 +612,9 @@ namespace OpenWifi::ProvObjects { field_from_json(Obj, "locale", locale); field_from_json(Obj, "realMacAddress", realMacAddress); field_from_json(Obj, "doNotAllowOverrides", doNotAllowOverrides); + field_from_json(Obj, "imported", imported); + field_from_json(Obj, "connected", connected); + field_from_json(Obj, "platform", platform); return true; } catch (...) { } diff --git a/src/RESTObjects/RESTAPI_ProvObjects.h b/src/RESTObjects/RESTAPI_ProvObjects.h index 6014d61..8f11867 100644 --- a/src/RESTObjects/RESTAPI_ProvObjects.h +++ b/src/RESTObjects/RESTAPI_ProvObjects.h @@ -490,9 +490,11 @@ namespace OpenWifi::ProvObjects { std::string locale; std::string realMacAddress; bool doNotAllowOverrides = false; + std::uint64_t imported=0; + std::uint64_t connected=0; + std::string platform{"AP"}; void to_json(Poco::JSON::Object &Obj) const; - bool from_json(const Poco::JSON::Object::Ptr &Obj); }; diff --git a/src/framework/EventBusManager.cpp b/src/framework/EventBusManager.cpp index 66774f1..4f4e8c7 100644 --- a/src/framework/EventBusManager.cpp +++ b/src/framework/EventBusManager.cpp @@ -16,9 +16,9 @@ namespace OpenWifi { KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg, false); while (Running_) { - Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer()); - if (!Running_) - break; + if(!Poco::Thread::trySleep((unsigned long)MicroServiceDaemonBusTimer())) { + break; + } Msg = (MicroServiceMakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_KEEP_ALIVE)); KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS, MicroServicePrivateEndPoint(), Msg, false); @@ -29,7 +29,7 @@ namespace OpenWifi { }; void EventBusManager::Start() { - poco_information(Logger(), "Starting..."); + poco_information(Logger_, "Starting..."); if (KafkaManager()->Enabled()) { Thread_.start(*this); } @@ -37,11 +37,11 @@ namespace OpenWifi { void EventBusManager::Stop() { if (KafkaManager()->Enabled()) { - poco_information(Logger(), "Stopping..."); + poco_information(Logger_, "Stopping..."); Running_ = false; Thread_.wakeUp(); Thread_.join(); - poco_information(Logger(), "Stopped..."); + poco_information(Logger_, "Stopped..."); } } diff --git a/src/framework/EventBusManager.h b/src/framework/EventBusManager.h index fe8a82c..4982fb4 100644 --- a/src/framework/EventBusManager.h +++ b/src/framework/EventBusManager.h @@ -22,7 +22,6 @@ namespace OpenWifi { return instance_; } - explicit EventBusManager(Poco::Logger &L); void run() final; void Start(); void Stop(); diff --git a/src/framework/KafkaManager.cpp b/src/framework/KafkaManager.cpp index f2936e7..9605736 100644 --- a/src/framework/KafkaManager.cpp +++ b/src/framework/KafkaManager.cpp @@ -79,8 +79,10 @@ namespace OpenWifi { Utils::SetThreadName("Kafka:Prod"); cppkafka::Configuration Config( {{"client.id", MicroServiceConfigGetString("openwifi.kafka.client.id", "")}, - {"metadata.broker.list", - MicroServiceConfigGetString("openwifi.kafka.brokerlist", "")}}); + {"metadata.broker.list",MicroServiceConfigGetString("openwifi.kafka.brokerlist", "")} // , + // {"send.buffer.bytes", KafkaManager()->KafkaManagerMaximumPayloadSize() } + } + ); AddKafkaSecurity(Config); @@ -275,6 +277,7 @@ namespace OpenWifi { int KafkaManager::Start() { if (!KafkaEnabled_) return 0; + MaxPayloadSize_ = MicroServiceConfigGetInt("openwifi.kafka.max.payload", 250000); ConsumerThr_.Start(); ProducerThr_.Start(); return 0; diff --git a/src/framework/KafkaManager.h b/src/framework/KafkaManager.h index e6272d3..75b9aa6 100644 --- a/src/framework/KafkaManager.h +++ b/src/framework/KafkaManager.h @@ -94,11 +94,14 @@ namespace OpenWifi { return ConsumerThr_.UnregisterTopicWatcher(Topic,Id); } + std::uint64_t KafkaManagerMaximumPayloadSize() const { return MaxPayloadSize_; } + private: bool KafkaEnabled_ = false; std::string SystemInfoWrapper_; KafkaProducer ProducerThr_; KafkaConsumer ConsumerThr_; + std::uint64_t MaxPayloadSize_ = 250000; void PartitionAssignment(const cppkafka::TopicPartitionList &partitions); void PartitionRevocation(const cppkafka::TopicPartitionList &partitions); diff --git a/src/framework/MicroService.cpp b/src/framework/MicroService.cpp index 13f89fb..bda4aaa 100644 --- a/src/framework/MicroService.cpp +++ b/src/framework/MicroService.cpp @@ -29,11 +29,13 @@ #include "framework/WebSocketLogger.h" #include "framework/utils.h" -namespace OpenWifi { +#ifdef USE_MEDUSA_CLIENT +#include +#endif - void MicroService::Exit(int Reason) { std::exit(Reason); } +namespace OpenWifi { - static std::string MakeServiceListString(const Types::MicroServiceMetaMap &Services) { + static std::string MakeServiceListString(const Types::MicroServiceMetaMap &Services) { std::string SvcList; for (const auto &Svc : Services) { if (SvcList.empty()) @@ -204,25 +206,29 @@ namespace OpenWifi { Res.push_back(ServiceRec); } return Res; + } void MicroService::LoadConfigurationFile() { - std::string Location = Poco::Environment::get(DAEMON_CONFIG_ENV_VAR, "."); - ConfigFileName_ = - ConfigFileName_.empty() ? Location + "/" + DAEMON_PROPERTIES_FILENAME : ConfigFileName_; - Poco::Path ConfigFile(ConfigFileName_); - - if (!ConfigFile.isFile()) { - std::cerr << DAEMON_APP_NAME << ": Configuration " << ConfigFile.toString() - << " does not seem to exist. Please set " + DAEMON_CONFIG_ENV_VAR + - " env variable the path of the " + DAEMON_PROPERTIES_FILENAME + - " file." - << std::endl; - std::exit(Poco::Util::Application::EXIT_CONFIG); - } - - // loadConfiguration(ConfigFile.toString()); - PropConfigurationFile_ = new Poco::Util::PropertyFileConfiguration(ConfigFile.toString()); + if(ConfigContent_.empty()) { + std::string Location = Poco::Environment::get(DAEMON_CONFIG_ENV_VAR, "."); + ConfigFileName_ = + ConfigFileName_.empty() ? Location + "/" + DAEMON_PROPERTIES_FILENAME : ConfigFileName_; + Poco::Path ConfigFile(ConfigFileName_); + + if (!ConfigFile.isFile()) { + std::cerr << DAEMON_APP_NAME << ": Configuration " << ConfigFile.toString() + << " does not seem to exist. Please set " + DAEMON_CONFIG_ENV_VAR + + " env variable the path of the " + DAEMON_PROPERTIES_FILENAME + + " file." + << std::endl; + std::exit(Poco::Util::Application::EXIT_CONFIG); + } + PropConfigurationFile_ = new Poco::Util::PropertyFileConfiguration(ConfigFile.toString()); + } else { + std::istringstream is(ConfigContent_); + PropConfigurationFile_ = new Poco::Util::PropertyFileConfiguration(is); + } configPtr()->addWriteable(PropConfigurationFile_, PRIO_DEFAULT); } @@ -425,49 +431,59 @@ namespace OpenWifi { void DaemonPostInitialization(Poco::Util::Application &self); - void MicroService::initialize(Poco::Util::Application &self) { - // add the default services - LoadConfigurationFile(); - InitializeLoggingSystem(); - - SubSystems_.push_back(KafkaManager()); - SubSystems_.push_back(ALBHealthCheckServer()); - SubSystems_.push_back(RESTAPI_ExtServer()); - SubSystems_.push_back(RESTAPI_IntServer()); + void MicroService::StartEverything(Poco::Util::Application &self) { + LoadConfigurationFile(); + InitializeLoggingSystem(); + + static bool InitializedBaseService=false; + if(!InitializedBaseService) { + InitializedBaseService = true; + SubSystems_.push_back(KafkaManager()); + SubSystems_.push_back(ALBHealthCheckServer()); + SubSystems_.push_back(RESTAPI_ExtServer()); + SubSystems_.push_back(RESTAPI_IntServer()); #ifndef TIP_SECURITY_SERVICE - SubSystems_.push_back(AuthClient()); + SubSystems_.push_back(AuthClient()); #endif - Poco::Net::initializeSSL(); - Poco::Net::HTTPStreamFactory::registerFactory(); - Poco::Net::HTTPSStreamFactory::registerFactory(); - Poco::Net::FTPStreamFactory::registerFactory(); - Poco::Net::FTPSStreamFactory::registerFactory(); - - Poco::File DataDir(ConfigPath("openwifi.system.data")); - DataDir_ = DataDir.path(); - if (!DataDir.exists()) { - try { - DataDir.createDirectory(); - } catch (const Poco::Exception &E) { - Logger_.log(E); - } - } - WWWAssetsDir_ = ConfigPath("openwifi.restapi.wwwassets", ""); - if (WWWAssetsDir_.empty()) - WWWAssetsDir_ = DataDir_; - LoadMyConfig(); + Poco::Net::initializeSSL(); + Poco::Net::HTTPStreamFactory::registerFactory(); + Poco::Net::HTTPSStreamFactory::registerFactory(); + Poco::Net::FTPStreamFactory::registerFactory(); + Poco::Net::FTPSStreamFactory::registerFactory(); + } - AllowExternalMicroServices_ = ConfigGetBool("allowexternalmicroservices", true); + Poco::File DataDir(ConfigPath("openwifi.system.data")); + DataDir_ = DataDir.path(); + if (!DataDir.exists()) { + try { + DataDir.createDirectory(); + } catch (const Poco::Exception &E) { + Logger_.log(E); + } + } + WWWAssetsDir_ = ConfigPath("openwifi.restapi.wwwassets", ""); + if (WWWAssetsDir_.empty()) + WWWAssetsDir_ = DataDir_; - InitializeSubSystemServers(); - ServerApplication::initialize(self); - DaemonPostInitialization(self); + LoadMyConfig(); - Types::TopicNotifyFunction F = [this](const std::string &Key, const std::string &Payload) { - this->BusMessageReceived(Key, Payload); - }; - KafkaManager()->RegisterTopicWatcher(KafkaTopics::SERVICE_EVENTS, F); + AllowExternalMicroServices_ = ConfigGetBool("allowexternalmicroservices", true); + + InitializeSubSystemServers(); + ServerApplication::initialize(self); + DaemonPostInitialization(self); + + Types::TopicNotifyFunction F = [this](const std::string &Key, const std::string &Payload) { + this->BusMessageReceived(Key, Payload); + }; + KafkaManager()->RegisterTopicWatcher(KafkaTopics::SERVICE_EVENTS, F); + } + + void MicroService::initialize([[maybe_unused]] Poco::Util::Application &self) { +#ifndef USE_MEDUSA_CLIENT + StartEverything(self); +#endif } void MicroService::uninitialize() { @@ -753,6 +769,8 @@ namespace OpenWifi { MicroServiceErrorHandler ErrorHandler(*this); Poco::ErrorHandler::set(&ErrorHandler); + Args_ = args; + if (!HelpRequested_) { SavePID(); @@ -768,11 +786,18 @@ namespace OpenWifi { poco_information(logger, "Starting as a daemon."); } +#ifdef USE_MEDUSA_CLIENT + MedusaClient::instance()->SetSubSystems(SubSystems_); + MedusaClient::instance()->Start(); + waitForTerminationRequest(); + MedusaClient::instance()->Stop(); +#else poco_information(logger, fmt::format("System ID set to {}", ID_)); StartSubSystemServers(); waitForTerminationRequest(); StopSubSystemServers(); logger.notice(fmt::format("Stopped {}...", DAEMON_APP_NAME)); +#endif } return Application::EXIT_OK; diff --git a/src/framework/MicroService.h b/src/framework/MicroService.h index 7290bbb..ccca8c8 100644 --- a/src/framework/MicroService.h +++ b/src/framework/MicroService.h @@ -55,9 +55,6 @@ namespace OpenWifi { #include "nlohmann/json.hpp" #include "ow_version.h" -#define _OWDEBUG_ std::cout << __FILE__ << ":" << __LINE__ << std::endl; -// #define _OWDEBUG_ Logger().debug(Poco::format("%s: %lu",__FILE__,__LINE__)); - namespace OpenWifi { class MicroService : public Poco::Util::ServerApplication { @@ -70,7 +67,6 @@ namespace OpenWifi { SubSystems_(std::move(Subsystems)), Logger_(Poco::Logger::get("FRAMEWORK")) { instance_ = this; RandomEngine_.seed(std::chrono::steady_clock::now().time_since_epoch().count()); - // Logger_ = Poco::Logger::root().get("BASE-SVC"); } inline static const char *ExtraConfigurationFilename = "/configuration_override.json"; @@ -92,7 +88,7 @@ namespace OpenWifi { inline uint64_t DaemonBusTimer() const { return DAEMON_BUS_TIMER; }; [[nodiscard]] const std::string &AppName() { return DAEMON_APP_NAME; } static inline uint64_t GetPID() { return Poco::Process::id(); }; - [[nodiscard]] inline const std::string GetPublicAPIEndPoint() { + [[nodiscard]] inline std::string GetPublicAPIEndPoint() const { return MyPublicEndPoint_ + "/api/v1"; }; [[nodiscard]] inline const std::string &GetUIURI() const { return UIURI_; }; @@ -107,7 +103,8 @@ namespace OpenWifi { } static MicroService &instance() { return *instance_; } - inline void Exit(int Reason); + inline void Exit(int Reason) { std::exit(Reason); } + void BusMessageReceived(const std::string &Key, const std::string &Payload); Types::MicroServiceMetaVec GetServices(const std::string &Type); Types::MicroServiceMetaVec GetServices(); @@ -115,6 +112,7 @@ namespace OpenWifi { void Reload(); void LoadMyConfig(); void initialize(Poco::Util::Application &self) override; + void StartEverything(Poco::Util::Application &self); void uninitialize() override; void reinitialize(Poco::Util::Application &self) override; void defineOptions(Poco::Util::OptionSet &options) override; @@ -132,7 +130,7 @@ namespace OpenWifi { void Reload(const std::string &Sub); Types::StringVec GetSubSystems() const; Types::StringPairVec GetLogLevels(); - const Types::StringVec &GetLogLevelNames(); + static const Types::StringVec &GetLogLevelNames(); uint64_t ConfigGetInt(const std::string &Key, uint64_t Default); uint64_t ConfigGetInt(const std::string &Key); uint64_t ConfigGetBool(const std::string &Key, bool Default); @@ -166,12 +164,16 @@ namespace OpenWifi { const std::string &FormatterPattern, const std::string &root_env_var); inline bool AllowExternalMicroServices() const { return AllowExternalMicroServices_; } + const ArgVec &Args() const { return Args_; } + + inline void SetConfigContent(const std::string &Content) { ConfigContent_ = Content; } private: static MicroService *instance_; bool HelpRequested_ = false; std::string LogDir_; std::string ConfigFileName_; + std::string ConfigContent_; uint64_t ID_ = 1; Poco::SharedPtr AppKey_; bool DebugMode_ = false; @@ -201,6 +203,7 @@ namespace OpenWifi { Poco::JWT::Signer Signer_; Poco::Logger &Logger_; Poco::ThreadPool TimerPool_{"timer:pool", 2, 32}; + ArgVec Args_; }; inline MicroService *MicroService::instance_ = nullptr; diff --git a/src/framework/UI_WebSocketClientServer.cpp b/src/framework/UI_WebSocketClientServer.cpp index 37c426f..eb5b0b7 100644 --- a/src/framework/UI_WebSocketClientServer.cpp +++ b/src/framework/UI_WebSocketClientServer.cpp @@ -58,11 +58,9 @@ namespace OpenWifi { void UI_WebSocketClientServer::run() { Running_ = true; while (Running_) { - Poco::Thread::trySleep(2000); - - if (!Running_) - break; - + if(!Poco::Thread::trySleep(2000)) { + break; + } std::lock_guard G(LocalMutex_); for (const auto i : ToBeRemoved_) { // std::cout << "Erasing old WS UI connection..." << std::endl; diff --git a/src/framework/ow_constants.h b/src/framework/ow_constants.h index ed4e246..7ef8424 100644 --- a/src/framework/ow_constants.h +++ b/src/framework/ow_constants.h @@ -565,6 +565,7 @@ namespace OpenWifi::RESTAPI::Protocol { static const char *TRANSFER = "transfer"; static const char *CERTUPDATE = "certupdate"; + static const char *POWERCYCLE = "powercycle"; static const char *RRM = "rrm"; static const char *REQUIREMENTS = "requirements"; @@ -687,6 +688,7 @@ namespace OpenWifi::uCentralProtocol { static const char *TRANSFER = "transfer"; static const char *CERTUPDATE = "certupdate"; + static const char *POWERCYCLE = "powercycle"; static const char *RRM = "rrm"; static const char *ACTIONS = "actions"; @@ -785,6 +787,7 @@ namespace OpenWifi::APCommands { rrm, certupdate, transfer, + powercycle, unknown }; @@ -799,7 +802,7 @@ namespace OpenWifi::APCommands { RESTAPI::Protocol::EVENTQUEUE, RESTAPI::Protocol::TELEMETRY, RESTAPI::Protocol::PING, RESTAPI::Protocol::SCRIPT, RESTAPI::Protocol::RRM, RESTAPI::Protocol::CERTUPDATE, - RESTAPI::Protocol::TRANSFER + RESTAPI::Protocol::TRANSFER, RESTAPI::Protocol::POWERCYCLE }; inline const char *to_string(Commands Cmd) { return uCentralAPCommands[(uint8_t)Cmd]; }