actions.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <?php
  2. if(!DEFINED('EGP'))
  3. exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));
  4. class actions
  5. {
  6. public static function stop($id)
  7. {
  8. global $cfg, $sql, $user;
  9. include(LIB.'ssh.php');
  10. $sql->query('SELECT `uid`, `unit`, `game`, `address`, `name` FROM `control_servers` WHERE `id`="'.$id.'" LIMIT 1');
  11. $server = $sql->get();
  12. $sql->query('SELECT `address`, `passwd` FROM `control` WHERE `id`="'.$server['unit'].'" LIMIT 1');
  13. $unit = $sql->get();
  14. // Проверка ssh соедниения пу с локацией
  15. if(!$ssh->auth($unit['passwd'], $unit['address']))
  16. return array('e' => sys::text('error', 'ssh'));
  17. $ssh->set('kill -9 `ps aux | grep s_'.$server['uid'].' | grep -v grep | awk '."'{print $2}'".' | xargs;'
  18. .'lsof -i@'.$server['address'].' | awk '."'{print $2}'".' | grep -v PID | xargs`; sudo -u server'.$server['uid'].' screen -wipe');
  19. // Обновление информации в базе
  20. $sql->query('UPDATE `control_servers` set `status`="off", `online`="0", `players`="", `stop`="0" WHERE `id`="'.$id.'" LIMIT 1');
  21. // Сброс кеша
  22. actions::clmcache($id);
  23. sys::reset_mcache('ctrl_server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'off', 'online' => 0, 'players' => ''));
  24. sys::reset_mcache('ctrl_server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'off', 'online' => 0));
  25. return array('s' => 'ok');
  26. }
  27. public static function change($id, $map = false)
  28. {
  29. global $cfg, $sql, $html, $user, $mcache;
  30. // Если в кеше есть карты
  31. if($mcache->get('ctrl_server_maps_change_'.$id) != '' && !$map)
  32. return array('maps' => $mcache->get('ctrl_server_maps_change_'.$id));
  33. include(LIB.'ssh.php');
  34. $sql->query('SELECT `uid`, `unit`, `game`, `online`, `players`, `name` FROM `control_servers` WHERE `id`="'.$id.'" LIMIT 1');
  35. $server = $sql->get();
  36. $sql->query('SELECT `address`, `passwd` FROM `control` WHERE `id`="'.$server['unit'].'" LIMIT 1');
  37. $unit = $sql->get();
  38. // Проверка ssh соедниения пу с локацией
  39. if(!$ssh->auth($unit['passwd'], $unit['address']))
  40. return array('e' => sys::text('error', 'ssh'));
  41. // Массив карт игрового сервера (папка "maps")
  42. $aMaps = explode("\n", $ssh->get('cd /servers/'.$server['uid'].'/cstrike/maps/ && ls | grep .bsp | grep -v .bsp.'));
  43. // Удаление пустого элемента
  44. unset($aMaps[count($aMaps)-1]);
  45. // Удаление ".bsp"
  46. $aMaps = str_replace('.bsp', '', $aMaps);
  47. // Если выбрана карта
  48. if($map)
  49. {
  50. // Проверка наличия выбранной карты
  51. if(!in_array($map, $aMaps))
  52. return array('e' => sys::updtext(sys::text('servers', 'change'), array('map' => $map.'.bsp')));
  53. // Отправка команды changelevel
  54. $ssh->set('sudo -u server'.$server['uid'].' screen -p 0 -S s_'.$server['uid'].' -X eval '."'stuff \"changelevel ".sys::cmd($map)."\"\015'");
  55. // Обновление информации в базе
  56. $sql->query('UPDATE `control_servers` set `status`="change" WHERE `id`="'.$id.'" LIMIT 1');
  57. // Сброс кеша
  58. actions::clmcache($id);
  59. sys::reset_mcache('ctrl_server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'change', 'online' => $server['online'], 'players' => base64_decode($server['players'])));
  60. sys::reset_mcache('ctrl_server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'change', 'online' => $server['online']));
  61. return array('s' => 'ok');
  62. }
  63. // Сортировка списка карт
  64. sort($aMaps);
  65. reset($aMaps);
  66. // Генерация списка карт для выбора
  67. foreach($aMaps as $map)
  68. {
  69. $html->get('change_list', 'sections/control/servers/games');
  70. $html->set('img', file_exists(DIR.'/maps/'.$server['game'].'/'.$map.'.jpg') ? $cfg['http'].'maps/'.$server['game'].'/'.$map.'.jpg' : $cfg['http'].'template/images/status/none.jpg');
  71. $html->set('name', $map);
  72. $html->set('id', $server['unit']);
  73. $html->set('server', $id);
  74. $html->pack('maps');
  75. }
  76. // Запись карт в кеш
  77. $mcache->set('ctrl_server_maps_change_'.$id, $html->arr['maps'], false, 30);
  78. return array('maps' => $html->arr['maps']);
  79. }
  80. public static function reinstall($id)
  81. {
  82. global $cfg, $sql, $user, $start_point;
  83. include(LIB.'ssh.php');
  84. $sql->query('SELECT `uid`, `unit`, `address`, `game`, `name`, `pack`, `ftp`, `core_fix` FROM `control_servers` WHERE `id`="'.$id.'" LIMIT 1');
  85. $server = $sql->get();
  86. $sql->query('SELECT `address`, `passwd`, `fcpu` FROM `control` WHERE `id`="'.$server['unit'].'" LIMIT 1');
  87. $unit = $sql->get();
  88. // Проверка ssh соедниения пу с локацией
  89. if(!$ssh->auth($unit['passwd'], $unit['address']))
  90. return array('e' => sys::text('error', 'ssh'));
  91. $ssh->set('kill -9 `ps aux | grep s_'.$server['uid'].' | grep -v grep | awk '."'{print $2}'".' | xargs;'
  92. .'lsof -i@'.$server['address'].' | awk '."'{print $2}'".' | grep -v PID | xargs`; sudo -u server'.$server['uid'].' screen -wipe');
  93. $taskset = '';
  94. // Если включена система автораспределения и не установлен фиксированный поток
  95. if(!$server['core_fix'])
  96. {
  97. $proc_stat = array();
  98. $proc_stat[0] = $ssh->get('cat /proc/stat');
  99. }
  100. $path = 'rm '.$server['pack'].'.zip; wget '.$cfg['control_server'].'/'.$server['pack'].'.zip; unzip '.$server['pack'].'.zip; rm '.$server['pack'].'.zip;';
  101. if(in_array($server['game'], array('css', 'csgo')))
  102. $path = 'cd '.$cfg['steamcmd'].'; ./steamcmd.sh +login anonymous +force_install_dir "/servers/'.$uid.'" +app_update '.$cfg['control_steamcmd'][$game].' +quit;';
  103. // Директория игрового сервера
  104. $install = '/servers/'.$server['uid'];
  105. // Если система автораспределения продолжить парсинг загрузки процессора
  106. if(isset($proc_stat))
  107. {
  108. $proc_stat[1] = $ssh->get('cat /proc/stat');
  109. // Ядро/поток, на котором будет запущен игровой сервер (поток выбран с рассчетом наименьшей загруженности в момент запуска игрового сервера)
  110. $core = sys::cpu_idle($proc_stat, $server['unit'], $unit['fcpu'], true); // число от 1 до n (где n число ядер/потоков в процессоре (без нулевого)
  111. if(!is_numeric($core))
  112. return array('e' => 'Не удается выполнить операцию, нет свободного потока.');
  113. $taskset = 'taskset -c '.$core;
  114. }
  115. if($server['core_fix'])
  116. {
  117. $core = $server['core_fix']-1;
  118. $taskset = 'taskset -c '.$core;
  119. }
  120. $ssh->set('rm -r '.$install.';' // Удаление директории игрового сервера
  121. .'mkdir '.$install.';' // Создание директории
  122. .'chown server'.$server['uid'].':1000 '.$install.';' // Изменение владельца и группы директории
  123. .'cd '.$install.' && sudo -u server'.$server['uid'].' '.$taskset.' screen -dmS r_'.$server['uid'].' sh -c "'
  124. .$path // Копирование файлов сборки для сервера
  125. .'find . -type d -exec chmod 700 {} \;;'
  126. .'find . -type f -exec chmod 600 {} \;;'
  127. .'chmod 500 '.params::$aFileGame[$server['game']].'"');
  128. // Очистка записей в базе
  129. $sql->query('DELETE FROM `control_admins_'.$server['game'].'` WHERE `server`="'.$id.'"'); // Список админов на сервере
  130. $sql->query('DELETE FROM `control_plugins_install` WHERE `server`="'.$id.'"'); // Список установленных плагинов на сервере
  131. $core = !isset($core) ? 0 : $core+1;
  132. // Обновление информации в базе
  133. $sql->query('UPDATE `control_servers` set `status`="reinstall", `core_use`="'.$core.'", `fastdl`="0" WHERE `id`="'.$id.'" LIMIT 1');
  134. // Сброс кеша
  135. actions::clmcache($id);
  136. sys::reset_mcache('ctrl_server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'reinstall', 'online' => 0, 'players' => ''));
  137. sys::reset_mcache('ctrl_server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'reinstall', 'online' => 0));
  138. return array('s' => 'ok');
  139. }
  140. public static function update($id)
  141. {
  142. global $cfg, $sql, $user, $start_point;
  143. include(LIB.'ssh.php');
  144. $sql->query('SELECT `uid`, `unit`, `address`, `game`, `name`, `pack`, `ftp` FROM `control_servers` WHERE `id`="'.$id.'" LIMIT 1');
  145. $server = $sql->get();
  146. $sql->query('SELECT `address`, `passwd`, `fcpu` FROM `control` WHERE `id`="'.$server['unit'].'" LIMIT 1');
  147. $unit = $sql->get();
  148. // Проверка ssh соедниения пу с локацией
  149. if(!$ssh->auth($unit['passwd'], $unit['address']))
  150. return array('e' => sys::text('error', 'ssh'));
  151. $ssh->set('kill -9 `ps aux | grep s_'.$server['uid'].' | grep -v grep | awk '."'{print $2}'".' | xargs;'
  152. .'lsof -i@'.$server['address'].' | awk '."'{print $2}'".' | grep -v PID | xargs`; sudo -u server'.$server['uid'].' screen -wipe');
  153. $taskset = '';
  154. // Если включена система автораспределения и не установлен фиксированный поток
  155. if(!$server['core_fix'])
  156. {
  157. $proc_stat = array();
  158. $proc_stat[0] = $ssh->get('cat /proc/stat');
  159. }
  160. $path = 'rm '.$server['pack'].'_udp.zip; wget '.$cfg['control_server'].'/'.$server['pack'].'_udp.zip; unzip -u '.$server['pack'].'_udp.zip; rm '.$server['pack'].'_udp.zip;';
  161. // Директория игрового сервера
  162. $install = '/servers/'.$server['uid'];
  163. // Если система автораспределения продолжить парсинг загрузки процессора
  164. if(isset($proc_stat))
  165. {
  166. $proc_stat[1] = $ssh->get('cat /proc/stat');
  167. // Ядро/поток, на котором будет запущен игровой сервер (поток выбран с рассчетом наименьшей загруженности в момент запуска игрового сервера)
  168. $core = sys::cpu_idle($proc_stat, $server['unit'], $unit['fcpu'], true); // число от 1 до n (где n число ядер/потоков в процессоре (без нулевого)
  169. if(!is_numeric($core))
  170. return array('e' => 'Не удается выполнить операцию, нет свободного потока.');
  171. $taskset = 'taskset -c '.$core;
  172. }
  173. if($server['core_fix'])
  174. {
  175. $core = $server['core_fix']-1;
  176. $taskset = 'taskset -c '.$core;
  177. }
  178. $ssh->set('cd '.$install.' && sudo -u server'.$server['uid'].' '.$taskset.' screen -dmS u_'.$server['uid'].' sh -c "'.$path // Копирование файлов обвновления сборки для сервера
  179. .'find . -type d -exec chmod 700 {} \;;'
  180. .'find . -type f -exec chmod 600 {} \;;'
  181. .'chmod 500 '.params::$aFileGame[$server['game']].'"');
  182. $core = !isset($core) ? 0 : $core+1;
  183. // Обновление информации в базе
  184. $sql->query('UPDATE `control_servers` set `status`="update", `core_use`="'.$core.'" WHERE `id`="'.$id.'" LIMIT 1');
  185. // Сброс кеша
  186. actions::clmcache($id);
  187. sys::reset_mcache('ctrl_server_scan_mon_pl_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'update', 'online' => 0, 'players' => ''));
  188. sys::reset_mcache('ctrl_server_scan_mon_'.$id, $id, array('name' => $server['name'], 'game' => $server['game'], 'status' => 'update', 'online' => 0));
  189. return array('s' => 'ok');
  190. }
  191. public static function delete($id)
  192. {
  193. global $cfg, $sql, $user;
  194. include(LIB.'ssh.php');
  195. $sql->query('SELECT `uid`, `unit`, `game`, `slots`, `address` FROM `control_servers` WHERE `id`="'.$id.'" LIMIT 1');
  196. $server = $sql->get();
  197. if(!$server['uid'])
  198. return array('e' => 'uid 404');
  199. $sql->query('SELECT `address`, `passwd`, `sql_login`, `sql_passwd`, `sql_port`, `sql_ftp` FROM `control` WHERE `id`="'.$server['unit'].'" LIMIT 1');
  200. $unit = $sql->get();
  201. // Проверка ssh соедниения пу с локацией
  202. if(!$ssh->auth($unit['passwd'], $unit['address']))
  203. return array('e' => sys::text('error', 'ssh'));
  204. // Убить процессы
  205. $ssh->set('kill -9 `ps aux | grep s_'.$server['uid'].' | grep -v grep | awk '."'{print $2}'".' | xargs;'
  206. .'lsof -i@:'.$server['address'].' | awk '."'{print $2}'".' | xargs`; sudo -u server'.$server['uid'].' screen -wipe');
  207. // Директория игрового сервера
  208. $install = '/servers/'.$server['uid'];
  209. $copys = 'screen -dmS r_copy_'.$server['uid'].' sh -c "';
  210. $scopy = $sql->query('SELECT `id`, `name` FROM `control_copy` WHERE `server`="'.$id.'"');
  211. while($copy = $sql->get($scopy))
  212. {
  213. $copys .= 'rm /copy/'.$copy['name'].'.tar;';
  214. $sql->query('DELETE FROM `control_copy` WHERE `id`="'.$copy['id'].'" LIMIT 1');
  215. }
  216. $copys .= '";';
  217. $ssh->set($copys // Удаление резервных копий
  218. .'screen -dmS r_'.$server['uid'].' sh -c "rm -r '.$install.';' // Удаление директории сервера
  219. .'userdel server'.$server['uid'].'"'); // Удаление пользователя сервера c локации
  220. // Удаление ftp доступа
  221. $qSql = 'DELETE FROM users WHERE username=\''.$server['uid'].'\';';
  222. $ssh->set('screen -dmS ftp'.$server['uid'].' mysql -P '.$unit['sql_port'].' -u'.$unit['sql_login'].' -p'.$unit['sql_passwd'].' --database '.$unit['sql_ftp'].' -e "'.$qSql.'"');
  223. // Очистка правил FireWall
  224. ctrl::iptables($id, 'remove', NULL, NULL, $server['unit'], false, $ssh);
  225. // Удаление заданий из crontab
  226. $sql->query('SELECT `address`, `passwd` FROM `panel` LIMIT 1');
  227. $panel = $sql->get();
  228. if(!$ssh->auth($panel['passwd'], $panel['address']))
  229. return array('e' => 'Неудалось создать связь с панелью');
  230. $crons = $sql->query('SELECT `id`, `cron` FROM `control_crontab` WHERE `server`="'.$id.'"');
  231. while($cron = $sql->get($crons))
  232. {
  233. $ssh->set('echo "" >> /etc/crontab && cat /etc/crontab');
  234. $crontab = str_replace($cron['cron'], '', $ssh->get());
  235. // Временный файл
  236. $temp = sys::temp($crontab);
  237. $ssh->setfile($temp, '/etc/crontab', 0644);
  238. $ssh->set("sed -i '/^$/d' /etc/crontab");
  239. $ssh->set('crontab -u root /etc/crontab');
  240. unlink($temp);
  241. $sql->query('DELETE FROM `control_crontab` WHERE `id`="'.$cron['id'].'" LIMIT 1');
  242. }
  243. // Удаление различной информации игрового сервера
  244. $sql->query('DELETE FROM `control_admins_'.$server['game'].'` WHERE `server`="'.$id.'" LIMIT 1');
  245. $sql->query('DELETE FROM `control_plugins_install` WHERE `server`="'.$id.'" LIMIT 1');
  246. $sql->query('DELETE FROM `control_plugins_buy` WHERE `server`="'.$id.'" LIMIT 1');
  247. $sql->query('DELETE FROM `control_servers` WHERE `id`="'.$id.'" LIMIT 1');
  248. return array('s' => 'ok');
  249. }
  250. public static function clmcache($id)
  251. {
  252. global $mcache;
  253. $mcache->delete('ctrl_server_index_'.$id);
  254. $mcache->delete('ctrl_server_resources_'.$id);
  255. $mcache->delete('ctrl_server_status_'.$id);
  256. }
  257. }