diff options
-rw-r--r-- | docs/inspircd.conf.example | 10 | ||||
-rw-r--r-- | include/cull_list.h | 10 | ||||
-rw-r--r-- | src/cull_list.cpp | 31 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treeserver.cpp | 3 | ||||
-rw-r--r-- | src/modules/m_spanningtree/treesocket1.cpp | 6 | ||||
-rw-r--r-- | src/modules/m_spanningtree/utils.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_spanningtree/utils.h | 3 |
7 files changed, 61 insertions, 3 deletions
diff --git a/docs/inspircd.conf.example b/docs/inspircd.conf.example index c3108b9a7..2ab450c2e 100644 --- a/docs/inspircd.conf.example +++ b/docs/inspircd.conf.example @@ -859,6 +859,15 @@ # +b, as it may break some features in popular # # clients such as mIRC. # # # +# quietbursts - When synching or splitting from the network, a # +# server can generate a lot of connect and quit # +# snotices to the +C and +Q snomasks. Setting this # +# value to yes squelches those messages, which can # +# make them more useful for opers, however it will # +# degrade their use by certain third party programs # +# such as BOPM which rely on them to scan users when # +# a split heals in certain configurations. # +# # <options prefixquit="Quit: " loglevel="default" @@ -887,6 +896,7 @@ disablehmac="no" hostintopic="yes" hidemodes="eI" + quietbursts="yes" allowhalfop="yes"> #-#-#-#-#-#-#-#-#-#-#-#-#-#- TIME SYNC OPTIONS -#-#-#-#-#-#-#-#-#-#-#-# diff --git a/include/cull_list.h b/include/cull_list.h index beafc1e80..bea75c86d 100644 --- a/include/cull_list.h +++ b/include/cull_list.h @@ -42,6 +42,9 @@ class CullItem : public classbase /** Holds the quit reason opers see, if different from users */ std::string oper_reason; + /** Silent items dont generate an snotice. + */ + bool silent; public: /** Constrcutor. * Initializes the CullItem with a user pointer @@ -52,6 +55,9 @@ class CullItem : public classbase CullItem(userrec* u, std::string &r, const char* ro = ""); CullItem(userrec* u, const char* r, const char* ro = ""); + void MakeSilent(); + bool IsSilent(); + ~CullItem(); /** Returns a pointer to the user @@ -111,6 +117,10 @@ class CullList : public classbase void AddItem(userrec* user, std::string &reason, const char* o_reason = ""); void AddItem(userrec* user, const char* reason, const char* o_reason = ""); + /* Turn an item into a silent item + */ + void MakeSilent(userrec* user); + /** Applies the cull list, quitting all the users * on the list with their quit reasons all at once. * This is a very fast operation compared to diff --git a/src/cull_list.cpp b/src/cull_list.cpp index b0bf74ccb..ac842e248 100644 --- a/src/cull_list.cpp +++ b/src/cull_list.cpp @@ -19,6 +19,7 @@ CullItem::CullItem(userrec* u, std::string &r, const char* o_reason) { this->user = u; this->reason = r; + this->silent = false; /* Seperate oper reason not set, use the user reason */ if (*o_reason) this->oper_reason = o_reason; @@ -30,6 +31,7 @@ CullItem::CullItem(userrec* u, const char* r, const char* o_reason) { this->user = u; this->reason = r; + this->silent = false; /* Seperate oper reason not set, use the user reason */ if (*o_reason) this->oper_reason = o_reason; @@ -37,6 +39,16 @@ CullItem::CullItem(userrec* u, const char* r, const char* o_reason) this->oper_reason = r; } +void CullItem::MakeSilent() +{ + this->silent = true; +} + +bool CullItem::IsSilent() +{ + return this->silent; +} + CullItem::~CullItem() { } @@ -78,6 +90,19 @@ void CullList::AddItem(userrec* user, const char* reason, const char* o_reason) } } +void CullList::MakeSilent(userrec* user) +{ + for (std::vector<CullItem>::iterator a = list.begin(); a != list.end(); ++a) + { + if (a->GetUser() == user) + { + a->MakeSilent(); + break; + } + } + return; +} + int CullList::Apply() { int n = list.size(); @@ -141,11 +166,13 @@ int CullList::Apply() if (a->GetUser()->registered == REG_ALL) { if (IS_LOCAL(a->GetUser())) - ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s!%s@%s [%s]",a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); + if (!a->IsSilent()) + ServerInstance->SNO->WriteToSnoMask('q',"Client exiting: %s!%s@%s [%s]",a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); else { if (!ServerInstance->SilentULine(a->GetUser()->server)) - ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s!%s@%s [%s]",a->GetUser()->server,a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); + if (!a->IsSilent()) + ServerInstance->SNO->WriteToSnoMask('Q',"Client exiting on server %s: %s!%s@%s [%s]",a->GetUser()->server,a->GetUser()->nick,a->GetUser()->ident,a->GetUser()->host,oper_reason.c_str()); } a->GetUser()->AddToWhoWas(); } diff --git a/src/modules/m_spanningtree/treeserver.cpp b/src/modules/m_spanningtree/treeserver.cpp index 2bcfecf2b..0c9509ada 100644 --- a/src/modules/m_spanningtree/treeserver.cpp +++ b/src/modules/m_spanningtree/treeserver.cpp @@ -144,6 +144,9 @@ int TreeServer::QuitUsers(const std::string &reason) userrec::QuitUser(ServerInstance, a, "*.net *.split", reason_s); else userrec::QuitUser(ServerInstance, a, reason_s); + + if (this->Utils->quiet_bursts) + ServerInstance->GlobalCulls.MakeSilent(a); } } return time_to_die.size(); diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp index 6176d0201..66d223fa6 100644 --- a/src/modules/m_spanningtree/treesocket1.cpp +++ b/src/modules/m_spanningtree/treesocket1.cpp @@ -1103,7 +1103,11 @@ bool TreeSocket::IntroduceClient(const std::string &source, std::deque<std::stri Instance->AddGlobalClone(_new); - if (!this->Instance->SilentULine(_new->server)) + bool send = (!this->Instance->SilentULine(_new->server)); + if (send) + send = (this->Utils->quiet_bursts && !this->bursting); + + if (send) this->Instance->SNO->WriteToSnoMask('C',"Client connecting at %s: %s!%s@%s [%s]",_new->server,_new->nick,_new->ident,_new->host, _new->GetIPString()); params[7] = ":" + params[7]; diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp index 923308de0..e1026ca94 100644 --- a/src/modules/m_spanningtree/utils.cpp +++ b/src/modules/m_spanningtree/utils.cpp @@ -477,6 +477,7 @@ void SpanningTreeUtilities::ReadConfiguration(bool rebind) EnableTimeSync = Conf->ReadFlag("timesync","enable",0); MasterTime = Conf->ReadFlag("timesync", "master", 0); ChallengeResponse = !Conf->ReadFlag("options", "disablehmac", 0); + quiet_bursts = Conf->ReadFlag("options", "quietbursts", 0); LinkBlocks.clear(); ValidIPs.clear(); for (int j =0; j < Conf->Enumerate("link"); j++) diff --git a/src/modules/m_spanningtree/utils.h b/src/modules/m_spanningtree/utils.h index 2fd53bb43..0e289146b 100644 --- a/src/modules/m_spanningtree/utils.h +++ b/src/modules/m_spanningtree/utils.h @@ -63,6 +63,9 @@ class SpanningTreeUtilities /** Synchronize timestamps between servers */ bool EnableTimeSync; + /** Make snomasks +CQ quiet during bursts and splits + */ + bool quiet_bursts; /** Socket bindings for listening sockets */ std::vector<TreeSocket*> Bindings; |