X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_spanningtree%2Futils.h;h=a2f7212f6d0c7c4a65e2e04c419b859a215d1c13;hb=ea258053f694ff17980e2f39ea182f3a2de9ba5b;hp=aeb89c6be93cec200be86beebe420c9704a2793b;hpb=b57c7f4e466f72fdd2ac3deca42caa1ea7748338;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_spanningtree/utils.h b/src/modules/m_spanningtree/utils.h index aeb89c6be..a2f7212f6 100644 --- a/src/modules/m_spanningtree/utils.h +++ b/src/modules/m_spanningtree/utils.h @@ -1,59 +1,59 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2007 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * Copyright (C) 2009 Daniel De Graaf + * Copyright (C) 2008 Robin Burchell + * Copyright (C) 2007 Dennis Friis + * Copyright (C) 2007 Craig Edwards * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ -#ifndef __ST__UTIL__ -#define __ST__UTIL__ + +#pragma once #include "inspircd.h" +#include "cachetimer.h" -/* Foward declarations */ class TreeServer; class TreeSocket; class Link; +class Autoconnect; class ModuleSpanningTree; +class SpanningTreeUtilities; +class CmdBuilder; -/* This hash_map holds the hash equivalent of the server - * tree, used for rapid linear lookups. - */ -#ifdef WINDOWS -typedef nspace::hash_map > > server_hash; -#else -typedef nspace::hash_map, irc::StrHashComp> server_hash; -#endif - -typedef std::map TreeServerList; +extern SpanningTreeUtilities* Utils; -/** A group of modules that implement InspSocketHook - * that we can use to hook our server to server connections. +/** Associative container type, mapping server names/ids to TreeServers */ -typedef std::map hookmodules; +typedef TR1NS::unordered_map server_hash; /** Contains helper functions and variables for this module, * and keeps them out of the global namespace */ -class SpanningTreeUtilities +class SpanningTreeUtilities : public classbase { - private: - /** Creator server - */ - InspIRCd* ServerInstance; + CacheRefreshTimer RefreshTimer; + public: + typedef std::set TreeSocketSet; + typedef std::map > TimeoutList; + /** Creator module */ ModuleSpanningTree* Creator; - /** Remote servers that are currently bursting - */ - server_hash RemoteServersBursting; + /** Flatten links and /MAP for non-opers */ bool FlatLinks; @@ -63,15 +63,15 @@ class SpanningTreeUtilities /** Announce TS changes to channels on merge */ bool AnnounceTSChange; - /** Synchronize timestamps between servers + + /** Allow modules marked as VF_OPTCOMMON to be mismatched when linking */ - bool EnableTimeSync; + bool AllowOptCommon; + /** Make snomasks +CQ quiet during bursts and splits */ bool quiet_bursts; - /** Socket bindings for listening sockets - */ - std::vector Bindings; + /* Number of seconds that a server can go without ping * before opers are warned of high latency. */ @@ -88,39 +88,15 @@ class SpanningTreeUtilities /** Hash of currently known server ids */ server_hash sidlist; - /** Hash of servers currently bursting but not initialized as connected + /** List of all outgoing sockets and their timeouts */ - std::map burstingserverlist; + TimeoutList timeoutlist; /** Holds the data from the tags in the conf */ - std::vector LinkBlocks; - /** Holds a bitmask of queued xline types waiting to be applied. - * Will be a mask containing values APPLY_GLINES, APPLY_KLINES, - * APPLY_QLINES and APPLY_ZLINES. + std::vector > LinkBlocks; + /** Holds the data from the tags in the conf */ - int lines_to_apply; - - /** If this is true, this server is the master sync server for time - * synching - e.g. it is the server with its clock correct. It will - * send out the correct time at intervals. - */ - bool MasterTime; - - /** List of module pointers which can provide I/O abstraction - */ - hookmodules hooks; - - /** List of module names which can provide I/O abstraction - */ - std::vector hooknames; - - /** True (default) if we are to use challenge-response HMAC - * to authenticate passwords. - * - * NOTE: This defaults to on, but should be turned off if - * you are linking to an older version of inspircd. - */ - bool ChallengeResponse; + std::vector > AutoconnectBlocks; /** Ping frequency of server to server links */ @@ -128,78 +104,73 @@ class SpanningTreeUtilities /** Initialise utility class */ - SpanningTreeUtilities(InspIRCd* Instance, ModuleSpanningTree* Creator); + SpanningTreeUtilities(ModuleSpanningTree* Creator); + + /** Prepare for class destruction + */ + CullResult cull(); + /** Destroy class and free listeners etc */ ~SpanningTreeUtilities(); + + void RouteCommand(TreeServer* origin, CommandBase* cmd, const parameterlist& parameters, User* user); + /** Send a message from this server to one other local or remote */ - bool DoOneToOne(const std::string &prefix, const std::string &command, std::deque ¶ms, std::string target); - /** Send a message from this server to all but one other, local or remote - */ - bool DoOneToAllButSender(const std::string &prefix, const std::string &command, std::deque ¶ms, std::string omit); + void DoOneToOne(const CmdBuilder& params, Server* target); + /** Send a message from this server to all but one other, local or remote */ - bool DoOneToAllButSender(const char* prefix, const char* command, std::deque ¶ms, std::string omit); - /** Send a message from this server to all others - */ - bool DoOneToMany(const std::string &prefix, const std::string &command, std::deque ¶ms); + void DoOneToAllButSender(const CmdBuilder& params, TreeServer* omit); + /** Send a message from this server to all others */ - bool DoOneToMany(const char* prefix, const char* command, std::deque ¶ms); - /** Send a message from this server to all others, without doing any processing on the command (e.g. send it as-is with colons and all) - */ - bool DoOneToAllButSenderRaw(const std::string &data, const std::string &omit, const std::string &prefix, const irc::string &command, std::deque ¶ms); + void DoOneToMany(const CmdBuilder& params); + /** Read the spanningtree module's tags from the config file */ - void ReadConfiguration(bool rebind); - /** Add a server to the server list for GetListOfServersForChannel + void ReadConfiguration(); + + /** Handle nick collision */ - void AddThisServer(TreeServer* server, TreeServerList &list); + bool DoCollision(User* u, TreeServer* server, time_t remotets, const std::string& remoteident, const std::string& remoteip, const std::string& remoteuid, const char* collidecmd); + /** Compile a list of servers which contain members of channel c */ - void GetListOfServersForChannel(Channel* c, TreeServerList &list, char status, const CUList &exempt_list); - /** Find a server by name + void GetListOfServersForChannel(Channel* c, TreeSocketSet& list, char status, const CUList& exempt_list); + + /** Find a server by name or SID */ TreeServer* FindServer(const std::string &ServerName); + /** Find server by SID */ TreeServer* FindServerID(const std::string &id); - /** Find a remote bursting server by name - */ - TreeServer* FindRemoteBurstServer(TreeServer* Server); - /** Set a remote server to bursting or not bursting - */ - void SetRemoteBursting(TreeServer* Server, bool bursting); - /** Find a route to a server by name + + /** Find a server based on a target string. + * @param target Target string where a command should be routed to. May be a server name, a sid, a nickname or a uuid. */ - TreeServer* BestRouteTo(const std::string &ServerName); + TreeServer* FindRouteTarget(const std::string& target); + /** Find a server by glob mask */ TreeServer* FindServerMask(const std::string &ServerName); - /** Returns true if this is a server name we recognise - */ - bool IsServer(const std::string &ServerName); - /** Attempt to connect to the failover link of link x - */ - void DoFailOver(Link* x); + /** Find a link tag from a server name */ Link* FindLink(const std::string& name); + /** Refresh the IP cache used for allowing inbound connections */ void RefreshIPCache(); - TreeSocket* FindBurstingServer(const std::string &ServerName); - - void AddBurstingServer(const std::string &ServerName, TreeSocket* s); - - void DelBurstingServer(TreeSocket* s); - - /** Return true if str looks like a server ID - * @param string to check against + /** Sends a PRIVMSG or a NOTICE to a channel obeying an exempt list and an optional prefix */ - bool IsSID(const std::string &str); + void SendChannelMessage(const std::string& prefix, Channel* target, const std::string& text, char status, const CUList& exempt_list, const char* message_type, TreeSocket* omit = NULL); }; -#endif +inline void SpanningTreeUtilities::DoOneToMany(const CmdBuilder& params) +{ + DoOneToAllButSender(params, NULL); +}