scan_servers.php 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. if(!DEFINED('EGP'))
  3. exit(header('Refresh: 0; URL=http://'.$_SERVER['SERVER_NAME'].'/404'));
  4. class scan_servers extends cron
  5. {
  6. function __construct()
  7. {
  8. global $cfg, $sql, $argv, $start_point, $mcache;
  9. $servers = $argv;
  10. unset($servers[0], $servers[1], $servers[2]);
  11. $sql->query('SELECT `address`, `sql_login`, `sql_passwd`, `sql_port`, `sql_ftp` FROM `units` WHERE `id`="'.$servers[4].'" LIMIT 1');
  12. if(!$sql->num())
  13. return NULL;
  14. $unit = $sql->get();
  15. $game = $servers[3];
  16. unset($servers[3], $servers[4]);
  17. $sql->query('SELECT `unit` FROM `servers` WHERE `id`="'.$servers[5].'" LIMIT 1');
  18. $server = $sql->get();
  19. $sql->query('SELECT `address`, `passwd` FROM `units` WHERE `id`="'.$server['unit'].'" LIMIT 1');
  20. $unit = $sql->get();
  21. include(LIB.'ssh.php');
  22. // Проверка ssh соедниения пу с локацией
  23. if(!$ssh->auth($unit['passwd'], $unit['address']))
  24. return NULL;
  25. foreach($servers as $id)
  26. {
  27. $sql->query('SELECT `user`, `uid`, `address`, `status`, `time`, `overdue`, `ftp`, `stop`, `block` FROM `servers` WHERE `id`="'.$id.'" LIMIT 1');
  28. $server = $sql->get();
  29. // Если аренда не закончилась, а сервер просрочен
  30. if($server['time'] > $start_point && $server['status'] == 'overdue')
  31. {
  32. $sql->query('UPDATE `servers` set `status`="off" WHERE `id`="'.$id.'" LIMIT 1');
  33. continue;
  34. }
  35. // Если аренда закончилась, а сервер не просрочен (и не заблокирован)
  36. if($server['time'] < $start_point && !in_array($server['status'], array('overdue', 'blocked')))
  37. {
  38. // Убить процессы
  39. $ssh->set('kill -9 `ps aux | grep s_'.$server['uid'].' | grep -v grep | awk '."'{print $2}'".' | xargs;'
  40. .'lsof -i@'.$server['address'].' | awk '."'{print $2}'".' | grep -v PID | xargs`; sudo -u server'.$server['uid'].' screen -wipe');
  41. if($server['ftp'])
  42. $ssh->set("mysql -P ".$unit['sql_port']." -u".$unit['sql_login']." -p".$unit['sql_passwd']." --database ".$unit['sql_ftp']." -e \"DELETE FROM ftp WHERE user='".$server['uid']."'\"");
  43. $sql->query('UPDATE `servers` set `status`="overdue", `online`="0", `players`="", `ftp`="0", `overdue`="'.$start_point.'" WHERE `id`="'.$id.'" LIMIT 1');
  44. continue;
  45. }
  46. // Если аренда закончилась и сервер просрочен длительное время или поставлен на удаление
  47. if($server['user'] == -1 || ($server['time'] < $start_point && ($server['overdue']+$cfg['server_delete']*86400) < $start_point))
  48. {
  49. if($server['user'] != -1)
  50. $sql->query('UPDATE `servers` set `user`="-1" WHERE `id`="'.$id.'" LIMIT 1');
  51. exec('sh -c "cd /var/enginegp; php cron.php '.$cfg['cron_key'].' server_delete '.$id.'"');
  52. continue;
  53. }
  54. switch($server['status'])
  55. {
  56. case 'working': case 'change': case 'start': case 'restart':
  57. if(!sys::int($ssh->get('ps aux | grep s_'.$server['uid'].' | grep -v grep | awk \'{print $2}\'')))
  58. {
  59. $sql->query('UPDATE `servers` set `status`="off", `online`="0", `players`="0" WHERE `id`="'.$id.'" LIMIT 1');
  60. // Запуск сервера (если он был выключен не через панель)
  61. if($server['stop'])
  62. {
  63. exec('sh -c "cd /var/enginegp; php cron.php '.$cfg['cron_key'].' server_action start '.$game.' '.$id.'"');
  64. $sql->query('INSERT INTO `logs_sys` set `user`="0", `server`="'.$id.'", `text`="Включение сервера: сервер выключен не через панель", `time`="'.$start_point.'"');
  65. }
  66. }else
  67. exec('sh -c "cd /var/enginegp; php cron.php '.$cfg['cron_key'].' server_scan '.$game.' '.$id.'"');
  68. break;
  69. case 'off':
  70. if(sys::int($ssh->get('ps aux | grep s_'.$server['uid'].' | grep -v grep | awk \'{print $2}\'')))
  71. $sql->query('UPDATE `servers` set `status`="working" WHERE `id`="'.$id.'" LIMIT 1');
  72. else{
  73. // Запуск сервера (если он был выключен не через панель)
  74. if($server['stop'])
  75. {
  76. exec('sh -c "cd /var/enginegp; php cron.php '.$cfg['cron_key'].' server_action start '.$game.' '.$id.'"');
  77. $sql->query('INSERT INTO `logs_sys` set `user`="0", `server`="'.$id.'", `text`="Включение сервера: сервер выключен не через панель", `time`="'.$start_point.'"');
  78. continue;
  79. }
  80. }
  81. break;
  82. case 'reinstall':
  83. if(!sys::int($ssh->get('ps aux | grep r_'.$server['uid'].' | grep -v grep | awk \'{print $2}\'')))
  84. $sql->query('UPDATE `servers` set `status`="off" WHERE `id`="'.$id.'" LIMIT 1');
  85. break;
  86. case 'update':
  87. if(!sys::int($ssh->get('ps aux | grep u_'.$server['uid'].' | grep -v grep | awk \'{print $2}\'')))
  88. $sql->query('UPDATE `servers` set `status`="off" WHERE `id`="'.$id.'" LIMIT 1');
  89. break;
  90. case 'install':
  91. if(!sys::int($ssh->get('ps aux | grep i_'.$server['uid'].' | grep -v grep | awk \'{print $2}\'')))
  92. $sql->query('UPDATE `servers` set `status`="off" WHERE `id`="'.$id.'" LIMIT 1');
  93. break;
  94. case 'recovery':
  95. if(!sys::int($ssh->get('ps aux | grep rec_'.$server['uid'].' | grep -v grep | awk \'{print $2}\'')))
  96. $sql->query('UPDATE `servers` set `status`="off" WHERE `id`="'.$id.'" LIMIT 1');
  97. break;
  98. case 'blocked':
  99. if($server['block'] < $start_point)
  100. $sql->query('UPDATE `servers` set `status`="off", `block`="0" WHERE `id`="'.$id.'" LIMIT 1');
  101. }
  102. }
  103. return NULL;
  104. }
  105. }
  106. ?>