2023-03-04 23:45:46 +00:00
|
|
|
|
<?php
|
2023-11-12 18:12:42 +00:00
|
|
|
|
if (!DEFINED('EGP'))
|
2023-12-23 01:50:14 +00:00
|
|
|
|
exit(header('Refresh: 0; URL=http://' . $_SERVER['HTTP_HOST'] . '/404'));
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
include(LIB . 'games/actions.php');
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
class action extends actions
|
|
|
|
|
{
|
|
|
|
|
public static function start($id, $type = 'start')
|
2023-03-04 23:45:46 +00:00
|
|
|
|
{
|
2023-11-12 18:12:42 +00:00
|
|
|
|
global $cfg, $sql, $user, $start_point;
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$sql->query('SELECT `uid`, `unit`, `tarif`, `game`, `address`, `slots_start`, `name`, `time_start`, `core_fix` FROM `servers` WHERE `id`="' . $id . '" LIMIT 1');
|
|
|
|
|
$server = $sql->get();
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$sql->query('SELECT `install` FROM `tarifs` WHERE `id`="' . $server['tarif'] . '" LIMIT 1');
|
|
|
|
|
$tarif = $sql->get();
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
include(LIB . 'ssh.php');
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$sql->query('SELECT `address`, `passwd` FROM `units` WHERE `id`="' . $server['unit'] . '" LIMIT 1');
|
|
|
|
|
$unit = $sql->get();
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Проверка ssh соедниения пу с локацией
|
|
|
|
|
if (!$ssh->auth($unit['passwd'], $unit['address']))
|
|
|
|
|
return array('e' => sys::text('error', 'ssh'));
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
list($ip, $port) = explode(':', $server['address']);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Убить процессы
|
|
|
|
|
$ssh->set('kill -9 `ps aux | grep s_' . $server['uid'] . ' | grep -v grep | awk ' . "'{print $2}'" . ' | xargs;'
|
|
|
|
|
. 'lsof -i@' . $server['address'] . ' | awk ' . "'{print $2}'" . ' | grep -v PID | xargs`; sudo -u server' . $server['uid'] . ' screen -wipe;');
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Временный файл
|
|
|
|
|
$temp = sys::temp(action::config($ip, $port, $server['slots_start'], $ssh->get('cat ' . $tarif['install'] . '/' . $server['uid'] . '/mods/deathmatch/mtaserver.conf')));
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Обновление файла server.cfg
|
|
|
|
|
$ssh->setfile($temp, $tarif['install'] . $server['uid'] . '/mods/deathmatch/mtaserver.conf', 0644);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
unlink($temp);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$taskset = '';
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Если включена система автораспределения и не установлен фиксированный поток
|
|
|
|
|
if ($cfg['cpu_route'] and !$server['core_fix']) {
|
|
|
|
|
$proc_stat = array();
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$proc_stat[0] = $ssh->get('cat /proc/stat');
|
|
|
|
|
}
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Если система автораспределения продолжить парсинг загрузки процессора
|
|
|
|
|
if (isset($proc_stat)) {
|
|
|
|
|
$proc_stat[1] = $ssh->get('cat /proc/stat');
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Ядро/поток, на котором будет запущен игровой сервер (поток выбран с рассчетом наименьшей загруженности в момент запуска игрового сервера)
|
|
|
|
|
$core = sys::cpu_idle($proc_stat, $server['unit'], false); // число от 1 до n (где n число ядер/потоков в процессоре (без нулевого)
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
if (!is_numeric($core))
|
|
|
|
|
return array('e' => sys::text('error', 'cpu'));
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$taskset = 'taskset -c ' . $core;
|
|
|
|
|
}
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
if ($server['core_fix']) {
|
|
|
|
|
$core = $server['core_fix'] - 1;
|
|
|
|
|
$taskset = 'taskset -c ' . $core;
|
|
|
|
|
}
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Параметры запуска
|
|
|
|
|
$bash = './mta-server';
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Временный файл
|
|
|
|
|
$temp = sys::temp($bash);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Обновление файла start.sh
|
|
|
|
|
$ssh->setfile($temp, $tarif['install'] . $server['uid'] . '/start.sh', 0500);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Строка запуска
|
|
|
|
|
$ssh->set('cd ' . $tarif['install'] . $server['uid'] . ';' // переход в директорию игрового сервера
|
|
|
|
|
. 'rm *.pid;' // Удаление *.pid файлов
|
|
|
|
|
. 'sudo -u server' . $server['uid'] . ' mkdir -p mods/deathmatch/oldstart;' // Создание папки логов
|
|
|
|
|
. 'cat mods/deathmatch/logs/server.log >> mods/deathmatch/oldstart/' . date('d.m.Y_H:i:s', $server['time_start']) . '.log; rm mods/deathmatch/logs/server.log; rm mods/deathmatch/logs/01.01.1970_03:00:00.log;' // Перемещение лога предыдущего запуска
|
|
|
|
|
. 'chown server' . $server['uid'] . ':1000 mods/deathmatch/mtaserver.conf start.sh;' // Обновление владельца файлов
|
|
|
|
|
. 'sudo -u server' . $server['uid'] . ' screen -dmS s_' . $server['uid'] . ' ' . $taskset . ' sh -c "./start.sh"'); // Запуск игровго сервера
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
$core = !isset($core) ? 0 : $core + 1;
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Обновление информации в базе
|
|
|
|
|
$sql->query('UPDATE `servers` set `status`="' . $type . '", `online`="0", `players`="", `core_use`="' . $core . '", `time_start`="' . $start_point . '", `stop`="1" WHERE `id`="' . $id . '" LIMIT 1');
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
unlink($temp);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
// Сброс кеша
|
|
|
|
|
actions::clmcache($id);
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
sys::reset_mcache('server_scan_mon_pl_' . $id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => $type, 'online' => 0, 'players' => ''));
|
|
|
|
|
sys::reset_mcache('server_scan_mon_' . $id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => $type, 'online' => 0));
|
2023-03-04 23:45:46 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
return array('s' => 'ok');
|
|
|
|
|
}
|
2023-11-11 20:56:12 +00:00
|
|
|
|
|
2023-11-12 18:12:42 +00:00
|
|
|
|
public static function config($ip, $port, $slots, $config)
|
|
|
|
|
{
|
|
|
|
|
$aRepl = array(
|
|
|
|
|
'<serverip>', '</serverip>',
|
|
|
|
|
'<maxplayers>', '</maxplayers>',
|
|
|
|
|
'<httpserver>', '</httpserver>',
|
|
|
|
|
'<serverport>', '</serverport>',
|
|
|
|
|
'<httpport>', '</httpport>',
|
|
|
|
|
'<logfile>', '</logfile>',
|
|
|
|
|
'<ase>', '</ase>'
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$config = str_ireplace($aRepl, $aRepl, $config);
|
|
|
|
|
$config = str_ireplace(array('<config>', '</config>', "\r", "\t"), '', $config);
|
|
|
|
|
$config = preg_replace("#\<\!--(.+?)--\>#is", '', $config);
|
|
|
|
|
|
|
|
|
|
$aLine = explode("\n", $config);
|
|
|
|
|
|
|
|
|
|
$search = array(
|
|
|
|
|
"#\<serverip\>(.+?)\<\/serverip\>#is",
|
|
|
|
|
"#\<maxplayers\>(.+?)\<\/maxplayers\>#is",
|
|
|
|
|
"#\<httpserver\>(.+?)\<\/httpserver\>#is",
|
|
|
|
|
"#\<serverport\>(.+?)\<\/serverport\>#is",
|
|
|
|
|
"#\<httpport\>(.+?)\<\/httpport\>#is",
|
|
|
|
|
"#\<logfile\>(.+?)\<\/logfile\>#is",
|
|
|
|
|
"#\<ase\>(.+?)\<\/ase\>#is"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
$config = '<config>' . PHP_EOL;
|
|
|
|
|
|
|
|
|
|
foreach ($aLine as $line) {
|
|
|
|
|
if (str_replace(array(' ', "\t"), '', $line) != '')
|
|
|
|
|
$edit = trim(preg_replace($search, array('', '', '', '', '', ''), $line));
|
|
|
|
|
|
|
|
|
|
if ($edit != '')
|
|
|
|
|
$config .= ' ' . $edit . PHP_EOL;
|
|
|
|
|
|
|
|
|
|
$edit = '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$config .= ' <serverip>' . $ip . '</serverip>' . PHP_EOL
|
|
|
|
|
. ' <maxplayers>' . $slots . '</maxplayers>' . PHP_EOL
|
|
|
|
|
. ' <httpserver>1</httpserver>' . PHP_EOL
|
|
|
|
|
. ' <serverport>' . $port . '</serverport>' . PHP_EOL
|
|
|
|
|
. ' <httpport>' . ($port + 10000) . '</httpport>' . PHP_EOL
|
|
|
|
|
. ' <ase>1</ase>' . PHP_EOL
|
|
|
|
|
. ' <logfile>logs/server.log</logfile>';
|
|
|
|
|
|
|
|
|
|
return $config . "\n" . '</config>';
|
2023-11-11 20:56:12 +00:00
|
|
|
|
}
|
2023-11-12 18:12:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-03-04 23:45:46 +00:00
|
|
|
|
?>
|