X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/899b65fa18e88f77d584d79f71592a2b51a632c2..1cb912e4f90473f78d2f0f10ab5c9b2c5bd36440:/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp diff --git a/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp b/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp index d9f87eca..5c176f45 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp @@ -19,6 +19,7 @@ * Author : Maxim Mamontov */ +#include "configproto.h" #include "conn.h" @@ -26,6 +27,7 @@ #include "parser_admins.h" #include "parser_tariffs.h" #include "parser_users.h" +#include "parser_services.h" #include "parser_message.h" #include "parser_user_info.h" #include "parser_auth_by.h" @@ -48,14 +50,16 @@ namespace SP = STG::PARSER; -CONFIGPROTO::CONFIGPROTO(PLUGIN_LOGGER & l) +CONFIGPROTO::CONFIGPROTO(STG::PluginLogger & l) : m_settings(NULL), m_admins(NULL), m_tariffs(NULL), m_users(NULL), + m_services(NULL), + m_corporations(NULL), + m_store(NULL), m_port(0), m_bindAddress("0.0.0.0"), - m_running(false), m_stopped(true), m_logger(l), m_listenSocket(-1) @@ -64,9 +68,16 @@ CONFIGPROTO::CONFIGPROTO(PLUGIN_LOGGER & l) CONFIGPROTO::~CONFIGPROTO() { + { std::deque::iterator it; for (it = m_conns.begin(); it != m_conns.end(); ++it) delete *it; + } + { + BASE_PARSER::REGISTRY::iterator it; + for (it = m_registry.begin(); it != m_registry.end(); ++it) + delete it->second; + } } int CONFIGPROTO::Prepare() @@ -78,7 +89,6 @@ int CONFIGPROTO::Prepare() sigaddset(&sigmask, SIGUSR1); sigaddset(&sigmask, SIGHUP); pthread_sigmask(SIG_BLOCK, &sigmask, &oldmask); - m_listenSocket = socket(PF_INET, SOCK_STREAM, 0); if (m_listenSocket < 0) @@ -109,14 +119,12 @@ int CONFIGPROTO::Prepare() RegisterParsers(); - m_running = true; m_stopped = false; return 0; } int CONFIGPROTO::Stop() { - m_running = false; for (int i = 0; i < 5 && !m_stopped; ++i) { struct timespec ts = {0, 200000000}; @@ -135,9 +143,9 @@ int CONFIGPROTO::Stop() return 0; } -void CONFIGPROTO::Run() +void CONFIGPROTO::Run(std::stop_token token) { - while (m_running) + while (!token.stop_requested()) { fd_set fds; @@ -155,13 +163,10 @@ void CONFIGPROTO::Run() m_logger(m_errorStr); break; } - if (!m_running) + if (token.stop_requested()) break; if (res > 0) - { - printfd(__FILE__, "Something happend - received %d events.\n", res); HandleEvents(fds); - } CleanupConns(); } @@ -209,6 +214,8 @@ void CONFIGPROTO::RegisterParsers() assert(m_admins != NULL); assert(m_users != NULL); assert(m_tariffs != NULL); + assert(m_services != NULL); + assert(m_corporations != NULL); SP::GET_SERVER_INFO::FACTORY::Register(m_registry, *m_settings, *m_users, *m_tariffs); @@ -229,6 +236,12 @@ void CONFIGPROTO::RegisterParsers() SP::CHG_USER::FACTORY::Register(m_registry, *m_users, *m_store, *m_tariffs); SP::CHECK_USER::FACTORY::Register(m_registry, *m_users); + SP::GET_SERVICES::FACTORY::Register(m_registry, *m_services); + SP::GET_SERVICE::FACTORY::Register(m_registry, *m_services); + SP::ADD_SERVICE::FACTORY::Register(m_registry, *m_services); + SP::DEL_SERVICE::FACTORY::Register(m_registry, *m_services); + SP::CHG_SERVICE::FACTORY::Register(m_registry, *m_services); + SP::SEND_MESSAGE::FACTORY::Register(m_registry, *m_users); SP::AUTH_BY::FACTORY::Register(m_registry, *m_users); @@ -248,7 +261,6 @@ int CONFIGPROTO::MaxFD() const void CONFIGPROTO::BuildFDSet(fd_set & fds) const { - printfd(__FILE__, "Building fd set for %d connections.\n", m_conns.size()); FD_ZERO(&fds); FD_SET(m_listenSocket, &fds); std::deque::const_iterator it; @@ -258,8 +270,6 @@ void CONFIGPROTO::BuildFDSet(fd_set & fds) const void CONFIGPROTO::CleanupConns() { - size_t old = m_conns.size(); - std::deque::iterator pos; for (pos = m_conns.begin(); pos != m_conns.end(); ++pos) if (((*pos)->IsDone() && !(*pos)->IsKeepAlive()) || !(*pos)->IsOk()) @@ -270,9 +280,6 @@ void CONFIGPROTO::CleanupConns() pos = std::remove(m_conns.begin(), m_conns.end(), static_cast(NULL)); m_conns.erase(pos, m_conns.end()); - - if (m_conns.size() < old) - printfd(__FILE__, "Cleaned up %d connections.\n", old - m_conns.size()); } void CONFIGPROTO::HandleEvents(const fd_set & fds) @@ -284,17 +291,12 @@ void CONFIGPROTO::HandleEvents(const fd_set & fds) std::deque::iterator it; for (it = m_conns.begin(); it != m_conns.end(); ++it) if (FD_ISSET((*it)->Sock(), &fds)) - { - printfd(__FILE__, "Reading data from %s:%d.\n", inet_ntostring((*it)->IP()).c_str(), (*it)->Port()); (*it)->Read(); - } } } void CONFIGPROTO::AcceptConnection() { - printfd(__FILE__, "Accepting new connection.\n"); - struct sockaddr_in outerAddr; socklen_t outerAddrLen(sizeof(outerAddr)); int sock = accept(m_listenSocket, reinterpret_cast(&outerAddr), &outerAddrLen); @@ -311,7 +313,7 @@ void CONFIGPROTO::AcceptConnection() try { - m_conns.push_back(new STG::Conn(m_registry, *m_admins, sock, outerAddr)); + m_conns.push_back(new STG::Conn(m_registry, *m_admins, sock, outerAddr, m_logger)); printfd(__FILE__, "New connection from %s:%d. Total connections: %d\n", inet_ntostring(m_conns.back()->IP()).c_str(), m_conns.back()->Port(), m_conns.size()); } catch (const STG::Conn::Error & error) @@ -320,9 +322,3 @@ void CONFIGPROTO::AcceptConnection() m_logger(std::string("Failed to create new client connection: '") + error.what() + "'."); } } -/* -void CONFIGPROTO::WriteLogAccessFailed(uint32_t ip) -{ - m_logger("Admin's connection failed. IP %s", inet_ntostring(ip).c_str()); -} -*/