restart_server.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?php
  2. /*
  3. *
  4. * OGP - Open Game Panel
  5. * Copyright (C) 2008 - 2018 The OGP Development Team
  6. *
  7. * http://www.opengamepanel.org/
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version 2
  12. * of the License, or any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22. *
  23. */
  24. require_once('home_handling_functions.php');
  25. require_once("modules/config_games/server_config_parser.php");
  26. function exec_ogp_module() {
  27. global $view,$db;
  28. $ip = $_REQUEST['ip'];
  29. $port = $_REQUEST['port'];
  30. $home_id = $_REQUEST['home_id'];
  31. $mod_id = $_REQUEST['mod_id'];
  32. $user_id = $_SESSION['user_id'];
  33. $isAdmin = $db->isAdmin($user_id);
  34. if($isAdmin)
  35. $home_info = $db->getGameHome($home_id);
  36. else
  37. $home_info = $db->getUserGameHome($user_id,$home_id);
  38. foreach($home_info['mods'][$mod_id] as $key => $value)
  39. {
  40. $home_info[$key] = $value;
  41. }
  42. require_once('includes/lib_remote.php');
  43. $remote = new OGPRemoteLibrary($home_info['agent_ip'],$home_info['agent_port'],$home_info['encryption_key'],$home_info['timeout']);
  44. $os = $remote->what_os();
  45. if ( $home_info === FALSE )
  46. {
  47. print_failure(get_lang('no_rights_to_stop_server'));
  48. return;
  49. }
  50. echo "<h2>";
  51. echo empty($home_info['home_name']) ? get_lang('not_available') : htmlentities($home_info['home_name']);
  52. echo "</h2>";
  53. $server_xml = read_server_config(SERVER_CONFIG_LOCATION."/".$home_info['home_cfg_file']);
  54. if ( !$server_xml )
  55. {
  56. echo create_back_button("gamemanager","game_monitor");
  57. return;
  58. }
  59. $rserver = $db->getRemoteServerById($home_info['remote_server_id']);
  60. if ( empty($rserver) )
  61. {
  62. print_failure("".get_lang('not_found_server')." ".$home_info['remote_server_id'].".");
  63. }
  64. else
  65. {
  66. if(isset($_REQUEST['refresh']))
  67. {
  68. if( isset( $server_xml->console_log ) )
  69. {
  70. $log_path = preg_replace("/mod/", $home_info['mods'][$mod_id]['mod_key'], $server_xml->console_log);
  71. $log_retval = $remote->remote_readfile( $home_info['home_path'].'/'.$log_path, $home_log );
  72. }
  73. else
  74. {
  75. $log_retval = $remote->get_log(OGP_SCREEN_TYPE_HOME,
  76. $home_id,
  77. clean_path($home_info['home_path']."/".$server_xml->exe_location),
  78. $home_log);
  79. }
  80. function getLastLines($string, $n = 1) {
  81. $lines = explode("\n", $string);
  82. $lines = array_slice($lines, -$n);
  83. return implode("\n", $lines);
  84. }
  85. $home_log = getLastLines($home_log, 40);
  86. if ($log_retval > 0)
  87. {
  88. if ( $log_retval == 2 )
  89. print_failure(get_lang('server_not_running_log_found'));
  90. echo "<pre style='background:black;color:white;'>".$home_log."</pre>";
  91. if ($log_retval == 2)
  92. return;
  93. }
  94. else
  95. {
  96. print_failure(get_lang_f('unable_to_get_log',$log_retval));
  97. }
  98. // If game is not supported by lgsl we skip the lgsl checks and
  99. // assume successfull start.
  100. if ( $home_info['use_nat'] == 1 )
  101. $query_ip = $home_info['agent_ip'];
  102. else
  103. $query_ip = $ip;
  104. $running = TRUE;
  105. if ( $server_xml->lgsl_query_name )
  106. {
  107. require('protocol/lgsl/lgsl_protocol.php');
  108. $get_q_and_s = lgsl_port_conversion((string)$server_xml->lgsl_query_name, $port, "", "");
  109. //Connection port
  110. $c_port = $get_q_and_s['0'];
  111. //query port
  112. $q_port = $get_q_and_s['1'];
  113. //software port
  114. $s_port = $get_q_and_s['2'];
  115. $data = lgsl_query_live((string)$server_xml->lgsl_query_name, $query_ip, $c_port, $q_port, $s_port, "sa");
  116. if ( $data['b']['status'] == "0" )
  117. {
  118. $running = FALSE;
  119. }
  120. }
  121. elseif ( $server_xml->gameq_query_name )
  122. {
  123. require_once 'protocol/GameQ/Autoloader.php';
  124. $query_port = get_query_port($server_xml, $port);
  125. $servers = array(
  126. array(
  127. 'id' => 'server',
  128. 'type' => (string)$server_xml->gameq_query_name,
  129. 'host' => $query_ip . ":" . $query_port,
  130. )
  131. );
  132. $gq = new \GameQ\GameQ();
  133. $gq->addServers($servers);
  134. $gq->setOption('timeout', 4);
  135. $gq->setOption('debug', FALSE);
  136. $gq->addFilter('normalise');
  137. $game = $gq->process();
  138. if ( ! $game['server']['gq_online'] )
  139. {
  140. $running = FALSE;
  141. }
  142. }
  143. if( ! $running )
  144. {
  145. if (!isset($_GET['retry']))
  146. $retry = 0;
  147. else
  148. $retry = $_GET['retry'];
  149. if ($retry >= 5)
  150. {
  151. echo "<p>".get_lang('server_running_not_responding')."
  152. <a href=?m=gamemanager&amp;p=stop&amp;home_id=".$home_id.
  153. "&amp;ip=".$ip."&amp;port=".
  154. $port.">".get_lang('already_running_stop_server').".</a></p>";
  155. echo "<table class='center'><tr><td><a href='?m=gamemanager&amp;p=game_monitor&amp;home_id-mod_id-ip-port=$home_id-$mod_id-$ip-$port'><< ".get_lang('back')."</a></td></tr></table>";
  156. }
  157. echo "</b>Retry #".$retry.".</b>";
  158. $retry++;
  159. print("<p class='note'>".get_lang('starting_server')."</p>");
  160. $view->refresh("?m=gamemanager&amp;p=start&amp;refresh&amp;ip=$ip&amp;port=$port&amp;home_id=$home_id&amp;mod_id=$mod_id&amp;retry=".$retry,3);
  161. return;
  162. }
  163. print_success(get_lang_f('server_restarted',htmlentities($home_info['home_name'])));
  164. $ip_id = $db->getIpIdByIp($ip);
  165. $db->delServerStatusCache($ip_id,$port);
  166. $view->refresh("?m=gamemanager&amp;p=game_monitor&amp;home_id-mod_id-ip-port=". $home_id . "-". $mod_id . "-" . $ip . "-" . $port);
  167. echo "<p>".get_lang('follow_server_status')." <a href='?m=gamemanager&amp;p=game_monitor&amp;home_id-mod_id-ip-port=".
  168. $home_id . "-". $mod_id . "-" . $ip . "-" . $port . "'>".get_lang('game_monitor')."</a> ".get_lang('page').".</p>";
  169. return;
  170. }
  171. else
  172. {
  173. $server_home = $home_info;
  174. if( $server_xml->replace_texts )
  175. {
  176. if( isset($server_xml->lgsl_query_name) )
  177. require_once('protocol/lgsl/lgsl_protocol.php');
  178. require_once("modules/gamemanager/cfg_text_replace.php");
  179. }
  180. $control_type = isset($server_xml->control_protocol_type) ? $server_xml->control_protocol_type : "";
  181. $run_dir = isset($server_xml->exe_location) ? $server_xml->exe_location : "";
  182. $start_cmd = get_start_cmd($remote, $server_xml, $home_info, $mod_id, $ip, $port, $db);
  183. // Run pre-start commands
  184. if(isset($server_xml->pre_start) && !empty($server_xml->pre_start)){
  185. $preStart = trim($server_xml->pre_start);
  186. }else{
  187. $preStart = "";
  188. }
  189. // Environment variables
  190. if(isset($server_xml->environment_variables) && !empty($server_xml->environment_variables)){
  191. $envVars = trim($server_xml->environment_variables);
  192. }else{
  193. $envVars = "";
  194. }
  195. // Additional files to lock
  196. if(isset($server_xml->lock_files) && !empty($server_xml->lock_files)){
  197. $lockFiles = trim($server_xml->lock_files);
  198. }else{
  199. $lockFiles = "";
  200. }
  201. if(!empty($lockFiles)){
  202. // Linux only call
  203. if(preg_match("/Linux/", $os)){
  204. $lockedFilesStatus = $remote->lock_additional_home_files($home_info['home_path'], $lockFiles, "lock");
  205. }
  206. }
  207. $remote_retval = $remote->remote_restart_server($home_id,$ip,$port,$server_xml->control_protocol,
  208. $home_info['control_password'],$control_type,$home_info['home_path'],
  209. $server_xml->server_exec_name,$run_dir,$start_cmd,
  210. $home_info['cpu_affinity'],$home_info['nice'],$preStart,$envVars, $server_xml->game_key,
  211. (isset( $server_xml->console_log ) ? $server_xml->console_log : ""));
  212. $db->logger(get_lang_f('server_restarted', $home_info['home_name']) . "($ip:$port)");
  213. if ( $remote_retval === 1 )
  214. {
  215. print("<p class='note'>".get_lang('restarting_server')."</p>");
  216. $view->refresh("?m=gamemanager&amp;p=restart&amp;refresh&amp;ip=$ip&amp;port=$port&amp;home_id=$home_id&amp;mod_id=$mod_id",3);
  217. return;
  218. }
  219. else if ( $remote_retval === -1 )
  220. {
  221. print_failure(get_lang('server_cant_start'));
  222. $view->refresh("?m=gamemanager&amp;p=game_monitor&amp;home_id-mod_id-ip-port=". $home_id . "-". $mod_id . "-" . $ip . "-" . $port,3);
  223. }
  224. else if ( $remote_retval === -2 )
  225. {
  226. print_failure(get_lang('server_cant_stop'));
  227. $view->refresh("?m=gamemanager&amp;p=game_monitor&amp;home_id-mod_id-ip-port=". $home_id . "-". $mod_id . "-" . $ip . "-" . $port,3);
  228. }
  229. else
  230. {
  231. $screen_running = $remote->is_screen_running(OGP_SCREEN_TYPE_HOME,$home_id);
  232. if ( $screen_running == 1 )
  233. {
  234. print("<p class='note'>".get_lang('restarting_server')."</p>");
  235. $view->refresh("?m=gamemanager&amp;p=restart&amp;refresh&amp;ip=$ip&amp;port=$port&amp;home_id=$home_id&amp;mod_id=$mod_id",3);
  236. return;
  237. }
  238. else
  239. {
  240. print_failure("".get_lang('error_occured_remote_host').".$remote_retval");
  241. $view->refresh("?m=gamemanager&amp;p=game_monitor&amp;home_id-mod_id-ip-port=". $home_id . "-". $mod_id . "-" . $ip . "-" . $port,3);
  242. }
  243. }
  244. }
  245. }
  246. }
  247. ?>