]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/authorization/stress/stress.cpp
New signal handling infrastructure. Prevent unloading running module.
[stg.git] / projects / stargazer / plugins / authorization / stress / stress.cpp
index d0d86d02ba0fd162dcb3fdef6410e20c9549bd0c..7273ed483479ede97445007aec28e41836a75f1e 100644 (file)
 
 #include <stdio.h>
 #include <unistd.h>
-#include <signal.h>
 
-#include "stress.h"
-#include "../../../user.h"
+#include <csignal>
+#include <algorithm>
 
-class STRESS_CREATOR
-{
-private:
-    AUTH_STRESS * dc;
+#include "stg/user.h"
+#include "stg/common.h"
+#include "stg/user_property.h"
+#include "stg/plugin_creator.h"
 
-public:
-    STRESS_CREATOR()
-        {
-        printfd(__FILE__, "constructor STRESS_CREATOR\n");
-        dc = new AUTH_STRESS();
-        };
-    ~STRESS_CREATOR()
-        {
-        printfd(__FILE__, "destructor STRESS_CREATOR\n");
-        delete dc;
-        };
+#include "stress.h"
 
-    BASE_PLUGIN * GetPlugin()
-    {
-        return dc;
-    };
-};
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-STRESS_CREATOR stressc;
+PLUGIN_CREATOR<AUTH_STRESS> stressc;
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 // ëÌÁÓÓ ÄÌÑ ÐÏÉÓËÁ ÀÚÅÒÁ × ÓÐÉÓËÅ ÎÏÔÉÆÉËÁÔÏÒÏ×
 template <typename varType>
-class IS_CONTAINS_USER: public binary_function<varType, user_iter, bool>
+class IS_CONTAINS_USER: public binary_function<varType, USER_PTR, bool>
 {
 public:
-    bool operator()(varType notifier, user_iter user) const
+    bool operator()(varType notifier, USER_PTR user) const
         {
         return notifier.GetUser() == user;
         };
@@ -73,7 +57,7 @@ public:
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
-BASE_PLUGIN * GetPlugin()
+PLUGIN * GetPlugin()
 {
 //printf("BASE_CAPTURER * GetCapturer()\n");
 return stressc.GetPlugin();
@@ -86,21 +70,6 @@ AUTH_STRESS_SETTINGS::AUTH_STRESS_SETTINGS()
 {
 }
 //-----------------------------------------------------------------------------
-int AUTH_STRESS_SETTINGS::ParseIntInRange(const string & str, int min, int max, int * val)
-{
-if (str2x(str.c_str(), *val))
-    {
-    errorStr = "Incorrect value \'" + str + "\'.";
-    return -1;
-    }
-if (*val < min || *val > max)
-    {
-    errorStr = "Value \'" + str + "\' out of range.";
-    return -1;
-    }
-return 0;
-}
-//-----------------------------------------------------------------------------
 int AUTH_STRESS_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
 {
 PARAM_VALUE pv;
@@ -169,7 +138,7 @@ int AUTH_STRESS::Start()
 GetUsers();
 nonstop = true;
 
-list<user_iter>::iterator users_iter;
+list<USER_PTR>::iterator users_iter;
 
 onAddUserNotifier.SetAuthorizator(this);
 onDelUserNotifier.SetAuthorizator(this);
@@ -207,7 +176,8 @@ if (isRunning)
         {
         if (!isRunning)
             break;
-        stgUsleep(200000);
+        struct timespec ts = {0, 200000000};
+        nanosleep(&ts, NULL);
         }
 
     //after 5 seconds waiting thread still running. now killing it
@@ -243,7 +213,7 @@ uint16_t AUTH_STRESS::GetStopPosition() const
 return 70;
 }
 //-----------------------------------------------------------------------------
-void AUTH_STRESS::SetUserNotifiers(user_iter u)
+void AUTH_STRESS::SetUserNotifiers(USER_PTR u)
 {
 // ---------- IP -------------------
 CHG_BEFORE_NOTIFIER<USER_IPS> BeforeChgIPNotifier;
@@ -257,12 +227,12 @@ AfterChgIPNotifier.SetAuthorizator(this);
 AfterChgIPNotifier.SetUser(u);
 AfterChgIPNotifierList.push_front(AfterChgIPNotifier);
 
-u->property.ips.AddBeforeNotifier(&(*BeforeChgIPNotifierList.begin()));
-u->property.ips.AddAfterNotifier(&(*AfterChgIPNotifierList.begin()));
+u->GetProperty().ips.AddBeforeNotifier(&(*BeforeChgIPNotifierList.begin()));
+u->GetProperty().ips.AddAfterNotifier(&(*AfterChgIPNotifierList.begin()));
 // ---------- IP end ---------------
 }
 //-----------------------------------------------------------------------------
-void AUTH_STRESS::UnSetUserNotifiers(user_iter u)
+void AUTH_STRESS::UnSetUserNotifiers(USER_PTR u)
 {
 // ---          IP              ---
 IS_CONTAINS_USER<CHG_BEFORE_NOTIFIER<USER_IPS> > IsContainsUserIPB;
@@ -277,7 +247,7 @@ ipBIter = find_if(BeforeChgIPNotifierList.begin(),
 
 if (ipBIter != BeforeChgIPNotifierList.end())
     {
-    ipBIter->GetUser()->property.ips.DelBeforeNotifier(&(*ipBIter));
+    ipBIter->GetUser()->GetProperty().ips.DelBeforeNotifier(&(*ipBIter));
     BeforeChgIPNotifierList.erase(ipBIter);
     }
 
@@ -287,7 +257,7 @@ ipAIter = find_if(AfterChgIPNotifierList.begin(),
 
 if (ipAIter != AfterChgIPNotifierList.end())
     {
-    ipAIter->GetUser()->property.ips.DelAfterNotifier(&(*ipAIter));
+    ipAIter->GetUser()->GetProperty().ips.DelAfterNotifier(&(*ipAIter));
     AfterChgIPNotifierList.erase(ipAIter);
     }
 // ---          IP end          ---
@@ -295,7 +265,7 @@ if (ipAIter != AfterChgIPNotifierList.end())
 //-----------------------------------------------------------------------------
 void AUTH_STRESS::GetUsers()
 {
-user_iter u;
+USER_PTR u;
 printfd(__FILE__, "users->OpenSearch() usernum=%d\n", users->GetUserNum());
 int h = users->OpenSearch();
 if (!h)
@@ -317,7 +287,7 @@ while (1)
 users->CloseSearch(h);
 }
 //-----------------------------------------------------------------------------
-void AUTH_STRESS::Unauthorize(user_iter u) const
+void AUTH_STRESS::Unauthorize(USER_PTR u) const
 {
 if (!u->IsAuthorizedBy(this))
     return;
@@ -326,31 +296,31 @@ printfd(__FILE__, "Unauthorized user %s\n", u->GetLogin().c_str());
 u->Unauthorize(this);
 }
 //-----------------------------------------------------------------------------
-void AUTH_STRESS::Authorize(user_iter u) const
+void AUTH_STRESS::Authorize(USER_PTR u) const
 {
-USER_IPS ips = u->property.ips;
+USER_IPS ips = u->GetProperty().ips;
 if (ips.OnlyOneIP() && !u->IsAuthorizedBy(this))
     {
-    if (u->Authorize(ips[0].ip, "", 0xFFffFFff, this) == 0)
+    if (u->Authorize(ips[0].ip, 0xFFffFFff, this) == 0)
         {
         printfd(__FILE__, "Authorized user %s\n", u->GetLogin().c_str());
         }
     }
 }
 //-----------------------------------------------------------------------------
-void AUTH_STRESS::AddUser(user_iter u)
+void AUTH_STRESS::AddUser(USER_PTR u)
 {
 //printfd(__FILE__, "User added to list %s\n", u->GetLogin().c_str());
 SetUserNotifiers(u);
 usersList.push_back(u);
 }
 //-----------------------------------------------------------------------------
-void AUTH_STRESS::DelUser(user_iter u)
+void AUTH_STRESS::DelUser(USER_PTR u)
 {
 Unauthorize(u);
 UnSetUserNotifiers(u);
 
-list<user_iter>::iterator users_iter;
+list<USER_PTR>::iterator users_iter;
 users_iter = usersList.begin();
 
 while (users_iter != usersList.end())
@@ -365,7 +335,7 @@ while (users_iter != usersList.end())
     }
 }
 //-----------------------------------------------------------------------------
-int AUTH_STRESS::SendMessage(const STG_MSG & msg, uint32_t ip) const
+int AUTH_STRESS::SendMessage(const STG_MSG &, uint32_t) const
 {
 errorStr = "Authorization modele \'AUTH_STRESS\' does not support sending messages";
 return -1;
@@ -380,21 +350,21 @@ ia->isRunning = true;
 
 while (ia->nonstop)
     {
-    printfd(__FILE__, "AUTH_STRESS::Run\n");
+    printfd(__FILE__, "AUTH_STRESS::Run - averageTime: %d\n", random() % (2*ia->stressSettings.GetAverageOnlineTime()));
 
-    list<user_iter>::iterator users_iter;
+    list<USER_PTR>::iterator users_iter;
     users_iter = ia->usersList.begin();
     while (users_iter != ia->usersList.end())
         {
-        if (random() % 2*ia->stressSettings.GetAverageOnlineTime() == 1)
+        if (random() % (2*ia->stressSettings.GetAverageOnlineTime()) == 1)
             {
             ia->Authorize(*users_iter);
-            printfd(__FILE__, "AUTH_STRESS::Authorize\n");
+            printfd(__FILE__, "AUTH_STRESS::Authorize - user: '%s'\n", (*users_iter)->GetLogin().c_str());
             }
-        if (random() % 2*ia->stressSettings.GetAverageOnlineTime() == 2)
+        if (random() % (2*ia->stressSettings.GetAverageOnlineTime()) == 2)
             {
             ia->Unauthorize(*users_iter);
-            printfd(__FILE__, "AUTH_STRESS::Unauthorize\n");
+            printfd(__FILE__, "AUTH_STRESS::Unauthorize - user: '%s'\n", (*users_iter)->GetLogin().c_str());
             }
 
         users_iter++;
@@ -406,17 +376,16 @@ while (ia->nonstop)
 ia->isRunning = false;
 return NULL;
 }
-
 //-----------------------------------------------------------------------------
 template <typename varParamType>
-void CHG_BEFORE_NOTIFIER<varParamType>::Notify(const varParamType & oldValue, const varParamType & newValue)
+void CHG_BEFORE_NOTIFIER<varParamType>::Notify(const varParamType &, const varParamType &)
 {
 auth->Unauthorize(user);
 }
 //-----------------------------------------------------------------------------
 template <typename varParamType>
-void CHG_AFTER_NOTIFIER<varParamType>::Notify(const varParamType & oldValue, const varParamType & newValue)
+void CHG_AFTER_NOTIFIER<varParamType>::Notify(const varParamType &, const varParamType &)
 {
-auth->Unauthorize(user);
+auth->Authorize(user);
 }
 //-----------------------------------------------------------------------------