From abd575e7ae51fd1462c8d4fe0229ed81ce8a564d Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sat, 1 Dec 2012 21:08:24 +0200 Subject: [PATCH 1/1] Use "connected" subscription for detecting connection and disconnection. --- .../plugins/other/rscript/rscript.cpp | 95 +++++++----- .../stargazer/plugins/other/rscript/rscript.h | 141 +++++++++--------- 2 files changed, 127 insertions(+), 109 deletions(-) diff --git a/projects/stargazer/plugins/other/rscript/rscript.cpp b/projects/stargazer/plugins/other/rscript/rscript.cpp index f7479da6..ebe2556d 100644 --- a/projects/stargazer/plugins/other/rscript/rscript.cpp +++ b/projects/stargazer/plugins/other/rscript/rscript.cpp @@ -19,12 +19,6 @@ * Author : Maxim Mamontov */ -/* - $Revision: 1.33 $ - $Date: 2010/04/16 12:30:37 $ - $Author: faust $ -*/ - #include #include @@ -36,6 +30,7 @@ #include "stg/common.h" #include "stg/locker.h" +#include "stg/users.h" #include "stg/user_property.h" #include "stg/plugin_creator.h" #include "stg/logger.h" @@ -47,6 +42,8 @@ extern volatile const time_t stgTime; #define RS_MAX_ROUTERS (100) +using RS::REMOTE_SCRIPT; + //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -61,16 +58,35 @@ return rsc.GetPlugin(); //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -RS_USER & RS_USER::operator=(const RS_USER & rvalue) +RS::USER::USER(const std::vector & r, USER_PTR it, REMOTE_SCRIPT & rs) + : lastSentTime(0), + user(it), + routers(r), + shortPacketsCount(0), + ip(user->GetCurrIP()), + notifier(rs, *this) +{ + user->AddConnectedAfterNotifier(¬ifier); +} +//----------------------------------------------------------------------------- +RS::USER::USER(const RS::USER & rhs) + : lastSentTime(rhs.lastSentTime), + user(rhs.user), + routers(rhs.routers), + shortPacketsCount(rhs.shortPacketsCount), + ip(rhs.ip), + notifier(rhs.notifier) +{ + user->DelConnectedAfterNotifier(&rhs.notifier); + user->AddConnectedAfterNotifier(¬ifier); +} +//----------------------------------------------------------------------------- +RS::USER::~USER() { -lastSentTime = rvalue.lastSentTime; -user = rvalue.user; -routers = rvalue.routers; -shortPacketsCount = rvalue.shortPacketsCount; -return *this; + user->DelConnectedAfterNotifier(¬ifier); } //----------------------------------------------------------------------------- -RS_SETTINGS::RS_SETTINGS() +RS::SETTINGS::SETTINGS() : sendPeriod(0), port(0), errorStr(), @@ -81,7 +97,7 @@ RS_SETTINGS::RS_SETTINGS() { } //----------------------------------------------------------------------------- -int RS_SETTINGS::ParseSettings(const MODULE_SETTINGS & s) +int RS::SETTINGS::ParseSettings(const MODULE_SETTINGS & s) { int p; PARAM_VALUE pv; @@ -168,7 +184,7 @@ return 0; //----------------------------------------------------------------------------- REMOTE_SCRIPT::REMOTE_SCRIPT() : ctx(), - afterChgIPNotifierList(), + ipNotifierList(), authorizedUsers(), errorStr(), rsSettings(), @@ -232,9 +248,6 @@ netRouters = rsSettings.GetSubnetsMap(); InitEncrypt(&ctx, rsSettings.GetPassword()); -//onAddUserNotifier.SetRemoteScript(this); -//onDelUserNotifier.SetRemoteScript(this); - users->AddNotifierUserAdd(&onAddUserNotifier); users->AddNotifierUserDel(&onDelUserNotifier); @@ -353,11 +366,10 @@ void REMOTE_SCRIPT::PeriodicSend() { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -map::iterator it(authorizedUsers.begin()); +map::iterator it(authorizedUsers.begin()); while (it != authorizedUsers.end()) { if (difftime(stgTime, it->second.lastSentTime) - (rand() % halfPeriod) > sendPeriod) - //if (stgTime - it->second.lastSentTime > sendPeriod) { Send(it->first, it->second); } @@ -366,12 +378,12 @@ while (it != authorizedUsers.end()) } //----------------------------------------------------------------------------- #ifdef NDEBUG -bool REMOTE_SCRIPT::PreparePacket(char * buf, size_t, uint32_t ip, RS_USER & rsu, bool forceDisconnect) const +bool REMOTE_SCRIPT::PreparePacket(char * buf, size_t, uint32_t ip, RS::USER & rsu, bool forceDisconnect) const #else -bool REMOTE_SCRIPT::PreparePacket(char * buf, size_t bufSize, uint32_t ip, RS_USER & rsu, bool forceDisconnect) const +bool REMOTE_SCRIPT::PreparePacket(char * buf, size_t bufSize, uint32_t ip, RS::USER & rsu, bool forceDisconnect) const #endif { -RS_PACKET_HEADER packetHead; +RS::PACKET_HEADER packetHead; memset(packetHead.padding, 0, sizeof(packetHead.padding)); strcpy((char*)packetHead.magic, RS_ID); @@ -409,7 +421,7 @@ if (packetHead.packetType == RS_ALIVE_PACKET) return false; } -RS_PACKET_TAIL packetTail; +RS::PACKET_TAIL packetTail; memset(packetTail.padding, 0, sizeof(packetTail.padding)); strcpy((char*)packetTail.magic, RS_ID); @@ -434,7 +446,7 @@ Encrypt(&ctx, buf + sizeof(packetHead), (char *)&packetTail, sizeof(packetTail) return false; } //----------------------------------------------------------------------------- -bool REMOTE_SCRIPT::Send(uint32_t ip, RS_USER & rsu, bool forceDisconnect) const +bool REMOTE_SCRIPT::Send(uint32_t ip, RS::USER & rsu, bool forceDisconnect) const { char buffer[RS_MAX_PACKET_LEN]; @@ -455,7 +467,7 @@ std::for_each( return false; } //----------------------------------------------------------------------------- -bool REMOTE_SCRIPT::SendDirect(uint32_t ip, RS_USER & rsu, uint32_t routerIP, bool forceDisconnect) const +bool REMOTE_SCRIPT::SendDirect(uint32_t ip, RS::USER & rsu, uint32_t routerIP, bool forceDisconnect) const { char buffer[RS_MAX_PACKET_LEN]; @@ -504,16 +516,16 @@ void REMOTE_SCRIPT::ChangedIP(USER_PTR u, uint32_t oldIP, uint32_t newIP) */ if (newIP) { - RS_USER rsu(IP2Routers(newIP), u); + RS::USER rsu(IP2Routers(newIP), u, *this); Send(newIP, rsu); STG_LOCKER lock(&mutex, __FILE__, __LINE__); - authorizedUsers[newIP] = rsu; + authorizedUsers.insert(std::make_pair(newIP, rsu)); } else { STG_LOCKER lock(&mutex, __FILE__, __LINE__); - const map::iterator it( + const map::iterator it( authorizedUsers.find(oldIP) ); if (it != authorizedUsers.end()) @@ -619,19 +631,17 @@ return value; //----------------------------------------------------------------------------- void REMOTE_SCRIPT::SetUserNotifier(USER_PTR u) { -RS_CHG_AFTER_NOTIFIER afterChgIPNotifier(*this, u); - -afterChgIPNotifierList.push_front(afterChgIPNotifier); +ipNotifierList.push_front(RS::IP_NOTIFIER(*this, u)); -u->AddCurrIPAfterNotifier(&(*afterChgIPNotifierList.begin())); +u->AddCurrIPAfterNotifier(&(*ipNotifierList.begin())); } //----------------------------------------------------------------------------- void REMOTE_SCRIPT::UnSetUserNotifier(USER_PTR u) { -list >::iterator ipAIter; -std::list >::iterator> toErase; +list::iterator ipAIter; +std::list::iterator> toErase; -for (ipAIter = afterChgIPNotifierList.begin(); ipAIter != afterChgIPNotifierList.end(); ++ipAIter) +for (ipAIter = ipNotifierList.begin(); ipAIter != ipNotifierList.end(); ++ipAIter) { if (ipAIter->GetUser() == u) { @@ -640,20 +650,25 @@ for (ipAIter = afterChgIPNotifierList.begin(); ipAIter != afterChgIPNotifierList } } -std::list >::iterator>::iterator eIter; +std::list::iterator>::iterator eIter; for (eIter = toErase.begin(); eIter != toErase.end(); ++eIter) { - afterChgIPNotifierList.erase(*eIter); + ipNotifierList.erase(*eIter); } } //----------------------------------------------------------------------------- -template -void RS_CHG_AFTER_NOTIFIER::Notify(const varParamType & oldValue, const varParamType & newValue) +void RS::IP_NOTIFIER::Notify(const uint32_t & oldValue, const uint32_t & newValue) { rs.ChangedIP(user, oldValue, newValue); } //----------------------------------------------------------------------------- +void RS::CONNECTED_NOTIFIER::Notify(const bool & /*oldValue*/, const bool & newValue) +{ +if (!newValue) + rs.Send(user.ip, user, true); +} +//----------------------------------------------------------------------------- void REMOTE_SCRIPT::InitEncrypt(BLOWFISH_CTX * ctx, const string & password) const { unsigned char keyL[PASSWD_LEN]; // Пароль для шифровки diff --git a/projects/stargazer/plugins/other/rscript/rscript.h b/projects/stargazer/plugins/other/rscript/rscript.h index 6ee10c82..001d65e1 100644 --- a/projects/stargazer/plugins/other/rscript/rscript.h +++ b/projects/stargazer/plugins/other/rscript/rscript.h @@ -19,18 +19,11 @@ * Author : Maxim Mamontov */ -/* - $Revision: 1.16 $ - $Date: 2010/09/10 06:43:59 $ - $Author: faust $ -*/ - #ifndef RSCRIPT_H #define RSCRIPT_H #include -#include #include #include #include @@ -38,16 +31,14 @@ #include #include "stg/plugin.h" -#include "stg/store.h" #include "stg/module_settings.h" #include "stg/os_int.h" #include "stg/notifer.h" -#include "stg/user_ips.h" #include "stg/user.h" -#include "stg/users.h" #include "stg/blowfish.h" #include "stg/rs_packets.h" #include "stg/logger.h" + #include "nrmap_parser.h" extern "C" PLUGIN * GetPlugin(); @@ -56,86 +47,95 @@ extern "C" PLUGIN * GetPlugin(); #define MAX_SHORT_PCKT (3) -class REMOTE_SCRIPT; class SETTINGS; +class USERS; + +namespace RS +{ + +class REMOTE_SCRIPT; +class UpdateRouter; +class DisconnectUser; + //----------------------------------------------------------------------------- -class RS_ADD_USER_NONIFIER: public NOTIFIER_BASE { +class ADD_USER_NONIFIER: public NOTIFIER_BASE { public: - RS_ADD_USER_NONIFIER(REMOTE_SCRIPT & r) + ADD_USER_NONIFIER(REMOTE_SCRIPT & r) : NOTIFIER_BASE(), rs(r) {} - virtual ~RS_ADD_USER_NONIFIER() {} + virtual ~ADD_USER_NONIFIER() {} void Notify(const USER_PTR & user); private: - RS_ADD_USER_NONIFIER(const RS_ADD_USER_NONIFIER & rvalue); - RS_ADD_USER_NONIFIER & operator=(const RS_ADD_USER_NONIFIER); + ADD_USER_NONIFIER(const ADD_USER_NONIFIER & rhs); + ADD_USER_NONIFIER & operator=(const ADD_USER_NONIFIER); REMOTE_SCRIPT & rs; }; //----------------------------------------------------------------------------- -class RS_DEL_USER_NONIFIER: public NOTIFIER_BASE { +class DEL_USER_NONIFIER: public NOTIFIER_BASE { public: - RS_DEL_USER_NONIFIER(REMOTE_SCRIPT & r) + DEL_USER_NONIFIER(REMOTE_SCRIPT & r) : NOTIFIER_BASE(), rs(r) {} - virtual ~RS_DEL_USER_NONIFIER() {} + virtual ~DEL_USER_NONIFIER() {} void Notify(const USER_PTR & user); private: - RS_DEL_USER_NONIFIER(const RS_DEL_USER_NONIFIER & rvalue); - RS_DEL_USER_NONIFIER & operator=(const RS_DEL_USER_NONIFIER); + DEL_USER_NONIFIER(const DEL_USER_NONIFIER & rhs); + DEL_USER_NONIFIER & operator=(const DEL_USER_NONIFIER); REMOTE_SCRIPT & rs; }; //----------------------------------------------------------------------------- -template -class RS_CHG_AFTER_NOTIFIER: public PROPERTY_NOTIFIER_BASE { +class IP_NOTIFIER: public PROPERTY_NOTIFIER_BASE { public: - RS_CHG_AFTER_NOTIFIER(REMOTE_SCRIPT & r, USER_PTR u) - : PROPERTY_NOTIFIER_BASE(), user(u), rs(r) {} - RS_CHG_AFTER_NOTIFIER(const RS_CHG_AFTER_NOTIFIER & rvalue) - : PROPERTY_NOTIFIER_BASE(), user(rvalue.user), rs(rvalue.rs) {} - void Notify(const T & oldValue, const T & newValue); + IP_NOTIFIER(REMOTE_SCRIPT & r, USER_PTR u) + : PROPERTY_NOTIFIER_BASE(), user(u), rs(r) {} + IP_NOTIFIER(const IP_NOTIFIER & rhs) + : PROPERTY_NOTIFIER_BASE(), user(rhs.user), rs(rhs.rs) {} + void Notify(const uint32_t & oldValue, const uint32_t & newValue); USER_PTR GetUser() { return user; } private: - RS_CHG_AFTER_NOTIFIER & operator=(const RS_CHG_AFTER_NOTIFIER & rvalue); + IP_NOTIFIER & operator=(const IP_NOTIFIER & rhs); USER_PTR user; REMOTE_SCRIPT & rs; }; //----------------------------------------------------------------------------- -struct RS_USER { - RS_USER() - : lastSentTime(0), - user(NULL), - routers(), - shortPacketsCount(0) - {} - RS_USER(const std::vector & r, USER_PTR it) - : lastSentTime(0), - user(it), - routers(r), - shortPacketsCount(0) - {} - RS_USER(const RS_USER & rvalue) - : lastSentTime(rvalue.lastSentTime), - user(rvalue.user), - routers(rvalue.routers), - shortPacketsCount(rvalue.shortPacketsCount) - {} - - RS_USER & operator=(const RS_USER & rvalue); +class USER; +//----------------------------------------------------------------------------- +class CONNECTED_NOTIFIER: public PROPERTY_NOTIFIER_BASE { +public: + CONNECTED_NOTIFIER(REMOTE_SCRIPT & r, USER & u) + : PROPERTY_NOTIFIER_BASE(), user(u), rs(r) {} + CONNECTED_NOTIFIER(const CONNECTED_NOTIFIER & rhs) + : PROPERTY_NOTIFIER_BASE(), user(rhs.user), rs(rhs.rs) {} + void Notify(const bool & oldValue, const bool & newValue); + +private: + CONNECTED_NOTIFIER & operator=(const CONNECTED_NOTIFIER & rhs); + + USER & user; + REMOTE_SCRIPT & rs; +}; +//----------------------------------------------------------------------------- +struct USER { + USER(const std::vector & r, USER_PTR it, REMOTE_SCRIPT & rs); + USER(const USER & rhs); + ~USER(); time_t lastSentTime; USER_PTR user; std::vector routers; int shortPacketsCount; + uint32_t ip; + CONNECTED_NOTIFIER notifier; }; //----------------------------------------------------------------------------- -class RS_SETTINGS { +class SETTINGS { public: - RS_SETTINGS(); - virtual ~RS_SETTINGS() {} + SETTINGS(); + virtual ~SETTINGS() {} const std::string & GetStrError() const { return errorStr; } int ParseSettings(const MODULE_SETTINGS & s); int GetSendPeriod() const { return sendPeriod; } @@ -180,16 +180,16 @@ public: void ChangedIP(USER_PTR u, uint32_t oldIP, uint32_t newIP); private: - REMOTE_SCRIPT(const REMOTE_SCRIPT & rvalue); - REMOTE_SCRIPT & operator=(const REMOTE_SCRIPT & rvalue); + REMOTE_SCRIPT(const REMOTE_SCRIPT & rhs); + REMOTE_SCRIPT & operator=(const REMOTE_SCRIPT & rhs); static void * Run(void *); bool PrepareNet(); bool FinalizeNet(); - bool Send(uint32_t ip, RS_USER & rsu, bool forceDisconnect = false) const; - bool SendDirect(uint32_t ip, RS_USER & rsu, uint32_t routerIP, bool forceDisconnect = false) const; - bool PreparePacket(char * buf, size_t bufSize, uint32_t ip, RS_USER &rsu, bool forceDisconnect = false) const; + bool Send(uint32_t ip, USER & rsu, bool forceDisconnect = false) const; + bool SendDirect(uint32_t ip, USER & rsu, uint32_t routerIP, bool forceDisconnect = false) const; + bool PreparePacket(char * buf, size_t bufSize, uint32_t ip, USER &rsu, bool forceDisconnect = false) const; void PeriodicSend(); std::vector IP2Routers(uint32_t ip); @@ -204,11 +204,11 @@ private: mutable BLOWFISH_CTX ctx; - std::list > afterChgIPNotifierList; - std::map authorizedUsers; + std::list ipNotifierList; + std::map authorizedUsers; mutable std::string errorStr; - RS_SETTINGS rsSettings; + SETTINGS rsSettings; MODULE_SETTINGS settings; int sendPeriod; int halfPeriod; @@ -225,19 +225,20 @@ private: int sock; - RS_ADD_USER_NONIFIER onAddUserNotifier; - RS_DEL_USER_NONIFIER onDelUserNotifier; + ADD_USER_NONIFIER onAddUserNotifier; + DEL_USER_NONIFIER onDelUserNotifier; PLUGIN_LOGGER logger; - friend class UpdateRouter; - friend class DisconnectUser; + friend class RS::UpdateRouter; + friend class RS::DisconnectUser; + friend class RS::CONNECTED_NOTIFIER; }; //----------------------------------------------------------------------------- -class DisconnectUser : public std::unary_function &, void> { +class DisconnectUser : public std::unary_function &, void> { public: DisconnectUser(REMOTE_SCRIPT & rs) : rscript(rs) {} - void operator()(std::pair & p) + void operator()(std::pair & p) { rscript.Send(p.first, p.second, true); } @@ -245,15 +246,17 @@ class DisconnectUser : public std::unary_function