Index: code/server/server.h =================================================================== --- code/server/server.h (revision 1499) +++ code/server/server.h (working copy) @@ -257,6 +257,7 @@ extern cvar_t *sv_timeout; extern cvar_t *sv_zombietime; extern cvar_t *sv_rconPassword; +extern cvar_t *sv_rconLog; extern cvar_t *sv_privatePassword; extern cvar_t *sv_allowDownload; extern cvar_t *sv_maxclients; Index: code/server/sv_init.c =================================================================== --- code/server/sv_init.c (revision 1499) +++ code/server/sv_init.c (working copy) @@ -665,6 +665,7 @@ // server vars sv_rconPassword = Cvar_Get ("rconPassword", "", CVAR_TEMP ); + sv_rconLog = Cvar_Get ("sv_rconLog", "", CVAR_ARCHIVE ); sv_privatePassword = Cvar_Get ("sv_privatePassword", "", CVAR_TEMP ); sv_fps = Cvar_Get ("sv_fps", "20", CVAR_TEMP ); sv_timeout = Cvar_Get ("sv_timeout", "200", CVAR_TEMP ); Index: code/server/sv_main.c =================================================================== --- code/server/sv_main.c (revision 1499) +++ code/server/sv_main.c (working copy) @@ -34,6 +34,7 @@ cvar_t *sv_timeout; // seconds without any message cvar_t *sv_zombietime; // seconds to sink messages after disconnect cvar_t *sv_rconPassword; // password for remote server commands +cvar_t *sv_rconLog; // log file for remote server commands cvar_t *sv_privatePassword; // password for the privateClient slots cvar_t *sv_allowDownload; cvar_t *sv_maxclients; @@ -463,6 +464,10 @@ char sv_outputbuf[SV_OUTPUTBUF_LENGTH]; static unsigned int lasttime = 0; char *cmd_aux; + const char *message = ""; + fileHandle_t rconLog = 0; + qtime_t qt; + const char *timestamp = ""; // TTimo - https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=534 time = Com_Milliseconds(); @@ -471,15 +476,31 @@ } lasttime = time; + if(strlen(sv_rconLog->string)) { + rconLog = FS_FOpenFileAppend(sv_rconLog->string); + if (!rconLog) { + Com_Printf("Warning: Unable to open sv_rconLog: \"%s\"\n", sv_rconLog->string); + } + } + if ( !strlen( sv_rconPassword->string ) || strcmp (Cmd_Argv(1), sv_rconPassword->string) ) { valid = qfalse; - Com_Printf ("Bad rcon from %s:\n%s\n", NET_AdrToString (from), Cmd_Argv(2) ); + message = va("Bad rcon from %s: %s\n", NET_AdrToString (from), Cmd_ArgsFrom(2)); } else { valid = qtrue; - Com_Printf ("Rcon from %s:\n%s\n", NET_AdrToString (from), Cmd_Argv(2) ); + message = va("Rcon from %s: %s\n", NET_AdrToString (from), Cmd_ArgsFrom(2)); } + Com_Printf ("%s", message); + if (rconLog) { + Com_RealTime(&qt); + timestamp = va( "%04i-%02i-%02i %02i:%02i:%02i ", qt.tm_year+1900, qt.tm_mon, qt.tm_mday, qt.tm_hour, qt.tm_min, qt.tm_sec); + FS_Write(timestamp, strlen(timestamp), rconLog); + FS_Write(message, strlen(message), rconLog); + FS_FCloseFile(rconLog); + } + // start redirecting all print outputs to the packet svs.redirectAddress = from; Com_BeginRedirect (sv_outputbuf, SV_OUTPUTBUF_LENGTH, SV_FlushRedirect); @@ -489,6 +510,9 @@ } else if ( !valid ) { Com_Printf ("Bad rconpassword.\n"); } else { + if (strlen(sv_rconLog->string) && !rconLog) { + Com_Printf("Warning: Unable to open sv_rconLog: \"%s\"\n", sv_rconLog->string); + } remaining[0] = 0; // https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=543