|
|
|
|
@@ -27,6 +27,11 @@ namespace OpenWifi {
|
|
|
|
|
inline uint64_t Now() { return std::time(nullptr); };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace OpenWifi::Utils {
|
|
|
|
|
std::vector<unsigned char> base64decode(const std::string& input);
|
|
|
|
|
std::string base64encode(const unsigned char *input, uint32_t size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using namespace std::chrono_literals;
|
|
|
|
|
|
|
|
|
|
#include "Poco/Util/Application.h"
|
|
|
|
|
@@ -238,6 +243,11 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
Obj.set(Field,Value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Poco::Data::BLOB &Value) {
|
|
|
|
|
auto Result = Utils::base64encode((const unsigned char *)Value.rawContent(),Value.size());
|
|
|
|
|
Obj.set(Field,Result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_to_json(Poco::JSON::Object &Obj, const char *Field, const Types::StringPairVec & S) {
|
|
|
|
|
Poco::JSON::Array Array;
|
|
|
|
|
for(const auto &i:S) {
|
|
|
|
|
@@ -334,12 +344,12 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, double & Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field))
|
|
|
|
|
Value = (double) Obj->get(Field);
|
|
|
|
|
Value = (double)Obj->get(Field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, float & Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field))
|
|
|
|
|
Value = (float) Obj->get(Field);
|
|
|
|
|
Value = (float)Obj->get(Field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, bool &Value) {
|
|
|
|
|
@@ -374,7 +384,14 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, uint64_t &Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field))
|
|
|
|
|
Value = (uint64_t ) Obj->get(Field);
|
|
|
|
|
Value = (uint64_t)Obj->get(Field);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, Poco::Data::BLOB &Value) {
|
|
|
|
|
if(Obj->has(Field) && !Obj->isNull(Field)) {
|
|
|
|
|
auto Result = Utils::base64decode(Obj->get(Field).toString());
|
|
|
|
|
Value.assignRaw((const unsigned char *)&Result[0],Result.size());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void field_from_json(const Poco::JSON::Object::Ptr &Obj, const char *Field, Types::StringPairVec &Vec) {
|
|
|
|
|
@@ -643,6 +660,27 @@ namespace OpenWifi::RESTAPI_utils {
|
|
|
|
|
|
|
|
|
|
namespace OpenWifi::Utils {
|
|
|
|
|
|
|
|
|
|
inline void SetThreadName(const char *name) {
|
|
|
|
|
#ifdef __linux__
|
|
|
|
|
Poco::Thread::current()->setName(name);
|
|
|
|
|
pthread_setname_np(pthread_self(), name);
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
|
Poco::Thread::current()->setName(name);
|
|
|
|
|
pthread_setname_np(name);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void SetThreadName(Poco::Thread &thr, const char *name) {
|
|
|
|
|
#ifdef __linux__
|
|
|
|
|
thr.setName(name);
|
|
|
|
|
pthread_setname_np(thr.tid(), name);
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef __APPLE__
|
|
|
|
|
thr.setName(name);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum MediaTypeEncodings {
|
|
|
|
|
PLAIN,
|
|
|
|
|
BINARY,
|
|
|
|
|
@@ -1316,7 +1354,7 @@ namespace OpenWifi {
|
|
|
|
|
inline void Start();
|
|
|
|
|
inline void Stop();
|
|
|
|
|
private:
|
|
|
|
|
std::atomic_bool Running_ = false;
|
|
|
|
|
mutable std::atomic_bool Running_ = false;
|
|
|
|
|
Poco::Thread Thread_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -1847,7 +1885,8 @@ namespace OpenWifi {
|
|
|
|
|
Request = &RequestIn;
|
|
|
|
|
Response = &ResponseIn;
|
|
|
|
|
|
|
|
|
|
Poco::Thread::current()->setName("WebServerThread_" + std::to_string(TransactionId_));
|
|
|
|
|
std::string th_name = "restsvr_" + std::to_string(TransactionId_);
|
|
|
|
|
Utils::SetThreadName(th_name.c_str());
|
|
|
|
|
|
|
|
|
|
if(Request->getContentLength()>0) {
|
|
|
|
|
if(Request->getContentType().find("application/json")!=std::string::npos) {
|
|
|
|
|
@@ -2042,6 +2081,17 @@ namespace OpenWifi {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline bool AssignIfPresent(const Poco::JSON::Object::Ptr &O, const std::string &Field, Poco::Data::BLOB &Value) {
|
|
|
|
|
if(O->has(Field)) {
|
|
|
|
|
std::string Content = O->get(Field).toString();
|
|
|
|
|
auto DecodedBlob = Utils::base64decode(Content);
|
|
|
|
|
Value.assignRaw((const unsigned char *)&DecodedBlob[0],DecodedBlob.size());
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T> bool AssignIfPresent(const Poco::JSON::Object::Ptr &O, const std::string &Field, const T &value, T & assignee) {
|
|
|
|
|
if(O->has(Field)) {
|
|
|
|
|
assignee = value;
|
|
|
|
|
@@ -2579,7 +2629,7 @@ namespace OpenWifi {
|
|
|
|
|
private:
|
|
|
|
|
std::recursive_mutex Mutex_;
|
|
|
|
|
Poco::Thread Worker_;
|
|
|
|
|
std::atomic_bool Running_=false;
|
|
|
|
|
mutable std::atomic_bool Running_=false;
|
|
|
|
|
Poco::NotificationQueue Queue_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@@ -2605,7 +2655,7 @@ namespace OpenWifi {
|
|
|
|
|
private:
|
|
|
|
|
std::recursive_mutex Mutex_;
|
|
|
|
|
Poco::Thread Worker_;
|
|
|
|
|
std::atomic_bool Running_=false;
|
|
|
|
|
mutable std::atomic_bool Running_=false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class KafkaDispatcher : public Poco::Runnable {
|
|
|
|
|
@@ -2662,6 +2712,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline void run() override {
|
|
|
|
|
Poco::AutoPtr<Poco::Notification> Note(Queue_.waitDequeueNotification());
|
|
|
|
|
Utils::SetThreadName("kafka-dispatch");
|
|
|
|
|
while(Note && Running_) {
|
|
|
|
|
auto Msg = dynamic_cast<KafkaMessage*>(Note.get());
|
|
|
|
|
if(Msg!= nullptr) {
|
|
|
|
|
@@ -2687,7 +2738,7 @@ namespace OpenWifi {
|
|
|
|
|
std::recursive_mutex Mutex_;
|
|
|
|
|
Types::NotifyTable Notifiers_;
|
|
|
|
|
Poco::Thread Worker_;
|
|
|
|
|
std::atomic_bool Running_=false;
|
|
|
|
|
mutable std::atomic_bool Running_=false;
|
|
|
|
|
uint64_t FunctionId_=1;
|
|
|
|
|
Poco::NotificationQueue Queue_;
|
|
|
|
|
};
|
|
|
|
|
@@ -2882,6 +2933,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
void handleRequest(Poco::Net::HTTPServerRequest& Request, Poco::Net::HTTPServerResponse& Response) override
|
|
|
|
|
{
|
|
|
|
|
Utils::SetThreadName("alb-request");
|
|
|
|
|
try {
|
|
|
|
|
if((id_ % 100) == 0) {
|
|
|
|
|
Logger_.debug(fmt::format("ALB-REQUEST({}): ALB Request {}.",
|
|
|
|
|
@@ -2950,7 +3002,7 @@ namespace OpenWifi {
|
|
|
|
|
std::unique_ptr<Poco::Net::HTTPServer> Server_;
|
|
|
|
|
std::unique_ptr<Poco::Net::ServerSocket> Socket_;
|
|
|
|
|
int Port_ = 0;
|
|
|
|
|
std::atomic_bool Running_=false;
|
|
|
|
|
mutable std::atomic_bool Running_=false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline auto ALBHealthCheckServer() { return ALBHealthCheckServer::instance(); }
|
|
|
|
|
@@ -2982,7 +3034,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *CallServer(const std::string &Path, uint64_t Id) {
|
|
|
|
|
RESTAPIHandler::BindingMap Bindings;
|
|
|
|
|
Poco::Thread::current()->setName(fmt::format("RESTAPI_ExtServer_{}",Id));
|
|
|
|
|
Utils::SetThreadName(fmt::format("rest_ext_{}",Id).c_str());
|
|
|
|
|
return RESTAPI_ExtRouter(Path, Bindings, Logger(), Server_, Id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3006,7 +3058,7 @@ namespace OpenWifi {
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *createRequestHandler(const Poco::Net::HTTPServerRequest &Request) override {
|
|
|
|
|
try {
|
|
|
|
|
Poco::URI uri(Request.getURI());
|
|
|
|
|
Poco::Thread::current()->setName(fmt::format("ExtWebServer_{}",TransactionId_));
|
|
|
|
|
Utils::SetThreadName(fmt::format("rest_ext_{}",TransactionId_).c_str());
|
|
|
|
|
return RESTAPI_ExtServer()->CallServer(uri.getPath(), TransactionId_++);
|
|
|
|
|
} catch (...) {
|
|
|
|
|
|
|
|
|
|
@@ -3115,7 +3167,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline Poco::Net::HTTPRequestHandler *CallServer(const std::string &Path, uint64_t Id) {
|
|
|
|
|
RESTAPIHandler::BindingMap Bindings;
|
|
|
|
|
Poco::Thread::current()->setName(fmt::format("RESTAPI_IntServer_{}",Id));
|
|
|
|
|
Utils::SetThreadName(fmt::format("rest_int_{}",Id).c_str());
|
|
|
|
|
return RESTAPI_IntRouter(Path, Bindings, Logger(), Server_, Id);
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
@@ -3524,7 +3576,9 @@ namespace OpenWifi {
|
|
|
|
|
void DaemonPostInitialization(Poco::Util::Application &self);
|
|
|
|
|
|
|
|
|
|
inline void MicroService::initialize(Poco::Util::Application &self) {
|
|
|
|
|
// add the default services
|
|
|
|
|
// Utils::SetThreadName("microservice");
|
|
|
|
|
|
|
|
|
|
// add the default services
|
|
|
|
|
LoadConfigurationFile();
|
|
|
|
|
InitializeLoggingSystem();
|
|
|
|
|
|
|
|
|
|
@@ -3919,6 +3973,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline int MicroService::main([[maybe_unused]] const ArgVec &args) {
|
|
|
|
|
|
|
|
|
|
// Utils::SetThreadName("main");
|
|
|
|
|
MyErrorHandler ErrorHandler(*this);
|
|
|
|
|
Poco::ErrorHandler::set(&ErrorHandler);
|
|
|
|
|
|
|
|
|
|
@@ -4034,6 +4089,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline void BusEventManager::run() {
|
|
|
|
|
Running_ = true;
|
|
|
|
|
Utils::SetThreadName("BusEventManager");
|
|
|
|
|
auto Msg = MicroService::instance().MakeSystemEventMessage(KafkaTopics::ServiceEvents::EVENT_JOIN);
|
|
|
|
|
KafkaManager()->PostMessage(KafkaTopics::SERVICE_EVENTS,MicroService::instance().PrivateEndPoint(),Msg, false);
|
|
|
|
|
while(Running_) {
|
|
|
|
|
@@ -4119,6 +4175,8 @@ namespace OpenWifi {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void KafkaProducer::run() {
|
|
|
|
|
|
|
|
|
|
Utils::SetThreadName("KafkaProducer");
|
|
|
|
|
cppkafka::Configuration Config({
|
|
|
|
|
{ "client.id", MicroService::instance().ConfigGetString("openwifi.kafka.client.id") },
|
|
|
|
|
{ "metadata.broker.list", MicroService::instance().ConfigGetString("openwifi.kafka.brokerlist") }
|
|
|
|
|
@@ -4157,6 +4215,8 @@ namespace OpenWifi {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void KafkaConsumer::run() {
|
|
|
|
|
Utils::SetThreadName("KafkaConsumer");
|
|
|
|
|
|
|
|
|
|
cppkafka::Configuration Config({
|
|
|
|
|
{ "client.id", MicroService::instance().ConfigGetString("openwifi.kafka.client.id") },
|
|
|
|
|
{ "metadata.broker.list", MicroService::instance().ConfigGetString("openwifi.kafka.brokerlist") },
|
|
|
|
|
@@ -4815,7 +4875,7 @@ namespace OpenWifi {
|
|
|
|
|
[[nodiscard]] bool SendToUser(const std::string &userName, const std::string &Payload);
|
|
|
|
|
void SendToAll(const std::string &Payload);
|
|
|
|
|
private:
|
|
|
|
|
std::atomic_bool Running_ = false;
|
|
|
|
|
mutable std::atomic_bool Running_ = false;
|
|
|
|
|
Poco::Thread Thr_;
|
|
|
|
|
// std::unique_ptr<MyParallelSocketReactor> ReactorPool_;
|
|
|
|
|
Poco::Net::SocketReactor Reactor_;
|
|
|
|
|
@@ -4912,6 +4972,7 @@ namespace OpenWifi {
|
|
|
|
|
|
|
|
|
|
inline void WebSocketClientServer::run() {
|
|
|
|
|
Running_ = true ;
|
|
|
|
|
Utils::SetThreadName("ws:clnt-svr");
|
|
|
|
|
while(Running_) {
|
|
|
|
|
Poco::Thread::trySleep(2000);
|
|
|
|
|
|
|
|
|
|
|