Browse Source

automatische speicherabbild erstellung bei server crashes

Kolja Strohm 6 years ago
parent
commit
f82ba1f5f4
5 changed files with 63 additions and 0 deletions
  1. 26 0
      MainServer/Datenbank.cpp
  2. 1 0
      MainServer/Datenbank.h
  3. 30 0
      MainServer/MainServer.cpp
  4. 1 0
      MainServer/MainServer.h
  5. 5 0
      MainServer/main.cpp

+ 26 - 0
MainServer/Datenbank.cpp

@@ -966,6 +966,32 @@ bool MSDatenbank::getEditorServer( int client, Text *ip, int *port )
 	return 1;
 }
 
+bool MSDatenbank::getMinigameServer( int client, Text *ip, int *port )
+{
+    Text *befehl = new Text( "SELECT a.port, a.ip FROM server AS a, server_client AS b "
+                             "WHERE a.server_typ_name = 'minigame' AND a.id = b.server_id AND b.client_id = " );
+    befehl->append( client );
+    lock();
+    if( !datenbank->befehl( befehl->getText() ) )
+    {
+        unlock();
+        befehl->release();
+        return 0;
+    }
+    Result res = datenbank->getResult();
+    unlock();
+    befehl->release();
+    if( !res.zeilenAnzahl )
+    {
+        res.destroy();
+        return 0;
+    }
+    *port = TextZuInt( res.values[ 0 ].getText(), 10 );
+    ip->setText( res.values[ 1 ].getText() );
+    res.destroy();
+    return 1;
+}
+
 // Reference Counting
 MSDatenbank *MSDatenbank::getThis()
 {

+ 1 - 0
MainServer/Datenbank.h

@@ -67,6 +67,7 @@ public:
     bool getHistorieServer( int client, Text *ip, int *port );
     bool getKartenServer( int client, Text *ip, int *port );
     bool getEditorServer( int client, Text *ip, int *port );
+    bool getMinigameServer( int client, Text *ip, int *port );
 	// Reference Counting
 	MSDatenbank *getThis();
 	MSDatenbank *release();

+ 30 - 0
MainServer/MainServer.cpp

@@ -868,6 +868,7 @@ void MSKlient::thread()
                     weiter->historieServerKlientAbsturz( klientNummer );
                     weiter->kartenServerKlientAbsturz( klientNummer );
                     weiter->editorServerKlientAbsturz( klientNummer );
+                    weiter->minigameServerKlientAbsturz( klientNummer );
 					weiter->release();
 					int *treffer = ms->zDB()->unregisterClient( klientNummer, 0 );
 					if( !treffer )
@@ -1282,6 +1283,35 @@ bool MSGWeiterleitung::editorServerKlientAbsturz( int klientId )
     return erf;
 }
 
+bool MSGWeiterleitung::minigameServerKlientAbsturz( int klientId )
+{
+    Text *ip = new Text();
+    int port = 0;
+    if( !ms->zDB()->getMinigameServer( klientId, ip, &port ) )
+    {
+        ip->release();
+        return 0;
+    }
+    Klient *k = new Klient();
+    unsigned char key[ 20 ] = { 88, 103, 192, 232, 69, 54, 57, 3, 239, 138, 234, 172, 126, 72, 81, 55, 205, 97, 59, 255 };
+    k->setSendeKey( (char*)key, 20 );
+    k->setEmpfangKey( (char*)key, 20 );
+    k->verbinde( (unsigned short)port, ip->getText() );
+    ip->release();
+    char ret = 0;
+    k->sendeEncrypted( "\2\2", 2 );
+    k->sendeEncrypted( (char*)&klientId, 4 );
+    k->getNachrichtEncrypted( &ret, 1 );
+    bool erf = ret == 1;
+    k->sendeEncrypted( "\3", 1 );
+    k->getNachrichtEncrypted( &ret, 1 );
+    ms->addEmpfangen( k->getDownloadBytes( 1 ) );
+    ms->addGesendet( k->getUploadBytes( 1 ) );
+    k->trenne();
+    k->release();
+    return erf;
+}
+
 bool MSGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
 {
 	bool ret = 1;

+ 1 - 0
MainServer/MainServer.h

@@ -107,6 +107,7 @@ public:
     bool historieServerKlientAbsturz( int klientId );
     bool kartenServerKlientAbsturz( int klientId );
     bool editorServerKlientAbsturz( int klientId );
+    bool minigameServerKlientAbsturz( int klientId );
 	bool spielErstelltAbbrechen( int spielErstelltId );
 	bool spielerLeavesGruppe( int gruppeId, int accountId );
 	bool setGruppeAdmin( int gruppeId, int adminId );

+ 5 - 0
MainServer/main.cpp

@@ -5,9 +5,14 @@
 #include <Datei.h>
 #include <Text.h>
 #include <Globals.h>
+#include <sys/resource.h>
 
 int main()
 {
+	struct rlimit core_limits;
+	core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
+	setrlimit(RLIMIT_CORE, &core_limits);
+
     Framework::initFramework();
 	Zeit *z = getZeit( );
 	Text *pfad = new Text( "../log/main/" );