#include "commands/cmd_whois.h"
#include "commands/cmd_stats.h"
#include "socket.h"
-#include "wildcard.h"
#include "xline.h"
#include "transport.h"
{
TreeServer *s = i->second;
- if (s->bursting)
- {
- unsigned long bursttime = ts - s->StartBurst;
- if (bursttime > 60000) // A minute
- {
- ServerInstance->SNO->WriteToSnoMask('l',"Server \002%s\002 has not finished burst, forcing end of burst.", s->GetName().c_str());
- s->FinishBurst();
- }
- }
-
// Now do PING checks on all servers
TreeServer *mts = Utils->BestRouteTo(s->GetID());
void ModuleSpanningTree::ConnectServer(Link* x)
{
bool ipvalid = true;
+
+ if (InspIRCd::Match(ServerInstance->Config->ServerName, assign(x->Name)))
+ {
+ RemoteMessage(NULL, "CONNECT: Not connecting to myself.");
+ return;
+ }
+
QueryType start_type = DNS_QUERY_A;
#ifdef IPV6
start_type = DNS_QUERY_AAAA;
/* Gave a hook, but it wasnt one we know */
if ((!x->Hook.empty()) && (Utils->hooks.find(x->Hook.c_str()) == Utils->hooks.end()))
return;
- TreeSocket* newsocket = new TreeSocket(Utils, ServerInstance, x->IPAddr,x->Port,false,x->Timeout ? x->Timeout : 10,x->Name.c_str(), x->Bind, x->Hook.empty() ? NULL : Utils->hooks[x->Hook.c_str()]);
+ TreeSocket* newsocket = new TreeSocket(Utils, ServerInstance, x->IPAddr,x->Port, x->Timeout ? x->Timeout : 10,x->Name.c_str(), x->Bind, x->Hook.empty() ? NULL : Utils->hooks[x->Hook.c_str()]);
if (newsocket->GetFd() > -1)
{
/* Handled automatically on success */
}
}
+void ModuleSpanningTree::DoConnectTimeout(time_t curtime)
+{
+ std::vector<Link*> failovers;
+ for (std::map<TreeSocket*, std::pair<std::string, int> >::iterator i = Utils->timeoutlist.begin(); i != Utils->timeoutlist.end(); i++)
+ {
+ TreeSocket* s = i->first;
+ std::pair<std::string, int> p = i->second;
+ if (curtime > s->age + p.second)
+ {
+ ServerInstance->SNO->WriteToSnoMask('l',"CONNECT: Error connecting \002%s\002 (timeout of %d seconds)",p.first.c_str(),p.second);
+ ServerInstance->SE->DelFd(s);
+ s->Close();
+ Link* MyLink = Utils->FindLink(p.first);
+ if (MyLink)
+ failovers.push_back(MyLink);
+ }
+ }
+ /* Trigger failover for each timed out socket */
+ for (std::vector<Link*>::const_iterator n = failovers.begin(); n != failovers.end(); ++n)
+ {
+ Utils->DoFailOver(*n);
+ }
+}
+
int ModuleSpanningTree::HandleVersion(const std::vector<std::string>& parameters, User* user)
{
// we've already checked if pcnt > 0, so this is safe
{
for (std::vector<Link>::iterator x = Utils->LinkBlocks.begin(); x < Utils->LinkBlocks.end(); x++)
{
- if (ServerInstance->MatchText(x->Name.c_str(),parameters[0]))
+ if (InspIRCd::Match(x->Name.c_str(),parameters[0]))
{
+ if (InspIRCd::Match(ServerInstance->Config->ServerName, assign(x->Name)))
+ {
+ RemoteMessage(user, "*** CONNECT: Server \002%s\002 is ME, not connecting.",x->Name.c_str());
+ return 1;
+ }
+
TreeServer* CheckDupe = Utils->FindServer(x->Name.c_str());
if (!CheckDupe)
{
{
AutoConnectServers(curtime);
DoPingChecks(curtime);
+ DoConnectTimeout(curtime);
}
void ModuleSpanningTree::OnUserJoin(User* user, Channel* channel, bool sync, bool &silent)
void ModuleSpanningTree::OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason)
{
+ if (!IS_LOCAL(source)) return; // Only start routing if we're origin.
std::deque<std::string> params;
params.push_back(":"+reason);
Utils->DoOneToMany(dest->uuid,"OPERQUIT",params);
ServerInstance->Logs->Log("remoterehash", DEBUG, "sending out lol");
std::deque<std::string> params;
params.push_back(parameter);
- Utils->DoOneToAllButSender(user ? user->uuid : ServerInstance->Config->GetSID(), "REHASH", params, user ? user->server : ServerInstance->Config->GetSID()); /// Can this take SID?
+ Utils->DoOneToAllButSender(user ? user->uuid : ServerInstance->Config->GetSID(), "REHASH", params, user ? user->server : ServerInstance->Config->ServerName);
}
// Re-read config stuff
ModuleSpanningTree::~ModuleSpanningTree()
{
- /* This will also free the listeners */
delete ServerInstance->PI;
ServerInstance->PI = new ProtocolInterface(ServerInstance);
+ /* This will also free the listeners */
delete Utils;
ServerInstance->Timers->DelTimer(RefreshTimer);
Version ModuleSpanningTree::GetVersion()
{
- return Version(1,2,0,2,VF_VENDOR,API_VERSION);
+ return Version("$Id$", VF_VENDOR, API_VERSION);
}
/* It is IMPORTANT that m_spanningtree is the last module in the chain