Browse Source

automatische speicherabbild erstellung bei server crashes

Kolja Strohm 6 years ago
parent
commit
1f3395f994

+ 26 - 0
ErhaltungServer/Datenbank.cpp

@@ -556,6 +556,32 @@ bool ESDatenbank::getEditorServer( int client, Text *ip, int *port )
     return 1;
 }
 
+bool ESDatenbank::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.id = b.server_id AND a.server_typ_name = 'minigame' 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;
+}
+
 void ESDatenbank::removeKlient( int klientId )
 {
 	Text *befehl = new Text( "SELECT unregister_client( " );

+ 1 - 0
ErhaltungServer/Datenbank.h

@@ -53,6 +53,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 );
 	void removeKlient( int klientId );
 	int clientIstEingeloggt( int clientId );
 	int logoutKlient( int klientId, Array< int > *ret );

+ 42 - 7
ErhaltungServer/ErhaltungServer.cpp

@@ -693,7 +693,7 @@ void ESKlient::thread()
 					br = 1;
 				}
 			}
-			if( c == 3 )
+            else if( c == 3 )
 			{
 				if( encrypted )
 					klient->sendeEncrypted( "\1", 1 );
@@ -701,6 +701,10 @@ void ESKlient::thread()
 					klient->sende( "\1", 1 );
 				br = 1;
 			}
+            else
+            {
+
+            }
 		}
 		else
 			br = 1;
@@ -797,6 +801,7 @@ void ESKlient::thread()
                 weiter->newsServerKlientAbsturz( klientNummer );
                 weiter->kartenServerKlientAbsturz( klientNummer );
                 weiter->editorServerKlientAbsturz( klientNummer );
+                weiter->minigameServerKlientAbsturz( klientNummer );
 				weiter->release();
 				es->zDB()->removeKlient( klientNummer );
 			}
@@ -818,6 +823,7 @@ void ESKlient::thread()
                     weiter->newsServerKlientAbsturz( klientNummer );
                     weiter->kartenServerKlientAbsturz( klientNummer );
                     weiter->editorServerKlientAbsturz( klientNummer );
+                    weiter->minigameServerKlientAbsturz( klientNummer );
 					weiter->release();
 					es->zDB()->removeKlient( klientNummer );
 				}
@@ -990,7 +996,7 @@ bool ESGWeiterleitung::chatServerKlientAbsturz( int klientId )
 		return 0;
 	}
 	Klient *k = new Klient();
-	unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
+	unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
 	k->setSendeKey( (char*)key, 20 );
 	k->setEmpfangKey( (char*)key, 20 );
 	k->verbinde( (unsigned short)port, ip->getText() );
@@ -1212,6 +1218,35 @@ bool ESGWeiterleitung::editorServerKlientAbsturz( int klientId )
     return erf;
 }
 
+bool ESGWeiterleitung::minigameServerKlientAbsturz( int klientId )
+{
+    Text *ip = new Text();
+    int port = 0;
+    if( !es->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 );
+    es->addEmpfangen( k->getDownloadBytes( 1 ) );
+    es->addGesendet( k->getUploadBytes( 1 ) );
+    k->trenne();
+    k->release();
+    return erf;
+}
+
 bool ESGWeiterleitung::spielErstelltAbbrechen( int spielErstelltId )
 {
 	bool ret = 1;
@@ -1262,7 +1297,7 @@ bool ESGWeiterleitung::spielerLeavesGruppe( int gruppeId, int accountId )
 		if( ip->getLength() )
 		{
 			Klient *klient = new Klient();
-			unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
+			unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
 			klient->setSendeKey( (char*)key, 20 );
 			klient->setEmpfangKey( (char*)key, 20 );
 			ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
@@ -1314,7 +1349,7 @@ bool ESGWeiterleitung::setGruppeAdmin( int gruppeId, int adminId )
 		if( ip->getLength() )
 		{
 			Klient *klient = new Klient();
-			unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
+			unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
 			klient->setSendeKey( (char*)key, 20 );
 			klient->setEmpfangKey( (char*)key, 20 );
 			ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
@@ -1356,7 +1391,7 @@ bool ESGWeiterleitung::spielerLeavesChatroom( int chatroomId, int accountId )
 		if( ip->getLength() )
 		{
 			Klient *klient = new Klient();
-			unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
+			unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
 			klient->setSendeKey( (char*)key, 20 );
 			klient->setEmpfangKey( (char*)key, 20 );
 			ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
@@ -1393,7 +1428,7 @@ bool ESGWeiterleitung::setChatroomAdmin( int chatroomId, int adminId )
 	if( ip->getLength() )
 	{
 		Klient *klient = new Klient();
-		unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
+		unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
 		klient->setSendeKey( (char*)key, 20 );
 		klient->setEmpfangKey( (char*)key, 20 );
 		ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );
@@ -1432,7 +1467,7 @@ bool ESGWeiterleitung::kickSpielerAusGruppe( int gruppeId )
 		if( ip->getLength() )
 		{
 			Klient *klient = new Klient();
-			unsigned char key[ 20 ] = { 79, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
+			unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
 			klient->setSendeKey( (char*)key, 20 );
 			klient->setEmpfangKey( (char*)key, 20 );
 			ret = ret & klient->verbinde( (unsigned short)port, ip->getText() );

+ 1 - 0
ErhaltungServer/ErhaltungServer.h

@@ -151,6 +151,7 @@ public:
     bool newsServerKlientAbsturz( 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 );

+ 1 - 1
ErhaltungServer/ErhaltungServer.vcxproj

@@ -36,7 +36,7 @@
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <TargetExt />
-    <RemoteProjectDir>$(RemoteRootDir)/Server/$(ProjectName)/Release</RemoteProjectDir>
+    <RemoteProjectDir>$(RemoteRootDir)/Server/$(ProjectName)/release</RemoteProjectDir>
     <IncludePath>..\..\..\..\Allgemein\Framework;../../../Framework/release;..\..\..\..\Allgemein\Network\Network;../../../Network/release;..\..\..\..\Allgemein\sql\sql;../../../sql/release;$(IncludePath)</IncludePath>
     <OutDir>$(ProjectDir)bin\$(Platform)\release\</OutDir>
     <IntDir>$(ProjectDir)obj\$(Platform)\release\</IntDir>

+ 4 - 1
ErhaltungServer/Start.cpp

@@ -3,9 +3,13 @@
 #include <iostream>
 #include <fstream>
 #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/erhaltung/" );
@@ -45,7 +49,6 @@ int main()
 
 	eServer->ende();
 	eServer->release();
-	dat->speichern();
 	dat->release();
 	std::cout << "ES: Der Server ist heruntergefahren.\n";
 	file.close();