Permalink
Browse files

added econ functionality

  • Loading branch information...
1 parent 65d312f commit 2ba6fbd7314bfce9cedf93e6f2b1e7f8b5ac7a84 @heinrich5991 heinrich5991 committed with oy Jul 2, 2011
No changes.
View
No changes.
@@ -317,8 +317,15 @@ int CServer::Init()
m_aClients[i].m_Snapshots.Init();
}
+ for(int i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++)
+ {
+ m_aEconClients[i].m_State = CEconClient::STATE_EMPTY;
+ }
+
m_CurrentGameTick = 0;
+ m_UseEcon = 0;
+
return 0;
}
@@ -611,6 +618,30 @@ int CServer::DelClientCallback(int ClientID, const char *pReason, void *pUser)
return 0;
}
+int CServer::NewConsoleClientCallback(int EconID, void *pUser)
+{
+ CServer *pThis = (CServer *)pUser;
+ pThis->m_aEconClients[EconID].m_State = CEconClient::STATE_CONNECTED;
+ pThis->m_NetConsole.SetTimeout(EconID, g_Config.m_SvEconAuthTimeout);
+ return 0;
+}
+
+int CServer::DelConsoleClientCallback(int EconID, const char *pReason, void *pUser)
+{
+ CServer *pThis = (CServer *)pUser;
+
+ NETADDR Addr = pThis->m_NetConsole.ClientAddr(EconID);
+ char aAddrStr[NETADDR_MAXSTRSIZE];
+ net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
+ char aBuf[256];
+ str_format(aBuf, sizeof(aBuf), "econ client dropped. eid=%d addr=%s reason='%s'", EconID, aAddrStr, pReason);
+ pThis->Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aBuf);
+
+ pThis->m_aEconClients[EconID].m_State = CEconClient::STATE_EMPTY;
+ return 0;
+}
+
+
void CServer::SendMap(int ClientID)
{
CMsgPacker Msg(NETMSG_MAP_CHANGE);
@@ -633,7 +664,12 @@ void CServer::SendRconLine(int ClientID, const char *pLine)
SendMsgEx(&Msg, MSGFLAG_VITAL, ClientID, true);
}
-void CServer::SendRconLineAuthed(const char *pLine, void *pUser)
+void CServer::SendEconLine(int EconID, const char *pLine)
+{
+ m_NetConsole.Send(EconID, pLine);
+}
+
+void CServer::SendConsoleLineAuthed(const char *pLine, void *pUser)
{
CServer *pThis = (CServer *)pUser;
static volatile int ReentryGuard = 0;
@@ -648,6 +684,15 @@ void CServer::SendRconLineAuthed(const char *pLine, void *pUser)
pThis->SendRconLine(i, pLine);
}
+ if(pThis->m_UseEcon)
+ {
+ for(i = 0; i < NET_MAX_CONSOLE_CLIENTS; i++)
+ {
+ if(pThis->m_aEconClients[i].m_State == CEconClient::STATE_AUTHED)
+ pThis->SendEconLine(i, pLine);
+ }
+ }
+
ReentryGuard--;
}
@@ -1084,6 +1129,47 @@ void CServer::PumpNetwork()
else
ProcessClientPacket(&Packet);
}
+
+ if(m_UseEcon)
+ EconPumpNetwork();
+}
+
+void CServer::EconPumpNetwork()
+{
+ m_NetConsole.Update();
+
+ char aBuf[NET_MAX_PACKETSIZE];
+ int EconID;
+
+ while(m_NetConsole.Recv(aBuf, sizeof(aBuf) - 1, &EconID))
+ {
+ dbg_assert(m_aEconClients[EconID].m_State != CEconClient::STATE_EMPTY, "got message from empty slot");
+ if(m_aEconClients[EconID].m_State == CEconClient::STATE_CONNECTED)
+ {
+ if(str_comp(aBuf, g_Config.m_SvRconPassword) == 0)
+ {
+ m_aEconClients[EconID].m_State = CEconClient::STATE_AUTHED;
+ m_NetConsole.Send(EconID, "Authentication successful. Remote console access granted.");
+ m_NetConsole.SetTimeout(EconID, g_Config.m_SvEconTimeout);
+
+ str_format(aBuf, sizeof(aBuf), "EconID=%d authed", EconID);
+ Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
+ }
+ else
+ {
+ m_NetConsole.Send(EconID, "Wrong password");
+ }
+ }
+ else if(m_aEconClients[EconID].m_State == CEconClient::STATE_AUTHED)
+ {
+ char aFormatted[256];
+ str_format(aFormatted, sizeof(aBuf), "eid=%d cmd='%s'", EconID, aBuf);
+ Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "server", aFormatted);
+ m_RconClientID = EconID;
+ Console()->ExecuteLine(aBuf);
+ m_RconClientID = -1;
+ }
+ }
}
char *CServer::GetMapName()
@@ -1158,7 +1244,7 @@ int CServer::Run()
m_pStorage = Kernel()->RequestInterface<IStorage>();
//
- Console()->RegisterPrintCallback(SendRconLineAuthed, this);
+ Console()->RegisterPrintCallback(SendConsoleLineAuthed, this);
// load map
if(!LoadMap(g_Config.m_SvMap))
@@ -1181,7 +1267,6 @@ int CServer::Run()
BindAddr.port = g_Config.m_SvPort;
}
-
if(!m_NetServer.Open(BindAddr, g_Config.m_SvMaxClients, g_Config.m_SvMaxClientsPerIP, 0))
{
dbg_msg("server", "couldn't open socket. port might already be in use");
@@ -1190,6 +1275,31 @@ int CServer::Run()
m_NetServer.SetCallbacks(NewClientCallback, DelClientCallback, this);
+ if(g_Config.m_SvEconPort && g_Config.m_SvRconPassword[0])
+ {
+ dbg_msg("econ", "binding econ to %s:%d", g_Config.m_SvEconBindaddr, g_Config.m_SvEconPort);
+ if(g_Config.m_SvEconBindaddr[0] && net_host_lookup(g_Config.m_SvEconBindaddr, &BindAddr, NETTYPE_ALL) == 0)
+ {
+ BindAddr.port = g_Config.m_SvEconPort;
+ }
+ else
+ {
+ mem_zero(&BindAddr, sizeof(BindAddr));
+ BindAddr.type = NETTYPE_ALL;
+ BindAddr.port = g_Config.m_SvEconPort;
+ }
+
+ if(m_NetConsole.Open(BindAddr, 0))
+ {
+ m_NetConsole.SetCallbacks(NewConsoleClientCallback, DelConsoleClientCallback, this);
+ m_UseEcon = 1;
+ }
+ else
+ {
+ dbg_msg("econ", "couldn't open econ socket. port might already be in use");
+ }
+ }
+
char aBuf[256];
str_format(aBuf, sizeof(aBuf), "server name is '%s'", g_Config.m_SvName);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "server", aBuf);
View
@@ -109,10 +109,26 @@ class CServer : public IServer
CClient m_aClients[MAX_CLIENTS];
+ class CEconClient
+ {
+ public:
+ enum
+ {
+ STATE_EMPTY=0,
+ STATE_CONNECTED,
+ STATE_AUTHED
+ };
+
+ int m_State;
+ };
+
+ CEconClient m_aEconClients[NET_MAX_CONSOLE_CLIENTS];
+
CSnapshotDelta m_SnapshotDelta;
CSnapshotBuilder m_SnapshotBuilder;
CSnapIDPool m_IDPool;
CNetServer m_NetServer;
+ CNetConsole m_NetConsole;
IEngineMap *m_pMap;
@@ -123,6 +139,8 @@ class CServer : public IServer
int m_RconClientID;
int m_RconAuthLevel;
+ int m_UseEcon;
+
int64 m_Lastheartbeat;
//static NETADDR4 master_server;
@@ -168,10 +186,14 @@ class CServer : public IServer
static int NewClientCallback(int ClientID, void *pUser);
static int DelClientCallback(int ClientID, const char *pReason, void *pUser);
+ static int NewConsoleClientCallback(int EconID, void *pUser);
+ static int DelConsoleClientCallback(int EconID, const char *pReason, void *pUser);
+
void SendMap(int ClientID);
void SendConnectionReady(int ClientID);
void SendRconLine(int ClientID, const char *pLine);
- static void SendRconLineAuthed(const char *pLine, void *pUser);
+ void SendEconLine(int EconID, const char *pLine);
+ static void SendConsoleLineAuthed(const char *pLine, void *pUser);
void SendRconCmdAdd(const IConsole::CCommandInfo *pCommandInfo, int ClientID);
void SendRconCmdRem(const IConsole::CCommandInfo *pCommandInfo, int ClientID);
@@ -185,6 +207,7 @@ class CServer : public IServer
int BanAdd(NETADDR Addr, int Seconds, const char *pReason);
int BanRemove(NETADDR Addr);
+ void EconPumpNetwork();
void PumpNetwork();
@@ -86,6 +86,10 @@ MACRO_CONFIG_STR(SvRconPassword, sv_rcon_password, 32, "", CFGFLAG_SERVER, "Remo
MACRO_CONFIG_STR(SvRconModPassword, sv_rcon_mod_password, 32, "", CFGFLAG_SERVER, "Remote console password for moderators (limited access)")
MACRO_CONFIG_INT(SvRconMaxTries, sv_rcon_max_tries, 3, 0, 100, CFGFLAG_SERVER, "Maximum number of tries for remote console authentication")
MACRO_CONFIG_INT(SvRconBantime, sv_rcon_bantime, 5, 0, 1440, CFGFLAG_SERVER, "The time a client gets banned if remote console authentication fails. 0 makes it just use kick")
+MACRO_CONFIG_STR(SvEconBindaddr, sv_econ_bindaddr, 128, "localhost", CFGFLAG_SERVER, "Address to bind the external console to. Anything but 'localhost' is dangerous")
+MACRO_CONFIG_INT(SvEconPort, sv_econ_port, 0, 0, 0, CFGFLAG_SERVER, "Port to use for the external console")
+MACRO_CONFIG_INT(SvEconAuthTimeout, sv_econ_auth_timeout, 30, 1, 120, CFGFLAG_SERVER, "Time in seconds before the the econ authentification times out")
+MACRO_CONFIG_INT(SvEconTimeout, sv_econ_timeout, 300, 1, 3600, CFGFLAG_SERVER, "Time in seconds before the econ connection times out")
MACRO_CONFIG_INT(Debug, debug, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Debug mode")
MACRO_CONFIG_INT(DbgStress, dbg_stress, 0, 0, 0, CFGFLAG_CLIENT|CFGFLAG_SERVER, "Stress systems")
@@ -49,6 +49,7 @@ enum
NET_MAX_CHUNKHEADERSIZE = 5,
NET_PACKETHEADERSIZE = 3,
NET_MAX_CLIENTS = 16,
+ NET_MAX_CONSOLE_CLIENTS = 16,
NET_MAX_SEQUENCE = 1<<10,
NET_SEQUENCE_MASK = NET_MAX_SEQUENCE-1,
@@ -192,6 +193,41 @@ class CNetConnection
int AckSequence() const { return m_Ack; }
};
+class CConsoleNetConnection
+{
+private:
+ unsigned m_State;
+
+ NETADDR m_PeerAddr;
+ NETSOCKET m_Socket;
+
+ char m_aBuffer[NET_MAX_PACKETSIZE];
+ char *m_pBufferPos;
+
+ char m_aErrorString[256];
+
+ int m_Timeout;
+ int64 m_LastRecvTime;
+
+public:
+ void Init(NETSOCKET Socket);
+ void Init(NETSOCKET Socket, const NETADDR *pAddr);
+ int Connect(const NETADDR *pAddr);
+ void Disconnect(const char *pReason);
+
+ int State() const { return m_State; }
+ NETADDR PeerAddress() const { return m_PeerAddr; }
+ const char *ErrorString() const { return m_aErrorString; }
+
+ void SetTimeout(int Timeout) { m_Timeout = Timeout; }
+ int Timeout() const { return m_Timeout; }
+
+ void Reset();
+ int Update();
+ int Send(const char *pLine);
+ int Recv(char *pLine, int MaxLength);
+};
+
class CNetRecvUnpacker
{
public:
@@ -292,6 +328,48 @@ class CNetServer
void SetMaxClientsPerIP(int Max);
};
+class CNetConsole
+{
+private:
+ struct CSlot
+ {
+ CConsoleNetConnection m_Connection;
+ };
+
+ NETSOCKET m_Socket;
+ CSlot m_aSlots[NET_MAX_CLIENTS];
+
+ NETFUNC_NEWCLIENT m_pfnNewClient;
+ NETFUNC_DELCLIENT m_pfnDelClient;
+ void *m_UserPtr;
+
+ CNetRecvUnpacker m_RecvUnpacker;
+
+public:
+ int SetCallbacks(NETFUNC_NEWCLIENT pfnNewClient, NETFUNC_DELCLIENT pfnDelClient, void *pUser);
+
+ //
+ bool Open(NETADDR BindAddr, int Flags);
+ int Close();
+
+ //
+ int Broadcast(const char *pLine);
+ int Recv(char *pLine, int MaxLength, int *pClientID = 0);
+ int Send(int ClientID, const char *pLine);
+ int Update();
+
+ //
+ int AcceptClient(NETSOCKET Socket, const NETADDR *pAddr);
+ int Drop(int ClientID, const char *pReason);
+
+ //
+ void SetTimeout(int ClientID, int Timeout) { m_aSlots[ClientID].m_Connection.SetTimeout(Timeout); }
+
+ // status requests
+ int Timeout(int ClientID) { return m_aSlots[ClientID].m_Connection.Timeout(); }
+ NETADDR ClientAddr(int ClientID) const { return m_aSlots[ClientID].m_Connection.PeerAddress(); }
+};
+
// client side
Oops, something went wrong.

0 comments on commit 2ba6fbd

Please sign in to comment.