-
-
Save aikar/8513f685bc8da139e3aa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Server { | |
public static function isScheduledUpgrade($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
$server = Config::get('servers',$serverName); | |
$destPath = Config::get('server_base_path').$server['folder']; | |
return file_exists($destPath . "/upgrade_trigger"); | |
} | |
public static function scheduleUpgrade($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
$server = Config::get('servers',$serverName); | |
$destPath = Config::get('server_base_path').$server['folder']; | |
if(!file_exists($destPath)){ | |
Core::output('%-Server folder does not exist, creating it'); | |
mkdir($destPath); | |
} | |
touch($destPath . "/upgrade_trigger"); | |
Core::output('%-Upgrade Scheduled'); | |
} | |
public static function upgradeServer($serverName){ | |
self::requireServerLocal($serverName); | |
$server = Config::get('servers',$serverName); | |
$sourcePath = Config::get('core_base_path').'server'; | |
$destPath = Config::get('server_base_path').$server['folder']; | |
if(!file_exists($destPath)){ | |
Core::output('%-Server folder does not exsist, creating it'); | |
mkdir($destPath); | |
} | |
Core::output('%-Copying server over'); | |
Core::startTimer('upgrade'); | |
shell_exec(Config::get('core_base_path') . "scripts/upgrade.sh pre " . escapeshellarg($serverName) . ' ' . escapeshellarg($destPath)); | |
shell_exec('cp -fr '.$sourcePath.'/* '.$destPath.'/'); | |
shell_exec(Config::get('core_base_path') . "scripts/upgrade.sh post " . escapeshellarg($serverName) . ' ' . escapeshellarg($destPath)); | |
Core::output('%-%-copy done, took '.Core::getTimer('upgrade').' seconds'); | |
Core::output('%-Updating server configs'); | |
self::filterFile($serverName, 'server.properties'); | |
self::filterFile($serverName, 'plugins/dynmap/configuration.txt'); | |
self::filterFile($serverName, 'plugins/WorldEdit/config.yml'); | |
$upgradeTrigger = $destPath . "/upgrade_trigger"; | |
if (file_exists($upgradeTrigger)) { | |
unlink($upgradeTrigger); | |
} | |
} | |
private static function filterFile($serverName, $file) { | |
$server = Config::get('servers',$serverName); | |
$destPath = Config::get('server_base_path').$server['folder']; | |
$file = $destPath."/$file"; | |
$replacements = array( | |
'%%server_ip%%' => $server['server_ip'], | |
'%%rcon_ip%%' => $server['rcon_ip'], | |
'%%port%%' => $server['port'], | |
'%%server_title%%' => $serverName, | |
'%%white_list%%' => $server['white_list']?'true':'false' | |
); | |
$data = file_get_contents($file); | |
foreach ($replacements as $find => $replace) { | |
$data = str_replace($find, $replace, $data); | |
} | |
file_put_contents($file, $data); | |
} | |
public static function start($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
$server = Config::get('servers',$serverName); | |
if(self::isRunning($serverName)) | |
{ | |
Core::output('Server '.$serverName.' is already running'); | |
return false; | |
} | |
if ($serverName != 'proxy') { | |
$hardPath = Config::get('server_base_path').$server['folder']; | |
$jar = $hardPath.'/minecraft_server.jar'; | |
} else { | |
$hardPath = Config::get('core_base_path') . '/bungee/'; | |
$jar = $hardPath . '/BungeeCord.jar'; | |
} | |
Core::output('%-starting screen session'); | |
// Ensure dead sessions are cleared first. | |
shell_exec('screen -wipe'); | |
$startCmd = 'cd '.$hardPath.' && screen -S '.$serverName.' -dmS '.Config::get('java','location').' '.$server['java_options'].' -jar '. $jar .' 2>&1'; | |
$output = shell_exec($startCmd); | |
sleep(2); | |
if (!self::isRunning($serverName)) { | |
Core::outputError("$serverName did not start correctly."); | |
Core::outputError($startCmd); | |
Core::outputError($output); | |
Core::outputError("Last 15 log lines:"); | |
if ($serverName == 'proxy') { | |
Core::outputError(shell_exec("tail -n 15 $hardPath/proxy.log.0")); | |
} else { | |
Core::outputError(shell_exec("tail -n 15 $hardPath/server.log")); | |
} | |
Core::outputError("Screen Sessions:"); | |
Core::outputError(shell_exec("screen -ls")); | |
Core::outputError("Java Processes:"); | |
Core::outputError(shell_exec("ps axu | grep java | grep $serverName")); | |
return false; | |
} | |
return true; | |
} | |
public static function saveOff($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
self::send($serverName,'save-off'); | |
} | |
public static function saveAll($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
self::send($serverName,'save-all'); | |
} | |
public static function saveOn($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
self::send($serverName,'save-on'); | |
} | |
public static function stop($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
$server = Config::get('servers',$serverName); | |
if(!self::isRunning($serverName)) | |
{ | |
Core::output('Server '.$serverName.' is not running'); | |
return false; | |
} | |
Core::output('%-ready, sending kill signal to server'); | |
if ($serverName != 'proxy') { | |
self::send($serverName, 'save-all'); | |
self::send($serverName, 'stop'); | |
} else { | |
self::send($serverName, 'end'); | |
} | |
while(Server::isRunning($serverName)) | |
sleep(1); | |
sleep(1); | |
return true; | |
} | |
public static function isRunning($serverName) | |
{ | |
self::requireServerLocal($serverName); | |
if (file_exists('../EMCDEV')) { | |
return true; | |
} | |
//if (shell_exec('screen -ls | grep '.$serverName . ' | grep -v grep | grep -v Dead | grep -v dead')) | |
if ($serverName == 'proxy') { | |
$jarFile = 'BungeeCord.jar'; | |
} else { | |
$jarFile = 'minecraft_server.jar'; | |
} | |
$cmd = 'ps ax | grep -v grep | grep ' . $serverName . ' | grep ' . $jarFile; | |
$ret = shell_exec($cmd); | |
// echo "$cmd = $ret\n"; | |
if ($ret) | |
return true; | |
else | |
return false; | |
} | |
public static function send($serverName,$data,$sleep = false) | |
{ | |
self::requireServerLocal($serverName); | |
shell_exec('screen -S '.$serverName.' -p 0 -X stuff "'.$data.'$(echo -ne \'\r\')"'); | |
if(!$sleep) | |
sleep(1); | |
else | |
usleep($sleep); | |
} | |
public static function say($serverName,$message) | |
{ | |
self::requireServerLocal($serverName); | |
self::send($serverName,($serverName == 'proxy' ? 'alert ' : 'say ').$message); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment