[8797] Merge WorldLog class into Log class.

* Added AuthSocket::SendPacket() function.
 * Packet logging now also possible in realmd.
 * realmd.conf.dist.in updated (added "WorldLogFile" setting).
This commit is contained in:
XTZGZoReX 2009-11-09 02:24:12 +01:00
parent fc42125cfb
commit 07aa44992b
13 changed files with 117 additions and 183 deletions

View file

@ -283,8 +283,6 @@ libmangosgame_a_SOURCES = \
Weather.h \
World.cpp \
World.h \
WorldLog.cpp \
WorldLog.h \
WorldSession.cpp \
WorldSession.h \
WorldSocket.cpp \

View file

@ -1,47 +0,0 @@
/*
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program 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; either version 2 of the License, or
* (at your option) any later version.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/** \file
\ingroup u2w
*/
#include "WorldLog.h"
#include "Policies/SingletonImp.h"
#include "Config/ConfigEnv.h"
#define CLASS_LOCK MaNGOS::ClassLevelLockable<WorldLog, ACE_Thread_Mutex>
INSTANTIATE_SINGLETON_2(WorldLog, CLASS_LOCK);
INSTANTIATE_CLASS_MUTEX(WorldLog, ACE_Thread_Mutex);
/// Open the log file (if specified so in the configuration file)
void WorldLog::Initialize()
{
std::string logsDir = sConfig.GetStringDefault("LogsDir","");
if(!logsDir.empty())
{
if((logsDir.at(logsDir.length()-1)!='/') && (logsDir.at(logsDir.length()-1)!='\\'))
logsDir.append("/");
}
std::string logname = sConfig.GetStringDefault("WorldLogFile", "");
if(!logname.empty())
{
i_file = fopen((logsDir+logname).c_str(), "w");
}
}

View file

@ -1,76 +0,0 @@
/*
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program 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; either version 2 of the License, or
* (at your option) any later version.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/// \addtogroup u2w
/// @{
/// \file
#ifndef MANGOS_WORLDLOG_H
#define MANGOS_WORLDLOG_H
#include "Common.h"
#include "Policies/Singleton.h"
#include "Errors.h"
#include <stdarg.h>
/// %Log packets to a file
class MANGOS_DLL_DECL WorldLog : public MaNGOS::Singleton<WorldLog, MaNGOS::ClassLevelLockable<WorldLog, ACE_Thread_Mutex> >
{
friend class MaNGOS::OperatorNew<WorldLog>;
WorldLog() : i_file(NULL) { Initialize(); }
WorldLog(const WorldLog &);
WorldLog& operator=(const WorldLog &);
typedef MaNGOS::ClassLevelLockable<WorldLog, ACE_Thread_Mutex>::Lock Guard;
/// Close the file in destructor
~WorldLog()
{
if( i_file != NULL )
fclose(i_file);
i_file = NULL;
}
public:
void Initialize();
/// Is the world logger active?
bool LogWorld(void) const { return (i_file != NULL); }
/// %Log to the file
void Log(char const *fmt, ...)
{
if( LogWorld() )
{
Guard guard(*this);
ASSERT(i_file);
va_list args;
va_start(args, fmt);
vfprintf(i_file, fmt, args);
va_end(args);
fflush(i_file);
}
}
private:
FILE *i_file;
};
#define sWorldLog WorldLog::Instance()
#endif
/// @}

View file

@ -42,7 +42,6 @@
#include "WorldSession.h"
#include "WorldSocketMgr.h"
#include "Log.h"
#include "WorldLog.h"
#if defined( __GNUC__ )
#pragma pack(1)
@ -166,24 +165,21 @@ int WorldSocket::SendPacket (const WorldPacket& pct)
return -1;
// Dump outgoing packet.
if (sWorldLog.LogWorld ())
if (sLog.IsLogWorld())
{
sWorldLog.Log ("SERVER:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n",
(uint32) get_handle (),
pct.size (),
LookupOpcodeName (pct.GetOpcode ()),
pct.GetOpcode ());
sLog.outWorld("S->C - SOCKET: %u LENGTH: %u OPCODE: %s (0x%.4X)\n",
uint32(get_handle()), pct.size (), LookupOpcodeName(pct.GetOpcode()), pct.GetOpcode());
uint32 p = 0;
while (p < pct.size ())
size_t p = 0;
while (p < pct.size())
{
for (uint32 j = 0; j < 16 && p < pct.size (); j++)
sWorldLog.Log ("%.2X ", const_cast<WorldPacket&>(pct)[p++]);
for (size_t j = 0; j < 16 && p < pct.size(); ++j)
sLog.outWorld("%.2X ", const_cast<WorldPacket&>(pct)[p++]);
sWorldLog.Log ("\n");
sLog.outWorld("\n");
}
sWorldLog.Log ("\n\n");
sLog.outWorld("\n\n");
}
ServerPktHeader header(pct.size()+2, pct.GetOpcode());
@ -682,25 +678,25 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct)
return -1;
// Dump received packet.
if (sWorldLog.LogWorld ())
if (sLog.IsLogWorld())
{
sWorldLog.Log ("CLIENT:\nSOCKET: %u\nLENGTH: %u\nOPCODE: %s (0x%.4X)\nDATA:\n",
(uint32) get_handle (),
new_pct->size (),
LookupOpcodeName (new_pct->GetOpcode ()),
new_pct->GetOpcode ());
sLog.outWorld("C->S - SOCKET: %u LENGTH: %u OPCODE: %s (0x%.4X)\n",
uint32(get_handle()), new_pct->size(), LookupOpcodeName(new_pct->GetOpcode()), new_pct->GetOpcode());
uint32 p = 0;
while (p < new_pct->size ())
size_t p = 0;
while (p < new_pct->size())
{
for (uint32 j = 0; j < 16 && p < new_pct->size (); j++)
sWorldLog.Log ("%.2X ", (*new_pct)[p++]);
sWorldLog.Log ("\n");
for (size_t j = 0; j < 16 && p < new_pct->size(); ++j)
sLog.outWorld("%.2X ", (*new_pct)[p++]);
sLog.outWorld("\n");
}
sWorldLog.Log ("\n\n");
sLog.outWorld("\n\n");
}
try {
try
{
switch(opcode)
{
case CMSG_PING:
@ -738,13 +734,13 @@ int WorldSocket::ProcessIncoming (WorldPacket* new_pct)
}
}
}
catch(ByteBufferException &)
catch (ByteBufferException &)
{
sLog.outError("WorldSocket::ProcessIncoming ByteBufferException occured while parsing an instant handled packet (opcode: %u) from client %s, accountid=%i. Disconnected client.",
opcode, GetRemoteAddress().c_str(), m_Session?m_Session->GetAccountId():-1);
if(sLog.IsOutDebug())
{
sLog.outDebug("Dumping error causing packet:");
sLog.outDebug("Dumping error-causing packet:");
new_pct->hexlike();
}

View file

@ -22,7 +22,6 @@
#include "Common.h"
#include "Database/DatabaseEnv.h"
#include "ByteBuffer.h"
#include "Config/ConfigEnv.h"
#include "Log.h"
#include "RealmList.h"
@ -252,14 +251,37 @@ void AuthSocket::OnRead()
///- Read the packet
TcpSocket::OnRead();
uint8 _cmd;
while (1)
while (true)
{
if (!ibuf.GetLength())
return;
///- Get the command out of it
///- Get the command out of it. We can assume it's there, since length is not 0.
ibuf.SoftRead((char *)&_cmd, 1); // UQ1: No longer exists in new net code ???
// Dump incoming packet.
if (sLog.IsLogWorld())
{
sLog.outWorld ("C->S - SOCKET: %u LENGTH: %u OPCODE: 0x%.4X\n",
GetSocket(), ibuf.GetLength(), _cmd);
size_t p = 0;
while (p < ibuf.GetLength())
{
char dest;
for (size_t j = 0; j < 16 && p < ibuf.GetLength(); ++j)
{
ibuf.SoftRead(&dest, 1);
sLog.outWorld("%.2X ", *((uint8*)dest));
p++;
}
sLog.outWorld("\n");
}
sLog.outWorld("\n\n");
}
size_t i;
///- Circle through known commands and call the correct command handler
@ -289,7 +311,34 @@ void AuthSocket::OnRead()
}
}
/// Make the SRP6 calculation from hash in dB
void AuthSocket::SendPacket(ByteBuffer* buf)
{
// TODO: Also handle outgoing structs?
uint8 _cmd = buf->read<uint8>();
// Dump outgoing packet.
if (sLog.IsLogWorld())
{
sLog.outWorld ("S->C - SOCKET: %u LENGTH: %u OPCODE: 0x%.4X\n",
GetSocket(), buf->size(), _cmd);
size_t p = 0;
while (p < buf->size())
{
for (size_t j = 0; j < 16 && p < buf->size(); ++j)
sLog.outWorld("%.2X ", (*buf)[p++]);
sLog.outWorld("\n");
}
sLog.outWorld("\n\n");
}
SendBuf((char const*)buf->contents(), buf->size());
}
/// Make the SRP6 calculation from hash in DB
void AuthSocket::_SetVSFields(const std::string& rI)
{
s.SetRand(s_BYTE_SIZE * 8);
@ -521,7 +570,8 @@ bool AuthSocket::_HandleLogonChallenge()
pkt<< (uint8) REALM_AUTH_NO_MATCH;
}
}
SendBuf((char const*)pkt.contents(), pkt.size());
SendPacket(&pkt);
return true;
}
@ -567,7 +617,7 @@ bool AuthSocket::_HandleLogonProof()
pkt << (uint8) REALM_AUTH_WRONG_BUILD_NUMBER;
DEBUG_LOG("[AuthChallenge] %u is not a valid client version!", _build);
DEBUG_LOG("[AuthChallenge] Patch %s not found", tmp);
SendBuf((char const*)pkt.contents(), pkt.size());
SendPacket(&pkt);
return true;
}
else // have patch
@ -807,7 +857,7 @@ bool AuthSocket::_HandleReconnectChallenge()
_reconnectProof.SetRand(16 * 8);
pkt.append(_reconnectProof.AsByteArray(16),16); // 16 bytes random
pkt << (uint64) 0x00 << (uint64) 0x00; // 16 bytes zeros
SendBuf((char const*)pkt.contents(), pkt.size());
SendPacket(&pkt);
return true;
}
@ -839,7 +889,7 @@ bool AuthSocket::_HandleReconnectProof()
pkt << (uint8) AUTH_RECONNECT_PROOF;
pkt << (uint8) 0x00;
pkt << (uint16) 0x00; // 2 bytes zeros
SendBuf((char const*)pkt.contents(), pkt.size());
SendPacket(&pkt);
///- Set _authed to true!
_authed = true;
@ -921,7 +971,7 @@ bool AuthSocket::_HandleRealmList()
hdr << (uint16)pkt.size();
hdr.append(pkt);
SendBuf((char const*)hdr.contents(), hdr.size());
SendPacket(&pkt);
return true;
}

View file

@ -24,6 +24,7 @@
#define _AUTHSOCKET_H
#include "Common.h"
#include "ByteBuffer.h"
#include "Auth/BigNumber.h"
#include "sockets/TcpSocket.h"
#include "sockets/SocketHandler.h"
@ -55,6 +56,8 @@ class AuthSocket: public TcpSocket
bool _HandleXferCancel();
bool _HandleXferAccept();
void SendPacket(ByteBuffer* buf);
void _SetVSFields(const std::string& rI);
FILE *pPatch;

View file

@ -49,6 +49,10 @@ ConfVersion=2007062001
# Default: "Realmd.log"
# "" - empty name disable creating log file
#
# WorldLogFile
# Packet logging file for the realmserver
# Default: "world.log"
#
# LogTimestamp
# Logfile with timestamp of server start in name
# Default: 0 - no timestamp in name
@ -105,6 +109,7 @@ PidFile = ""
LogLevel = 0
LogTime = 0
LogFile = "Realmd.log"
WorldLogFile = ""
LogTimestamp = 0
LogFileLevel = 0
LogColors = ""

View file

@ -225,9 +225,9 @@ void Log::Initialize()
}
charLogfile = openLogFile("CharLogFile","CharLogTimestamp","a");
dberLogfile = openLogFile("DBErrorLogFile",NULL,"a");
raLogfile = openLogFile("RaLogFile",NULL,"a");
worldLogfile = openLogFile("WorldLogFile",NULL,"a");
// Main log file settings
m_includeTime = sConfig.GetBoolDefault("LogTime", false);
@ -698,6 +698,21 @@ void Log::outChar(const char * str, ... )
}
}
void Log::outWorld( const char * str, ... )
{
if (!str)
return;
if (worldLogfile)
{
va_list args;
va_start(args, str);
vfprintf(worldLogfile, str, args);
va_end(args);
fflush(worldLogfile);
}
}
void Log::outCharDump( const char * str, uint32 account_id, uint32 guid, const char * name )
{
if(charLogfile)

View file

@ -80,6 +80,10 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
if (raLogfile != NULL)
fclose(raLogfile);
raLogfile = NULL;
if (worldLogfile != NULL)
fclose(worldLogfile);
worldLogfile = NULL;
}
public:
void Initialize();
@ -106,6 +110,8 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
// any log level
void outChar( const char * str, ... ) ATTR_PRINTF(2,3);
// any log level
void outWorld( const char * str, ... ) ATTR_PRINTF(2,3);
// any log level
void outCharDump( const char * str, uint32 account_id, uint32 guid, const char * name );
void outRALog( const char * str, ... ) ATTR_PRINTF(2,3);
void SetLogLevel(char * Level);
@ -118,6 +124,7 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
uint32 getLogFilter() const { return m_logFilter; }
bool IsOutDebug() const { return m_logLevel > 2 || (m_logFileLevel > 2 && logfile); }
bool IsOutCharDump() const { return m_charLog_Dump; }
bool IsLogWorld() const { return (worldLogfile); }
bool IsIncludeTime() const { return m_includeTime; }
private:
FILE* openLogFile(char const* configFileName,char const* configTimeStampFlag, char const* mode);
@ -128,6 +135,7 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
FILE* gmLogfile;
FILE* charLogfile;
FILE* dberLogfile;
FILE* worldLogfile;
// log/console control
uint32 m_logLevel;
@ -152,7 +160,7 @@ class Log : public MaNGOS::Singleton<Log, MaNGOS::ClassLevelLockable<Log, ACE_Th
#define sLog MaNGOS::Singleton<Log>::Instance()
#ifdef MANGOS_DEBUG
#define DEBUG_LOG MaNGOS::Singleton<Log>::Instance().outDebug
#define DEBUG_LOG sLog.outDebug
#else
#define DEBUG_LOG
#endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "8796"
#define REVISION_NR "8797"
#endif // __REVISION_NR_H__

View file

@ -488,7 +488,6 @@
<ClCompile Include="..\..\src\game\WaypointMovementGenerator.cpp" />
<ClCompile Include="..\..\src\game\Weather.cpp" />
<ClCompile Include="..\..\src\game\World.cpp" />
<ClCompile Include="..\..\src\game\WorldLog.cpp" />
<ClCompile Include="..\..\src\game\WorldSession.cpp" />
<ClCompile Include="..\..\src\game\WorldSocket.cpp" />
<ClCompile Include="..\..\src\game\WorldSocketMgr.cpp" />
@ -621,7 +620,6 @@
<ClInclude Include="..\..\src\game\WaypointMovementGenerator.h" />
<ClInclude Include="..\..\src\game\Weather.h" />
<ClInclude Include="..\..\src\game\World.h" />
<ClInclude Include="..\..\src\game\WorldLog.h" />
<ClInclude Include="..\..\src\game\WorldSession.h" />
<ClInclude Include="..\..\src\game\WorldSocket.h" />
<ClInclude Include="..\..\src\game\WorldSocketMgr.h" />

View file

@ -1485,14 +1485,6 @@
RelativePath="..\..\src\game\SharedDefines.h"
>
</File>
<File
RelativePath="..\..\src\game\WorldLog.cpp"
>
</File>
<File
RelativePath="..\..\src\game\WorldLog.h"
>
</File>
<File
RelativePath="..\..\src\game\WorldSession.cpp"
>

View file

@ -1486,14 +1486,6 @@
RelativePath="..\..\src\game\SharedDefines.h"
>
</File>
<File
RelativePath="..\..\src\game\WorldLog.cpp"
>
</File>
<File
RelativePath="..\..\src\game\WorldLog.h"
>
</File>
<File
RelativePath="..\..\src\game\WorldSession.cpp"
>