Start.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. #ifdef WIN32
  2. #include <main.h>
  3. #else
  4. #include <spawn.h>
  5. #endif
  6. #include <Zeit.h>
  7. #include <iostream>
  8. #include <fstream>
  9. #include <Text.h>
  10. #include <Datei.h>
  11. #include <InitDatei.h>
  12. #include <sql.h>
  13. #include <Klient.h>
  14. using namespace Framework;
  15. #pragma GCC diagnostic push
  16. #pragma GCC diagnostic ignored "-Wunused-result"
  17. #ifdef WIN32
  18. int KSGStart Framework::Start( Startparam p )
  19. #else
  20. int main()
  21. #endif
  22. {
  23. #ifdef _DEBUG
  24. chdir( "/test/startup" );
  25. #else
  26. chdir( "/ksg/Server/startup" );
  27. #endif
  28. Network::Start( 100 );
  29. Zeit *z = getZeit();
  30. Text *pfad = new Text( "../log/startup/" );
  31. pfad->append( z->getZeit( "y-m-d_h-i-s.log" ) );
  32. z->release();
  33. DateiPfadErstellen( pfad->getText() );
  34. std::ofstream file;
  35. file.open( pfad->getText() );
  36. std::streambuf *sbuf = std::cout.rdbuf();
  37. std::cout.rdbuf( file.rdbuf() );
  38. pfad->release();
  39. system( "/usr/lib/sendmail -t < mail" );
  40. std::cout << "Startet...\n";
  41. std::cout << "Lese init Datei ../data/startup.ini ...\n";
  42. InitDatei *dat = new InitDatei( "../data/startup.ini" );
  43. if( !dat->laden() )
  44. {
  45. std::cout << "error: Datei konnte nicht gelesen werden. Das Programm wird geschlossen.\n";
  46. dat->release();
  47. file.close();
  48. std::cout.rdbuf( sbuf );
  49. Network::Exit();
  50. return 1;
  51. }
  52. std::cout << "Verbindung mit Datenbank wird hergestellt...\n";
  53. if( !dat->wertExistiert( "DBIP" ) )
  54. {
  55. std::cout << "error: Kein 'DBIP' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  56. dat->release();
  57. file.close();
  58. std::cout.rdbuf( sbuf );
  59. Network::Exit();
  60. return 2;
  61. }
  62. if( !dat->wertExistiert( "DBPort" ) )
  63. {
  64. std::cout << "error: Kein 'DBPort' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  65. dat->release();
  66. file.close();
  67. std::cout.rdbuf( sbuf );
  68. Network::Exit();
  69. return 2;
  70. }
  71. if( !dat->wertExistiert( "DBBenutzer" ) )
  72. {
  73. std::cout << "error: Kein 'DBBenutzer' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  74. dat->release();
  75. file.close();
  76. std::cout.rdbuf( sbuf );
  77. Network::Exit();
  78. return 2;
  79. }
  80. if( !dat->wertExistiert( "DBPasswort" ) )
  81. {
  82. std::cout << "error: Kein 'DBPasswort' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  83. dat->release();
  84. file.close();
  85. std::cout.rdbuf( sbuf );
  86. Network::Exit();
  87. return 2;
  88. }
  89. if( !dat->wertExistiert( "DBName" ) )
  90. {
  91. std::cout << "error: Kein 'DBName' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  92. dat->release();
  93. file.close();
  94. std::cout.rdbuf( sbuf );
  95. Network::Exit();
  96. return 2;
  97. }
  98. sql::Datenbank *db = new sql::Datenbank( dat->zWert( "DBBenutzer" )->getText(),
  99. dat->zWert( "DBPasswort" )->getText(),
  100. dat->zWert( "DBName" )->getText(),
  101. dat->zWert( "DBIP" )->getText(),
  102. (unsigned short)TextZuInt( dat->zWert( "DBPort" )->getText(), 10 ) );
  103. if( !db->istOk() )
  104. {
  105. Text *err = db->getLetzterFehler();
  106. std::cout << "error: Es konnte keine Verbindung zur datenbank hergestellt werden. Das Programm wird geschlossen.\n" << err->getText();
  107. err->release();
  108. db->release();
  109. dat->release();
  110. file.close();
  111. std::cout.rdbuf( sbuf );
  112. Network::Exit();
  113. return 3;
  114. }
  115. std::cout << "Verbindung zur Datenbank erfolgreich Hergestellt.\n";
  116. std::cout << "Überprüfe ob Datenbank Server läuft...\n";
  117. if( !dat->wertExistiert( "DBServerIP" ) )
  118. {
  119. std::cout << "error: Kein 'DBServerIP' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  120. db->release();
  121. dat->release();
  122. file.close();
  123. std::cout.rdbuf( sbuf );
  124. Network::Exit();
  125. return 2;
  126. }
  127. if( !dat->wertExistiert( "DBServerPort" ) )
  128. {
  129. std::cout << "error: Kein 'DBServerIP' Eintrag in der startup.ini gefunden. Das Programm wird geschlossen.\n";
  130. db->release();
  131. dat->release();
  132. file.close();
  133. std::cout.rdbuf( sbuf );
  134. Network::Exit();
  135. return 2;
  136. }
  137. Network::Klient *klient = new Network::Klient();
  138. bool b = klient->verbinde( (unsigned short)TextZuInt( dat->zWert( "DBServerPort" )->getText(), 10 ), dat->zWert( "DBServerIP" )->getText() );
  139. char ret = 0;
  140. if( b )
  141. {
  142. klient->sende( "\6", 1 );
  143. klient->getNachricht( &ret, 1 );
  144. klient->trenne();
  145. }
  146. klient = (Network::Klient *)klient->release();
  147. if( b )
  148. {
  149. std::cout << "error: Der Datenbank Server läuft bereits. Es ist kein erneuter Start des Systems möglich. Das Programm wird geschlossen.\n";
  150. db->release();
  151. dat->release();
  152. file.close();
  153. std::cout.rdbuf( sbuf );
  154. Network::Exit();
  155. return 4;
  156. }
  157. std::cout << "App Server wird gestartet...\n";
  158. if( !dat->wertExistiert( "AppServerPfad" ) )
  159. std::cout << "warnung: Kein 'AppServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  160. else
  161. {
  162. pid_t id;
  163. char *args[] = { (char *)"AppServer", (char *)0 };
  164. chdir( dat->zWert( "AppServerPfad" )->getText() );
  165. posix_spawn( &id, "AppServer", 0, 0, args, 0 );
  166. std::cout << "App Server wurde gestartet.\n";
  167. }
  168. /*std::cout << "Chat App Server wird gestartet...\n";
  169. if( !dat->wertExistiert( "ChatAppServerPfad" ) )
  170. std::cout << "warnung: Kein 'ChatAppServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  171. else
  172. {
  173. pid_t id;
  174. char *args[] = { ( char* )"ChatAppServer", (char*)0 };
  175. chdir( dat->zWert( "ChatAppServerPfad" )->getText() );
  176. posix_spawn( &id, "ChatAppServer", 0, 0, args, 0 );
  177. std::cout << "Chat App Server wurde gestartet.\n";
  178. }*/
  179. std::cout << "Main Server wird gestartet...\n";
  180. if( !dat->wertExistiert( "MainServerPfad" ) )
  181. std::cout << "warnung: Kein 'MainServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  182. else
  183. {
  184. pid_t id;
  185. char *args[] = { (char *)"MainServer", (char *)0 };
  186. chdir( dat->zWert( "MainServerPfad" )->getText() );
  187. posix_spawn( &id, "MainServer", 0, 0, args, 0 );
  188. std::cout << "Main Server wurde gestartet.\n";
  189. }
  190. std::cout << "Lösche Client Liste in Datenbank...\n";
  191. db->befehl( "SELECT id from client" );
  192. sql::Result r = db->getResult();
  193. for( int i = 0; i < r.zeilenAnzahl; i++ )
  194. {
  195. Text *befehl = new Text( "SELECT unregister_client( " );
  196. befehl->append( r.values[ i ].getText() );
  197. befehl->append( " )" );
  198. db->befehl( befehl->getText() );
  199. befehl->release();
  200. }
  201. std::cout << r.zeilenAnzahl << " Clients gelöscht.\n";
  202. r.destroy();
  203. std::cout << "Lösche laufende Spiele...\n";
  204. db->befehl( "SELECT id FROM spiel WHERE end_datum IS NULL" );
  205. r = db->getResult();
  206. for( int i = 0; i < r.zeilenAnzahl; i++ )
  207. {
  208. Text *befehl = new Text( "DELETE FROM spiel_spieler WHERE spiel_id = " );
  209. befehl->append( r.values[ i ].getText() );
  210. db->befehl( befehl->getText() );
  211. befehl->setText( "DELETE FROM spiel WHERE id = " );
  212. befehl->append( r.values[ i ].getText() );
  213. db->befehl( befehl->getText() );
  214. befehl->release();
  215. }
  216. std::cout << r.zeilenAnzahl << " laufende Spiele gelöscht.\n";
  217. r.destroy();
  218. std::cout << "Lösche erstellte Spiele...\n";
  219. db->befehl( "SELECT id FROM spiel_erstellt" );
  220. r = db->getResult();
  221. for( int i = 0; i < r.zeilenAnzahl; i++ )
  222. {
  223. Text *befehl = new Text( "DELETE FROM spiel_erstellt_spieler WHERE spiel_erstellt_id = " );
  224. befehl->append( r.values[ i ].getText() );
  225. db->befehl( befehl->getText() );
  226. befehl->setText( "DELETE FROM spiel_erstellt_gruppe WHERE spiel_erstellt_id = " );
  227. befehl->append( r.values[ i ].getText() );
  228. db->befehl( befehl->getText() );
  229. befehl->setText( "DELETE FROM spiel_erstellt WHERE id = " );
  230. befehl->append( r.values[ i ].getText() );
  231. db->befehl( befehl->getText() );
  232. befehl->release();
  233. }
  234. std::cout << r.zeilenAnzahl << " erstellte Spiele gelöscht.\n";
  235. r.destroy();
  236. std::cout << "Lösche Warteschlange...\n";
  237. db->befehl( "DELETE FROM account_anmeldung_fuer_spiel" );
  238. std::cout << db->getZeilenAnzahl() << " Spieler aus der Warteschlange entfernt.\n";
  239. db->befehl( "DELETE FROM gruppe_anmeldung_fuer_spiel" );
  240. std::cout << db->getZeilenAnzahl() << " Gruppen aus der Warteschlange entfernt.\n";
  241. std::cout << "Lösche Gruppen...\n";
  242. db->befehl( "SELECT id FROM gruppe" );
  243. r = db->getResult();
  244. for( int i = 0; i < r.zeilenAnzahl; i++ )
  245. {
  246. Text *befehl = new Text( "DELETE FROM gruppe_spieler WHERE gruppe_id = " );
  247. befehl->append( r.values[ i ].getText() );
  248. db->befehl( befehl->getText() );
  249. befehl->setText( "DELETE FROM gruppe WHERE id = " );
  250. befehl->append( r.values[ i ].getText() );
  251. db->befehl( befehl->getText() );
  252. befehl->release();
  253. }
  254. std::cout << r.zeilenAnzahl << " Gruppen gelöscht.\n";
  255. r.destroy();
  256. db->befehl( "UPDATE server a SET server_status_id = 1, tasks = 0 FROM server_typ b WHERE a.server_typ_name = b.name AND b.task_name = 'clients'" );
  257. std::cout << db->getZeilenAnzahl() << " Server zurückgesetzt.\n";
  258. //std::cout << "Lösche Chaträume...\n";
  259. //db->befehl( "SELECT id FROM chatroom" );
  260. //r = db->getResult();
  261. //for( int i = 0; i < r.zeilenAnzahl; i++ )
  262. //{
  263. // Text *befehl = new Text( "DELETE FROM chatroom_spieler WHERE chatroom_id = " );
  264. // befehl->append( r.values[ i ].getText() );
  265. // db->befehl( befehl->getText() );
  266. // befehl->setText( "DELETE FROM chatroom WHERE id = " );
  267. // befehl->append( r.values[ i ].getText() );
  268. // db->befehl( befehl->getText() );
  269. // befehl->release();
  270. //}
  271. //std::cout << r.zeilenAnzahl << " Chaträume gelöscht.\n";
  272. //r.destroy();
  273. std::cout << "Starte Erhaltungs Server...\n";
  274. if( !dat->wertExistiert( "ErhaltungServerPfad" ) )
  275. std::cout << "warnung: Kein 'ErhaltungServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  276. else
  277. {
  278. pid_t id;
  279. char *args[] = { (char *)"ErhaltungServer", (char *)0 };
  280. chdir( dat->zWert( "ErhaltungServerPfad" )->getText() );
  281. posix_spawn( &id, "ErhaltungServer", 0, 0, args, 0 );
  282. std::cout << "Erhaltung Server wurde gestartet.\n";
  283. }
  284. std::cout << "Starte Patch Server...\n";
  285. if( !dat->wertExistiert( "PatchServerPfad" ) )
  286. std::cout << "warnung: Kein 'PatchServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  287. else
  288. {
  289. pid_t id;
  290. char *args[] = { (char *)"PatchServer", (char *)0 };
  291. chdir( dat->zWert( "PatchServerPfad" )->getText() );
  292. posix_spawn( &id, "PatchServer", 0, 0, args, 0 );
  293. std::cout << "Patch Server wurde gestartet.\n";
  294. }
  295. std::cout << "Starte Register Server...\n";
  296. if( !dat->wertExistiert( "RegisterServerPfad" ) )
  297. std::cout << "warnung: Kein 'RegisterServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  298. else
  299. {
  300. pid_t id;
  301. char *args[] = { (char *)"RegisterServer", (char *)0 };
  302. chdir( dat->zWert( "RegisterServerPfad" )->getText() );
  303. posix_spawn( &id, "RegisterServer", 0, 0, args, 0 );
  304. std::cout << "Register Server wurde gestartet.\n";
  305. }
  306. std::cout << "Starte Login Server...\n";
  307. if( !dat->wertExistiert( "LoginServerPfad" ) )
  308. std::cout << "warnung: Kein 'LoginServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  309. else
  310. {
  311. pid_t id;
  312. char *args[] = { (char *)"LoginServer", (char *)0 };
  313. chdir( dat->zWert( "LoginServerPfad" )->getText() );
  314. posix_spawn( &id, "LoginServer", 0, 0, args, 0 );
  315. std::cout << "Login Server wurde gestartet.\n";
  316. }
  317. std::cout << "Starte Information Server...\n";
  318. if( !dat->wertExistiert( "InformationServerPfad" ) )
  319. std::cout << "warnung: Kein 'InformationServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  320. else
  321. {
  322. pid_t id;
  323. char *args[] = { (char *)"InformationServer", (char *)0 };
  324. chdir( dat->zWert( "InformationServerPfad" )->getText() );
  325. posix_spawn( &id, "InformationServer", 0, 0, args, 0 );
  326. std::cout << "Information Server wurde gestartet.\n";
  327. }
  328. std::cout << "Starte Chat Server...\n";
  329. if( !dat->wertExistiert( "ChatServerPfad" ) )
  330. std::cout << "warnung: Kein 'ChatServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  331. else
  332. {
  333. pid_t id;
  334. char *args[] = { (char *)"ChatServer", (char *)0 };
  335. chdir( dat->zWert( "ChatServerPfad" )->getText() );
  336. posix_spawn( &id, "ChatServer", 0, 0, args, 0 );
  337. std::cout << "Chat Server wurde gestartet.\n";
  338. }
  339. std::cout << "Starte Anmeldung Server...\n";
  340. if( !dat->wertExistiert( "AnmeldungServerPfad" ) )
  341. std::cout << "warnung: Kein 'AnmeldungServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  342. else
  343. {
  344. pid_t id;
  345. char *args[] = { (char *)"AnmeldungServer", (char *)0 };
  346. chdir( dat->zWert( "AnmeldungServerPfad" )->getText() );
  347. posix_spawn( &id, "AnmeldungServer", 0, 0, args, 0 );
  348. std::cout << "Anmeldung Server wurde gestartet.\n";
  349. }
  350. std::cout << "Starte karten Server...\n";
  351. if( !dat->wertExistiert( "KartenServerPfad" ) )
  352. std::cout << "warnung: Kein 'KartenServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  353. else
  354. {
  355. pid_t id;
  356. char *args[] = { (char *)"KartenServer", (char *)0 };
  357. chdir( dat->zWert( "KartenServerPfad" )->getText() );
  358. posix_spawn( &id, "KartenServer", 0, 0, args, 0 );
  359. std::cout << "Karten Server wurde gestartet.\n";
  360. }
  361. std::cout << "Starte spiel Server...\n";
  362. if( !dat->wertExistiert( "SpielServerPfad" ) )
  363. std::cout << "warnung: Kein 'SpielServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  364. else
  365. {
  366. pid_t id;
  367. char *args[] = { (char *)"SpielServer", (char *)0 };
  368. chdir( dat->zWert( "SpielServerPfad" )->getText() );
  369. posix_spawn( &id, "SpielServer", 0, 0, args, 0 );
  370. std::cout << "Spiel Server wurde gestartet.\n";
  371. }
  372. std::cout << "Starte Shop Server...\n";
  373. if( !dat->wertExistiert( "ShopServerPfad" ) )
  374. std::cout << "warnung: Kein 'ShopServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  375. else
  376. {
  377. pid_t id;
  378. char *args[] = { (char *)"ShopServer", (char *)0 };
  379. chdir( dat->zWert( "ShopServerPfad" )->getText() );
  380. posix_spawn( &id, "ShopServer", 0, 0, args, 0 );
  381. std::cout << "Shop Server wurde gestartet.\n";
  382. }
  383. std::cout << "Starte Historie Server...\n";
  384. if( !dat->wertExistiert( "HistorieServerPfad" ) )
  385. std::cout << "warnung: Kein 'HistorieServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  386. else
  387. {
  388. pid_t id;
  389. char *args[] = { (char *)"HistorieServer", (char *)0 };
  390. chdir( dat->zWert( "HistorieServerPfad" )->getText() );
  391. posix_spawn( &id, "HistorieServer", 0, 0, args, 0 );
  392. std::cout << "Historie Server wurde gestartet.\n";
  393. }
  394. std::cout << "Starte News Server...\n";
  395. if( !dat->wertExistiert( "NewsServerPfad" ) )
  396. std::cout << "warnung: Kein 'NewsServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  397. else
  398. {
  399. pid_t id;
  400. char *args[] = { (char *)"NewsServer", (char *)0 };
  401. chdir( dat->zWert( "NewsServerPfad" )->getText() );
  402. posix_spawn( &id, "NewsServer", 0, 0, args, 0 );
  403. std::cout << "News Server wurde gestartet.\n";
  404. }
  405. std::cout << "Starte Editor Server...\n";
  406. if( !dat->wertExistiert( "EditorServerPfad" ) )
  407. std::cout << "warnung: Kein 'EditorServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  408. else
  409. {
  410. pid_t id;
  411. char *args[] = { (char *)"EditorServer", (char *)0 };
  412. chdir( dat->zWert( "EditorServerPfad" )->getText() );
  413. posix_spawn( &id, "EditorServer", 0, 0, args, 0 );
  414. std::cout << "Editor Server wurde gestartet.\n";
  415. }
  416. std::cout << "Starte Minigame Server...\n";
  417. if( !dat->wertExistiert( "MinigameServerPfad" ) )
  418. std::cout << "warnung: Kein 'MinigameServerPfad' Eintrag in der startup.ini gefunden. Dieser Server wird nicht gestartet.\n";
  419. else
  420. {
  421. pid_t id;
  422. char *args[] = { (char *)"MinigameServer", (char *)0 };
  423. chdir( dat->zWert( "MinigameServerPfad" )->getText() );
  424. posix_spawn( &id, "MinigameServer", 0, 0, args, 0 );
  425. std::cout << "Minigame Server wurde gestartet.\n";
  426. }
  427. db->release();
  428. dat->speichern();
  429. dat->release();
  430. std::cout << "Der Startvorgang wurde beendet.\n";
  431. file.close();
  432. std::cout.rdbuf( sbuf );
  433. Network::Exit();
  434. return 0;
  435. }
  436. #pragma GCC diagnostic pop