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 );
}
}