summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/inspircd.conf.example10
-rw-r--r--include/cull_list.h10
-rw-r--r--src/cull_list.cpp31
-rw-r--r--src/modules/m_spanningtree/treeserver.cpp3
-rw-r--r--src/modules/m_spanningtree/treesocket1.cpp6
-rw-r--r--src/modules/m_spanningtree/utils.cpp1
-rw-r--r--src/modules/m_spanningtree/utils.h3
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;