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/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]; }