]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/configuration/sgconfig/configproto.cpp
Add an option to opt-out Firebird store.
[stg.git] / projects / stargazer / plugins / configuration / sgconfig / configproto.cpp
index d9f87eca5884786abaffca61a9c5ef621cdb05b8..5c176f4568fd6fc5cb76f04dd2518b43d598390f 100644 (file)
@@ -19,6 +19,7 @@
  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
  */
 
+#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"
 
 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<STG::Conn *>::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<STG::Conn *>::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<STG::Conn *>::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<STG::Conn *>(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<STG::Conn *>::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<sockaddr *>(&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());
-}
-*/