ogp_api.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. <?php
  2. /*
  3. *
  4. * OGP - Open Game Panel
  5. * Copyright (C) 2008 - 2017 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. /******************
  25. * Functions *
  26. * ***************/
  27. function outPutJSON($result){
  28. global $action, $db;
  29. // Send JSON ouput
  30. header('Content-Type: application/json');
  31. echo json_encode($result);
  32. exit();
  33. }
  34. function runRemoteAction($action){
  35. global $settings, $db, $remote, $server_xml, $mod_xml, $server_home, $mod_key, $mod_id, $appId, $home_ip_ports, $homeId, $resultOp;
  36. // Load XML and server options
  37. $installer_name = isset($mod_xml->installer_name) ? $mod_xml->installer_name : $mod_key;
  38. $modname = $installer_name == '90' ? $mod_key : '';
  39. $betaname = isset($mod_xml->betaname) ? $mod_xml->betaname : '';
  40. $betapwd = isset($mod_xml->betapwd) ? $mod_xml->betapwd : '';
  41. $login = $mod_xml->installer_login ? $mod_xml->installer_login : $settings['steam_user'];
  42. $pass = $mod_xml->installer_login ? '' : $settings['steam_pass'];
  43. $arch = isset($mod_xml->steam_bitness) ? $mod_xml->steam_bitness : '';
  44. $exec_folder_path = $server_xml->exe_location;
  45. $exec_path = $server_xml->server_exec_name;
  46. $precmd = $server_home['mods'][$mod_id]['precmd'] == "" ? ($server_home['mods'][$mod_id]['def_precmd'] == "" ? $server_xml->pre_install : $server_home['mods'][$mod_id]['def_precmd'] ) : $server_home['mods'][$mod_id]['precmd'];
  47. $postcmd = $server_home['mods'][$mod_id]['postcmd'] == "" ? ($server_home['mods'][$mod_id]['def_postcmd'] == "" ? $server_xml->post_install : $server_home['mods'][$mod_id]['def_precmd'] ) : $server_home['mods'][$mod_id]['postcmd'];
  48. $cfg_os = preg_match('/win32|win64/', $server_xml->game_key) ? 'windows' : 'linux';
  49. $lockFiles = !empty($server_xml->lock_files) ? trim($server_xml->lock_files) : '';
  50. $preStart = !empty($server_xml->pre_start) ? trim($server_xml->pre_start) : '';
  51. $envVars = !empty($server_xml->environment_variables) ? trim($server_xml->environment_variables) : '';
  52. $startup_cmd = get_start_cmd($remote, $server_xml, $server_home, $mod_id, $home_ip_ports['ip'], $home_ip_ports['port'], $db);
  53. switch($action){
  54. case "steam_auto_update":
  55. // Make the update call
  56. $remoteResult = $remote->automatic_steam_update(
  57. //generic
  58. $homeId, $server_home['home_path'], $home_ip_ports['ip'], $home_ip_ports['port'], $exec_path, $exec_folder_path,
  59. //stop
  60. $server_xml->control_protocol, $server_home['control_password'], $server_xml->control_type,
  61. //update
  62. $appId, $modname, $betaname, $betapwd, $login, $pass, $settings['steam_guard'], $precmd, $postcmd, $cfg_os, $lockFiles,
  63. //start
  64. $startup_cmd, $server_home['mods'][$mod_id]['cpu_affinity'], $server_home['mods'][$mod_id]['nice'], $preStart, $envVars, $server_xml->game_key, $arch
  65. );
  66. break;
  67. case "restart_server":
  68. $remoteResult = $remote->remote_restart_server($server_home['home_id'],
  69. $home_ip_ports['ip'],
  70. $home_ip_ports['port'],
  71. $server_xml->control_protocol,
  72. $server_home['control_password'],
  73. $server_xml->control_protocol_type,
  74. $server_home['home_path'],
  75. $server_xml->server_exec_name,
  76. $server_xml->exe_location,
  77. $startup_cmd,
  78. $server_home['mods'][$mod_id]['cpu_affinity'],
  79. $server_home['mods'][$mod_id]['nice'],
  80. $preStart,
  81. $envVars,
  82. $server_xml->game_key
  83. );
  84. break;
  85. case "stop_server":
  86. $remoteResult = $remote->remote_stop_server($server_home['home_id'],
  87. $home_ip_ports['ip'],
  88. $home_ip_ports['port'],
  89. $server_xml->control_protocol,
  90. $server_home['control_password'],
  91. $server_xml->control_protocol_type,
  92. $server_home['home_path']
  93. );
  94. break;
  95. case "start_server":
  96. $remoteResult = $remote->universal_start($server_home['home_id'],
  97. $server_home['home_path'],
  98. $server_xml->server_exec_name,
  99. $server_xml->exe_location,
  100. $startup_cmd,
  101. $home_ip_ports['port'],
  102. $home_ip_ports['ip'],
  103. $server_home['mods'][$mod_id]['cpu_affinity'],
  104. $server_home['mods'][$mod_id]['nice'],
  105. $preStart,
  106. $envVars,
  107. $server_xml->game_key);
  108. break;
  109. }
  110. if($remoteResult == 1){
  111. return true;
  112. }else if(hasValue($remoteResult, true)){
  113. return $remoteResult;
  114. }
  115. return false;
  116. }
  117. function callSteamAutoUpdate(){
  118. global $settings, $db, $remote, $server_xml, $mod_xml, $server_home, $mod_key, $mod_id, $appId, $home_ip_ports, $resultOp;
  119. if($server_xml->installer == 'steamcmd') {
  120. if($remote->rfile_exists($server_home['home_path'] . '/steamapps/appmanifest_' . $appId . '.acf') === 1){
  121. $ourVersion = $remote->installed_steam_version($server_home['home_path'], $appId, 0);
  122. $steamVersion = $remote->fetch_steam_version($appId, 0);
  123. if($ourVersion != $steamVersion){
  124. $success = runRemoteAction("steam_auto_update");
  125. if($success == 1){
  126. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" has been successfully auto-updated via SteamCMD and restarted.";
  127. $resultOp["success"] = true;
  128. }else if($success == 2){
  129. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" has been successfully auto-updated via SteamCMD.";
  130. $resultOp["success"] = true;
  131. }else{
  132. if(is_array($success)){
  133. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" failed to auto-update. Agent returned: " . print_r($success, true);
  134. }else{
  135. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" failed to auto-update. Agent returned error code: " . $success;
  136. }
  137. $resultOp["success"] = false;
  138. }
  139. }else{
  140. $resultOp["message"] = "Server is already up-to-date.";
  141. $resultOp["success"] = false;
  142. }
  143. }else{
  144. $resultOp["message"] = "Unable to find appmanifest.";
  145. $resultOp["success"] = false;
  146. }
  147. }else{
  148. $resultOp["message"] = "Game server does NOT integrate directly with Steam.";
  149. $resultOp["success"] = false;
  150. }
  151. }
  152. function callRestartServer(){
  153. global $settings, $db, $remote, $server_xml, $mod_xml, $server_home, $mod_key, $mod_id, $appId, $home_ip_ports, $resultOp;
  154. $success = runRemoteAction("restart_server");
  155. if($success >= 0){
  156. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" has been successfully restarted.";
  157. $resultOp["success"] = true;
  158. }else{
  159. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" failed to restart. Agent returned: " . (is_array($success) ? print_r($success, true) : $success);
  160. $resultOp["success"] = false;
  161. }
  162. }
  163. function callStartServer(){
  164. global $settings, $db, $remote, $server_xml, $mod_xml, $server_home, $mod_key, $mod_id, $appId, $home_ip_ports, $resultOp;
  165. $success = runRemoteAction("start_server");
  166. if($success == 1){
  167. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" has been successfully started.";
  168. $resultOp["success"] = true;
  169. }else{
  170. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" failed to start. Agent returned: " . (is_array($success) ? print_r($success, true) : $success);
  171. $resultOp["success"] = false;
  172. }
  173. }
  174. function callStopServer(){
  175. global $settings, $db, $remote, $server_xml, $mod_xml, $server_home, $mod_key, $mod_id, $appId, $home_ip_ports, $resultOp;
  176. $success = runRemoteAction("stop_server");
  177. if($success == 1){
  178. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" has stopped successfully.";
  179. $resultOp["success"] = true;
  180. }else{
  181. $resultOp["message"] = "Server \"" . $server_home["home_name"] . "\" failed to stop. Agent returned: " . (is_array($success) ? print_r($success, true) : $success);
  182. $resultOp["success"] = false;
  183. }
  184. }
  185. /****************** *
  186. * CODE APP START *
  187. * ******************/
  188. // Report all PHP errors
  189. error_reporting(E_ERROR);
  190. // Path definitions
  191. define("IMAGES", "images/");
  192. define("INCLUDES", "includes/");
  193. define("MODULES", "modules/");
  194. define("CONFIG_FILE","includes/config.inc.php");
  195. require_once 'includes/functions.php';
  196. require_once 'includes/helpers.php';
  197. require_once 'includes/html_functions.php';
  198. require_once 'modules/config_games/server_config_parser.php';
  199. require_once 'modules/gamemanager/home_handling_functions.php';
  200. require_once 'includes/lib_remote.php';
  201. // Start the session valid for opengamepanel_web only
  202. startSession();
  203. require_once CONFIG_FILE;
  204. // Connect to the database server and select database.
  205. $db = createDatabaseConnection($db_type, $db_host, $db_user, $db_pass, $db_name, $table_prefix);
  206. $settings = $db->getSettings();
  207. @$GLOBALS['panel_language'] = $settings['panel_language'];
  208. // Handle API Request
  209. if(hasValue($_REQUEST["action"]) && hasValue($_REQUEST["homeid"]) && hasValue($_REQUEST["controlpass"]) && is_numeric($_REQUEST["homeid"])){
  210. // Get the variables we need
  211. $action = $_REQUEST["action"];
  212. $homeId = $_REQUEST["homeid"];
  213. $controlPass = $_REQUEST["controlpass"];
  214. // Get home information
  215. $server_home = $db->getGameHome($homeId);
  216. if(hasValue($server_home) && is_array($server_home) && count($server_home) > 0){
  217. if(trim($server_home["control_password"]) == trim(strip_tags($controlPass))){
  218. // Set command server variables (home server XML, IPs, etc)
  219. $server_xml = read_server_config(SERVER_CONFIG_LOCATION . '/' . $server_home['home_cfg_file']);
  220. if($server_xml){
  221. $getIpPorts = $db->getHomeIpPorts($homeId);
  222. $home_ip_ports = $getIpPorts[0];
  223. $remote = new OGPRemoteLibrary($server_home['agent_ip'], $server_home['agent_port'], $server_home['encryption_key'], $server_home['timeout']);
  224. $appId = (int)$server_xml->mods->mod->installer_name;
  225. $mod_id = key($server_home['mods']);
  226. $mod_key = $server_home['mods'][$mod_id]['mod_key'];
  227. $mod_xml = xml_get_mod($server_xml, $mod_key);
  228. if($mod_xml !== false){
  229. /****************************************/
  230. // Actual API Logic :) /
  231. /****************************************/
  232. // Handle API Action
  233. switch($action){
  234. case "autoUpdateSteamHome":
  235. callSteamAutoUpdate();
  236. break;
  237. case "restartServer":
  238. callRestartServer();
  239. break;
  240. case "startServer":
  241. callStartServer();
  242. break;
  243. case "stopServer":
  244. callStopServer();
  245. break;
  246. default:
  247. $resultOp["message"] = "Invalid action specified.";
  248. $resultOp["success"] = false;
  249. }
  250. /****************************************/
  251. // End Actual API Logic :) /
  252. /****************************************/
  253. }else{
  254. $resultOp["message"] = "Problem retrieving server mod XML.";
  255. $resultOp["success"] = false;
  256. }
  257. }else{
  258. $resultOp["message"] = "Failed to read server XML.";
  259. $resultOp["success"] = false;
  260. }
  261. }else{
  262. $resultOp["message"] = "Server home key does not match stored information.";
  263. $resultOp["success"] = false;
  264. }
  265. }else{
  266. $resultOp["message"] = "Unable to find game server home.";
  267. $resultOp["success"] = false;
  268. }
  269. }else{
  270. $resultOp["message"] = "Invalid inputs.";
  271. $resultOp["success"] = false;
  272. }
  273. // Output JSON
  274. if(hasValue($resultOp["message"]) && hasValue($resultOp["success"], true)){
  275. outPutJSON($resultOp);
  276. }
  277. exit();
  278. ?>