X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Fmain.cpp;h=31d8227894205f00edd71f48fcad0ee23b4e623c;hb=0ec19b7ac91eedc83b31c3da733e237bfe28fc48;hp=ce13e5d2523a33cb9d7b0dfb57a983250514921e;hpb=70b835e89eff6fcc47403d7fd7b4782f993ecf21;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index ce13e5d25..31d822789 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -33,6 +33,7 @@ #include "link.h" #include "treesocket.h" #include "commands.h" +#include "translate.h" ModuleSpanningTree::ModuleSpanningTree() : rconnect(this), rsquit(this), map(this) @@ -40,7 +41,6 @@ ModuleSpanningTree::ModuleSpanningTree() , currmembid(0) , DNS(this, "DNS") , loopCall(false) - , SplitInProgress(false) { } @@ -51,7 +51,7 @@ SpanningTreeCommands::SpanningTreeCommands(ModuleSpanningTree* module) away(module), addline(module), delline(module), encap(module), idle(module), nick(module), ping(module), pong(module), push(module), save(module), server(module), squit(module), snonotice(module), - burst(module), endburst(module), sinfo(module) + endburst(module), sinfo(module) { } @@ -153,70 +153,6 @@ std::string ModuleSpanningTree::TimeToStr(time_t secs) + ConvToStr(secs) + "s"); } -void ModuleSpanningTree::DoPingChecks(time_t curtime) -{ - /* - * Cancel remote burst mode on any servers which still have it enabled due to latency/lack of data. - * This prevents lost REMOTECONNECT notices - */ - long ts = ServerInstance->Time() * 1000 + (ServerInstance->Time_ns() / 1000000); - -restart: - for (server_hash::iterator i = Utils->serverlist.begin(); i != Utils->serverlist.end(); i++) - { - TreeServer *s = i->second; - - // Skip myself - if (s->IsRoot()) - continue; - - if (s->GetSocket()->GetLinkState() == DYING) - { - s->GetSocket()->Close(); - goto restart; - } - - // Do not ping servers that are not fully connected yet! - // Servers which are connected to us have IsLocal() == true and if they're fully connected - // then Socket->LinkState == CONNECTED. Servers that are linked to another server are always fully connected. - if (s->IsLocal() && s->GetSocket()->GetLinkState() != CONNECTED) - continue; - - // Now do PING checks on all servers - // Only ping if this server needs one - if (curtime >= s->NextPingTime()) - { - // And if they answered the last - if (s->AnsweredLastPing()) - { - // They did, send a ping to them - s->SetNextPingTime(curtime + Utils->PingFreq); - s->GetSocket()->WriteLine(CmdBuilder("PING").push(s->GetID())); - s->LastPingMsec = ts; - } - else - { - // They didn't answer the last ping, if they are locally connected, get rid of them. - if (s->IsLocal()) - { - TreeSocket* sock = s->GetSocket(); - sock->SendError("Ping timeout"); - sock->Close(); - goto restart; - } - } - } - - // If warn on ping enabled and not warned and the difference is sufficient and they didn't answer the last ping... - if ((Utils->PingWarnTime) && (!s->Warned) && (curtime >= s->NextPingTime() - (Utils->PingFreq - Utils->PingWarnTime)) && (!s->AnsweredLastPing())) - { - /* The server hasnt responded, send a warning to opers */ - ServerInstance->SNO->WriteToSnoMask('l',"Server \002%s\002 has not responded to PING for %d seconds, high latency.", s->GetName().c_str(), Utils->PingWarnTime); - s->Warned = true; - } - } -} - void ModuleSpanningTree::ConnectServer(Autoconnect* a, bool on_timer) { if (!a) @@ -477,7 +413,6 @@ void ModuleSpanningTree::OnUserMessage(User* user, void* dest, int target_type, void ModuleSpanningTree::OnBackgroundTimer(time_t curtime) { AutoConnectServers(curtime); - DoPingChecks(curtime); DoConnectTimeout(curtime); } @@ -582,7 +517,8 @@ void ModuleSpanningTree::OnUserQuit(User* user, const std::string &reason, const // Hide the message if one of the following is true: // - User is being quit due to a netsplit and quietbursts is on // - Server is a silent uline - bool hide = (((this->SplitInProgress) && (Utils->quiet_bursts)) || (user->server->IsSilentULine())); + TreeServer* server = TreeServer::Get(user); + bool hide = (((server->IsDead()) && (Utils->quiet_bursts)) || (server->IsSilentULine())); if (!hide) { ServerInstance->SNO->WriteToSnoMask('Q', "Client exiting on server %s: %s (%s) [%s]", @@ -701,7 +637,7 @@ restart: { sock->SendError("SSL module unloaded"); sock->Close(); - // XXX: The list we're iterating is modified by TreeSocket::Squit() which is called by Close() + // XXX: The list we're iterating is modified by TreeServer::SQuit() which is called by Close() goto restart; } } @@ -757,6 +693,33 @@ ModResult ModuleSpanningTree::OnSetAway(User* user, const std::string &awaymsg) return MOD_RES_PASSTHRU; } +void ModuleSpanningTree::OnMode(User* source, User* u, Channel* c, const Modes::ChangeList& modes, ModeParser::ModeProcessFlag processflags, const std::string& output_mode) +{ + if (processflags & ModeParser::MODE_LOCALONLY) + return; + + if (u) + { + if (u->registered != REG_ALL) + return; + + CmdBuilder params(source, "MODE"); + params.push(u->uuid); + params.push(output_mode); + params.push_raw(Translate::ModeChangeListToParams(modes.getlist())); + params.Broadcast(); + } + else + { + CmdBuilder params(source, "FMODE"); + params.push(c->name); + params.push_int(c->age); + params.push(output_mode); + params.push_raw(Translate::ModeChangeListToParams(modes.getlist())); + params.Broadcast(); + } +} + CullResult ModuleSpanningTree::cull() { if (Utils)