EngineGP/system/library/games/actions.php

316 lines
16 KiB
PHP
Raw Normal View History

2023-03-04 23:45:46 +00:00
<?php
2023-03-05 13:59:34 +00:00
if(!DEFINED('EGP'))
exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
class actions
{
public static function stop($id)
{
global $cfg, $sql, $user;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include(LIB.'ssh.php');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `uid`, `unit`, `game`, `address`, `name` FROM `servers` WHERE `id`="'.$id.'" LIMIT 1');
$server = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +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-03-05 13:59:34 +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-03-05 13:59:34 +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-03-05 13:59:34 +00:00
// Обновление информации в базе
$sql->query('UPDATE `servers` set `status`="off", `online`="0", `players`="", `stop`="0" WHERE `id`="'.$id.'" LIMIT 1');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Сброс кеша
actions::clmcache($id);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys::reset_mcache('server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'off', 'online' => 0, 'players' => ''));
sys::reset_mcache('server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'off', 'online' => 0));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return array('s' => 'ok');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function change($id, $map = false)
{
global $cfg, $sql, $html, $user, $mcache;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Если в кеше есть карты
if($mcache->get('server_maps_change_'.$id) != '' && !$map)
return array('maps' => $mcache->get('server_maps_change_'.$id));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include(LIB.'ssh.php');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `uid`, `unit`, `game`, `tarif`, `online`, `players`, `name` FROM `servers` WHERE `id`="'.$id.'" LIMIT 1');
$server = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +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-03-05 13:59:34 +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-03-05 13:59:34 +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-03-05 13:59:34 +00:00
// Массив карт игрового сервера (папка "maps")
$aMaps = explode("\n", $ssh->get('cd '.$tarif['install'].$server['uid'].'/cstrike/maps/ && ls | grep .bsp | grep -v .bsp.'));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Удаление пустого элемента
unset($aMaps[count($aMaps)-1]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Удаление ".bsp"
$aMaps = str_replace('.bsp', '', $aMaps);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Если выбрана карта
if($map)
{
// Проверка наличия выбранной карты
if(!in_array($map, $aMaps))
return array('e' => sys::updtext(sys::text('servers', 'change'), array('map' => $map.'.bsp')));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Отправка команды changelevel
$ssh->set('sudo -u server'.$server['uid'].' screen -p 0 -S s_'.$server['uid'].' -X eval '."'stuff \"changelevel ".sys::cmd($map)."\"\015'");
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Обновление информации в базе
$sql->query('UPDATE `servers` set `status`="change" WHERE `id`="'.$id.'" LIMIT 1');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Сброс кеша
actions::clmcache($id);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys::reset_mcache('server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'change', 'online' => $server['online'], 'players' => base64_decode($server['players'])));
sys::reset_mcache('server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'change', 'online' => $server['online']));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return array('s' => 'ok');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Сортировка списка карт
sort($aMaps);
reset($aMaps);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Генерация списка карт для выбора
foreach($aMaps as $map)
{
$html->get('change_list', 'sections/servers/games');
$html->set('img', sys::img($map, $server['game']));
$html->set('name', $map);
$html->set('id', $id);
$html->pack('maps');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Запись карт в кеш
$mcache->set('server_maps_change_'.$id, $html->arr['maps'], false, 30);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return array('maps' => $html->arr['maps']);
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function reinstall($id)
{
global $cfg, $sql, $user, $start_point;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include(LIB.'ssh.php');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `uid`, `unit`, `tarif`, `address`, `game`, `name`, `pack`, `plugins_use`, `ftp`, `reinstall`, `core_fix` FROM `servers` WHERE `id`="'.$id.'" LIMIT 1');
$server = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Проверка времени переустановки
$reinstall = $server['reinstall']+$cfg['reinstall'][$server['game']]*60;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if($reinstall > $start_point && $user['group'] != 'admin')
return array('e' => sys::updtext(sys::text('servers', 'reinstall'), array('time' => sys::date('max', $reinstall))));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `address`, `passwd`, `sql_login`, `sql_passwd`, `sql_port`, `sql_ftp` FROM `units` WHERE `id`="'.$server['unit'].'" LIMIT 1');
$unit = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `path`, `install`, `plugins_install` FROM `tarifs` WHERE `id`="'.$server['tarif'].'" LIMIT 1');
$tarif = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +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-03-05 13:59:34 +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-03-05 13:59:34 +00:00
$taskset = '';
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Если включена система автораспределения и не установлен фиксированный поток
if($cfg['cpu_route'] && !$server['core_fix'])
{
$proc_stat = array();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$proc_stat[0] = $ssh->get('cat /proc/stat');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Директория сборки
$path = $tarif['path'].$server['pack'];
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Директория игрового сервера
$install = $tarif['install'].$server['uid'];
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Если система автораспределения продолжить парсинг загрузки процессора
if(isset($proc_stat))
{
$proc_stat[1] = $ssh->get('cat /proc/stat');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Ядро/поток, на котором будет запущен игровой сервер (поток выбран с рассчетом наименьшей загруженности в момент запуска игрового сервера)
$core = sys::cpu_idle($proc_stat, $server['unit'], false); // число от 1 до n (где n число ядер/потоков в процессоре (без нулевого)
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if(!is_numeric($core))
return array('e' => 'Не удается выполнить операцию, нет свободного потока.');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$taskset = 'taskset -c '.$core;
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if($server['core_fix'])
{
$core = $server['core_fix']-1;
$taskset = 'taskset -c '.$core;
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh->set('rm -r '.$install.';' // Удаление директории игрового сервера
.'mkdir '.$install.';' // Создание директории
.'chown server'.$server['uid'].':1000 '.$install.';' // Изменение владельца и группы директории
.'cd '.$install.' && sudo -u server'.$server['uid'].' '.$taskset.' screen -dmS r_'.$server['uid'].' sh -c "'
.'cp -r '.$path.'/. .;' // Копирование файлов сборки для сервера
.'find . -type d -exec chmod 700 {} \;;'
.'find . -type f -exec chmod 600 {} \;;'
.'chmod 500 '.params::$aFileGame[$server['game']].'"');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Очистка записей в базе
$sql->query('DELETE FROM `admins_'.$server['game'].'` WHERE `server`="'.$id.'"'); // Список админов на сервере
$sql->query('DELETE FROM `plugins_install` WHERE `server`="'.$id.'"'); // Список установленных плагинов на сервере
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Запись установленных плагинов
if($server['plugins_use'])
{
// Массив идентификаторов плагинов
$aPlugins = sys::b64djs($tarif['plugins_install']);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if(isset($aPlugins[$server['pack']]))
{
$plugins = explode(',', $aPlugins[$server['pack']]);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
foreach($plugins as $plugin)
if($plugin)
$sql->query('INSERT INTO `plugins_install` set `server`="'.$id.'", `plugin`="'.$plugin.'", `time`="'.$start_point.'"');
}
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$core = !isset($core) ? 0 : $core+1;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Обновление информации в базе
$sql->query('UPDATE `servers` set `status`="reinstall", `reinstall`="'.$start_point.'", `core_use`="'.$core.'", `fastdl`="0" WHERE `id`="'.$id.'" LIMIT 1');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Логирование
$sql->query('INSERT INTO `logs_sys` set `user`="'.$user['id'].'", `server`="'.$id.'", `text`="'.sys::text('syslogs', 'reinstall').'", `time`="'.$start_point.'"');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Сброс кеша
actions::clmcache($id);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys::reset_mcache('server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'reinstall', 'online' => 0, 'players' => ''));
sys::reset_mcache('server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'reinstall', 'online' => 0));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return array('s' => 'ok');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function update($id)
{
global $cfg, $sql, $user, $start_point;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
include(LIB.'ssh.php');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `uid`, `unit`, `tarif`, `address`, `game`, `name`, `pack`, `plugins_use`, `ftp`, `update` FROM `servers` WHERE `id`="'.$id.'" LIMIT 1');
$server = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Проверка времени обновления
$update = $server['update']+$cfg['update'][$server['game']]*60;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if($update > $start_point && $user['group'] != 'admin')
return array('e' => sys::updtext(sys::text('servers', 'update'), array('time' => sys::date('max', $update))));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `address`, `passwd`, `sql_login`, `sql_passwd`, `sql_port`, `sql_ftp` FROM `units` WHERE `id`="'.$server['unit'].'" LIMIT 1');
$unit = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$sql->query('SELECT `update`, `install` FROM `tarifs` WHERE `id`="'.$server['tarif'].'" LIMIT 1');
$tarif = $sql->get();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +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-03-05 13:59:34 +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-03-05 13:59:34 +00:00
$taskset = '';
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Если включена система автораспределения и не установлен фиксированный поток
if($cfg['cpu_route'] && !$server['core_fix'])
{
$proc_stat = array();
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$proc_stat[0] = $ssh->get('cat /proc/stat');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Директория обновлений сборки
$path = $tarif['update'].$server['pack'];
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Директория игрового сервера
$install = $tarif['install'].$server['uid'];
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Если система автораспределения продолжить парсинг загрузки процессора
if(isset($proc_stat))
{
$proc_stat[1] = $ssh->get('cat /proc/stat');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Ядро/поток, на котором будет запущен игровой сервер (поток выбран с рассчетом наименьшей загруженности в момент запуска игрового сервера)
$core = sys::cpu_idle($proc_stat, $server['unit'], false); // число от 1 до n (где n число ядер/потоков в процессоре (без нулевого)
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if(!is_numeric($core))
return array('e' => 'Не удается выполнить операцию, нет свободного потока.');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$taskset = 'taskset -c '.$core;
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
if($server['core_fix'])
{
$core = $server['core_fix']-1;
$taskset = 'taskset -c '.$core;
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$ssh->set('cd '.$install.' && sudo -u server'.$server['uid'].' '.$taskset.' screen -dmS u_'.$server['uid'].' sh -c "cp -rv '.$path.'/. .;' // Копирование файлов обвновления сборки для сервера
.'find . -type d -exec chmod 700 {} \;;'
.'find . -type f -exec chmod 600 {} \;;'
.'chmod 500 '.params::$aFileGame[$server['game']].'"');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$core = !isset($core) ? 0 : $core+1;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Обновление информации в базе
$sql->query('UPDATE `servers` set `status`="update", `update`="'.$start_point.'", `core_use`="'.$core.'" WHERE `id`="'.$id.'" LIMIT 1');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Логирование
$sql->query('INSERT INTO `logs_sys` set `user`="'.$user['id'].'", `server`="'.$id.'", `text`="'.sys::text('syslogs', 'update').'", `time`="'.$start_point.'"');
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
// Сброс кеша
actions::clmcache($id);
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
sys::reset_mcache('server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'update', 'online' => 0, 'players' => ''));
sys::reset_mcache('server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'update', 'online' => 0));
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
return array('s' => 'ok');
}
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
public static function clmcache($id)
{
global $mcache;
2023-03-04 23:45:46 +00:00
2023-03-05 13:59:34 +00:00
$mcache->delete('server_index_'.$id);
$mcache->delete('server_resources_'.$id);
$mcache->delete('server_status_'.$id);
}
}