X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Fmain.cpp;h=ea01bb2c52eb7df44730f0e2d0e9d26346ea2380;hb=5b6462f4f60f743ab63480d76d40a40c6b0453d1;hp=97da561b6a5c17e0083f64f0d9b227798197a247;hpb=d05aafc2281b4885946f71b908e6fd977c1fe730;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 97da561b6..ea01bb2c5 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -13,6 +13,7 @@ /* $ModDesc: Provides a spanning tree server link protocol */ +#include "inspircd.h" #include "configreader.h" #include "users.h" #include "channels.h" @@ -20,7 +21,6 @@ #include "commands/cmd_whois.h" #include "commands/cmd_stats.h" #include "socket.h" -#include "inspircd.h" #include "wildcard.h" #include "xline.h" #include "transport.h" @@ -37,7 +37,7 @@ /* $ModDep: m_spanningtree/timesynctimer.h m_spanningtree/resolvers.h m_spanningtree/main.h m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/link.h m_spanningtree/treesocket.h m_spanningtree/rconnect.h */ ModuleSpanningTree::ModuleSpanningTree(InspIRCd* Me) - : Module::Module(Me), max_local(0), max_global(0) + : Module(Me), max_local(0), max_global(0) { ServerInstance->UseInterface("InspSocketHook"); Utils = new SpanningTreeUtilities(Me, this); @@ -147,19 +147,24 @@ void ModuleSpanningTree::HandleLusers(const char** parameters, int pcnt, userrec return; } -const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current) +std::string ModuleSpanningTree::TimeToStr(time_t secs) { - time_t secs_up = ServerInstance->Time() - Current->age; - time_t mins_up = secs_up / 60; + time_t mins_up = secs / 60; time_t hours_up = mins_up / 60; time_t days_up = hours_up / 24; - secs_up = secs_up % 60; + secs = secs % 60; mins_up = mins_up % 60; hours_up = hours_up % 24; - return (" [Up: "+ (days_up ? (ConvToStr(days_up) + "d") : std::string("")) + return ((days_up ? (ConvToStr(days_up) + "d") : std::string("")) + (hours_up ? (ConvToStr(hours_up) + "h") : std::string("")) + (mins_up ? (ConvToStr(mins_up) + "m") : std::string("")) - + ConvToStr(secs_up) + "s Lag: "+ConvToStr(Current->rtt)+"s]"); + + ConvToStr(secs) + "s"); +} + +const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current) +{ + time_t secs_up = ServerInstance->Time() - Current->age; + return (" [Up: " + TimeToStr(secs_up) + " Lag: "+ConvToStr(Current->rtt)+"s]"); } // WARNING: NOT THREAD SAFE - DONT GET ANY SMART IDEAS. @@ -184,6 +189,9 @@ void ModuleSpanningTree::ShowMap(TreeServer* Current, userrec* user, int depth, } float percent; char text[128]; + /* Neat and tidy default values, as we're dealing with a matrix not a simple string */ + memset(text, 0, 128); + if (ServerInstance->clientlist->size() == 0) { // If there are no users, WHO THE HELL DID THE /MAP?!?!?! percent = 0; @@ -460,11 +468,12 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime) sock->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" PING "+serv->GetName()); serv->SetNextPingTime(curtime + 60); serv->LastPing = curtime; + serv->Warned = false; } else { - // they didnt answer, boot them - ServerInstance->SNO->WriteToSnoMask('l',"Server \002%s\002 pinged out",serv->GetName().c_str()); + /* they didnt answer, boot them */ + sock->SendError("Ping timeout"); sock->Squit(serv,"Ping timeout"); ServerInstance->SE->DelFd(sock); sock->Close(); @@ -472,8 +481,20 @@ void ModuleSpanningTree::DoPingChecks(time_t curtime) return; } } + else if ((Utils->PingWarnTime) && (!serv->Warned) && (curtime >= serv->NextPingTime() - (60 - Utils->PingWarnTime)) && (!serv->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.", serv->GetName().c_str(), Utils->PingWarnTime); + serv->Warned = true; + } } } + + /* Cancel remote burst mode on any servers which still have it enabled due to latency/lack of data. + * This prevents lost REMOTECONNECT notices + */ + for (server_hash::iterator i = Utils->serverlist.begin(); i != Utils->serverlist.end(); i++) + Utils->SetRemoteBursting(i->second, false); } void ModuleSpanningTree::ConnectServer(Link* x) @@ -869,7 +890,7 @@ void ModuleSpanningTree::OnBackgroundTimer(time_t curtime) DoPingChecks(curtime); } -void ModuleSpanningTree::OnUserJoin(userrec* user, chanrec* channel) +void ModuleSpanningTree::OnUserJoin(userrec* user, chanrec* channel, bool &silent) { // Only do this for local users if (IS_LOCAL(user)) @@ -886,8 +907,7 @@ void ModuleSpanningTree::OnUserJoin(userrec* user, chanrec* channel) Utils->DoOneToMany(ServerInstance->Config->ServerName,"FJOIN",params); /* First user in, sync the modes for the channel */ params.pop_back(); - /* This is safe, all inspircd servers default to +nt */ - params.push_back("+nt"); + params.push_back(channel->ChanModes(true)); Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",params); } else @@ -920,7 +940,7 @@ void ModuleSpanningTree::OnChangeName(userrec* user, const std::string &gecos) Utils->DoOneToMany(user->nick,"FNAME",params); } -void ModuleSpanningTree::OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage) +void ModuleSpanningTree::OnUserPart(userrec* user, chanrec* channel, const std::string &partmessage, bool &silent) { if (IS_LOCAL(user)) { @@ -990,7 +1010,7 @@ void ModuleSpanningTree::OnUserPostNick(userrec* user, const std::string &oldnic } } -void ModuleSpanningTree::OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason) +void ModuleSpanningTree::OnUserKick(userrec* source, userrec* user, chanrec* chan, const std::string &reason, bool &silent) { if ((source) && (IS_LOCAL(source))) { @@ -1243,6 +1263,8 @@ void ModuleSpanningTree::OnEvent(Event* event) if (a) { ourTS = a->age; + Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODE",*params); + return; } else { @@ -1250,10 +1272,10 @@ void ModuleSpanningTree::OnEvent(Event* event) if (a) { ourTS = a->age; + params->insert(params->begin() + 1,ConvToStr(ourTS)); + Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",*params); } } - params->insert(params->begin() + 1,ConvToStr(ourTS)); - Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",*params); } else if (event->GetEventID() == "send_mode_explicit") { @@ -1356,7 +1378,7 @@ class ModuleSpanningTreeFactory : public ModuleFactory }; -extern "C" void * init_module( void ) +extern "C" DllExport void * init_module( void ) { return new ModuleSpanningTreeFactory; }