From: Andrew C. <ac...@us...> - 2004-01-31 04:51:59
|
Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv699/src/server Modified Files: serverstatus.cpp serverstatus.h Log Message: Some updates to the server status system to make it produce XML files instead of listening for a network connection Index: serverstatus.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/serverstatus.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** serverstatus.cpp 1 Sep 2003 04:22:47 -0000 1.7 --- serverstatus.cpp 30 Jan 2004 01:36:52 -0000 1.8 *************** *** 27,34 **** #include "iutil/cfgmgr.h" #include "groupmanager.h" ServerStatus::ServerStatus () ! : server(NULL), sock(INVALID_SOCKET) { } --- 27,37 ---- #include "iutil/cfgmgr.h" #include "groupmanager.h" + #include "clients.h" + #include "entitymanager.h" ServerStatus::ServerStatus () ! : server(NULL) { + running = true; } *************** *** 36,41 **** { thread->Stop (); - if (sock != INVALID_SOCKET) - SOCK_CLOSE(sock); } --- 39,42 ---- *************** *** 43,78 **** { server = newserver; - csRef<iConfigManager> configmanager = CS_QUERY_REGISTRY(objreg, iConfigManager); if (!configmanager) ! return false; ! ! if ( (sock = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) ! return false; ! ! #ifdef OS_LINUX ! int i = 1; ! setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); ! #endif ! ! SOCKADDR_IN addr; ! memset (&addr, 0, sizeof(SOCKADDR_IN)); ! ! int port = configmanager->GetInt ("Planeshift.Server.Status.Port", 21221); ! csString addrstr = configmanager->GetStr ("Planeshift.Server.Addr", "127.0.0.1"); ! addr.sin_family = AF_INET; ! addr.sin_port = htons (port); ! addr.sin_addr.s_addr = inet_addr(addrstr); ! ! if (bind (sock, (LPSOCKADDR) &addr, sizeof(SOCKADDR_IN)) != 0) ! return false; ! ! if (listen (sock, 5)) ! return false; ! thread = csThread::Create (this); if (!thread->Start ()) ! return false; return true; --- 44,60 ---- { server = newserver; csRef<iConfigManager> configmanager = CS_QUERY_REGISTRY(objreg, iConfigManager); if (!configmanager) ! return false; ! vfs = CS_QUERY_REGISTRY( objreg, iVFS ); ! reportOn = configmanager->GetInt ("Planeshift.Server.Status.Report", 0); ! reportRate = configmanager->GetInt ("Planeshift.Server.Status.Rate", 1000); ! reportFile = configmanager->GetStr ("Planeshift.Server.Status.LogFile", "/this/serverfile"); ! ! thread = csThread::Create (this); if (!thread->Start ()) ! return false; return true; *************** *** 81,109 **** void ServerStatus::Run () { ! SOCKET sockaccpt; ! SOCKADDR_IN addr; ! socklen_t addrlen = sizeof(SOCKADDR_IN); ! bool hasBeenReady, ready; ! while ( (sockaccpt = accept(sock, (LPSOCKADDR)&addr, &addrlen)) >= 0) ! { ! ready = server->IsReady(); ! hasBeenReady = server->HasBeenReady(); ! csString msg = "Server: "; ! msg += (ready ^ hasBeenReady) ? "shuting down" : "running\n"; ! msg += "World: "; msg += hasBeenReady ? "loaded.\n" : "not loaded.\n"; ! msg += "Clients: "; msg += server->GetNetManager()->GetConnections()->Count(); msg += "\n"; ! ! unsigned int total = 0; ! while (total < msg.Length()) ! { ! int n = send(sockaccpt, msg.GetData() + total, ! msg.Length()-total, 0); ! if (n == -1) ! break; ! total += n; ! } ! SOCK_CLOSE(sockaccpt); } } --- 63,141 ---- void ServerStatus::Run () { ! csTicks start = csGetTicks(); ! int count = 0; ! char buffer[32]; ! ! struct tm currentTime; ! time_t now, result; ! int days; ! ! csString reportString; ! csString timeString; ! ! while ( running ) ! { ! if ( (csGetTicks() - start) > reportRate ) ! { ! time( &now ); ! currentTime = *localtime( &now ); ! timeString = csString( asctime( ¤tTime ) ); ! timeString[timeString.Length() - 1] = '\0'; ! ! reportString.Format("<server_report time=\"%s\" number=\"%d\" >", timeString.GetData(), count ); ! ! ClientConnectionSet * clients = server->GetEntityManager()->GetClients(); ! ! ClientIterator i(*clients); ! Client* curr; ! for (curr = i.First(); curr; curr = i.Next()) ! { ! psGuildInfo * guild = 0; ! csString guildTitle; ! csString guildName; ! csString format("%s"); // Player name ! csString guildSecret="no"; ! if (curr->IsSuperClient() || !curr->GetActor()) continue; ! guild = curr->GetActor()->GetGuild(); ! ! if (guild != NULL) ! { ! if (guild->id) ! { ! psGuildLevel * level = curr->GetActor()->GetGuildLevel(); ! if (level) ! { ! format.Append(", %s in %s"); // Guild level title ! guildTitle = level->title; ! } ! else ! { ! format.Append(", %s"); ! } ! guildName = guild->name; ! } ! if ( guild->IsSecret() ) ! guildSecret = "yes"; ! } ! ! ! ! csString player; ! player.Format("<player name=\"%s\" guild=\"%s\" title=\"%s\" security=\"%d\" secret=\"%s\" />", ! curr->GetName(), guildName.GetData(), guildTitle.GetData(), curr->GetSecurityLevel(), guildSecret.GetData()); ! ! reportString.Append( player ); ! } ! ! ! csRef<iFile> logFile = vfs->Open( reportFile, VFS_FILE_WRITE ); ! logFile->Write( reportString, reportString.Length() ); ! logFile->Flush(); ! ! start = csGetTicks(); ! count++; ! } } } Index: serverstatus.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/serverstatus.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** serverstatus.h 29 Jan 2004 00:46:54 -0000 1.4 --- serverstatus.h 30 Jan 2004 01:36:52 -0000 1.5 *************** *** 20,24 **** --- 20,28 ---- #define __SERVERSTATUS_H__ + #include <iutil/vfs.h> + #include <csutil/thread.h> + #include <csutil/csstring.h> + #ifdef USE_WINSOCK *************** *** 32,37 **** class psServer; ! /** This thread listens on a tcp port and reports status back if it receives a ! * STATUS command */ class ServerStatus : public csRunnable --- 36,53 ---- class psServer; ! /** This class generates logs at a particular interval that has information that ! * can be displayed later on a website. ! * ! * At the moment it overwrites logs but can be easily changed to either create a ! * unique log file for each report ( such as daily ). ! * ! * Log Format: ! * <server_report time="Time stamp for report" number="number of this report" > ! * <player name="player name" ! * guild="guild name" ! * title="guild rank" ! * security="security level" ! * secret="yes|no" /> ! * <server_report> */ class ServerStatus : public csRunnable *************** *** 52,57 **** psServer* server; ! SOCKET sock; csRef<csThread> thread; }; --- 68,86 ---- psServer* server; ! csRef<csThread> thread; + + bool running; + + /// 1 = report 0 = don't report. + int reportOn; + + /// Interval in milliseconds to generate a report file. + csTicks reportRate; + + /// File that it should log to. + csString reportFile; + + csRef<iVFS> vfs; }; |