Changeset - r16264:1f7e2ab6252c
[Not reviewed]
master
0 6 0
rubidium - 14 years ago 2010-10-17 17:43:01
rubidium@openttd.org
(svn r20975) -Add: logging of console output for remote admins (dihedral)
6 files changed with 49 insertions and 1 deletions:
0 comments (0 inline, 0 general)
src/console.cpp
Show inline comments
 
@@ -109,12 +109,13 @@ void IConsolePrint(ConsoleColour colour_
 
	 * characters and (when applicable) assign it to the console buffer */
 
	str = strdup(string);
 
	str_strip_colours(str);
 
	str_validate(str, str + strlen(str));
 

	
 
	if (_network_dedicated) {
 
		NetworkAdminConsole("console", str);
 
		fprintf(stdout, "%s%s\n", GetLogPrefix(), str);
 
		fflush(stdout);
 
		IConsoleWriteToLogFile(str);
 
		free(str); // free duplicated string since it's not used anymore
 
		return;
 
	}
src/debug.cpp
Show inline comments
 
@@ -17,13 +17,13 @@
 
#include "fileio_func.h"
 
#include "settings_type.h"
 

	
 
#include <time.h>
 

	
 
#if defined(ENABLE_NETWORK)
 
#include "network/core/os_abstraction.h"
 
#include "network/network_admin.h"
 
SOCKET _debug_socket = INVALID_SOCKET;
 
#endif /* ENABLE_NETWORK */
 

	
 
int _debug_ai_level;
 
int _debug_driver_level;
 
int _debug_grf_level;
 
@@ -91,12 +91,13 @@ static void debug_print(const char *dbg,
 
		TCHAR tbuf[512];
 
		_sntprintf(tbuf, sizeof(tbuf), _T("%s"), OTTD2FS(dbg));
 
		NKDbgPrintfW(_T("dbg: [%s] %s\n"), tbuf, OTTD2FS(buf));
 
#else
 
		fprintf(stderr, "%sdbg: [%s] %s\n", GetLogPrefix(), dbg, buf);
 
#endif
 
		NetworkAdminConsole(dbg, buf);
 
		IConsoleDebug(dbg, buf);
 
	} else {
 
		static FILE *f = FioFOpenFile("commands-out.log", "wb", AUTOSAVE_DIR);
 
		if (f == NULL) return;
 

	
 
		fprintf(f, "%s%s\n", GetLogPrefix(), buf);
src/network/core/tcp_admin.cpp
Show inline comments
 
@@ -76,12 +76,13 @@ NetworkRecvStatus NetworkAdminSocketHand
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_UPDATE)
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_REMOVE)
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_ECONOMY)
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_COMPANY_STATS)
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_CHAT)
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_RCON)
 
		ADMIN_COMMAND(ADMIN_PACKET_SERVER_CONSOLE)
 

	
 
		default:
 
			if (this->HasClientQuit()) {
 
				DEBUG(net, 0, "[tcp/admin] received invalid packet type %d from '%s' (%s)", type, this->admin_name, this->admin_version);
 
			} else {
 
				DEBUG(net, 0, "[tcp/admin] received illegal packet from '%s' (%s)", this->admin_name, this->admin_version);
 
@@ -150,8 +151,9 @@ DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_UPDATE)
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_REMOVE)
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_ECONOMY)
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_COMPANY_STATS)
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_CHAT)
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_RCON)
 
DEFINE_UNAVAILABLE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_CONSOLE)
 

	
 
#endif /* ENABLE_NETWORK */
src/network/core/tcp_admin.h
Show inline comments
 
@@ -52,12 +52,13 @@ enum PacketAdminType {
 
	ADMIN_PACKET_SERVER_COMPANY_UPDATE,  ///< The server gives the admin an information update on a company.
 
	ADMIN_PACKET_SERVER_COMPANY_REMOVE,  ///< The server tells the admin that a company was removed.
 
	ADMIN_PACKET_SERVER_COMPANY_ECONOMY, ///< The server gives the admin some economy related company information.
 
	ADMIN_PACKET_SERVER_COMPANY_STATS,   ///< The server gives the admin some statistics about a company.
 
	ADMIN_PACKET_SERVER_CHAT,            ///< The server received a chat message and relays it.
 
	ADMIN_PACKET_SERVER_RCON,            ///< The server's reply to a remove console command.
 
	ADMIN_PACKET_SERVER_CONSOLE,         ///< The server gives the admin the data that got printed to its console.
 

	
 
	INVALID_ADMIN_PACKET = 0xFF,         ///< An invalid marker for admin packets.
 
};
 

	
 
/** Status of an admin. */
 
enum AdminStatus {
 
@@ -71,12 +72,13 @@ enum AdminUpdateType {
 
	ADMIN_UPDATE_DATE,            ///< Updates about the date of the game.
 
	ADMIN_UPDATE_CLIENT_INFO,     ///< Updates about the information of clients.
 
	ADMIN_UPDATE_COMPANY_INFO,    ///< Updates about the generic information of companies.
 
	ADMIN_UPDATE_COMPANY_ECONOMY, ///< Updates about the economy of companies.
 
	ADMIN_UPDATE_COMPANY_STATS,   ///< Updates about the statistics of companies.
 
	ADMIN_UPDATE_CHAT,            ///< The admin would like to have chat messages.
 
	ADMIN_UPDATE_CONSOLE,         ///< The admin would like to have console messages.
 
	ADMIN_UPDATE_END              ///< Must ALWAYS be on the end of this list!! (period)
 
};
 

	
 
/** Update frequencies an admin can register. */
 
enum AdminUpdateFrequency {
 
	ADMIN_FREQUENCY_POLL      = 0x01, ///< The admin can poll this.
 
@@ -328,12 +330,19 @@ protected:
 
	 * Result of an rcon command:
 
	 * uint16  Colour as it would be used on the server or a client.
 
	 * string  Output of the executed command.
 
	 */
 
	DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_RCON);
 

	
 
	/**
 
	 * Send what would be printed on the server's console also into the admin network.
 
	 * string  The origin of the text, e.g. "console" for console, or "net" for network related (debug) messages.
 
	 * string  Text as found on the console of the server.
 
	 */
 
	DECLARE_ADMIN_RECEIVE_COMMAND(ADMIN_PACKET_SERVER_CONSOLE);
 

	
 
	NetworkRecvStatus HandlePacket(Packet *p);
 
public:
 
	NetworkRecvStatus CloseConnection(bool error = true);
 

	
 
	NetworkAdminSocketHandler(SOCKET s);
 
	~NetworkAdminSocketHandler();
src/network/network_admin.cpp
Show inline comments
 
@@ -46,12 +46,13 @@ static const AdminUpdateFrequency _admin
 
	ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_DAILY | ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_DATE
 
	ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC,                                                                                                      ///< ADMIN_UPDATE_CLIENT_INFO
 
	ADMIN_FREQUENCY_POLL | ADMIN_FREQUENCY_AUTOMATIC,                                                                                                      ///< ADMIN_UPDATE_COMPANY_INFO
 
	ADMIN_FREQUENCY_POLL |                         ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_ECONOMY
 
	ADMIN_FREQUENCY_POLL |                         ADMIN_FREQUENCY_WEEKLY | ADMIN_FREQUENCY_MONTHLY | ADMIN_FREQUENCY_QUARTERLY | ADMIN_FREQUENCY_ANUALLY, ///< ADMIN_UPDATE_COMPANY_STATS
 
	                       ADMIN_FREQUENCY_AUTOMATIC,                                                                                                      ///< ADMIN_UPDATE_CHAT
 
	                       ADMIN_FREQUENCY_AUTOMATIC,                                                                                                      ///< ADMIN_UPDATE_CONSOLE
 
};
 
assert_compile(lengthof(_admin_update_type_frequencies) == ADMIN_UPDATE_END);
 

	
 
/**
 
 * Create a new socket for the server side of the admin network.
 
 * @param s The socket to connect with.
 
@@ -427,12 +428,29 @@ DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_
 
	_redirect_console_to_admin = this->index;
 
	IConsoleCmdExec(command);
 
	_redirect_console_to_admin = INVALID_ADMIN_ID;
 
	return NETWORK_RECV_STATUS_OKAY;
 
}
 

	
 
NetworkRecvStatus ServerNetworkAdminSocketHandler::SendConsole(const char *origin, const char *string)
 
{
 
	/* If the length of both strings, plus the 2 '\0' terminations and 3 bytes of the packet
 
	 * are bigger than the MTU, just ignore the message. Better safe than sorry. It should
 
	 * never occur though as the longest strings are chat messages, which are still 30%
 
	 * smaller than SEND_MTU. */
 
	if (strlen(origin) + strlen(string) + 2 + 3 >= SEND_MTU) return NETWORK_RECV_STATUS_OKAY;
 

	
 
	Packet *p = new Packet(ADMIN_PACKET_SERVER_CONSOLE);
 

	
 
	p->Send_string(origin);
 
	p->Send_string(string);
 
	this->Send_Packet(p);
 

	
 
	return NETWORK_RECV_STATUS_OKAY;
 
}
 

	
 
/***********
 
 * Receiving functions
 
 ************/
 

	
 
DEF_ADMIN_RECEIVE_COMMAND(Server, ADMIN_PACKET_ADMIN_JOIN)
 
{
 
@@ -711,12 +729,27 @@ void NetworkAdminChat(NetworkAction acti
 
void NetworkServerSendAdminRcon(AdminIndex admin_index, ConsoleColour colour_code, const char *string)
 
{
 
	ServerNetworkAdminSocketHandler::Get(admin_index)->SendRcon(colour_code, string);
 
}
 

	
 
/**
 
 * Send console to the admin network (if they did opt in for the respective update).
 
 * @param origin the origin of the message.
 
 * @param string the message as printed on the console.
 
 */
 
void NetworkAdminConsole(const char *origin, const char *string)
 
{
 
	ServerNetworkAdminSocketHandler *as;
 
	FOR_ALL_ADMIN_SOCKETS(as) {
 
		if (as->update_frequency[ADMIN_UPDATE_CONSOLE] & ADMIN_FREQUENCY_AUTOMATIC) {
 
			as->SendConsole(origin, string);
 
		}
 
	}
 
}
 

	
 
/**
 
 * Send a Welcome packet to all connected admins
 
 */
 
void ServerNetworkAdminSocketHandler::WelcomeAll()
 
{
 
	ServerNetworkAdminSocketHandler *as;
 
	FOR_ALL_ADMIN_SOCKETS(as) {
src/network/network_admin.h
Show inline comments
 
@@ -60,12 +60,13 @@ public:
 
	NetworkRecvStatus SendCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr);
 
	NetworkRecvStatus SendCompanyEconomy();
 
	NetworkRecvStatus SendCompanyStats();
 

	
 
	NetworkRecvStatus SendChat(NetworkAction action, DestType desttype, ClientID client_id, const char *msg, int64 data);
 
	NetworkRecvStatus SendRcon(uint16 colour, const char *command);
 
	NetworkRecvStatus SendConsole(const char *origin, const char *command);
 

	
 
	static void Send();
 
	static void AcceptConnection(SOCKET s, const NetworkAddress &address);
 
	static bool AllowConnection();
 
	static void WelcomeAll();
 

	
 
@@ -90,9 +91,10 @@ void NetworkAdminCompanyInfo(const Compa
 
void NetworkAdminCompanyUpdate(const Company *company);
 
void NetworkAdminCompanyRemove(CompanyID company_id, AdminCompanyRemoveReason bcrr);
 

	
 
void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_id, const char *msg, int64 data = 0, bool from_admin = false);
 
void NetworkAdminUpdate(AdminUpdateFrequency freq);
 
void NetworkServerSendAdminRcon(AdminIndex admin_index, ConsoleColour colour_code, const char *string);
 
void NetworkAdminConsole(const char *origin, const char *string);
 

	
 
#endif /* ENABLE_NETWORK */
 
#endif /* NETWORK_ADMIN_H */
0 comments (0 inline, 0 general)