From 466401257ced70054df06e81bd4119ea426657cd Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sun, 20 Oct 2013 11:44:41 +0300 Subject: [PATCH 01/16] Added x2str for double type. --- stglibs/common.lib/common.cpp | 7 +++++++ stglibs/common.lib/include/stg/common.h | 24 ++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/stglibs/common.lib/common.cpp b/stglibs/common.lib/common.cpp index 787b813d..dab99605 100644 --- a/stglibs/common.lib/common.cpp +++ b/stglibs/common.lib/common.cpp @@ -790,6 +790,13 @@ const std::string & x2str(uint64_t x, std::string & s) return unsigned2str(x, s); } //--------------------------------------------------------------------------- +const std::string & x2str(double x, std::string & s) +{ +char buf[256]; +s = snprintf(buf, sizeof(buf), "%f", x); +return s; +} +//--------------------------------------------------------------------------- std::string & TrimL(std::string & val) { size_t pos = val.find_first_not_of(" \t"); diff --git a/stglibs/common.lib/include/stg/common.h b/stglibs/common.lib/include/stg/common.h index eb0d14a6..0a4ef949 100644 --- a/stglibs/common.lib/include/stg/common.h +++ b/stglibs/common.lib/include/stg/common.h @@ -107,6 +107,20 @@ int ParseYesNo(const std::string & str, bool * val); bool WaitPackets(int sd); +//----------------------------------------------------------------------------- +int str2x(const std::string & str, int32_t & x); +int str2x(const std::string & str, uint32_t & x); +#ifndef WIN32 +int str2x(const std::string & str, int64_t & x); +int str2x(const std::string & str, uint64_t & x); +#endif +//----------------------------------------------------------------------------- +const std::string & x2str(uint32_t x, std::string & s); +const std::string & x2str(uint64_t x, std::string & s); +//----------------------------------------------------------------------------- +const std::string & x2str(double x, std::string & s); +//----------------------------------------------------------------------------- + template int str2x(const std::string & str, varT & x); template @@ -240,16 +254,6 @@ const std::string & unsigned2str(varT x, std::string & s) return s; } //----------------------------------------------------------------------------- -int str2x(const std::string & str, int32_t & x); -int str2x(const std::string & str, uint32_t & x); -#ifndef WIN32 -int str2x(const std::string & str, int64_t & x); -int str2x(const std::string & str, uint64_t & x); -#endif -//----------------------------------------------------------------------------- -const std::string & x2str(uint32_t x, std::string & s); -const std::string & x2str(uint64_t x, std::string & s); -//----------------------------------------------------------------------------- char * stg_strptime(const char *, const char *, struct tm *); time_t stg_timegm(struct tm *); -- 2.44.2 From 2eb7bcdd1bd2dc0e5240dec45f159dfe06b288c2 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sat, 9 Nov 2013 14:25:17 +0200 Subject: [PATCH 02/16] Merge branch 'fix-gts-auth-errors' --- .../stargazer/plugins/other/rscript/rscript.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/projects/stargazer/plugins/other/rscript/rscript.cpp b/projects/stargazer/plugins/other/rscript/rscript.cpp index fb8cb57c..3bc90792 100644 --- a/projects/stargazer/plugins/other/rscript/rscript.cpp +++ b/projects/stargazer/plugins/other/rscript/rscript.cpp @@ -629,14 +629,25 @@ authorizedUsers.insert(std::make_pair(user->GetCurrIP(), rsu)); void REMOTE_SCRIPT::DelRSU(USER_PTR user) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); -const std::map::iterator it( +std::map::iterator it(authorizedUsers.begin()); +while (it != authorizedUsers.end()) + { + if (it->second.user == user) + { + Send(it->second, true); + authorizedUsers.erase(it); + return; + } + ++it; + } +/*const std::map::iterator it( authorizedUsers.find(user->GetCurrIP()) ); if (it != authorizedUsers.end()) { Send(it->second, true); authorizedUsers.erase(it); - } + }*/ } //----------------------------------------------------------------------------- void RS::IP_NOTIFIER::Notify(const uint32_t & /*oldValue*/, const uint32_t & newValue) -- 2.44.2 From 0d37dfa5f5a3d46ce814f63bb8f468971fd0904c Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sat, 9 Nov 2013 15:40:24 +0200 Subject: [PATCH 03/16] Removed some conflicting macros. --- include/stg/const.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/stg/const.h b/include/stg/const.h index e882200d..55f5b54b 100644 --- a/include/stg/const.h +++ b/include/stg/const.h @@ -80,8 +80,6 @@ #define NO_TARIFF_NAME "*_NO_TARIFF_*" #define NO_CORP_NAME "*_NO_CORP_*" -#define mega (1024 * 1024) - #define MONITOR_TIME_DELAY_SEC (60) #endif -- 2.44.2 From 793728a58d8f97daf7de1dde7a02a5c4a30e30d4 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Thu, 14 Nov 2013 22:01:45 +0200 Subject: [PATCH 04/16] Merge branch 'log-unauth-reasons' Conflicts: projects/stargazer/user_impl.cpp --- include/stg/users.h | 4 +- include/stg/utime.h | 5 ++ projects/stargazer/main.cpp | 2 +- .../authorization/inetaccess/inetaccess.cpp | 77 ++++++++++++++++--- .../authorization/inetaccess/inetaccess.h | 4 +- projects/stargazer/user_impl.cpp | 10 ++- projects/stargazer/user_impl.h | 4 +- projects/stargazer/users_impl.cpp | 6 +- projects/stargazer/users_impl.h | 4 +- 9 files changed, 98 insertions(+), 18 deletions(-) diff --git a/include/stg/users.h b/include/stg/users.h index a1d5d295..1a8d7a43 100644 --- a/include/stg/users.h +++ b/include/stg/users.h @@ -47,7 +47,9 @@ public: virtual bool Authorize(const std::string & login, uint32_t ip, uint32_t enabledDirs, const AUTH * auth) = 0; - virtual bool Unauthorize(const std::string & login, const AUTH * auth) = 0; + virtual bool Unauthorize(const std::string & login, + const AUTH * auth, + const std::string & reason = std::string()) = 0; virtual int ReadUsers() = 0; virtual size_t Count() const = 0; diff --git a/include/stg/utime.h b/include/stg/utime.h index 20da4e43..fe6b3f69 100644 --- a/include/stg/utime.h +++ b/include/stg/utime.h @@ -164,6 +164,11 @@ struct UTIME: public timeval { return tv_usec; } + + double AsDouble() const + { + return tv_sec + tv_usec * 1e-6; + } }; diff --git a/projects/stargazer/main.cpp b/projects/stargazer/main.cpp index 7cc8eccc..1e4c677e 100644 --- a/projects/stargazer/main.cpp +++ b/projects/stargazer/main.cpp @@ -463,7 +463,7 @@ while (true) } break; default: - WriteServLog("Ignore signel %d", sig); + WriteServLog("Ignore signal %d", sig); break; } if (stop) diff --git a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp index dd0102b2..5a15a10a 100644 --- a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp +++ b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp @@ -134,6 +134,17 @@ if (ParseIntInRange(pvi->value[0], 15, 1200, &userTimeout)) printfd(__FILE__, "Cannot parse parameter 'UserTimeout'\n"); return -1; } +/////////////////////////// +pv.param = "LogProtocolErrors"; +pvi = find(s.moduleParams.begin(), s.moduleParams.end(), pv); +if (pvi == s.moduleParams.end()) + logProtocolErrors = false; +else if (ParseYesNo(pvi->value[0], &logProtocolErrors)) + { + errorStr = "Cannot parse parameter \'LogProtocolErrors\': " + errorStr; + printfd(__FILE__, "Cannot parse parameter 'LogProtocolErrors'\n"); + return -1; + } ///////////////////////////////////////////////////////////// std::string freeMbType; int n = 0; @@ -590,8 +601,11 @@ if (dataLen <= 0) // Error if (dataLen > 256) return -1; +uint32_t sip = outerAddr.sin_addr.s_addr; +uint16_t sport = htons(outerAddr.sin_port); + int protoVer; -if (CheckHeader(buffer, &protoVer)) +if (CheckHeader(buffer, sip, &protoVer)) return -1; char login[PASSWD_LEN]; //TODO why PASSWD_LEN ? @@ -599,9 +613,6 @@ memset(login, 0, PASSWD_LEN); Decrypt(&ctxS, login, buffer + 8, PASSWD_LEN / 8); -uint32_t sip = outerAddr.sin_addr.s_addr; -uint16_t sport = htons(outerAddr.sin_port); - USER_PTR user; if (users->FindByName(login, &user)) { @@ -642,12 +653,14 @@ if (!user->GetProperty().ips.Get().IsIPInIPS(sip)) return PacketProcessor(buffer, dataLen, sip, sport, protoVer, user); } //----------------------------------------------------------------------------- -int AUTH_IA::CheckHeader(const char * buffer, int * protoVer) +int AUTH_IA::CheckHeader(const char * buffer, uint32_t sip, int * protoVer) { if (strncmp(IA_ID, buffer, strlen(IA_ID)) != 0) { //SendError(userIP, updateMsg); printfd(__FILE__, "update needed - IA_ID\n"); + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. Header: invalid packed signature.", inet_ntostring(sip).c_str()); //SendError(userIP, "Incorrect header!"); return -1; } @@ -655,6 +668,8 @@ if (strncmp(IA_ID, buffer, strlen(IA_ID)) != 0) if (buffer[6] != 0) //proto[0] shoud be 0 { printfd(__FILE__, "update needed - PROTO major: %d\n", buffer[6]); + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. Header: invalid protocol major version: %d.", inet_ntostring(sip).c_str(), buffer[6]); //SendError(userIP, updateMsg); return -1; } @@ -664,6 +679,8 @@ if (buffer[7] < 6) // need update //SendError(userIP, updateMsg); printfd(__FILE__, "update needed - PROTO minor: %d\n", buffer[7]); + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. Header: invalid protocol minor version: %d.", inet_ntostring(sip).c_str(), buffer[7]); return -1; } else @@ -691,6 +708,8 @@ while (it != ip2user.end()) if ((it->second.phase.GetPhase() == 2) && (currTime - it->second.phase.GetTime()) > iaSettings.GetUserDelay()) { + if (iaSettings.LogProtocolErrors()) + logger("User '%s'. Protocol version: %d. Phase 2: connect request timeout (%f > %d).", it->second.login.c_str(), it->second.protoVer, (currTime - it->second.phase.GetTime()).AsDouble(), iaSettings.GetUserDelay()); it->second.phase.SetPhase1(); printfd(__FILE__, "Phase changed from 2 to 1. Reason: timeout\n"); ip2user.erase(it++); @@ -733,6 +752,8 @@ while (it != ip2user.end()) if ((currTime - it->second.phase.GetTime()) > iaSettings.GetUserTimeout()) { + if (iaSettings.LogProtocolErrors()) + logger("User '%s'. Protocol version: %d. Phase 3: alive timeout (%f > %d).", it->second.login.c_str(), it->second.protoVer, (currTime - it->second.phase.GetTime()).AsDouble(), iaSettings.GetUserTimeout()); users->Unauthorize(it->second.user->GetLogin(), this); ip2user.erase(it++); continue; @@ -742,6 +763,8 @@ while (it != ip2user.end()) if ((it->second.phase.GetPhase() == 4) && ((currTime - it->second.phase.GetTime()) > iaSettings.GetUserDelay())) { + if (iaSettings.LogProtocolErrors()) + logger("User '%s'. Protocol version: %d. Phase 4: disconnect request timeout (%f > %d).", it->second.login.c_str(), it->second.protoVer, (currTime - it->second.phase.GetTime()).AsDouble(), iaSettings.GetUserDelay()); it->second.phase.SetPhase3(); printfd(__FILE__, "Phase changed from 4 to 3. Reason: timeout\n"); } @@ -1174,6 +1197,8 @@ if ((iaUser->phase.GetPhase() == 2) && (connAck->rnd == iaUser->rnd + 1)) else { errorStr = iaUser->user->GetStrError(); + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. User '%s'. Protocol version: %d. CONN_ACK: phase 2, authorization error ('%s').", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, errorStr.c_str()); iaUser->phase.SetPhase1(); ip2user.erase(sip); printfd(__FILE__, "Phase changed from 2 to 1. Reason: failed to authorize user\n"); @@ -1181,6 +1206,13 @@ if ((iaUser->phase.GetPhase() == 2) && (connAck->rnd == iaUser->rnd + 1)) } } printfd(__FILE__, "Invalid phase or control number. Phase: %d. Control number: %d\n", iaUser->phase.GetPhase(), connAck->rnd); +if (iaSettings.LogProtocolErrors()) + { + if (iaUser->phase.GetPhase() != 2) + logger("IP: %s. User '%s'. Protocol version: %d. CONN_ACK: invalid phase, expected 2, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, iaUser->phase.GetPhase()); + if (connAck->rnd != iaUser->rnd + 1) + logger("IP: %s. User '%s'. Protocol version: %d. CONN_ACK: invalid control number, expected %d, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, (iaUser->rnd + 1), connAck->rnd); + } return -1; } //----------------------------------------------------------------------------- @@ -1210,6 +1242,8 @@ if ((iaUser->phase.GetPhase() == 2) && (connAck->rnd == iaUser->rnd + 1)) else { errorStr = iaUser->user->GetStrError(); + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. User '%s'. Protocol version: %d. CONN_ACK: phase 2, authorization error ('%s').", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, errorStr.c_str()); iaUser->phase.SetPhase1(); ip2user.erase(sip); printfd(__FILE__, "Phase changed from 2 to 1. Reason: failed to authorize user\n"); @@ -1217,6 +1251,13 @@ if ((iaUser->phase.GetPhase() == 2) && (connAck->rnd == iaUser->rnd + 1)) } } printfd(__FILE__, "Invalid phase or control number. Phase: %d. Control number: %d\n", iaUser->phase.GetPhase(), connAck->rnd); +if (iaSettings.LogProtocolErrors()) + { + if (iaUser->phase.GetPhase() != 2) + logger("IP: %s. User '%s'. Protocol version: %d. CONN_ACK: invalid phase, expected 2, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, iaUser->phase.GetPhase()); + if (connAck->rnd != iaUser->rnd + 1) + logger("IP: %s. User '%s'. Protocol version: %d. CONN_ACK: invalid control number, expected %d, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, (iaUser->rnd + 1), connAck->rnd); + } return -1; } //----------------------------------------------------------------------------- @@ -1259,11 +1300,13 @@ if ((iaUser->phase.GetPhase() == 3) && (aliveAck->rnd == iaUser->rnd + 1)) return 0; } //----------------------------------------------------------------------------- -int AUTH_IA::Process_DISCONN_SYN_6(DISCONN_SYN_6 *, IA_USER * iaUser, uint32_t) +int AUTH_IA::Process_DISCONN_SYN_6(DISCONN_SYN_6 *, IA_USER * iaUser, uint32_t sip) { printfd(__FILE__, "DISCONN_SYN_6\n"); if (iaUser->phase.GetPhase() != 3) { + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. User '%s'. Protocol version: %d. DISCONN_SYN: invalid phase, expected 3, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, iaUser->phase.GetPhase()); printfd(__FILE__, "Invalid phase. Expected 3, actual %d\n", iaUser->phase.GetPhase()); errorStr = "Incorrect request DISCONN_SYN"; return -1; @@ -1280,10 +1323,12 @@ int AUTH_IA::Process_DISCONN_SYN_7(DISCONN_SYN_7 * disconnSyn, IA_USER * iaUser, return Process_DISCONN_SYN_6(disconnSyn, iaUser, sip); } //----------------------------------------------------------------------------- -int AUTH_IA::Process_DISCONN_SYN_8(DISCONN_SYN_8 *, IA_USER * iaUser, uint32_t) +int AUTH_IA::Process_DISCONN_SYN_8(DISCONN_SYN_8 *, IA_USER * iaUser, uint32_t sip) { if (iaUser->phase.GetPhase() != 3) { + if (iaSettings.LogProtocolErrors()) + logger("IP: %s. User '%s'. Protocol version: %d. DISCONN_SYN: invalid phase, expected 3, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, iaUser->phase.GetPhase()); errorStr = "Incorrect request DISCONN_SYN"; printfd(__FILE__, "Invalid phase. Expected 3, actual %d\n", iaUser->phase.GetPhase()); return -1; @@ -1297,7 +1342,7 @@ return 0; //----------------------------------------------------------------------------- int AUTH_IA::Process_DISCONN_ACK_6(DISCONN_ACK_6 * disconnAck, IA_USER * iaUser, - uint32_t, + uint32_t sip, std::map::iterator) { #ifdef ARCH_BE @@ -1307,6 +1352,13 @@ SwapBytes(disconnAck->rnd); printfd(__FILE__, "DISCONN_ACK_6\n"); if (!((iaUser->phase.GetPhase() == 4) && (disconnAck->rnd == iaUser->rnd + 1))) { + if (iaSettings.LogProtocolErrors()) + { + if (iaUser->phase.GetPhase() != 4) + logger("IP: %s. User '%s'. Protocol version: %d. DISCONN_ACK: invalid phase, expected 4, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, iaUser->phase.GetPhase()); + if (disconnAck->rnd != iaUser->rnd + 1) + logger("IP: %s. User '%s'. Protocol version: %d. DISCONN_ACK: invalid control number, expected %d, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, (iaUser->rnd + 1), disconnAck->rnd); + } printfd(__FILE__, "Invalid phase or control number. Phase: %d. Control number: %d\n", iaUser->phase.GetPhase(), disconnAck->rnd); return -1; } @@ -1319,7 +1371,7 @@ int AUTH_IA::Process_DISCONN_ACK_7(DISCONN_ACK_7 * disconnAck, IA_USER * iaUser, return Process_DISCONN_ACK_6(disconnAck, iaUser, sip, it); } //----------------------------------------------------------------------------- -int AUTH_IA::Process_DISCONN_ACK_8(DISCONN_ACK_8 * disconnAck, IA_USER * iaUser, uint32_t, std::map::iterator) +int AUTH_IA::Process_DISCONN_ACK_8(DISCONN_ACK_8 * disconnAck, IA_USER * iaUser, uint32_t sip, std::map::iterator) { #ifdef ARCH_BE SwapBytes(disconnAck->len); @@ -1328,6 +1380,13 @@ SwapBytes(disconnAck->rnd); printfd(__FILE__, "DISCONN_ACK_8\n"); if (!((iaUser->phase.GetPhase() == 4) && (disconnAck->rnd == iaUser->rnd + 1))) { + if (iaSettings.LogProtocolErrors()) + { + if (iaUser->phase.GetPhase() != 4) + logger("IP: %s. User '%s'. Protocol version: %d. DISCONN_ACK: invalid phase, expected 4, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, iaUser->phase.GetPhase()); + if (disconnAck->rnd != iaUser->rnd + 1) + logger("IP: %s. User '%s'. Protocol version: %d. DISCONN_ACK: invalid control number, expected %d, got %d.", inet_ntostring(sip).c_str(), iaUser->login.c_str(), iaUser->protoVer, (iaUser->rnd + 1), disconnAck->rnd); + } printfd(__FILE__, "Invalid phase or control number. Phase: %d. Control number: %d\n", iaUser->phase.GetPhase(), disconnAck->rnd); return -1; } diff --git a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h index a13a11db..87350556 100644 --- a/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h +++ b/projects/stargazer/plugins/authorization/inetaccess/inetaccess.h @@ -209,6 +209,7 @@ public: int GetUserTimeout() const { return userTimeout; } uint16_t GetUserPort() const { return port; } FREEMB GetFreeMbShowType() const { return freeMbShowType; } + bool LogProtocolErrors() const { return logProtocolErrors; } private: int userDelay; @@ -216,6 +217,7 @@ private: uint16_t port; std::string errorStr; FREEMB freeMbShowType; + bool logProtocolErrors; }; //----------------------------------------------------------------------------- class AUTH_IA; @@ -266,7 +268,7 @@ private: int FinalizeNet(); void DelUser(USER_PTR u); int RecvData(char * buffer, int bufferSize); - int CheckHeader(const char * buffer, int * protoVer); + int CheckHeader(const char * buffer, uint32_t sip, int * protoVer); int PacketProcessor(void * buff, size_t dataLen, uint32_t sip, uint16_t sport, int protoVer, USER_PTR user); int Process_CONN_SYN_6(CONN_SYN_6 * connSyn, IA_USER * iaUser, uint32_t sip); diff --git a/projects/stargazer/user_impl.cpp b/projects/stargazer/user_impl.cpp index 13cf0b77..7b0348bc 100644 --- a/projects/stargazer/user_impl.cpp +++ b/projects/stargazer/user_impl.cpp @@ -525,7 +525,7 @@ ScanMessage(); return 0; } //----------------------------------------------------------------------------- -void USER_IMPL::Unauthorize(const AUTH * auth) +void USER_IMPL::Unauthorize(const AUTH * auth, const std::string & reason) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); /* @@ -537,6 +537,7 @@ if (!authorizedBy.erase(auth)) if (authorizedBy.empty()) { authorizedModificationTime = stgTime; + lastDisconnectReason = reason; lastIPForDisconnect = currIP; currIP = 0; // DelUser in traffcounter return; @@ -671,7 +672,12 @@ if (!fakeDisconnect) connected = false; } -if (store->WriteUserDisconnect(login, up, down, sessionUpload, sessionDownload, cash, freeMb, reason)) +std::string reasonMessage(reason); +if (!lastDisconnectReason.empty()) + reasonMessage += ": " + lastDisconnectReason; + +if (store->WriteUserDisconnect(login, up, down, sessionUpload, sessionDownload, + cash, freeMb, reasonMessage)) { WriteServLog("Cannot write disconnect for user %s.", login.c_str()); WriteServLog("%s", store->GetStrError().c_str()); diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h index 26ff58fc..68945d2c 100644 --- a/projects/stargazer/user_impl.h +++ b/projects/stargazer/user_impl.h @@ -188,7 +188,8 @@ public: int GetAuthorized() const { return static_cast(authorizedBy.size()); } time_t GetAuthorizedModificationTime() const { return authorizedModificationTime; } int Authorize(uint32_t ip, uint32_t enabledDirs, const AUTH * auth); - void Unauthorize(const AUTH * auth); + void Unauthorize(const AUTH * auth, + const std::string & reason = std::string()); bool IsAuthorizedBy(const AUTH * auth) const; std::vector GetAuthorizers() const; @@ -255,6 +256,7 @@ private: USER_PROPERTY currIP; uint32_t lastIPForDisconnect; // User's ip after unauth but before disconnect + std::string lastDisconnectReason; time_t pingTime; diff --git a/projects/stargazer/users_impl.cpp b/projects/stargazer/users_impl.cpp index 5b88e685..4c4d4ce0 100644 --- a/projects/stargazer/users_impl.cpp +++ b/projects/stargazer/users_impl.cpp @@ -314,7 +314,9 @@ AddToIPIdx(iter); return true; } //----------------------------------------------------------------------------- -bool USERS_IMPL::Unauthorize(const std::string & login, const AUTH * auth) +bool USERS_IMPL::Unauthorize(const std::string & login, + const AUTH * auth, + const std::string & reason) { user_iter iter; STG_LOCKER lock(&mutex, __FILE__, __LINE__); @@ -326,7 +328,7 @@ if (FindByNameNonLock(login, &iter)) uint32_t ip = iter->GetCurrIP(); -iter->Unauthorize(auth); +iter->Unauthorize(auth, reason); if (!iter->GetAuthorized()) DelFromIPIdx(ip); diff --git a/projects/stargazer/users_impl.h b/projects/stargazer/users_impl.h index b9d2b22d..43065bde 100644 --- a/projects/stargazer/users_impl.h +++ b/projects/stargazer/users_impl.h @@ -96,7 +96,9 @@ public: bool Authorize(const std::string & login, uint32_t ip, uint32_t enabledDirs, const AUTH * auth); - bool Unauthorize(const std::string & login, const AUTH * auth); + bool Unauthorize(const std::string & login, + const AUTH * auth, + const std::string & reason = std::string()); int ReadUsers(); size_t Count() const { return users.size(); } -- 2.44.2 From 0c80dbc4ce66a278eb5235420d34a469323efc6b Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Mon, 6 Jan 2014 17:51:09 +0200 Subject: [PATCH 05/16] Merge branch 'new-daily-fee' Conflicts: include/stg/tariff_conf.h projects/stargazer/plugins/store/firebird/Makefile projects/stargazer/plugins/store/firebird/firebird_store.cpp projects/stargazer/plugins/store/firebird/firebird_store.h projects/stargazer/plugins/store/mysql/Makefile projects/stargazer/plugins/store/mysql/mysql_store.cpp projects/stargazer/plugins/store/mysql/mysql_store.h projects/stargazer/plugins/store/postgresql/Makefile projects/stargazer/plugins/store/postgresql/postgresql_store.cpp projects/stargazer/plugins/store/postgresql/postgresql_store.h projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp --- doc/xmlrpc/API-tariffs.xml | 33 +++++ include/stg/tariff.h | 32 ++++- include/stg/tariff_conf.h | 40 +++--- .../stargazer/inst/var/01-alter-02.mysql.sql | 12 ++ .../inst/var/01-alter-02.postgresql.sql | 13 ++ projects/stargazer/inst/var/01-alter-02.sql | 15 +++ .../configuration/rpcconfig/tariff_helper.cpp | 6 + .../configuration/sgconfig/parser_tariff.cpp | 8 ++ .../plugins/store/files/file_store.cpp | 9 +- .../plugins/store/firebird/firebird_store.cpp | 37 ++++++ .../plugins/store/firebird/firebird_store.h | 2 + .../store/firebird/firebird_store_tariffs.cpp | 51 ++++++-- .../plugins/store/mysql/mysql_store.cpp | 121 ++++++++++++++++-- .../plugins/store/mysql/mysql_store.h | 2 + .../store/postgresql/postgresql_store.cpp | 2 + .../postgresql/postgresql_store_tariffs.cpp | 83 ++++++------ projects/stargazer/tariff_impl.h | 1 + projects/stargazer/user_impl.cpp | 39 ++++++ projects/stargazer/user_impl.h | 1 + projects/stargazer/users_impl.cpp | 2 + 20 files changed, 431 insertions(+), 78 deletions(-) create mode 100644 projects/stargazer/inst/var/01-alter-02.mysql.sql create mode 100644 projects/stargazer/inst/var/01-alter-02.postgresql.sql create mode 100644 projects/stargazer/inst/var/01-alter-02.sql diff --git a/doc/xmlrpc/API-tariffs.xml b/doc/xmlrpc/API-tariffs.xml index d36b01dd..9b84889a 100644 --- a/doc/xmlrpc/API-tariffs.xml +++ b/doc/xmlrpc/API-tariffs.xml @@ -113,6 +113,17 @@ + + string period + + Периодичность снятия абонплаты: + + month — ежемесячное снятие + day — ежедневное снятие + + + + array of struct dirprices @@ -277,6 +288,17 @@ + + string period + + Периодичность снятия абонплаты: + + month — ежемесячное снятие + day — ежедневное снятие + + + + array of struct dirprices @@ -541,6 +563,17 @@ + + string period + + Периодичность снятия абонплаты: + + month — ежемесячное снятие + day — ежедневное снятие + + + + array of struct dirprices diff --git a/include/stg/tariff.h b/include/stg/tariff.h index a5b1d2e9..d0bf20b6 100644 --- a/include/stg/tariff.h +++ b/include/stg/tariff.h @@ -21,15 +21,21 @@ #ifndef TARIFF_H #define TARIFF_H -#include +#include "os_int.h" #include +#include +#include -#include "os_int.h" -#include "tariff_conf.h" +struct TARIFF_DATA; class TARIFF { public: + enum PERIOD { DAY = 0, MONTH }; + + static std::string PeriodToString(PERIOD period); + static PERIOD StringToPeriod(const std::string& value); + virtual ~TARIFF() {} virtual double GetPriceWithTraffType(uint64_t up, uint64_t down, @@ -39,6 +45,7 @@ public: virtual double GetPassiveCost() const = 0; virtual double GetFee() const = 0; virtual double GetFree() const = 0; + virtual PERIOD GetPeriod() const = 0; virtual const std::string & GetName() const = 0; virtual void SetName(const std::string & name) = 0; @@ -49,4 +56,23 @@ public: virtual const TARIFF_DATA & GetTariffData() const = 0; }; +inline +std::string TARIFF::PeriodToString(TARIFF::PERIOD period) +{ +switch (period) + { + case DAY: return "day"; + case MONTH: return "month"; + } +return "month"; // Classic behaviour. +} + +inline +TARIFF::PERIOD TARIFF::StringToPeriod(const std::string& value) +{ +if (strcasecmp(value.c_str(), "day") == 0) + return DAY; +return MONTH; // Classic behaviour. +} + #endif diff --git a/include/stg/tariff_conf.h b/include/stg/tariff_conf.h index b554e14a..6a296230 100644 --- a/include/stg/tariff_conf.h +++ b/include/stg/tariff_conf.h @@ -27,12 +27,13 @@ #ifndef TARIFF_CONF_H #define TARIFF_CONF_H -#include -#include - +#include "tariff.h" #include "resetable.h" #include "const.h" +#include +#include + //----------------------------------------------------------------------------- enum { @@ -135,18 +136,20 @@ struct DIRPRICE_DATA_RES //----------------------------------------------------------------------------- struct TARIFF_CONF { - double fee; - double free; - int traffType; - double passiveCost; - std::string name; + double fee; + double free; + int traffType; + double passiveCost; + std::string name; + TARIFF::PERIOD period; TARIFF_CONF() : fee(0), free(0), traffType(TRAFF_UP_DOWN), passiveCost(0), - name() + name(), + period(TARIFF::MONTH) {} TARIFF_CONF(const std::string & n) @@ -154,7 +157,8 @@ struct TARIFF_CONF free(0), traffType(TRAFF_UP_DOWN), passiveCost(0), - name(n) + name(n), + period(TARIFF::MONTH) {} }; //----------------------------------------------------------------------------- @@ -165,7 +169,8 @@ struct TARIFF_CONF_RES free(), traffType(), passiveCost(), - name() + name(), + period() {} TARIFF_CONF_RES & operator=(const TARIFF_CONF & tc) @@ -175,6 +180,7 @@ struct TARIFF_CONF_RES traffType = tc.traffType; passiveCost = tc.passiveCost; name = tc.name; + period = tc.period; return *this; } @@ -186,14 +192,16 @@ struct TARIFF_CONF_RES tc.name = name.data(); tc.passiveCost = passiveCost.data(); tc.traffType = traffType.data(); + tc.period = period.data(); return tc; } - RESETABLE fee; - RESETABLE free; - RESETABLE traffType; - RESETABLE passiveCost; - RESETABLE name; + RESETABLE fee; + RESETABLE free; + RESETABLE traffType; + RESETABLE passiveCost; + RESETABLE name; + RESETABLE period; }; //----------------------------------------------------------------------------- struct TARIFF_DATA diff --git a/projects/stargazer/inst/var/01-alter-02.mysql.sql b/projects/stargazer/inst/var/01-alter-02.mysql.sql new file mode 100644 index 00000000..1f1b044b --- /dev/null +++ b/projects/stargazer/inst/var/01-alter-02.mysql.sql @@ -0,0 +1,12 @@ +/* + * DB migration from v01 to v02 (mysql) + */ + +ALTER TABLE tariffs ADD period VARCHAR(32) NOT NULL DEFAULT 'month'; + +CREATE TABLE info +( + version INTEGER NOT NULL +); + +INSERT INTO info VALUES (1); diff --git a/projects/stargazer/inst/var/01-alter-02.postgresql.sql b/projects/stargazer/inst/var/01-alter-02.postgresql.sql new file mode 100644 index 00000000..ef6a98c6 --- /dev/null +++ b/projects/stargazer/inst/var/01-alter-02.postgresql.sql @@ -0,0 +1,13 @@ +/* + * DB migration from v01 to v02 (postgres) + */ +BEGIN; + +CREATE DOMAIN DM_TARIFF_PERIOD AS TEXT NOT NULL + CONSTRAINT valid_value CHECK (VALUE = 'month' OR VALUE = 'day'); + +ALTER TABLE tb_tariffs ADD period DM_TARIFF_PERIOD DEFAULT 'month'; + +UPDATE tb_info SET version = 7; + +COMMIT; diff --git a/projects/stargazer/inst/var/01-alter-02.sql b/projects/stargazer/inst/var/01-alter-02.sql new file mode 100644 index 00000000..628a016a --- /dev/null +++ b/projects/stargazer/inst/var/01-alter-02.sql @@ -0,0 +1,15 @@ +/* + * DB migration from v01 to v02 (firebird) + */ + +CREATE DOMAIN DM_TARIFF_PERIOD AS VARCHAR(32) NOT NULL + CHECK (VALUE = 'month' OR VALUE = 'day'); + +ALTER TABLE tb_tariffs ADD period DM_TARIFF_PERIOD DEFAULT 'month'; + +CREATE TABLE tb_info +( + version INTEGER NOT NULL +); + +INSERT INTO tb_info VALUES (1); diff --git a/projects/stargazer/plugins/configuration/rpcconfig/tariff_helper.cpp b/projects/stargazer/plugins/configuration/rpcconfig/tariff_helper.cpp index fad12886..85abf820 100644 --- a/projects/stargazer/plugins/configuration/rpcconfig/tariff_helper.cpp +++ b/projects/stargazer/plugins/configuration/rpcconfig/tariff_helper.cpp @@ -12,6 +12,7 @@ structVal["fee"] = xmlrpc_c::value_double(data.tariffConf.fee); structVal["freemb"] = xmlrpc_c::value_double(data.tariffConf.free); structVal["passivecost"] = xmlrpc_c::value_double(data.tariffConf.passiveCost); structVal["traffType"] = xmlrpc_c::value_int(data.tariffConf.traffType); +structVal["period"] = xmlrpc_c::value_string(TARIFF::PeriodToString(data.tariffConf.period)); std::vector prices(DIR_NUM); @@ -65,6 +66,11 @@ if ((it = structVal.find("traffType")) != structVal.end()) data.tariffConf.traffType = xmlrpc_c::value_int(it->second); } +if ((it = structVal.find("period")) != structVal.end()) + { + data.tariffConf.period = TARIFF::StringToPeriod(xmlrpc_c::value_string(it->second)); + } + if ((it = structVal.find("dirprices")) != structVal.end()) { std::vector prices( diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp index 7be1af96..0e001b22 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp @@ -145,6 +145,8 @@ for (; it != dataList.end(); ++it) break; } + answerList->push_back("tariffConf.period) + "\"/>"); + answerList->push_back(""); } answerList->push_back(""); @@ -451,6 +453,12 @@ else } return 0; } + + if (strcasecmp(el, "Period") == 0) + { + td.tariffConf.period = TARIFF::StringToPeriod(attr[1]); + return 0; + } } return -1; } diff --git a/projects/stargazer/plugins/store/files/file_store.cpp b/projects/stargazer/plugins/store/files/file_store.cpp index 0f55b530..0466b824 100644 --- a/projects/stargazer/plugins/store/files/file_store.cpp +++ b/projects/stargazer/plugins/store/files/file_store.cpp @@ -1483,6 +1483,11 @@ else printfd(__FILE__, "FILES_STORE::RestoreTariff - invalid trafftype for tariff '%s'\n", tariffName.c_str()); return -1; } + +if (conf.ReadString("Period", &str, "month") < 0) + td->tariffConf.period = TARIFF::MONTH; +else + td->tariffConf.period = TARIFF::StringToPeriod(str); return 0; } //----------------------------------------------------------------------------- @@ -1558,6 +1563,8 @@ std::string fileName = storeSettings.GetTariffsDir() + "/" + tariffName + ".tf"; cf.WriteString("TraffType", "max"); break; } + + cf.WriteString("Period", TARIFF::PeriodToString(td.tariffConf.period)); } return 0; @@ -1851,7 +1858,7 @@ if (rename((fileName + ".new").c_str(), fileName.c_str()) < 0) { STG_LOCKER lock(&mutex, __FILE__, __LINE__); errorStr = "Error moving dir from " + fileName + ".new to " + fileName; - printfd(__FILE__, "FILES_STORE::SaveTariff - rename failed. Message: '%s'\n", strerror(errno)); + printfd(__FILE__, "FILES_STORE::EditMessage - rename failed. Message: '%s'\n", strerror(errno)); return -1; } diff --git a/projects/stargazer/plugins/store/firebird/firebird_store.cpp b/projects/stargazer/plugins/store/firebird/firebird_store.cpp index 7e57483e..8e3c9d90 100644 --- a/projects/stargazer/plugins/store/firebird/firebird_store.cpp +++ b/projects/stargazer/plugins/store/firebird/firebird_store.cpp @@ -123,6 +123,7 @@ try { db = IBPP::DatabaseFactory(db_server, db_database, db_user, db_password, "", "KOI8U", ""); db->Connect(); + return CheckVersion(); } catch (IBPP::Exception & ex) { @@ -134,3 +135,39 @@ catch (IBPP::Exception & ex) return 0; } //----------------------------------------------------------------------------- +int FIREBIRD_STORE::CheckVersion() +{ +IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amRead, til, tlr); +IBPP::Statement st = IBPP::StatementFactory(db, tr); + +string name; + +try + { + tr->Start(); + st->Execute("SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_NAME = 'TB_INFO'"); + if (!st->Fetch()) + { + schemaVersion = 0; + } + else + { + st->Execute("SELECT version FROM tb_info"); + while (st->Fetch()) + st->Get(1, schemaVersion); + } + tr->Commit(); + WriteServLog("FIREBIRD_STORE: Current DB schema version: %d", schemaVersion); + } + +catch (IBPP::Exception & ex) + { + tr->Rollback(); + strError = "IBPP exception"; + printfd(__FILE__, ex.what()); + return -1; + } + +return 0; +} +//----------------------------------------------------------------------------- diff --git a/projects/stargazer/plugins/store/firebird/firebird_store.h b/projects/stargazer/plugins/store/firebird/firebird_store.h index 638067f2..688f0e88 100644 --- a/projects/stargazer/plugins/store/firebird/firebird_store.h +++ b/projects/stargazer/plugins/store/firebird/firebird_store.h @@ -125,9 +125,11 @@ private: mutable pthread_mutex_t mutex; IBPP::TIL til; IBPP::TLR tlr; + int schemaVersion; PLUGIN_LOGGER logger; int SaveStat(const USER_STAT & stat, const std::string & login, int year = 0, int month = 0) const; + int CheckVersion(); }; time_t ts2time_t(const IBPP::Timestamp & ts); diff --git a/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp b/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp index 1d74cf07..325e7d7f 100644 --- a/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp +++ b/projects/stargazer/plugins/store/firebird/firebird_store_tariffs.cpp @@ -146,17 +146,36 @@ try } st->Get(1, id); st->Close(); - st->Prepare("update tb_tariffs set \ - fee = ?, \ - free = ?, \ - passive_cost = ?, \ - traff_type = ? \ - where pk_tariff = ?"); - st->Set(1, td.tariffConf.fee); - st->Set(2, td.tariffConf.free); - st->Set(3, td.tariffConf.passiveCost); - st->Set(4, td.tariffConf.traffType); - st->Set(5, id); + if (schemaVersion > 0) + { + st->Prepare("update tb_tariffs set \ + fee = ?, \ + free = ?, \ + passive_cost = ?, \ + traff_type = ?, \ + period = ? \ + where pk_tariff = ?"); + st->Set(1, td.tariffConf.fee); + st->Set(2, td.tariffConf.free); + st->Set(3, td.tariffConf.passiveCost); + st->Set(4, td.tariffConf.traffType); + st->Set(5, TARIFF::PeriodToString(td.tariffConf.period)); + st->Set(6, id); + } + else + { + st->Prepare("update tb_tariffs set \ + fee = ?, \ + free = ?, \ + passive_cost = ?, \ + traff_type = ? \ + where pk_tariff = ?"); + st->Set(1, td.tariffConf.fee); + st->Set(2, td.tariffConf.free); + st->Set(3, td.tariffConf.passiveCost); + st->Set(4, td.tariffConf.traffType); + st->Set(5, id); + } st->Execute(); st->Close(); @@ -200,7 +219,7 @@ try threshold = ?, \ time_day_begins = ?, \ time_day_ends = ? \ - where fk_tariff = ? and dir_num = ?"); + where fk_tariff = ? and dir_num = ?"); st->Set(1, pda); st->Set(2, pdb); st->Set(3, pna); @@ -246,7 +265,7 @@ td->tariffConf.name = tariffName; try { tr->Start(); - st->Prepare("select * from tb_tariffs where name = ?"); + st->Prepare("select * from tb_tariffs where name = ?"); // TODO: explicit field order! st->Set(1, tariffName); st->Execute(); if (!st->Fetch()) @@ -261,6 +280,12 @@ try st->Get(4, td->tariffConf.free); st->Get(5, td->tariffConf.passiveCost); st->Get(6, td->tariffConf.traffType); + if (schemaVersion > 0) + { + std::string period; + st->Get(7, period); + td->tariffConf.period = TARIFF::StringToPeriod(period); + } st->Close(); st->Prepare("select * from tb_tariffs_params where fk_tariff = ?"); st->Set(1, id); diff --git a/projects/stargazer/plugins/store/mysql/mysql_store.cpp b/projects/stargazer/plugins/store/mysql/mysql_store.cpp index b4ac8715..11c2def3 100644 --- a/projects/stargazer/plugins/store/mysql/mysql_store.cpp +++ b/projects/stargazer/plugins/store/mysql/mysql_store.cpp @@ -12,6 +12,7 @@ #include "stg/user_stat.h" #include "stg/blowfish.h" #include "stg/plugin_creator.h" +#include "stg/logger.h" #include "mysql_store.h" #define adm_enc_passwd "cjeifY8m3" @@ -235,12 +236,18 @@ else } ret = CheckAllTables(sock); } - } - else - ret = CheckAllTables(sock); - mysql_close(sock); + } + else + { + ret = CheckAllTables(sock); + } + if (!ret) + { + WriteServLog("MYSQL_STORE: Current DB schema version: %d", schemaVersion); + MakeUpdates(sock); + } + mysql_close(sock); } - } return ret; } @@ -267,6 +274,43 @@ return num_rows == 1; //----------------------------------------------------------------------------- int MYSQL_STORE::CheckAllTables(MYSQL * sock) { +//info------------------------------------------------------------------------- +if(!IsTablePresent("info",sock)) +{ + sprintf(qbuf,"CREATE TABLE info (version INTEGER NOT NULL)"); + + if(MysqlQuery(qbuf,sock)) + { + errorStr = "Couldn't create info table With error:\n"; + errorStr += mysql_error(sock); + mysql_close(sock); + return -1; + } + + sprintf(qbuf,"INSERT INTO info SET version=0"); + + if(MysqlQuery(qbuf,sock)) + { + errorStr = "Couldn't write default version. With error:\n"; + errorStr += mysql_error(sock); + mysql_close(sock); + return -1; + } + schemaVersion = 0; +} +else +{ + std::vector info; + if (GetAllParams(&info, "info", "version")) + schemaVersion = 0; + else + { + if (info.empty()) + schemaVersion = 0; + else + GetInt(info.front(), &schemaVersion, 0); + } +} //admins----------------------------------------------------------------------- if(!IsTablePresent("admins",sock)) { @@ -330,8 +374,9 @@ if(!IsTablePresent("tariffs",sock)) res += param; } - res += "PassiveCost DOUBLE DEFAULT 0.0, Fee DOUBLE DEFAULT 0.0,"\ - "Free DOUBLE DEFAULT 0.0, TraffType VARCHAR(10) DEFAULT '')"; + res += "PassiveCost DOUBLE DEFAULT 0.0, Fee DOUBLE DEFAULT 0.0," + "Free DOUBLE DEFAULT 0.0, TraffType VARCHAR(10) DEFAULT ''," + "period VARCHAR(32) NOT NULL DEFAULT 'month')"; if(MysqlQuery(res.c_str(),sock)) { @@ -385,7 +430,7 @@ if(!IsTablePresent("tariffs",sock)) res += "PassiveCost=0.0, Fee=10.0, Free=0,"\ "SinglePrice0=1, SinglePrice1=1,PriceDayA1=0.75,PriceDayB1=0.75,"\ - "PriceNightA0=1.0,PriceNightB0=1.0,TraffType='up+down'"; + "PriceNightA0=1.0,PriceNightB0=1.0,TraffType='up+down',period='month'"; if(MysqlQuery(res.c_str(),sock)) { @@ -394,6 +439,17 @@ if(!IsTablePresent("tariffs",sock)) mysql_close(sock); return -1; } + + sprintf(qbuf,"UPDATE info SET version=1"); + + if(MysqlQuery(qbuf,sock)) + { + errorStr = "Couldn't write default version. With error:\n"; + errorStr += mysql_error(sock); + mysql_close(sock); + return -1; + } + schemaVersion = 1; } //users----------------------------------------------------------------------- @@ -525,6 +581,29 @@ if(!IsTablePresent("stat",sock)) return 0; } //----------------------------------------------------------------------------- +int MYSQL_STORE::MakeUpdates(MYSQL * sock) +{ +if (schemaVersion < 1) + { + if (MysqlQuery("ALTER TABLE tariffs ADD period VARCHAR(32) NOT NULL DEFAULT 'month'", sock)) + { + errorStr = "Couldn't update tariffs table to version 1. With error:\n"; + errorStr += mysql_error(sock); + mysql_close(sock); + return -1; + } + if (MysqlQuery("UPDATE info SET version = 1", sock)) + { + errorStr = "Couldn't update DB schema version to 1. With error:\n"; + errorStr += mysql_error(sock); + mysql_close(sock); + return -1; + } + schemaVersion = 1; + WriteServLog("MYSQL_STORE: Updated DB schema to version %d", schemaVersion); + } +return 0; +} //----------------------------------------------------------------------------- int MYSQL_STORE::GetAllParams(std::vector * ParamList, @@ -1561,6 +1640,26 @@ else return -1; } +if (schemaVersion > 0) +{ + str = row[5+8*DIR_NUM]; + param = "Period"; + + if (str.length() == 0) + { + mysql_free_result(res); + errorStr = "Cannot read tariff " + tariffName + ". Parameter " + param; + mysql_close(sock); + return -1; + } + + td->tariffConf.period = TARIFF::StringToPeriod(str); + } +else + { + td->tariffConf.period = TARIFF::MONTH; + } + mysql_free_result(res); mysql_close(sock); return 0; @@ -1638,12 +1737,16 @@ switch (td.tariffConf.traffType) res += " TraffType='max'"; break; } + +if (schemaVersion > 0) + res += ", Period='" + TARIFF::PeriodToString(td.tariffConf.period) + "'"; + strprintf(¶m, " WHERE name='%s' LIMIT 1", tariffName.c_str()); res += param; if(MysqlSetQuery(res.c_str())) { - errorStr = "Couldn't save admin:\n"; + errorStr = "Couldn't save tariff:\n"; //errorStr += mysql_error(sock); return -1; } diff --git a/projects/stargazer/plugins/store/mysql/mysql_store.h b/projects/stargazer/plugins/store/mysql/mysql_store.h index af747c14..4a492b38 100644 --- a/projects/stargazer/plugins/store/mysql/mysql_store.h +++ b/projects/stargazer/plugins/store/mysql/mysql_store.h @@ -132,6 +132,7 @@ private: virtual int WriteLogString(const std::string & str, const std::string & login) const; int GetAllParams(std::vector * ParamList, const std::string & table, const std::string & name) const; int CheckAllTables(MYSQL * sock); + int MakeUpdates(MYSQL * sock); bool IsTablePresent(const std::string & str,MYSQL * sock); mutable std::string errorStr; int MysqlQuery(const char* sQuery,MYSQL * sock) const; @@ -141,6 +142,7 @@ private: std::string version; MYSQL_STORE_SETTINGS storeSettings; MODULE_SETTINGS settings; + int schemaVersion; PLUGIN_LOGGER logger; }; diff --git a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp index dd2fbbab..5b55f318 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp @@ -237,6 +237,8 @@ if (CommitTransaction()) return -1; } +WriteServLog("POSTGRESQL_STORE: Current DB schema version: %d", version); + return 0; } //----------------------------------------------------------------------------- diff --git a/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp b/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp index fb8caf9d..c9cb7ccf 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store_tariffs.cpp @@ -122,9 +122,9 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -185,9 +185,9 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::AddTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -249,9 +249,9 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -286,9 +286,9 @@ if (tuples != 1) printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Invalid number of tuples. Wanted 1, actulally %d'\n", tuples); PQclear(result); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::SaveTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -307,8 +307,12 @@ if (tuples != 1) fee = " << td.tariffConf.fee << ", \ free = " << td.tariffConf.free << ", \ passive_cost = " << td.tariffConf.passiveCost << ", \ - traff_type = " << td.tariffConf.traffType << " \ - WHERE pk_tariff = " << id; + traff_type = " << td.tariffConf.traffType; + + if (version > 6) + query << ", period = '" << TARIFF::PeriodToString(td.tariffConf.period) << "'"; + + query << " WHERE pk_tariff = " << id; result = PQexec(connection, query.str().c_str()); } @@ -426,9 +430,9 @@ if (EscapeString(ename)) { printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to escape name'\n"); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -437,10 +441,14 @@ td->tariffConf.name = tariffName; std::ostringstream query; query << "SELECT pk_tariff, \ fee, \ - free, \ - passive_cost, \ - traff_type \ - FROM tb_tariffs WHERE name = '" << ename << "'"; + free, \ + passive_cost, \ + traff_type"; + +if (version > 6) + query << ", period"; + +query << " FROM tb_tariffs WHERE name = '" << ename << "'"; result = PQexec(connection, query.str().c_str()); @@ -464,9 +472,9 @@ if (tuples != 1) printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Invalid number of tuples. Wanted 1, actulally %d'\n", tuples); PQclear(result); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); + } return -1; } @@ -487,21 +495,24 @@ int id; tuple >> td->tariffConf.traffType; } +if (version > 6) + td->tariffConf.period = TARIFF::StringToPeriod(PQgetvalue(result, 0, 5)); + PQclear(result); query.str(""); query << "SELECT dir_num, \ price_day_a, \ price_day_b, \ - price_night_a, \ - price_night_b, \ - threshold, \ - EXTRACT(hour FROM time_day_begins), \ - EXTRACT(minute FROM time_day_begins), \ - EXTRACT(hour FROM time_day_ends), \ - EXTRACT(minute FROM time_day_ends) \ - FROM tb_tariffs_params \ - WHERE fk_tariff = " << id; + price_night_a, \ + price_night_b, \ + threshold, \ + EXTRACT(hour FROM time_day_begins), \ + EXTRACT(minute FROM time_day_begins), \ + EXTRACT(hour FROM time_day_ends), \ + EXTRACT(minute FROM time_day_ends) \ + FROM tb_tariffs_params \ + WHERE fk_tariff = " << id; result = PQexec(connection, query.str().c_str()); @@ -511,9 +522,9 @@ if (PQresultStatus(result) != PGRES_TUPLES_OK) PQclear(result); printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): '%s'\n", strError.c_str()); if (RollbackTransaction()) - { - printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); - } + { + printfd(__FILE__, "POSTGRESQL_STORE::RestoreTariff(): 'Failed to rollback transaction'\n"); + } return -1; } diff --git a/projects/stargazer/tariff_impl.h b/projects/stargazer/tariff_impl.h index 122dabd0..f2f84d26 100644 --- a/projects/stargazer/tariff_impl.h +++ b/projects/stargazer/tariff_impl.h @@ -71,6 +71,7 @@ public: double GetPassiveCost() const { return tariffData.tariffConf.passiveCost; } double GetFee() const { return tariffData.tariffConf.fee; } double GetFree() const { return tariffData.tariffConf.free; } + PERIOD GetPeriod() const { return tariffData.tariffConf.period; } void Print() const; diff --git a/projects/stargazer/user_impl.cpp b/projects/stargazer/user_impl.cpp index 7b0348bc..3b2489ad 100644 --- a/projects/stargazer/user_impl.cpp +++ b/projects/stargazer/user_impl.cpp @@ -1253,6 +1253,9 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__); if (passive.ConstData() || tariff == NULL) return; +if (tariff->GetPeriod() != TARIFF::MONTH) + return; + double fee = tariff->GetFee() / DaysInCurrentMonth(); if (std::fabs(fee) < 1.0e-3) @@ -1287,6 +1290,9 @@ STG_LOCKER lock(&mutex, __FILE__, __LINE__); if (tariff == NULL) return; +if (tariff->GetPeriod() != TARIFF::MONTH) + return; + double passiveTimePart = 1.0; if (!settings->GetFullFee()) { @@ -1348,6 +1354,39 @@ switch (settings->GetFeeChargeType()) } } //----------------------------------------------------------------------------- +void USER_IMPL::ProcessDailyFee() +{ +STG_LOCKER lock(&mutex, __FILE__, __LINE__); + +if (passive.ConstData() || tariff == NULL) + return; + +if (tariff->GetPeriod() != TARIFF::DAY) + return; + +double fee = tariff->GetFee(); + +if (fee == 0.0) + return; + +double c = cash; +switch (settings->GetFeeChargeType()) + { + case 0: + property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + break; + case 1: + if (c + credit >= 0) + property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + break; + case 2: + if (c + credit >= fee) + property.cash.Set(c - fee, sysAdmin, login, store, "Subscriber fee charge"); + break; + } +ResetPassiveTime(); +} +//----------------------------------------------------------------------------- void USER_IMPL::SetPrepaidTraff() { if (tariff != NULL) diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h index 68945d2c..90ae01b9 100644 --- a/projects/stargazer/user_impl.h +++ b/projects/stargazer/user_impl.h @@ -215,6 +215,7 @@ public: void ProcessDayFee(); void ProcessDayFeeSpread(); void ProcessNewMonth(); + void ProcessDailyFee(); bool IsInetable(); std::string GetEnabledDirs(); diff --git a/projects/stargazer/users_impl.cpp b/projects/stargazer/users_impl.cpp index 4c4d4ce0..f4b4dea0 100644 --- a/projects/stargazer/users_impl.cpp +++ b/projects/stargazer/users_impl.cpp @@ -513,6 +513,8 @@ else } } +std::for_each(users.begin(), users.end(), std::mem_fun_ref(&USER_IMPL::ProcessDailyFee)); + if (settings->GetDayFeeIsLastDay()) { printfd(__FILE__, "DayResetTraff - 2 -\n"); -- 2.44.2 From 9fdd58e794e43fc2435265c4fb2f6933758f3c0b Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Mon, 6 Jan 2014 21:18:55 +0200 Subject: [PATCH 06/16] Fixed merge issues. --- include/stg/user_traff.h | 7 ++++--- .../plugins/store/firebird/firebird_store.cpp | 4 ++-- .../store/firebird/firebird_store_users.cpp | 8 ++++---- .../plugins/store/mysql/mysql_store.cpp | 16 ++++++++-------- .../store/postgresql/postgresql_store.cpp | 2 +- projects/stargazer/user_impl.h | 1 - 6 files changed, 19 insertions(+), 19 deletions(-) diff --git a/include/stg/user_traff.h b/include/stg/user_traff.h index 4d5efe62..1b9e2035 100644 --- a/include/stg/user_traff.h +++ b/include/stg/user_traff.h @@ -27,12 +27,13 @@ #ifndef USER_TRAFF_H #define USER_TRAFF_H -#include -#include - +#include "resetable.h" #include "const.h" #include "os_int.h" +#include +#include + enum TRAFF_DIRECTION {TRAFF_UPLOAD, TRAFF_DOWNLOAD}; class DIR_TRAFF diff --git a/projects/stargazer/plugins/store/firebird/firebird_store.cpp b/projects/stargazer/plugins/store/firebird/firebird_store.cpp index 8e3c9d90..37b5184f 100644 --- a/projects/stargazer/plugins/store/firebird/firebird_store.cpp +++ b/projects/stargazer/plugins/store/firebird/firebird_store.cpp @@ -140,7 +140,7 @@ int FIREBIRD_STORE::CheckVersion() IBPP::Transaction tr = IBPP::TransactionFactory(db, IBPP::amRead, til, tlr); IBPP::Statement st = IBPP::StatementFactory(db, tr); -string name; +std::string name; try { @@ -157,7 +157,7 @@ try st->Get(1, schemaVersion); } tr->Commit(); - WriteServLog("FIREBIRD_STORE: Current DB schema version: %d", schemaVersion); + logger("FIREBIRD_STORE: Current DB schema version: %d", schemaVersion); } catch (IBPP::Exception & ex) diff --git a/projects/stargazer/plugins/store/firebird/firebird_store_users.cpp b/projects/stargazer/plugins/store/firebird/firebird_store_users.cpp index e48fd0d8..3f00b16b 100644 --- a/projects/stargazer/plugins/store/firebird/firebird_store_users.cpp +++ b/projects/stargazer/plugins/store/firebird/firebird_store_users.cpp @@ -204,8 +204,8 @@ try upload = ?, \ download = ? \ where fk_stat = ? and dir_num = ?"); - st->Set(1, (int64_t)stat.up[i]); - st->Set(2, (int64_t)stat.down[i]); + st->Set(1, (int64_t)stat.monthUp[i]); + st->Set(2, (int64_t)stat.monthDown[i]); st->Set(3, sid); st->Set(4, i); st->Execute(); @@ -421,8 +421,8 @@ try if (st->Fetch()) { st->Get(3, dir); - st->Get(5, (int64_t &)stat->up[dir]); - st->Get(4, (int64_t &)stat->down[dir]); + st->Get(5, (int64_t &)stat->monthUp[dir]); + st->Get(4, (int64_t &)stat->monthDown[dir]); } else { diff --git a/projects/stargazer/plugins/store/mysql/mysql_store.cpp b/projects/stargazer/plugins/store/mysql/mysql_store.cpp index 11c2def3..53de158a 100644 --- a/projects/stargazer/plugins/store/mysql/mysql_store.cpp +++ b/projects/stargazer/plugins/store/mysql/mysql_store.cpp @@ -243,7 +243,7 @@ else } if (!ret) { - WriteServLog("MYSQL_STORE: Current DB schema version: %d", schemaVersion); + logger("MYSQL_STORE: Current DB schema version: %d", schemaVersion); MakeUpdates(sock); } mysql_close(sock); @@ -600,7 +600,7 @@ if (schemaVersion < 1) return -1; } schemaVersion = 1; - WriteServLog("MYSQL_STORE: Updated DB schema to version %d", schemaVersion); + logger("MYSQL_STORE: Updated DB schema to version %d", schemaVersion); } return 0; } @@ -903,7 +903,7 @@ for (int i = 0; i < DIR_NUM; i++) mysql_close(sock); return -1; } - stat->down[i] = traff; + stat->monthDown[i] = traff; sprintf(s, "U%d", i); if (GetULongLongInt(row[startPos+i*2+1], &traff, 0) != 0) @@ -913,7 +913,7 @@ for (int i = 0; i < DIR_NUM; i++) mysql_close(sock); return -1; } - stat->up[i] = traff; + stat->monthUp[i] = traff; }//for startPos += (2*DIR_NUM); @@ -1033,10 +1033,10 @@ res = "UPDATE users SET"; for (int i = 0; i < DIR_NUM; i++) { - strprintf(¶m, " D%d=%lld,", i, stat.down[i]); + strprintf(¶m, " D%d=%lld,", i, stat.monthDown[i]); res += param; - strprintf(¶m, " U%d=%lld,", i, stat.up[i]); + strprintf(¶m, " U%d=%lld,", i, stat.monthUp[i]); res += param; } @@ -1196,10 +1196,10 @@ strprintf(&res, "INSERT INTO stat SET login='%s', month=%d, year=%d,", for (int i = 0; i < DIR_NUM; i++) { - strprintf(¶m, " U%d=%lld,", i, stat.up[i]); + strprintf(¶m, " U%d=%lld,", i, stat.monthUp[i]); res += param; - strprintf(¶m, " D%d=%lld,", i, stat.down[i]); + strprintf(¶m, " D%d=%lld,", i, stat.monthDown[i]); res += param; } diff --git a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp index 5b55f318..3a1d7272 100644 --- a/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp +++ b/projects/stargazer/plugins/store/postgresql/postgresql_store.cpp @@ -237,7 +237,7 @@ if (CommitTransaction()) return -1; } -WriteServLog("POSTGRESQL_STORE: Current DB schema version: %d", version); +logger("POSTGRESQL_STORE: Current DB schema version: %d", version); return 0; } diff --git a/projects/stargazer/user_impl.h b/projects/stargazer/user_impl.h index 90ae01b9..150f2a8b 100644 --- a/projects/stargazer/user_impl.h +++ b/projects/stargazer/user_impl.h @@ -247,7 +247,6 @@ private: int id; bool __connected; USER_PROPERTY connected; - std::string lastDisconnectReason; bool enabledDirs[DIR_NUM]; -- 2.44.2 From d5e9e78ddcc2a7e116f3a8cb1b44b0d4a4132f8d Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Mon, 17 Mar 2014 21:19:46 +0200 Subject: [PATCH 07/16] Fixed stupid things in MySQL backend. --- .../plugins/store/mysql/mysql_store.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/projects/stargazer/plugins/store/mysql/mysql_store.cpp b/projects/stargazer/plugins/store/mysql/mysql_store.cpp index 53de158a..995ed538 100644 --- a/projects/stargazer/plugins/store/mysql/mysql_store.cpp +++ b/projects/stargazer/plugins/store/mysql/mysql_store.cpp @@ -500,8 +500,13 @@ if(!IsTablePresent("users",sock)) res = "INSERT INTO users SET login='test',Address='',AlwaysOnline=0,"\ "Credit=0.0,CreditExpire=0,Down=0,Email='',DisabledDetailStat=0,"\ "StgGroup='',IP='192.168.1.1',Note='',Passive=0,Password='123456',"\ - "Phone='', RealName='',Tariff='tariff',TariffChange='',Userdata0='',"\ - "Userdata1='',"; + "Phone='', RealName='',Tariff='tariff',TariffChange='',NAS='',"; + + for (int i = 0; i < USERDATA_NUM; i++) + { + strprintf(¶m, " Userdata%d='',", i); + res += param; + } for (int i = 0; i < DIR_NUM; i++) { @@ -676,9 +681,12 @@ return 0; //----------------------------------------------------------------------------- int MYSQL_STORE::AddUser(const std::string & login) const { -sprintf(qbuf,"INSERT INTO users SET login='%s'", login.c_str()); - -if(MysqlSetQuery(qbuf)) +std::string query = "INSERT INTO users SET login='" + login + "',Note='',NAS=''"; + +for (int i = 0; i < USERDATA_NUM; i++) + query += ",Userdata" + x2str(i) + "=''"; + +if(MysqlSetQuery(query.c_str())) { errorStr = "Couldn't add user:\n"; //errorStr += mysql_error(sock); -- 2.44.2 From a2030122b69115407ef847e1d9f99beed5060397 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Tue, 25 Mar 2014 21:21:27 +0200 Subject: [PATCH 08/16] Pass debug flags to CFLAGS. --- projects/rscriptd/build | 2 ++ projects/sgauth/build | 4 +++- projects/sgauthstress/build | 4 +++- projects/sgconf/build | 2 ++ projects/sgconf_xml/build | 2 ++ projects/sgconv/build | 2 ++ projects/stargazer/build | 2 ++ 7 files changed, 16 insertions(+), 2 deletions(-) diff --git a/projects/rscriptd/build b/projects/rscriptd/build index c7aa090d..62681932 100755 --- a/projects/rscriptd/build +++ b/projects/rscriptd/build @@ -20,6 +20,7 @@ if [ "$1" = "debug" ] then DEFS="$DEFS -DDEBUG" MAKEOPTS="$MAKEOPTS -j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall -Wextra" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall -Wextra" DEBUG="yes" else @@ -27,6 +28,7 @@ else DEBUG="no" fi +CFLAGS="$CFLAGS -I/usr/local/include" CXXFLAGS="$CXXFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" diff --git a/projects/sgauth/build b/projects/sgauth/build index 5ea022a2..203e0c88 100755 --- a/projects/sgauth/build +++ b/projects/sgauth/build @@ -20,6 +20,7 @@ if [ "$1" = "debug" ] then DEFS="$DEFS -DDEBUG" MAKEOPTS="$MAKEOPTS -j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall -Wextra" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall -Wextra" DEBUG="yes" else @@ -27,8 +28,9 @@ else DEBUG="no" fi +CFLAGS="$CFLAGS -I/usr/local/include" CXXFLAGS="$CXXFLAGS -I/usr/local/include" -LDFLAGS="$CXXFLAGS -L/usr/local/lib" +LDFLAGS="$LDFLAGS -L/usr/local/lib" if [ "$sys" = "Linux" ] then diff --git a/projects/sgauthstress/build b/projects/sgauthstress/build index 2b145659..825f00b5 100755 --- a/projects/sgauthstress/build +++ b/projects/sgauthstress/build @@ -25,6 +25,7 @@ else then DEFS="-DDEBUG" MAKEOPTS="-j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall" DEBUG="yes" else @@ -33,8 +34,9 @@ else fi fi +CFLAGS="$CFLAGS -I/usr/local/include" CXXFLAGS="$CXXFLAGS -I/usr/local/include" -LDFLAGS="$CXXFLAGS -L/usr/local/lib" +LDFLAGS="$LDFLAGS -L/usr/local/lib" if [ "$sys" = "Linux" ] then diff --git a/projects/sgconf/build b/projects/sgconf/build index d7b72363..62fceb23 100755 --- a/projects/sgconf/build +++ b/projects/sgconf/build @@ -20,6 +20,7 @@ if [ "$1" = "debug" ] then DEFS="$DEFS -DDEBUG" MAKEOPTS="$MAKEOPTS -j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall -Wextra" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall -Wextra" DEBUG="yes" else @@ -27,6 +28,7 @@ else DEBUG="no" fi +CFLAGS="$CFLAGS -I/usr/local/include" CXXFLAGS="$CXXFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" diff --git a/projects/sgconf_xml/build b/projects/sgconf_xml/build index e9cfb40b..9314452b 100755 --- a/projects/sgconf_xml/build +++ b/projects/sgconf_xml/build @@ -20,6 +20,7 @@ if [ "$1" = "debug" ] then DEFS="$DEFS -DDEBUG" MAKEOPTS="$MAKEOPTS -j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall -Wextra" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall -Wextra" DEBUG="yes" else @@ -27,6 +28,7 @@ else DEBUG="no" fi +CFLAGS="$CFLAGS -I/usr/local/include" CXXFLAGS="$CXXFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" diff --git a/projects/sgconv/build b/projects/sgconv/build index 7e430be2..580d515a 100755 --- a/projects/sgconv/build +++ b/projects/sgconv/build @@ -21,6 +21,7 @@ if [ "$1" = "debug" ] then DEFS="$DEFS -DDEBUG" MAKEOPTS="$MAKEOPTS -j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall -Wextra" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall -Wextra" DEBUG="yes" else @@ -28,6 +29,7 @@ else DEBUG="no" fi +CFLAGS="$CFLAGS -ggdb3 -W -Wall -I/usr/local/include" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" diff --git a/projects/stargazer/build b/projects/stargazer/build index 2061d538..d8ed3092 100755 --- a/projects/stargazer/build +++ b/projects/stargazer/build @@ -39,6 +39,7 @@ if [ "$1" = "debug" ] then DEFS="$DEFS -DDEBUG" MAKEOPTS="$MAKEOPTS -j1" + CFLAGS="$CFLAGS -ggdb3 -W -Wall" CXXFLAGS="$CXXFLAGS -ggdb3 -W -Wall" DEBUG="yes" else @@ -46,6 +47,7 @@ else DEBUG="no" fi +CFLAGS="$CFLAGS -I/usr/local/include" CXXFLAGS="$CXXFLAGS -I/usr/local/include" LDFLAGS="$LDFLAGS -L/usr/local/lib" -- 2.44.2 From ab2f65a4271701388a6baef4350ed6cb6dcecb8c Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sun, 18 May 2014 23:30:57 +0300 Subject: [PATCH 09/16] Support all next FreeBSD versions by default. --- projects/rlm_stg/build | 6 ++---- projects/rscriptd/build | 16 +++++++--------- projects/sgauth/build | 14 ++++++-------- projects/sgconf/build | 12 +++++------- projects/sgconf_xml/build | 14 ++++++-------- projects/sgconv/build | 16 +++++++--------- projects/stargazer/build | 20 +++++++++----------- 7 files changed, 42 insertions(+), 56 deletions(-) diff --git a/projects/rlm_stg/build b/projects/rlm_stg/build index 6459cdb9..b93f30bd 100755 --- a/projects/rlm_stg/build +++ b/projects/rlm_stg/build @@ -44,15 +44,13 @@ then 5) OS=bsd5;; 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac MAKE="gmake" fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but rlm_stg currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" diff --git a/projects/rscriptd/build b/projects/rscriptd/build index 62681932..5746d822 100755 --- a/projects/rscriptd/build +++ b/projects/rscriptd/build @@ -46,15 +46,13 @@ then 5) OS=bsd5;; 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac MAKE="gmake" fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but rscriptd currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" @@ -65,12 +63,12 @@ printf "######################################################################## printf " Building rscriptd for $sys $release\n" printf "#############################################################################\n" -STG_LIBS="logger.lib +STG_LIBS="logger.lib locker.lib - crypto.lib - common.lib - scriptexecuter.lib - conffiles.lib" + crypto.lib + common.lib + scriptexecuter.lib + conffiles.lib" if [ "$OS" = "linux" ] then diff --git a/projects/sgauth/build b/projects/sgauth/build index 203e0c88..82a3dcf6 100755 --- a/projects/sgauth/build +++ b/projects/sgauth/build @@ -46,15 +46,13 @@ then 5) OS=bsd5;; 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac MAKE="gmake" fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but sgauth currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" @@ -65,10 +63,10 @@ printf "######################################################################## printf " Building sgauth for $sys $release\n" printf "#############################################################################\n" -STG_LIBS="crypto.lib - common.lib - conffiles.lib - ia.lib" +STG_LIBS="crypto.lib + common.lib + conffiles.lib + ia.lib" if [ "$OS" = "linux" ] then diff --git a/projects/sgconf/build b/projects/sgconf/build index 62fceb23..8431474d 100755 --- a/projects/sgconf/build +++ b/projects/sgconf/build @@ -46,9 +46,7 @@ then 5) OS=bsd5;; 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac MAKE="gmake" fi @@ -61,7 +59,7 @@ then fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but sgconf currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" @@ -73,9 +71,9 @@ printf " Building sgconf for $sys $release\n" printf "#############################################################################\n" STG_LIBS="conffiles.lib - crypto.lib - common.lib - srvconf.lib" + crypto.lib + common.lib + srvconf.lib" if [ "$OS" = "linux" ] then diff --git a/projects/sgconf_xml/build b/projects/sgconf_xml/build index 9314452b..689cc262 100755 --- a/projects/sgconf_xml/build +++ b/projects/sgconf_xml/build @@ -44,17 +44,15 @@ then case $release in 4) OS=bsd;; 5) OS=bsd5;; - 6) OS=bsd5;; + 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac MAKE="gmake" fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but sgconf currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" @@ -66,9 +64,9 @@ printf " Building sgconf for $sys $release\n" printf "#############################################################################\n" STG_LIBS="conffiles.lib - crypto.lib - common.lib - srvconf.lib" + crypto.lib + common.lib + srvconf.lib" if [ "$OS" = "linux" ] then diff --git a/projects/sgconv/build b/projects/sgconv/build index 580d515a..aa826138 100755 --- a/projects/sgconv/build +++ b/projects/sgconv/build @@ -47,15 +47,13 @@ then 5) OS=bsd5;; 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac MAKE="gmake" fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but sgconv currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" @@ -66,12 +64,12 @@ printf "######################################################################## printf " Building sgconv for $sys $release\n" printf "#############################################################################\n" -STG_LIBS="logger.lib +STG_LIBS="logger.lib locker.lib - crypto.lib - common.lib - conffiles.lib - dotconfpp.lib" + crypto.lib + common.lib + conffiles.lib + dotconfpp.lib" PLUGINS="store/files" diff --git a/projects/stargazer/build b/projects/stargazer/build index d8ed3092..ec14eaad 100755 --- a/projects/stargazer/build +++ b/projects/stargazer/build @@ -66,9 +66,7 @@ then 5) OS=bsd5;; 6) OS=bsd5;; 7) OS=bsd7;; - 8) OS=bsd7;; - 9) OS=bsd7;; - *) OS=unknown;; + *) OS=bsd7;; esac ETC_DIR="./inst/freebsd/etc/stargazer" MAKE="gmake" @@ -82,7 +80,7 @@ then fi if [ "$OS" = "unknown" ] -then +then printf "#############################################################################\n" printf "# Sorry, but stargazer currently supported by Linux, FreeBSD 4.x, 5.x, 6.x #\n" printf "#############################################################################\n" @@ -93,14 +91,14 @@ printf "######################################################################## printf " Building STG 2.4 for $sys $release\n" printf "#############################################################################\n" -STG_LIBS="logger.lib +STG_LIBS="logger.lib locker.lib - crypto.lib - common.lib - scriptexecuter.lib - conffiles.lib - pinger.lib - dotconfpp.lib + crypto.lib + common.lib + scriptexecuter.lib + conffiles.lib + pinger.lib + dotconfpp.lib smux.lib" PLUGINS="authorization/ao -- 2.44.2 From 127981f11d5d3553925f01102f7c253e012829b5 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Thu, 29 May 2014 13:20:26 +0300 Subject: [PATCH 10/16] Added Splice method for resetables. --- include/stg/resetable.h | 8 ++++++++ include/stg/tariff_conf.h | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/include/stg/resetable.h b/include/stg/resetable.h index c78d0247..8a6ad27c 100644 --- a/include/stg/resetable.h +++ b/include/stg/resetable.h @@ -42,6 +42,14 @@ public: const T & data() const throw() { return value; } bool empty() const throw() { return !is_set; } void reset() throw() { is_set = false; } + void splice(const RESETABLE & rhs) + { + if (rhs.is_set) + { + value = rhs.value; + is_set = true; + } + } private: value_type value; diff --git a/include/stg/tariff_conf.h b/include/stg/tariff_conf.h index 6a296230..fc9807be 100644 --- a/include/stg/tariff_conf.h +++ b/include/stg/tariff_conf.h @@ -121,6 +121,21 @@ struct DIRPRICE_DATA_RES return dd; } + void Splice(const DIRPRICE_DATA_RES & rhs) + { + hDay.splice(rhs.hDay); + mDay.splice(rhs.mDay); + hNight.splice(rhs.hNight); + mNight.splice(rhs.mNight); + priceDayA.splice(rhs.priceDayA); + priceNightA.splice(rhs.priceNightA); + priceDayB.splice(rhs.priceDayB); + priceNightB.splice(rhs.priceNightB); + threshold.splice(rhs.threshold); + singlePrice.splice(rhs.singlePrice); + noDiscount.splice(rhs.noDiscount); + } + RESETABLE hDay; RESETABLE mDay; RESETABLE hNight; -- 2.44.2 From b3d4b1a28e293d8bb346de5ccda0a3fddda2a0b6 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Thu, 29 May 2014 13:20:51 +0300 Subject: [PATCH 11/16] Added Split utility. --- stglibs/common.lib/include/stg/common.h | 34 ++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/stglibs/common.lib/include/stg/common.h b/stglibs/common.lib/include/stg/common.h index 0a4ef949..1dd8c1c7 100644 --- a/stglibs/common.lib/include/stg/common.h +++ b/stglibs/common.lib/include/stg/common.h @@ -33,6 +33,7 @@ #include #endif #include +#include #include "stg/os_int.h" #include "stg/const.h" @@ -96,7 +97,38 @@ std::string & TrimL(std::string & val); std::string & TrimR(std::string & val); std::string & Trim(std::string & val); -std::string IconvString(const std::string & source, const std::string & from, const std::string & to); +template +C Split(const std::string & value, char delim, F conv) +{ +C res; +size_t startPos = 0; +size_t pos = value.find_first_of(delim); +while (pos != std::string::npos) + { + res.push_back(conv(value.substr(startPos, pos - startPos))); + startPos = pos + 1; + pos = value.find_first_of(delim, pos); + } +res.push_back(conv(value.substr(startPos, pos - startPos))); +return res; +} + +template +T FromString(const std::string & value) +{ +T res; +std::istringstream stream(value); +stream >> res; +return res; +} + +template +C Split(const std::string & value, char delim) +{ + return Split(value, delim, FromString); +} + +std::string IconvString(const std::string & source, const std::string & from, const std::string & to); int ParseInt(const std::string & str, int * val); int ParseUnsigned(const std::string & str, unsigned * val); -- 2.44.2 From 8458e9a72389eef2a76e66d2b427e490ba92c9e6 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Thu, 29 May 2014 17:36:26 +0300 Subject: [PATCH 12/16] Fixed Split. --- stglibs/common.lib/include/stg/common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stglibs/common.lib/include/stg/common.h b/stglibs/common.lib/include/stg/common.h index 1dd8c1c7..94c26a8b 100644 --- a/stglibs/common.lib/include/stg/common.h +++ b/stglibs/common.lib/include/stg/common.h @@ -107,7 +107,7 @@ while (pos != std::string::npos) { res.push_back(conv(value.substr(startPos, pos - startPos))); startPos = pos + 1; - pos = value.find_first_of(delim, pos); + pos = value.find_first_of(delim, pos + 1); } res.push_back(conv(value.substr(startPos, pos - startPos))); return res; -- 2.44.2 From 3f316b0bda61b18136122406677a2e728af01171 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Thu, 29 May 2014 17:36:54 +0300 Subject: [PATCH 13/16] Fixed x2str for doubles. --- stglibs/common.lib/common.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/stglibs/common.lib/common.cpp b/stglibs/common.lib/common.cpp index dab99605..db2ff6b3 100644 --- a/stglibs/common.lib/common.cpp +++ b/stglibs/common.lib/common.cpp @@ -793,7 +793,8 @@ return unsigned2str(x, s); const std::string & x2str(double x, std::string & s) { char buf[256]; -s = snprintf(buf, sizeof(buf), "%f", x); +snprintf(buf, sizeof(buf), "%f", x); +s = buf; return s; } //--------------------------------------------------------------------------- -- 2.44.2 From 37d1ed6886cbb6f0a18e00f698974d5025257c59 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sun, 8 Jun 2014 12:46:20 +0300 Subject: [PATCH 14/16] Initial adding of netfilter_queue capturer. --- .../plugins/capture/nfqueue/Makefile | 13 ++ .../plugins/capture/nfqueue/nfqueue.cpp | 143 ++++++++++++++++++ .../plugins/capture/nfqueue/nfqueue.h | 80 ++++++++++ 3 files changed, 236 insertions(+) create mode 100644 projects/stargazer/plugins/capture/nfqueue/Makefile create mode 100644 projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp create mode 100644 projects/stargazer/plugins/capture/nfqueue/nfqueue.h diff --git a/projects/stargazer/plugins/capture/nfqueue/Makefile b/projects/stargazer/plugins/capture/nfqueue/Makefile new file mode 100644 index 00000000..a9f4a803 --- /dev/null +++ b/projects/stargazer/plugins/capture/nfqueue/Makefile @@ -0,0 +1,13 @@ +include ../../../../../Makefile.conf + +PROG = mod_cap_nfqueue.so + +SRCS = ./nfqueue.cpp + +LIBS += $(NFQ_LIBS) $(LIB_THREAD) + +STGLIBS = common \ + logger + +include ../../Makefile.in + diff --git a/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp b/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp new file mode 100644 index 00000000..a007c890 --- /dev/null +++ b/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp @@ -0,0 +1,143 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +* Author : Maxim Mamontov +*/ + +#include "nfqueue.h" + +#include "stg/traffcounter.h" +#include "stg/plugin_creator.h" +#include "stg/common.h" +#include "stg/raw_ip_packet.h" + +#include + +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +namespace +{ +PLUGIN_CREATOR ncc; +} + +extern "C" PLUGIN * GetPlugin(); +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +PLUGIN * GetPlugin() +{ +return ncc.GetPlugin(); +} +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +std::string NFQ_CAP::GetVersion() const +{ +return "cap_nfqueue v.1.0"; +} +//----------------------------------------------------------------------------- +NFQ_CAP::NFQ_CAP() + : errorStr(), + thread(), + nonstop(false), + isRunning(false), + traffCnt(NULL), + logger(GetPluginLogger(GetStgLogger(), "cap_nfqueue")) +{ +} +//----------------------------------------------------------------------------- +int NFQ_CAP::ParseSettings() +{ +return 0; +} +//----------------------------------------------------------------------------- +int NFQ_CAP::Start() +{ +if (isRunning) + return 0; + +nonstop = true; + +if (pthread_create(&thread, NULL, Run, this)) + { + errorStr = "Cannot create thread."; + logger("Cannot create thread."); + printfd(__FILE__, "Cannot create thread\n"); + return -1; + } + +return 0; +} +//----------------------------------------------------------------------------- +int NFQ_CAP::Stop() +{ +if (!isRunning) + return 0; + +nonstop = false; + +//5 seconds to thread stops itself +for (int i = 0; i < 25 && isRunning; i++) + { + struct timespec ts = {0, 200000000}; + nanosleep(&ts, NULL); + } +//after 5 seconds waiting thread still running. now killing it +if (isRunning) + { + if (pthread_kill(thread, SIGUSR1)) + { + errorStr = "Cannot kill thread."; + logger("Cannot send signal to thread."); + return -1; + } + for (int i = 0; i < 25 && isRunning; ++i) + { + struct timespec ts = {0, 200000000}; + nanosleep(&ts, NULL); + } + if (isRunning) + { + errorStr = "NFQ_CAP not stopped."; + logger("Cannot stop thread."); + printfd(__FILE__, "Cannot stop thread\n"); + return -1; + } + } + +pthread_join(thread, NULL); + +return 0; +} +//----------------------------------------------------------------------------- +void * NFQ_CAP::Run(void * d) +{ +sigset_t signalSet; +sigfillset(&signalSet); +pthread_sigmask(SIG_BLOCK, &signalSet, NULL); + +NFQ_CAP * dc = static_cast(d); +dc->isRunning = true; + +while (dc->nonstop) + { + } + +dc->isRunning = false; +return NULL; +} diff --git a/projects/stargazer/plugins/capture/nfqueue/nfqueue.h b/projects/stargazer/plugins/capture/nfqueue/nfqueue.h new file mode 100644 index 00000000..02452bb8 --- /dev/null +++ b/projects/stargazer/plugins/capture/nfqueue/nfqueue.h @@ -0,0 +1,80 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +/* +* Author : Maxim Mamontov +*/ + +#ifndef NFQ_CAP_H +#define NFQ_CAP_H + +#include "stg/plugin.h" +#include "stg/module_settings.h" +#include "stg/logger.h" + +#include +#include + +#include + +class USERS; +class TARIFFS; +class ADMINS; +class TRAFFCOUNTER; +class SETTINGS; + +class TRAFFCOUNTER; + +class NFQ_CAP : public PLUGIN { +public: + NFQ_CAP(); + virtual ~NFQ_CAP() {} + + void SetTraffcounter(TRAFFCOUNTER * tc) { traffCnt = tc; } + + int Start(); + int Stop(); + int Reload() { return 0; } + bool IsRunning() { return isRunning; } + + void SetSettings(const MODULE_SETTINGS & s) { settings = s; } + int ParseSettings(); + + const std::string & GetStrError() const { return errorStr; } + std::string GetVersion() const; + uint16_t GetStartPosition() const { return 40; } + uint16_t GetStopPosition() const { return 40; } + +private: + NFQ_CAP(const NFQ_CAP & rvalue); + NFQ_CAP & operator=(const NFQ_CAP & rvalue); + + static void * Run(void *); + + mutable std::string errorStr; + + pthread_t thread; + bool nonstop; + bool isRunning; + MODULE_SETTINGS settings; + + TRAFFCOUNTER * traffCnt; + + PLUGIN_LOGGER logger; +}; +//----------------------------------------------------------------------------- + +#endif -- 2.44.2 From 7d8cd97c12ce291be0da9e16e4c1d136020a246d Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sun, 8 Jun 2014 12:54:52 +0300 Subject: [PATCH 15/16] Small fixes. Conflicts: projects/stargazer/plugins/capture/pcap/pcap_cap.cpp --- .../plugins/capture/cap_debug/debug_cap.cpp | 2 +- .../plugins/capture/cap_nf/cap_nf.cpp | 22 +++++++++---------- .../stargazer/plugins/capture/cap_nf/cap_nf.h | 2 +- .../capture/divert_freebsd/divert_cap.cpp | 10 ++++----- .../capture/ether_freebsd/ether_cap.cpp | 8 +++---- .../plugins/capture/ether_linux/ether_cap.cpp | 8 +++---- .../plugins/capture/ipq_linux/ipq_cap.cpp | 2 +- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/projects/stargazer/plugins/capture/cap_debug/debug_cap.cpp b/projects/stargazer/plugins/capture/cap_debug/debug_cap.cpp index 6ec8c342..480ef202 100644 --- a/projects/stargazer/plugins/capture/cap_debug/debug_cap.cpp +++ b/projects/stargazer/plugins/capture/cap_debug/debug_cap.cpp @@ -81,7 +81,7 @@ RAW_PACKET MakeTCPPacket(const char * src, uint16_t len); std::string DEBUG_CAP::GetVersion() const { -return "Debug_cap v.0.01a"; +return "cap_debug v.0.01a"; } //----------------------------------------------------------------------------- DEBUG_CAP::DEBUG_CAP() diff --git a/projects/stargazer/plugins/capture/cap_nf/cap_nf.cpp b/projects/stargazer/plugins/capture/cap_nf/cap_nf.cpp index 41ad9fae..8c4fdc2d 100644 --- a/projects/stargazer/plugins/capture/cap_nf/cap_nf.cpp +++ b/projects/stargazer/plugins/capture/cap_nf/cap_nf.cpp @@ -39,7 +39,7 @@ $Author: faust $ #include -#include "stg/common.h" +#include "stg/common.h" #include "stg/raw_ip_packet.h" #include "stg/traffcounter.h" #include "stg/plugin_creator.h" @@ -123,7 +123,7 @@ if (portU > 0) runningUDP = false; CloseUDP(); errorStr = "Cannot create UDP thread"; - logger("Cannot create UDP thread."); + logger("Cannot create UDP thread."); printfd(__FILE__, "Error: Cannot create UDP thread\n"); return -1; } @@ -139,7 +139,7 @@ if (portT > 0) { runningTCP = false; CloseTCP(); - logger("Cannot create TCP thread."); + logger("Cannot create TCP thread."); errorStr = "Cannot create TCP thread"; printfd(__FILE__, "Error: Cannot create TCP thread\n"); return -1; @@ -168,7 +168,7 @@ if (portU && !stoppedUDP) if (pthread_kill(tidUDP, SIGUSR1)) { errorStr = "Error sending signal to UDP thread"; - logger("Error sending sugnal to UDP thread."); + logger("Error sending sugnal to UDP thread."); printfd(__FILE__, "Error: Error sending signal to UDP thread\n"); return -1; } @@ -193,12 +193,12 @@ if (portT && !stoppedTCP) if (pthread_kill(tidTCP, SIGUSR1)) { errorStr = "Error sending signal to TCP thread"; - logger("Error sending signal to TCP thread."); + logger("Error sending signal to TCP thread."); printfd(__FILE__, "Error: Error sending signal to TCP thread\n"); return -1; } printfd(__FILE__, "TCP thread NOT stopped\n"); - logger("Cannot stop TCP thread."); + logger("Cannot stop TCP thread."); } } return 0; @@ -283,10 +283,10 @@ while (cap->runningUDP) break; if (res < 0) - { - cap->logger("recvfrom error: %s", strerror(errno)); - continue; - } + { + cap->logger("recvfrom error: %s", strerror(errno)); + continue; + } if (res == 0) // EOF { @@ -334,7 +334,7 @@ while (cap->runningTCP) if (sd <= 0) { if (sd < 0) - cap->logger("accept error: %s", strerror(errno)); + cap->logger("accept error: %s", strerror(errno)); continue; } diff --git a/projects/stargazer/plugins/capture/cap_nf/cap_nf.h b/projects/stargazer/plugins/capture/cap_nf/cap_nf.h index 23f7d7db..bcb8b743 100644 --- a/projects/stargazer/plugins/capture/cap_nf/cap_nf.h +++ b/projects/stargazer/plugins/capture/cap_nf/cap_nf.h @@ -39,7 +39,7 @@ $Author: faust $ #include "stg/module_settings.h" #include "stg/logger.h" -#define VERSION "CAP_NF v. 0.4" +#define VERSION "cap_nf v. 0.4" #define START_POS 40 #define STOP_POS 40 diff --git a/projects/stargazer/plugins/capture/divert_freebsd/divert_cap.cpp b/projects/stargazer/plugins/capture/divert_freebsd/divert_cap.cpp index 96476d4e..41817d92 100644 --- a/projects/stargazer/plugins/capture/divert_freebsd/divert_cap.cpp +++ b/projects/stargazer/plugins/capture/divert_freebsd/divert_cap.cpp @@ -80,7 +80,7 @@ return dcc.GetPlugin(); //----------------------------------------------------------------------------- std::string DIVERT_CAP::GetVersion() const { -return "Divert_cap v.1.0"; +return "cap_divert v.1.0"; } //----------------------------------------------------------------------------- DIVERT_CAP::DIVERT_CAP() @@ -147,7 +147,7 @@ if (isRunning) if (pthread_kill(thread, SIGINT)) { errorStr = "Cannot kill thread."; - logger("Cannot send signal to thread."); + logger("Cannot send signal to thread."); printfd(__FILE__, "Cannot kill thread\n"); return -1; } @@ -262,10 +262,10 @@ if ((bytes = recvfrom (cddiv.sock, buf, BUFF_LEN, *iface = cddiv.iface; if (!disableForwarding) - { + { if (sendto(cddiv.sock, buf, bytes, 0, (struct sockaddr*)&divertaddr, divertaddrSize) < 0) - logger("sendto error: %s", strerror(errno)); - } + logger("sendto error: %s", strerror(errno)); + } } else { diff --git a/projects/stargazer/plugins/capture/ether_freebsd/ether_cap.cpp b/projects/stargazer/plugins/capture/ether_freebsd/ether_cap.cpp index 72e7f73b..254fd3f9 100644 --- a/projects/stargazer/plugins/capture/ether_freebsd/ether_cap.cpp +++ b/projects/stargazer/plugins/capture/ether_freebsd/ether_cap.cpp @@ -117,7 +117,7 @@ return iface[num]; //----------------------------------------------------------------------------- std::string BPF_CAP::GetVersion() const { -return "bpf_cap v.1.0"; +return "cap_bpf v.1.0"; } //----------------------------------------------------------------------------- BPF_CAP::BPF_CAP() @@ -131,7 +131,7 @@ BPF_CAP::BPF_CAP() capSock(-1), settings(), traffCnt(NULL), - logger(GetPluginLogger(GetStgLogger(), "cap_ether")) + logger(GetPluginLogger(GetStgLogger(), "cap_bpf")) { } //----------------------------------------------------------------------------- @@ -197,7 +197,7 @@ if (isRunning) if (pthread_kill(thread, SIGINT)) { errorStr = "Cannot kill thread."; - logger("Cannot send signal to thread."); + logger("Cannot send signal to thread."); printfd(__FILE__, "Cannot kill thread\n"); return -1; } @@ -347,7 +347,7 @@ if (bd->canRead) bd->r = read(bd->fd, bd->buffer, BUFF_LEN); if (bd->r < 0) { - logger("read error: %s", strerror(errno)); + logger("read error: %s", strerror(errno)); struct timespec ts = {0, 20000000}; nanosleep(&ts, NULL); return -1; diff --git a/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp b/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp index a97fa8e7..fd83c485 100644 --- a/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp +++ b/projects/stargazer/plugins/capture/ether_linux/ether_cap.cpp @@ -71,10 +71,10 @@ return ecc.GetPlugin(); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- -//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- std::string ETHER_CAP::GetVersion() const { -return "Ether_cap v.1.2"; +return "cap_ether v.1.2"; } //----------------------------------------------------------------------------- ETHER_CAP::ETHER_CAP() @@ -132,7 +132,7 @@ if (isRunning) if (pthread_kill(thread, SIGUSR1)) { errorStr = "Cannot kill thread."; - logger("Cannot send signal to thread."); + logger("Cannot send signal to thread."); return -1; } for (int i = 0; i < 25 && isRunning; ++i) @@ -143,7 +143,7 @@ if (isRunning) if (isRunning) { errorStr = "ETHER_CAP not stopped."; - logger("Cannot stop thread."); + logger("Cannot stop thread."); printfd(__FILE__, "Cannot stop thread\n"); return -1; } diff --git a/projects/stargazer/plugins/capture/ipq_linux/ipq_cap.cpp b/projects/stargazer/plugins/capture/ipq_linux/ipq_cap.cpp index 05599306..45ca9b1f 100644 --- a/projects/stargazer/plugins/capture/ipq_linux/ipq_cap.cpp +++ b/projects/stargazer/plugins/capture/ipq_linux/ipq_cap.cpp @@ -58,7 +58,7 @@ return icc.GetPlugin(); //----------------------------------------------------------------------------- std::string IPQ_CAP::GetVersion() const { -return "ipq_cap v.1.2"; +return "cap_ipq v.1.2"; } //----------------------------------------------------------------------------- IPQ_CAP::IPQ_CAP() -- 2.44.2 From 9a060830dcc1d1ae3e557b56e937fb2966dd6337 Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Sun, 8 Jun 2014 13:33:42 +0300 Subject: [PATCH 16/16] Implemented NFQ capturing. --- .../plugins/capture/nfqueue/nfqueue.cpp | 91 +++++++++++++++++++ .../plugins/capture/nfqueue/nfqueue.h | 8 ++ 2 files changed, 99 insertions(+) diff --git a/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp b/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp index a007c890..245fc649 100644 --- a/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp +++ b/projects/stargazer/plugins/capture/nfqueue/nfqueue.cpp @@ -25,6 +25,14 @@ #include "stg/common.h" #include "stg/raw_ip_packet.h" +extern "C" { + +#include /* Defines verdicts (NF_ACCEPT, etc) */ +#include + +} + +#include // ntohl #include //----------------------------------------------------------------------------- @@ -32,7 +40,36 @@ //----------------------------------------------------------------------------- namespace { + PLUGIN_CREATOR ncc; + +int callback(struct nfq_q_handle * /*queueHandle*/, struct nfgenmsg * /*msg*/, + struct nfq_data * nfqData, void *data) +{ +int id = 0; + +struct nfqnl_msg_packet_hdr * packetHeader = nfq_get_msg_packet_hdr(nfqData); +if (packetHeader == NULL) + return 0; + +id = ntohl(packetHeader->packet_id); + +unsigned char * payload = NULL; + +if (nfq_get_payload(nfqData) < 0) + return id; + +RAW_PACKET packet; + +memcpy(&packet.rawPacket, payload, sizeof(ip.rawPacket)); + +NFQ_CAP * cap = static_cast(data); + +cap->Process(packet); + +return nfq_set_verdict(qh, id, NF_ACCEPT, 0, NULL); +} + } extern "C" PLUGIN * GetPlugin(); @@ -71,6 +108,43 @@ int NFQ_CAP::Start() if (isRunning) return 0; +nfqHandle = nfq_open(); +if (nfqHandle == NULL) + { + errorStr = "Failed to initialize netfilter queue."; + logger(errorStr); + return -1; + } + +if (nfq_unbind_pf(nfqHandle, AF_INET) < 0) + { + errorStr = "Failed to unbind netfilter queue from IP handling."; + logger(errorStr); + return -1; + } + +if (nfq_bind_pf(nfqHandle, AF_INET) < 0) + { + errorStr = "Failed to bind netfilter queue to IP handling."; + logger(errorStr); + return -1; + } + +queueHandle = nfq_create_queue(nfqHandle, queueNumber, &Callback, this); +if (queueHandle == NULL) + { + errorStr = "Failed to create queue " + x2str(queueNumber) + "."; + logger(errorStr); + return -1; + } + +if (nfq_set_mode(queueHandle, NFQNL_COPY_PACKET, 0xffFF) < 0) + { + errorStr = "Failed to set queue " + x2str(queueNumber) + " mode."; + logger(errorStr); + return -1; + } + nonstop = true; if (pthread_create(&thread, NULL, Run, this)) @@ -122,6 +196,9 @@ if (isRunning) pthread_join(thread, NULL); +nfq_destroy_queue(queueHandle); +nfq_close(nfqHandle); + return 0; } //----------------------------------------------------------------------------- @@ -134,8 +211,22 @@ pthread_sigmask(SIG_BLOCK, &signalSet, NULL); NFQ_CAP * dc = static_cast(d); dc->isRunning = true; +int fd = nfq_fd(nfqHandle); +char buf[4096]; + while (dc->nonstop) { + if (!WaitPackets(fd)) + continue; + + int rv = read(fd, buf, sizeof(buf), 0); + if (rv < 0) + { + errorStr = "Read error: " + strerror(errno); + logger(errorStr); + break; + } + nfq_handle_packet(nfqHandle, buf, rv); } dc->isRunning = false; diff --git a/projects/stargazer/plugins/capture/nfqueue/nfqueue.h b/projects/stargazer/plugins/capture/nfqueue/nfqueue.h index 02452bb8..45342be0 100644 --- a/projects/stargazer/plugins/capture/nfqueue/nfqueue.h +++ b/projects/stargazer/plugins/capture/nfqueue/nfqueue.h @@ -38,6 +38,9 @@ class SETTINGS; class TRAFFCOUNTER; +struct nfq_handle; +struct nfq_q_handle; + class NFQ_CAP : public PLUGIN { public: NFQ_CAP(); @@ -58,6 +61,8 @@ public: uint16_t GetStartPosition() const { return 40; } uint16_t GetStopPosition() const { return 40; } + void Process(const RAW_PACKET & packet) { traffCnt->Process(packet); } + private: NFQ_CAP(const NFQ_CAP & rvalue); NFQ_CAP & operator=(const NFQ_CAP & rvalue); @@ -71,6 +76,9 @@ private: bool isRunning; MODULE_SETTINGS settings; + struct nfq_handle * nfqHandle; + struct nfq_q_handle * queueHandle; + TRAFFCOUNTER * traffCnt; PLUGIN_LOGGER logger; -- 2.44.2