#include "m_spanningtree/link.h"
#include "m_spanningtree/treesocket.h"
#include "m_spanningtree/rconnect.h"
+#include "m_spanningtree/rsquit.h"
-/* $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 */
+/* $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 m_spanningtree/rsquit.h */
ModuleSpanningTree::ModuleSpanningTree(InspIRCd* Me)
: Module(Me), max_local(0), max_global(0)
Utils = new SpanningTreeUtilities(Me, this);
command_rconnect = new cmd_rconnect(ServerInstance, this, Utils);
ServerInstance->AddCommand(command_rconnect);
+ command_rsquit = new cmd_rsquit(ServerInstance, this, Utils);
+ ServerInstance->AddCommand(command_rsquit);
if (Utils->EnableTimeSync)
{
SyncTimer = new TimeSyncTimer(ServerInstance, this);
}
}
}
- user->WriteServ("251 %s :There are %d users and %d invisible on %d servers",user->nick,n_users-ServerInstance->InvisibleUserCount(),ServerInstance->InvisibleUserCount(),ulined_count ? this->CountServs() - ulined_count : this->CountServs());
+ user->WriteServ("251 %s :There are %d users and %d invisible on %d servers",user->nick,
+ n_users-ServerInstance->InvisibleUserCount(),
+ ServerInstance->InvisibleUserCount(),
+ ulined_count ? this->CountServs() - ulined_count : this->CountServs());
+
if (ServerInstance->OperCount())
user->WriteServ("252 %s %d :operator(s) online",user->nick,ServerInstance->OperCount());
+
if (ServerInstance->UnregisteredUserCount())
user->WriteServ("253 %s %d :unknown connections",user->nick,ServerInstance->UnregisteredUserCount());
+
if (ServerInstance->ChannelCount())
user->WriteServ("254 %s %d :channels formed",user->nick,ServerInstance->ChannelCount());
+
user->WriteServ("255 %s :I have %d clients and %d servers",user->nick,ServerInstance->LocalUserCount(),ulined_local_count ? this->CountLocalServs() - ulined_local_count : this->CountLocalServs());
user->WriteServ("265 %s :Current Local Users: %d Max: %d",user->nick,ServerInstance->LocalUserCount(),max_local);
user->WriteServ("266 %s :Current Global Users: %d Max: %d",user->nick,n_users,max_global);
const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current)
{
time_t secs_up = ServerInstance->Time() - Current->age;
+
+#ifndef WIN32
+ return (" [Up: " + TimeToStr(secs_up) + " Lag: "+ConvToStr(Current->rtt)+"ms]");
+#else
return (" [Up: " + TimeToStr(secs_up) + " Lag: "+ConvToStr(Current->rtt)+"s]");
+#endif
}
// WARNING: NOT THREAD SAFE - DONT GET ANY SMART IDEAS.
/* Send it out remotely, generate no reply yet */
TreeServer* s = Utils->FindServerMask(parameters[0]);
if (s)
+ {
+ params[0] = s->GetName();
Utils->DoOneToOne(user->nick, "MOTD", params, s->GetName());
+ }
else
user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]);
return 1;
if (pcnt > 0)
{
if (match(ServerInstance->Config->ServerName, parameters[0]))
- return 1;
+ return 0;
/* Remote ADMIN, the server is within the 1st parameter */
std::deque<std::string> params;
/* Send it out remotely, generate no reply yet */
TreeServer* s = Utils->FindServerMask(parameters[0]);
if (s)
+ {
+ params[0] = s->GetName();
Utils->DoOneToOne(user->nick, "ADMIN", params, s->GetName());
+ }
else
user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]);
return 1;
int ModuleSpanningTree::HandleModules(const char** parameters, int pcnt, userrec* user)
{
- if (match(ServerInstance->Config->ServerName, parameters[0]))
- return 1;
+ if (pcnt > 0)
+ {
+ if (match(ServerInstance->Config->ServerName, parameters[0]))
+ return 0;
- std::deque<std::string> params;
- params.push_back(parameters[0]);
- TreeServer* s = Utils->FindServerMask(parameters[0]);
- if (s)
- Utils->DoOneToOne(user->nick, "MODULES", params, s->GetName());
- else
- user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]);
- return 1;
+ std::deque<std::string> params;
+ params.push_back(parameters[0]);
+ TreeServer* s = Utils->FindServerMask(parameters[0]);
+ if (s)
+ {
+ params[0] = s->GetName();
+ Utils->DoOneToOne(user->nick, "MODULES", params, s->GetName());
+ }
+ else
+ user->WriteServ( "402 %s %s :No such server", user->nick, parameters[0]);
+ return 1;
+ }
+ return 0;
}
int ModuleSpanningTree::HandleStats(const char** parameters, int pcnt, userrec* user)
sock->Squit(s,std::string("Server quit by ") + user->GetFullRealHost());
ServerInstance->SE->DelFd(sock);
sock->Close();
- delete sock;
}
else
{
- /* route it */
- std::deque<std::string> params;
- params.push_back(parameters[0]);
- params.push_back(std::string(":Server quit by ") + user->GetFullRealHost());
- Utils->DoOneToOne(user->nick, "RSQUIT", params, parameters[0]);
+ if (IS_LOCAL(user))
+ user->WriteServ("NOTICE %s :*** WARNING: Using SQUIT to split remote servers is deprecated. Please use RSQUIT instead.",user->nick);
}
}
else
if (serv->AnsweredLastPing())
{
sock->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" PING "+serv->GetName());
- serv->SetNextPingTime(curtime + 60);
+ serv->SetNextPingTime(curtime + Utils->PingFreq);
serv->LastPing = curtime;
+#ifndef WIN32
+ timeval t;
+ gettimeofday(&t, NULL);
+ long ts = (t.tv_sec * 1000) + (t.tv_usec / 1000);
+ serv->LastPingMsec = ts;
+#endif
serv->Warned = false;
}
else
sock->Squit(serv,"Ping timeout");
ServerInstance->SE->DelFd(sock);
sock->Close();
- delete sock;
return;
}
}
- else if ((Utils->PingWarnTime) && (!serv->Warned) && (curtime >= serv->NextPingTime() - (60 - Utils->PingWarnTime)) && (!serv->AnsweredLastPing()))
+ else if ((Utils->PingWarnTime) && (!serv->Warned) && (curtime >= serv->NextPingTime() - (Utils->PingFreq - 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);
ipvalid = false;
}
else
+#endif
{
in_addr n;
if (inet_aton(x->IPAddr.c_str(),&n) < 1)
ipvalid = false;
}
-#else
- in_addr n;
- if (inet_aton(x->IPAddr.c_str(),&n) < 1)
- ipvalid = false;
-#endif
/* Do we already have an IP? If so, no need to resolve it. */
if (ipvalid)
for (unsigned int i = 0; i < Utils->Bindings.size(); i++)
{
- /*
- * XXX - todo:
- * we need to remove duplicate ports from this list, and possibly also
- * show the correct number of servers on the port.
- *
- * XXX also, this doesn't currently work, as something is not initialising ->port, so it's 0 all the time.
- *
- */
- if (Utils->Bindings[i]->port)
- {
- results.push_back(ConvToStr(ServerInstance->Config->ServerName) + " 249 "+user->nick+" :p:"+ConvToStr(Utils->Bindings[i]->port)+" (X servers) "+
- ServerInstance->Config->ports[i]->GetDescription());
- }
+ std::string ip = Utils->Bindings[i]->IP;
+ if (ip.empty())
+ ip = "*";
+
+ std::string transport("plaintext");
+ if (Utils->Bindings[i]->GetHook())
+ transport = InspSocketNameRequest(this, Utils->Bindings[i]->GetHook()).Send();
+
+ results.push_back(ConvToStr(ServerInstance->Config->ServerName) + " 249 "+user->nick+" :" + ip + ":" + ConvToStr(Utils->Bindings[i]->port)+
+ " (server, " + transport + ")");
}
}
return 0;
{
std::deque<std::string> params;
params.push_back(channel->name);
- if (partmessage != "")
+ if (!partmessage.empty())
params.push_back(":"+partmessage);
Utils->DoOneToMany(user->nick,"PART",params);
}
}
}
-void ModuleSpanningTree::OnRemoteKill(userrec* source, userrec* dest, const std::string &reason)
+void ModuleSpanningTree::OnRemoteKill(userrec* source, userrec* dest, const std::string &reason, const std::string &operreason)
{
std::deque<std::string> params;
+ params.push_back(":"+reason);
+ Utils->DoOneToMany(dest->nick,"OPERQUIT",params);
+ params.clear();
params.push_back(dest->nick);
params.push_back(":"+reason);
+ dest->SetOperQuit(operreason);
Utils->DoOneToMany(source->nick,"KILL",params);
}
void ModuleSpanningTree::OnRehash(userrec* user, const std::string ¶meter)
{
- if (parameter != "")
+ if (!parameter.empty())
{
std::deque<std::string> params;
params.push_back(parameter);
return PRIORITY_LAST;
}
-class ModuleSpanningTreeFactory : public ModuleFactory
-{
- public:
- ModuleSpanningTreeFactory()
- {
- }
-
- ~ModuleSpanningTreeFactory()
- {
- }
-
- virtual Module * CreateModule(InspIRCd* Me)
- {
- return new ModuleSpanningTree(Me);
- }
-
-};
+MODULE_INIT(ModuleSpanningTree)
-
-extern "C" DllExport void * init_module( void )
-{
- return new ModuleSpanningTreeFactory;
-}