Skip to content

Instantly share code, notes, and snippets.

@aikar

aikar/Server.php Secret

Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aikar/8513f685bc8da139e3aa to your computer and use it in GitHub Desktop.
Save aikar/8513f685bc8da139e3aa to your computer and use it in GitHub Desktop.
<?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