Panel/includes/lib_remote.php
copilot-swe-agent[bot] 7377f955fd
Fix PHP 8.3 htmlentities null safety, remove unused themes, rename OGP_LANG_ to LANG_
Agent-Logs-Url: https://github.com/GameServerPanel/GSP/sessions/9909a053-0a66-4453-a844-d3b80d727b27

Co-authored-by: iaretechnician <2749183+iaretechnician@users.noreply.github.com>
2026-05-04 17:31:16 +00:00

1191 lines
33 KiB
PHP

<?php
/*
*
* OGP - Open Game Panel
* Copyright (C) 2008 - 2018 The OGP Development Team
*
* http://www.opengamepanel.org/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
require_once("Crypt/XXTEA.php");
if (!defined('GSP_XMLRPC_READY')) {
if (!function_exists('xmlrpc_encode_request') || !function_exists('xmlrpc_decode')) {
$message = "GSP requires the PHP xmlrpc extension for agent communication.\n".
"Install the php-xmlrpc package for your PHP version (example: sudo apt install php8.3-xmlrpc on Ubuntu 24.04 or use PECL).\n".
"See https://www.php.net/manual/en/book.xmlrpc.php for installation instructions.";
if (PHP_SAPI === 'cli') {
fwrite(STDERR, $message . PHP_EOL);
} else {
if (!headers_sent()) {
header('Content-Type: text/plain; charset=UTF-8', true, 500);
}
echo nl2br(htmlentities($message ?? '', ENT_QUOTES, 'UTF-8'));
}
exit(1);
}
define('GSP_XMLRPC_READY', true);
}
// Screen type for servers
define("OGP_SCREEN_TYPE_HOME","HOME");
define("OGP_SCREEN_TYPE_UPDATE","UPDATE");
define("AGENT_ERROR_NOT_EXECUTABLE",-13);
class OGPRemoteLibrary
{
private $port;
private $host;
private $encryption_key;
private $enc;
private $timeout;
public function __construct($host,$port,$encryption_key,$timeout = 5)
{
$this->host = $host;
$this->port = $port;
$this->encryption_key = $encryption_key;
$this->enc = new Crypt_XXTEA();
$this->enc->setKey($this->encryption_key);
$this->timeout = $timeout;
}
public function __destruct()
{
}
private function sendRequest($request)
{
$context = stream_context_create
(array('http' => array
(
'method' => "POST",
'header' => "Content-Type: text/xml",
'content' => $request,
'timeout' => $this->timeout
)));
$status = @file_get_contents("http://".$this->host.":".$this->port."/RPC2", false, $context);
return xmlrpc_decode($status);
}
private function encryptParam($param)
{
$param = base64_encode($param);
$param = $this->enc->encrypt($param);
return base64_encode($param);
}
private function encrypt_params()
{
$params_array = array();
$args = func_get_args();
foreach ((array)$args as $arg)
{
array_push($params_array,$this->encryptParam($arg));
}
return $params_array;
}
/// \return FALSE If there was problems in the decoding.
private function decryptParam($param)
{
$param_tmp = base64_decode($param_tmp,true);
$param_tmp = $this->enc->decrypt($param);
// Lets check in strict mode, so that errors are found.
$param_tmp = base64_decode($param_tmp,true);
if ( $param_tmp === FALSE )
return FALSE;
$param = $param_tmp;
return TRUE;
}
private function add_enc_chk(&$args)
{
$param = "Encryption checking OK";
if(is_array($args))
{
array_push($args, $this->encryptParam($param));
}
elseif(is_null($args))
{
$args = $this->encryptParam($param);
}
else
{
$args = array($args, $this->encryptParam($param));
}
}
/// \returns 1 If file exists
/// \returns 0 If file does not exist
/// \returns -1 If server not available.
public function rfile_exists($file)
{
$args = $this->encryptParam(trim($file));
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("rfile_exists", $args);
$status = $this->sendRequest($request);
if ( $status === 0 )
return 1;
if ( empty($status) )
return -1;
// File does not exist.
return 0;
}
/// \returns 1 If online
/// \returns 0 If offline
/// \returns -1 If encryption key mismatch
public function status_chk()
{
$param = "hello";
$args = $this->encryptParam($param);
$request = xmlrpc_encode_request("quick_chk", $args);
$status = $this->sendRequest($request);
// If 1 is returned then the encryption key did not match.
if ( $status === 1 )
return -1;
// When 0 is returned everythin is OK.
else if ( $status === 0 )
return 1;
// We could not connect to the remote host, offline?.
else
return 0;
}
/// \returns 0 When server offline / could not be connected.
/// \returns the log in $data in case the log can be found.
public function get_log($screen_type,$home_id,$home_path,&$data,$nb_of_lines = 100, $console_log = false)
{
$params_array = $this->encrypt_params($screen_type,$home_id,$home_path,$nb_of_lines,$console_log);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request('get_log',$params_array);
$response = $this->sendRequest($request);
if ( $response === NULL )
return 0;
if ( $response == -10 )
return 'Agent Returned: -10. Home not found.';
@list($retval,$data_tmp) = @explode(";",$response);
// We get log only with positive values.
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line)."\n";
}
}
return $retval;
}
/// \brief Stops remote server.
/// \return 1 On success.
/// \return 0 When server offline / could not be connected.
/// \return -1 When error occurred
public function remote_stop_server($home_id, $server_ip,
$server_port, $control_protocol, $control_password, $control_type, $home_path)
{
$params_array = $this->encrypt_params($home_id,$server_ip,$server_port,
$control_protocol,$control_password,$control_type,$home_path);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("stop_server", $params_array);
$status = $this->sendRequest($request);
// Error occurred on the remote end.
if( $status === 1 )
return -1;
// Server successfully stopped.
else if ( $status == 0 )
return 1;
// Connection problems.
else
return 0;
}
/// \brief Send a RCON command.
/// \return 1 On success.
public function remote_send_rcon_command($home_id, $server_ip,
$server_port, $control_protocol, $control_password, $control_type, $rconCommand,&$data)
{
$params_array = $this->encrypt_params($home_id,$server_ip,$server_port,
$control_protocol,$control_password,$control_type, $rconCommand);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("send_rcon_command", $params_array);
$response = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$response);
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line);
}
return 1;
}
elseif ( $retval === 0 )
return 0;
elseif ( $retval === -10 )
return -10;
else
return -1;
}
/// \return 1 If success
/// \return 0 If file does not exist.
/// \return -1 In case of connection error
/// \return -2 If failed to read file.
public function remote_readfile($args,&$data)
{
$args = trim($args);
$args = $this->encryptParam($args);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("readfile", $args);
$response = $this->sendRequest($request);
if ( $response === NULL )
return -1;
if ( is_array($response) && xmlrpc_is_fault($response))
return -1;
@list($retval,$data_tmp) = @explode(";",$response);
$retval = (integer) $retval;
if ( $retval === 0 )
return 0;
else if ( $retval === -1 )
return -2;
$data = base64_decode($data_tmp);
return 1;
}
/// \return 1 If success
/// \return 0 On failure
/// \return -1 If agent could not be connected.
public function remote_writefile($writefile, $content)
{
$content = base64_encode($content);
$params = $this->encrypt_params($writefile,$content);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("writefile", $params);
$response = $this->sendRequest($request);
if ( $response === 1 )
return 1;
else if ( $response === 0 )
return 0;
else
return -1;
}
/// \return 1 If success
public function remote_rebootnow()
{
// Must have a parameter even if one is not used.
$args = $this->encryptParam("reboot");
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("rebootnow", $args);
$response = $this->sendRequest($request);
if ( $response )
return 1;
}
/// Updates the mod located in the game home with steam.
/// \return 1 If update started successfully
/// \return 0 If error
/// \return -1 In case of connection error.
public function steam($home_id,$game_home,$mod,$exec_folder_path,$exec_path,$precmd,$postcmd)
{
$params = $this->encrypt_params($home_id,$game_home,$mod,$exec_folder_path,$exec_path,$precmd,$postcmd);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("steam", $params);
$response = $this->sendRequest($request);
if ( $response === 1 )
return 1;
else if ( $response === 0 )
return 0;
else
return -1;
}
/// Updates the mod located in the game home with steamCmd.
/// \return 1 If update started successfully
/// \return 0 If error
/// \return -1 In case of connection error.
public function steam_cmd($home_id,$game_home,$mod,$modname,$betaname,$betapwd,$user,$pass,$guard,$exec_folder_path,$exec_path,$precmd,$postcmd,$cfg_os,$lockFiles,$archBits)
{
$params = $this->encrypt_params($home_id,$game_home,$mod,$modname,$betaname,$betapwd,$user,$pass,$guard,$exec_folder_path,$exec_path,$precmd,$postcmd,$cfg_os,$lockFiles,$archBits);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("steam_cmd", $params);
$response = $this->sendRequest($request);
if ( $response === 1 )
return 1;
else if ( $response === 0 )
return 0;
else
return -1;
}
// Returns the latest buildid for $appId
public function fetch_steam_version($appId, $pureOutput = 0)
{
$params = $this->encrypt_params($appId, $pureOutput);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("fetch_steam_version", $params);
$response = $this->sendRequest($request);
return $response;
}
// Returns -10 if the steamapps/appmanifest file doesn't exist.
// Returns the version installed otherwise.
public function installed_steam_version($game_home, $mod, $pureOutput = 0)
{
$params = $this->encrypt_params($game_home, $mod, $pureOutput);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("installed_steam_version", $params);
$response = $this->sendRequest($request);
return $response;
}
// If server is running, stops it. Starts an update. And if the server was running, starts the server upon finishing the update.
// Returns -10 if an update is currently in place.
// Returns -9 if the server failed to stop.
// Returns -8 if the update failed to start.
// Returns -7 if the server failed to start.
// Returns 1 on success. (updated, started)
// Returns 2 if the update was successful, but the server wasn't originally running. So wasn't started.
// Requires agent timeout to be set to a high value - otherwise return value will be null.
public function automatic_steam_update(
$home_id, $home_path, $server_ip, $server_port, $exec_path, $exec_folder_path,
$control_protocol, $control_password, $control_type,
$appId, $modname, $betaname, $betapwd, $user, $pass, $guard, $precmd, $postcmd, $cfg_os, $filesToLockUnlock,
$startup_cmd, $cpu, $nice, $preStart, $envVars, $game_key, $archBits, $console_log = ""
)
{
$params = $this->encrypt_params($home_id, $home_path, $server_ip, $server_port, $exec_path, $exec_folder_path,
$control_protocol, $control_password, $control_type,
$appId, $modname, $betaname, $betapwd, $user, $pass, $guard, $precmd, $postcmd, $cfg_os, $filesToLockUnlock,
$startup_cmd, $cpu, $nice, $preStart, $envVars, $game_key, $archBits, $console_log);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("automatic_steam_update", $params);
$response = $this->sendRequest($request);
return $response;
}
/// Updates the mod located in the game home with master server.
/// \return 1 If update started successfully
/// \return 0 If error
/// \return -1 In case of connection error.
public function masterServerUpdate($home_id,$home_path,$ms_home_id,$ms_home_path,$exec_folder_path,$exec_path,$precmd,$postcmd)
{
$params = $this->encrypt_params($home_id,$home_path,$ms_home_id,$ms_home_path,$exec_folder_path,$exec_path,$precmd,$postcmd);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("master_server_update", $params);
$response = $this->sendRequest($request);
if ( $response === 1 )
return 1;
else if ( $response === 0 )
return 0;
else
return -1;
}
/// \brief Checks if the game update is running for the certain gamehome.
/// \return 1 if the update is active
/// \return 0 if the update is not active
/// \return -1 If unable to connect to the remote server.
/// \return -2 In other errors.
public function game_update_active($game_home,$mod)
{
$params = $this->encrypt_params($game_home, $mod);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("game_update_active", $params);
if(!$response = $this->sendRequest($request) )
return -1;
else if ( $response === 1 )
return 1;
else if ( $response === 0 )
return 0;
// other errors.
else
return -2;
}
/// \return -1 If could not connect to the remote host.
/// \return -3 In case of unknown error
/// \todo This function is not complete. Also the agent side requires work.
public function start_file_download($url, $dest, $filename, $action = "", $post_script = "" )
{
$params_array = $this->encrypt_params($url,$dest,$filename,$action,$post_script);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("start_file_download",$params_array);
$response = $this->sendRequest($request);
if( !$response )
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -3;
return $response;
}
public function is_file_download_in_progress($pid)
{
$args = $this->encryptParam($pid);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("is_file_download_in_progress", $args);
return $this->sendRequest($request);
}
public function uncompress_file($file_location, $destination)
{
$params_array = $this->encrypt_params($file_location,$destination);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("uncompress_file",$params_array);
return $this->sendRequest($request);
}
/// \return -1 If could not connect to the remote host.
/// \return -3 In case of unknown error
/// \todo This function is not complete. Also the agent side requires work.
/// \return array of files in directory, when request success.
/// \return -1 If unable to connect to the remote server.
/// \return -2 In case directory was not accessible.
/// \return -3 Any other error.
public function remote_dirlist($args)
{
$args = $this->encryptParam($args);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("dirlist",$args);
if( !$response = $this->sendRequest($request))
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -3;
if( $response < 0 )
return -2;
return explode(";", $response);
}
/// \return array of files and file info (size owner etc) in directory, when request success.
/// \return -1 If unable to connect to the remote server.
/// \return -2 In case directory was not accessible.
/// \return -3 Any other error.
public function remote_dirlistfm($args)
{
$args = $this->encryptParam($args);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("dirlistfm", $args);
$response = $this->sendRequest($request);
if ( $response === NULL )
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -3;
if( $response < 0 )
return -2;
if ( $response == 1 )
return array();
array_walk_recursive($response, function (&$item, $key) {
if ($key == 'filename')$item = base64_decode($item);
});
return $response;
}
/// \returns the number of CPUs on the server
/// \returns -1 If the server cannot be reached.
public function cpu_count()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("cpu_count", $args);
$status = $this->sendRequest($request);
if ( empty($status) )
{
return -1;
}
return $status;
}
public function renice_process($home_id, $nice)
{
$params_array = $this->encrypt_params($home_id, $nice);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("renice_process",$params_array);
return $this->sendRequest($response);
}
/// \return 1 If everything ok
/// \return -1 If connection could not be established.
/// \return -2 In other errors.
/// \todo Other return values?
// Starts game server
public function universal_start($home_id, $game_home, $game_binary, $run_dir, $startup_cmd,
$server_port, $server_ip, $cpu, $nice, $preStart, $envVars, $game_key, $console_log = "")
{
$params_array = $this->encrypt_params($home_id, $game_home, $game_binary,
$run_dir, $startup_cmd, $server_port, $server_ip, $cpu, $nice, $preStart, $envVars, $game_key, $console_log);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("universal_start", $params_array);
$response = $this->sendRequest($request);
if($response === NULL)
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -2;
return $response;
}
public function lock_additional_home_files($game_home, $filesToLockUnlock, $action)
{
$params_array = $this->encrypt_params($game_home, $filesToLockUnlock, $action);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("lock_additional_files", $params_array);
$response = $this->sendRequest($request);
if($response === NULL)
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -2;
return $response;
}
/// \returns the os of the remote host.
public function what_os()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("what_os", $args);
$status = $this->sendRequest($request);
return "$status";
}
/// \return Available IP addresses of the remote host.
/// \return empty array if no ip's are found.
/// \return array containing the ip's on success.
public function discover_ips()
{
$args = "chk";
$args = $this->encryptParam($args);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("discover_ips", $args);
$status = $this->sendRequest($request);
if ( $status == 0 )
return array();
return explode(",",$status);
}
/// \brief Checks if the server is running.
/// \return 1 If is
/// \return 0 If is not
/// \return -1 If agent could not be reached.
public function is_screen_running($screen_type,$home_id)
{
$params = $this->encrypt_params($screen_type,$home_id);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("is_screen_running", $params);
$status = $this->sendRequest($request);
if ( $status === 1 )
return 1;
else if ( $status === 0 )
return 0;
else
return -1;
}
public function mon_stats()
{
$args = $this->encrypt_params("mon_stats");
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("mon_stats", $args);
$response = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$response);
$data = NULL;
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line);
}
}
return $data;
}
/// \brief copies a game home on the filesystem.
/// \return 1 On success.
/// \return 0 When server offline / could not be connected.
/// \return -1 When error occurred
/// Usually a -1 happens because of a connection timeout during the copy. This is expected
public function clone_home($source_home, $dest_home, $owner)
{
$params_array = $this->encrypt_params($source_home, $dest_home, $owner);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("clone_home", $params_array);
$status = $this->sendRequest($request);
// Copy was successful.
if( $status === 1 )
return 1;
// Copy failed.
else if ( $status === 0 )
return 0;
// Connection problems.
else
return -1;
}
/// \brief removes a game home from the filesystem.
/// \return 1 On success.
/// \return 0 When server offline / could not be connected.
/// \return -1 When error occurred
public function remove_home($game_home_del)
{
$args = $this->encryptParam($game_home_del);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("remove_home", $args);
$status = $this->sendRequest($request);
// Delete was successful.
if( $status === 1 )
return 1;
// Delete failed.
else if ( $status === 0 )
return 0;
// Connection problems.
else
return -1;
}
public function remote_restart_server($home_id,$server_ip,$server_port,
$control_protocol,$control_password,$control_type,
$home_path,$server_exe,$run_dir,$cmd,$cpu,$nice,$preStart, $envVars, $game_key, $console_log = "")
{
$params_array = $this->encrypt_params($home_id,$server_ip,$server_port,
$control_protocol,$control_password,$control_type,
$home_path,$server_exe,$run_dir,$cmd,$cpu,$nice,$preStart,$envVars, $game_key, $console_log);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("restart_server", $params_array);
$status = $this->sendRequest($request);
// Error server cant stop.
if( $status === -2 )
return -2;
// Error server cant start.
else if ( $status === -1 )
return -1;
//// OK successfully restarted.
else if ( $status === 1 )
return 1;
// Connection problems.
else
return 0;
}
public function sudo_exec($command)
{
$args = $this->encryptParam($command);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("sudo_exec", $args);
$status = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$status);
$data = NULL;
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line)."\n";
}
return $data;
}
return 0;
}
public function exec($command)
{
$args = $this->encryptParam($command);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("exec", $args);
$response = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$response);
$data = NULL;
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line);
}
}
return $data;
}
public function secure_path($action, $path)
{
$params_array = $this->encrypt_params($action, $path);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("secure_path", $params_array);
$status = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$status);
$data = NULL;
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line);
}
}
return $data;
}
public function get_chattr($path)
{
$args = $this->encryptParam($path);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("get_chattr", $args);
$status = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$status);
$data = NULL;
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line);
}
}
return $data;
}
public function ftp_mgr($action, $login = "", $password = "", $home_path = "")
{
$params_array = $this->encrypt_params($action, $login, $password, $home_path);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("ftp_mgr", $params_array);
$status = $this->sendRequest($request);
@list($retval,$data_tmp) = @explode(";",$status);
$data = '';
if ( $retval > 0 )
{
$data_tmp = is_string($data_tmp) ? $data_tmp : '';
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$decoded_line = base64_decode($line);
if(!preg_match("/^[\s|\t]*$/", $decoded_line))
$data .= "$decoded_line\n";
}
return $data;
}
return 0;
}
public function compress_files($files,$destination,$archive_name,$archive_type)
{
$params_array = $this->encrypt_params($files,$destination,$archive_name,$archive_type);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("compress_files",$params_array);
return $this->sendRequest($request);
}
public function stop_fastdl()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("stop_fastdl",$args);
return $this->sendRequest($request);
}
public function start_fastdl()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("start_fastdl",$args);
return $this->sendRequest($request);
}
public function restart_fastdl()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("restart_fastdl",$args);
return $this->sendRequest($request);
}
public function fastdl_status()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("fastdl_status",$args);
$response = $this->sendRequest($request);
if($response === -1 or $response === 0)
return -1;
return 1;
}
public function fastdl_get_aliases()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("fastdl_get_aliases",$args);
$response = $this->sendRequest($request);
if(!is_array($response) or count((array)$response) == 0)
return -1;
return $response;
}
public function fastdl_add_alias($alias,$home,$match_file_extension,$match_client_ip)
{
$params_array = $this->encrypt_params($alias,$home,$match_file_extension,$match_client_ip);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("fastdl_add_alias",$params_array);
return $this->sendRequest($request);
}
public function fastdl_del_alias($aliases)
{
if(is_array($aliases))
{
$params_array = array();
foreach ((array)$aliases as $alias)
{
$params_array[] = $this->encryptParam($alias);
}
}
else
$params_array = array(0 => $this->encryptParam($aliases));
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("fastdl_del_alias",$params_array);
return $this->sendRequest($request);
}
public function fastdl_get_info()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("fastdl_get_info",$args);
$response = $this->sendRequest($request);
if($response === -1 or $response == 0)
return -1;
return $response;
}
public function fastdl_create_config($fd_address, $fd_port, $listing, $autostart_on_agent_startup)
{
$params_array = $this->encrypt_params($fd_address, $fd_port, $listing, $autostart_on_agent_startup);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("fastdl_create_config",$params_array);
return $this->sendRequest($request);
}
public function agent_restart()
{
$args = $this->encryptParam('restart');
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("agent_restart", $args);
$response = $this->sendRequest($request);
if($response === -1)
return -1;
return 1;
}
public function scheduler_list_tasks()
{
$args = NULL;
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("scheduler_list_tasks", $args);
$response = $this->sendRequest($request);
if($response === -1 or $response == 0)
return -1;
else
{
$data = array();
foreach ((array)$response as $id => $task)
{
$task = trim(base64_decode($task));
$data[$id] = $task;
}
ksort($data);
return $data;
}
}
public function scheduler_del_task($id)
{
$args = $this->encryptParam($id);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("scheduler_del_task",$args);
return $this->sendRequest($request);
}
public function scheduler_add_task($job)
{
$args = $this->encryptParam($job);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("scheduler_add_task",$args);
return $this->sendRequest($request);
}
public function scheduler_edit_task($job_id, $job)
{
$params_array = $this->encrypt_params($job_id, $job);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("scheduler_edit_task",$params_array);
return $this->sendRequest($request);
}
public function remote_get_file_part($file, $offset, &$data)
{
$params_array = $this->encrypt_params($file, $offset);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("get_file_part",$params_array);
$response = $this->sendRequest($request);
if ( $response === NULL )
return -1;
if ( is_array($response) && xmlrpc_is_fault($response))
return -1;
if ( $response === -1 )
return -1;
list($cur_offset,$data_tmp) = explode(";",$response);
$data = base64_decode($data_tmp);
return $cur_offset;
}
public function shell_action($action, $arguments)
{
$params_array = $this->encrypt_params($action, $arguments);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("shell_action", $params_array);
$response = $this->sendRequest($request);
if (is_array($response) && xmlrpc_is_fault($response))
return NULL;
$data = NULL;
if (is_array($response) and !empty($response))
{
$data = array();
foreach ((array)$response as $key => $value)
{
$data[$key] = base64_decode($value);
}
return $data;
}
@list($retval,$data_tmp) = @explode(";",$response);
if ( $retval > 0 )
{
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
$data .= base64_decode($line);
}
}
return $data;
}
public function stop_update($home_id)
{
$args = $this->encryptParam($home_id);
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("stop_update", $args);
$response = $this->sendRequest($request);
if ($response === NULL)
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -1;
if ($response === 1)
return -1;
return 1;
}
public function remote_query($protocol, $game_type, $ip, $c_port, $q_port, $s_port)
{
$params_array = $this->encrypt_params($protocol, $game_type, $ip, $c_port, $q_port, $s_port);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("remote_query", $params_array);
$response = $this->sendRequest($request);
if (is_array($response) && xmlrpc_is_fault($response))
return NULL;
if ($response === -1 or $response === 0)
return NULL;
return base64_decode($response);
}
public function send_steam_guard_code($home_id, $sgc)
{
$params_array = $this->encrypt_params($home_id, $sgc);
$this->add_enc_chk($params_array);
$request = xmlrpc_encode_request("send_steam_guard_code", $params_array);
$response = $this->sendRequest($request);
if ($response === NULL)
return -1;
if (is_array($response) && xmlrpc_is_fault($response))
return -1;
if ($response === 1)
return -1;
return 1;
}
/// Updates the mod located in the game home with steamCmd.
/// \return 1 If update started successfully
/// \return 0 If error
/// \return -1 In case of connection error.
public function steam_workshop($home_id, $mods_full_path,
$workshop_id, $mods_list,
$regex, $mods_backreference_index,
$variable, $place_after, $mod_string,
$string_separator, $config_file_path,
$post_install, $mod_names_list,
$anonymous_login, $user, $pass,
$download_method, $url_list, $filename_list)
{
$params = $this->encrypt_params($home_id, $mods_full_path,
$workshop_id, $mods_list,
$regex, $mods_backreference_index,
$variable, $place_after, $mod_string,
$string_separator, $config_file_path,
$post_install, $mod_names_list,
$anonymous_login, $user, $pass,
$download_method, $url_list, $filename_list);
$this->add_enc_chk($params);
$request = xmlrpc_encode_request("steam_workshop", $params);
$response = $this->sendRequest($request);
// Connection Error
if ($response === NULL)
return -3;
// Subroutine Failure
if(is_array($response) && xmlrpc_is_fault($response))
return -2;
// Error unmet condition
if ($response === -1)
return -1;
//OK
if($response === 1)
return 1;
//Unknown response
return -4;
}
public function get_workshop_mods_info(&$data)
{
$args = $this->encryptParam("mods_info");
$this->add_enc_chk($args);
$request = xmlrpc_encode_request("get_workshop_mods_info", $args);
$response = $this->sendRequest($request);
$data = array();
// Offline
if ($response === NULL)
return -3;
// Failure
if(is_array($response) && xmlrpc_is_fault($response))
return -2;
// mods directory does not exists
if($response === -1)
return -1;
if(preg_match("/^1;/", $response))
{
list($retval, $data_tmp) = explode(";", $response);
$lines = explode('\n',$data_tmp);
foreach ((array)$lines as $line)
{
@list($string_name, $mod_title) = explode(':', base64_decode($line), 2);
if($string_name != "" and $mod_title != "")
$data["$string_name"] = $mod_title;
}
return $retval;
}
//Unknown response
return -4;
}
}
?>