Example #1
0
 /**
  * Переустановка игрового сервера
  * 
  * 
  */
 function reinstall_game_server($id, $confirm = false)
 {
     $this->load->model('servers/games');
     $this->load->model('servers/game_types');
     $local_tpl['content'] = '';
     if (!$this->servers->get_server_data($id)) {
         $this->_show_message(lang('adm_servers_server_not_found'), site_url('adm_servers/view/game_servers'));
         return false;
     }
     if ($confirm == $this->security->get_csrf_hash()) {
         /* Удаление директории на выделенном сервере */
         //~ if (isset($this->servers->server_data['dir'])) {
         //~ switch($this->servers->server_data['os']) {
         //~ case 'Windows':
         //~ $command = 'rmdir /S ' . $this->servers->server_data['dir'];
         //~ break;
         //~ default:
         //~ // Linux
         //~ $command = 'rm -rf ' . $this->servers->server_data['dir'];
         //~ break;
         //~ }
         //~ }
         //~
         //~ try {
         //~ $result = send_command($command, $this->servers->server_data);
         //~ } catch (Exception $e) {
         //~ // Директория не удалена
         //~ }
         // Остановка сервера
         try {
             $this->servers->stop($id);
         } catch (Exception $e) {
             // Сохраняем логи
             $log_data['type'] = 'server_command';
             $log_data['command'] = 'stop';
             $log_data['user_name'] = $this->users->auth_login;
             $log_data['server_id'] = $id;
             $log_data['msg'] = 'Stop server Error';
             $log_data['log_data'] = $e->getMessage() . "\n" . get_last_command();
             $this->panel_log->save_log($log_data);
         }
         $sql_data['installed'] = 0;
         if ($this->servers->edit_game_server($id, $sql_data)) {
             $this->_show_message(lang('adm_servers_server_will_be_reinstalled'), site_url('adm_servers/edit/game_servers/' . $id), lang('next'));
             $log_data['msg'] = lang('adm_servers_server_will_be_reinstalled');
         } else {
             $this->_show_message(lang('adm_servers_error_server_edit'), site_url('adm_servers/edit/game_servers/' . $id), lang('next'));
             $log_data['msg'] = lang('adm_servers_error_server_edit');
         }
         // Записываем логи
         $log_data['type'] = 'adm_servers';
         $log_data['command'] = 'edit_ds';
         $log_data['server_id'] = 0;
         $log_data['user_name'] = $this->users->auth_login;
         $log_data['log_data'] = 'ID: ' . $id;
         $this->panel_log->save_log($log_data);
         return;
     } else {
         $confirm_tpl['message'] = lang('adm_servers_reinstall_gs_confirm');
         $confirm_tpl['confirmed_url'] = site_url('adm_servers/reinstall_game_server/' . $id . '/' . $this->security->get_csrf_hash());
         $this->tpl_data['content'] .= $this->parser->parse('confirm.html', $confirm_tpl, true);
     }
     $this->parser->parse('main.html', $this->tpl_data);
 }
Example #2
0
 /**
  * Выполнение заданий
  * 
  * @param array  список с id серверов
  */
 private function _tasks($servers_id_list = array())
 {
     $log_data['user_name'] = 'System (cron)';
     if (empty($servers_id_list)) {
         return;
     }
     $this->_cmd_output("--Task manager");
     $cron_stats = array('success' => 0, 'failed' => 0, 'skipped' => 0);
     /* Получение заданий из базы данных 
      * Задания ограничиваются последним часом, если по какой либо 
      * причине задания двухчасовой давносте не были выполнены они не 
      * будут выполнены вновь
      * */
     $where = array('date_perform >' => now() - 3600, 'date_perform <' => now(), 'started' => 0);
     $this->db->where_in('server_id', $servers_id_list);
     $query = $this->db->get_where('cron', $where);
     $task_list = $query->result_array();
     $i = 0;
     $a = 0;
     $count_i = count($task_list);
     while ($i < $count_i) {
         // Если достигнут предел выполняемых задания, то оставляем оставшиеся на потом
         if ($i >= 100) {
             $cron_stats['skipped'] += $count_i - $i;
             break;
         }
         $cron_success = false;
         /* Проверяем дату, чтобы выполнить то что нужно
          * Возможно задание уже было выполнено ранее*/
         if ($task_list[$i]['date_performed'] > $task_list[$i]['date_perform']) {
             $cron_stats['skipped']++;
             $i++;
             continue;
         }
         /*
          * Получение данных сервера
          */
         if (isset($task_list[$i]['server_id'])) {
             $server_id = $task_list[$i]['server_id'];
             // Получение данных сервера
             //~ $this->_get_server_data($server_id);
         } else {
             $cron_stats['skipped']++;
             $i++;
             continue;
         }
         // Получение данных сервера
         $this->_get_server_data($server_id);
         /* 
          * Отправляем данны о том, что задание начало выполняться 
          * чтобы исключить повторное выполнение при следующем запуске cron скрипта, 
          * в случаях когда задание не завершилось 
          */
         $this->db->where('id', $task_list[$i]['id']);
         $this->db->update('cron', array('started' => '1'));
         // Выполняем задание
         switch ($task_list[$i]['code']) {
             case 'server_start':
                 try {
                     $response = $this->servers->start($this->servers_data[$server_id]);
                     $message = $this->_get_message($response);
                     $cron_success = true;
                     $cron_stats['success']++;
                     $this->_cmd_output('---Task: server #' . $server_id . '  start success');
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'start';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = $message;
                     $log_data['log_data'] = $response;
                     $this->panel_log->save_log($log_data);
                 } catch (Exception $e) {
                     $cron_stats['failed']++;
                     $message = $e->getMessage();
                     $this->_cmd_output('---Task: server #' . $server_id . '  start failed. ' . $message);
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'start';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = 'Start server Error';
                     $log_data['log_data'] = $message . "\n" . get_last_command();
                     $this->panel_log->save_log($log_data);
                 }
                 break;
             case 'server_stop':
                 try {
                     $response = $this->servers->stop($this->servers_data[$server_id]);
                     $message = $this->_get_message($response);
                     $cron_success = true;
                     $cron_stats['success']++;
                     $this->_cmd_output('---Task: server #' . $server_id . '  stop success');
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'stop';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = $message;
                     $log_data['log_data'] = $response;
                     $this->panel_log->save_log($log_data);
                 } catch (Exception $e) {
                     $cron_stats['failed']++;
                     $message = $e->getMessage();
                     $this->_cmd_output('---Task: server #' . $server_id . '  stop failed. ' . $message);
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'stop';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = 'Stop server Error';
                     $log_data['log_data'] = $message . "\n" . get_last_command();
                     $this->panel_log->save_log($log_data);
                 }
                 break;
             case 'server_restart':
                 try {
                     $response = $this->servers->restart($this->servers_data[$server_id]);
                     $message = $this->_get_message($response);
                     $cron_success = true;
                     $cron_stats['success']++;
                     $this->_cmd_output('---Task: server #' . $server_id . '  restart success');
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'restart';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = $message;
                     $log_data['log_data'] = $response;
                     $this->panel_log->save_log($log_data);
                 } catch (Exception $e) {
                     $cron_stats['failed']++;
                     $message = $e->getMessage();
                     $this->_cmd_output('---Task: server #' . $server_id . '  restart failed. ' . $message);
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'restart';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = 'Restart server Error';
                     $log_data['log_data'] = $message . "\n" . get_last_command();
                     $this->panel_log->save_log($log_data);
                 }
                 break;
             case 'server_update':
                 try {
                     // Обновление - установка файлов поверх существующих
                     $this->servers->stop($this->servers_data[$server_id]);
                     $this->_install_server($server_id, true);
                     $cron_success = true;
                     $cron_stats['success']++;
                     $this->_cmd_output('---Task: server #' . $server_id . '  update success');
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'update';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = $message;
                     $log_data['log_data'] = $response;
                     $this->panel_log->save_log($log_data);
                 } catch (Exception $e) {
                     $cron_stats['failed']++;
                     $message = $e->getMessage();
                     $this->_cmd_output('---Task: server #' . $server_id . '  update failed. ' . $message);
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'update';
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = 'Update server Error';
                     $log_data['log_data'] = $message . "\n" . get_last_command();
                     $this->panel_log->save_log($log_data);
                 }
                 break;
             case 'server_rcon':
                 if ($this->servers->server_status($this->servers_data[$server_id]['server_ip'], $this->servers_data[$server_id]['query_port'])) {
                     $this->rcon->set_variables($this->servers_data[$server_id]['server_ip'], $this->servers_data[$server_id]['server_port'], $this->servers_data[$server_id]['rcon'], $this->servers_data[$server_id]['engine'], $this->servers_data[$server_id]['engine_version']);
                     $rcon_connect = $this->rcon->connect();
                     if ($rcon_connect) {
                         $rcon_string = $this->rcon->command($task_list[$i]['command']);
                         $cron_success = true;
                         $cron_stats['success']++;
                         $this->_cmd_output('---Task: server #' . $server_id . '  rcon send success');
                         // Сохраняем логи
                         $log_data['type'] = 'server_rcon';
                         $log_data['command'] = $task_list[$i]['command'];
                         $log_data['server_id'] = $server_id;
                         $log_data['msg'] = 'Rcon command';
                         $log_data['log_data'] = 'Rcon string: ' . $rcon_string;
                         $this->panel_log->save_log($log_data);
                     } else {
                         $cron_stats['failed']++;
                         $this->_cmd_output('---Task: server #' . $server_id . '  rcon send failed');
                         // Сохраняем логи
                         $log_data['type'] = 'server_rcon';
                         $log_data['command'] = $task_list[$i]['command'];
                         $log_data['server_id'] = $server_id;
                         $log_data['msg'] = 'Rcon connect error';
                         $log_data['log_data'] = '';
                         $this->panel_log->save_log($log_data);
                     }
                 } else {
                     $cron_stats['failed']++;
                     $this->_cmd_output('---Task: server #' . $server_id . '  rcon send failed');
                     // Сохраняем логи
                     $log_data['type'] = 'server_rcon';
                     $log_data['command'] = $task_list[$i]['command'];
                     $log_data['server_id'] = $server_id;
                     $log_data['msg'] = 'Server is down';
                     $log_data['log_data'] = '';
                     $this->panel_log->save_log($log_data);
                 }
                 break;
             case 'delete_files':
                 // Команда удаления
                 switch (strtolower($this->servers->server_data['os'])) {
                     case 'windows':
                         $command = 'rmdir /S /Q ' . str_replace('/', '\\', $this->servers->server_data['dir']);
                         break;
                     default:
                         // Linux
                         $command = 'rm -rf ' . $this->servers->server_data['dir'];
                         break;
                 }
                 $log_data['type'] = 'server_command';
                 $log_data['command'] = $task_list[$i]['command'];
                 $log_data['server_id'] = $server_id;
                 try {
                     // Остановка сервера
                     $stop_response = $this->servers->stop($this->servers_data[$server_id]);
                     // Отправка команды удаления
                     $delete_response = send_command($command, $this->servers_data[$server_id]);
                     $this->_cmd_output('---Task: server #' . $server_id . '  delete success');
                     $cron_stats['success']++;
                     $log_data['msg'] = 'Delete successful';
                     $log_data['log_data'] = 'Stop response:' . var_export($stop_response, true) . "\n" . 'Delete response: ' . var_export($delete_response, true);
                     // Удаление задания
                     $this->db->delete('cron', array('id' => $task_list[$i]['id']));
                 } catch (Exception $e) {
                     $this->_cmd_output('---Task: server #' . $server_id . '  delete failed');
                     $cron_stats['failed']++;
                     $log_data['msg'] = 'Delete failed';
                     $log_data['log_data'] = $e->getMessage();
                 }
                 $this->panel_log->save_log($log_data);
                 break;
             default:
                 $i++;
                 continue;
                 break;
         }
         /* Задание было выполнено */
         $sql_data[$a]['id'] = $task_list[$i]['id'];
         $sql_data[$a]['started'] = '0';
         // Устанавливаем дату выполнения
         $sql_data[$a]['date_performed'] = now();
         if ($task_list[$i]['time_add']) {
             // Устанавливаем дату следующего выполнения
             $sql_data[$a]['date_perform'] = $task_list[$i]['date_perform'] + $task_list[$i]['time_add'];
         } else {
             // Удаление задания, т.к. даты следующего выполнения нет
             $this->db->where('id', $task_list[$i]['id']);
             $this->db->delete('cron');
         }
         $i++;
         $a++;
     }
     // Обновляем данные
     if (isset($sql_data) && is_array($sql_data) && !empty($sql_data)) {
         $this->db->update_batch('cron', $sql_data, 'id');
     }
     // Отображаем статистику заданий
     //~ $this->_cmd_output("---Success: {$cron_stats['success']} Failed: {$cron_stats['failed']} Skipped: {$cron_stats['skipped']}");
     $this->_cmd_output('-- End Task manager');
 }
Example #3
0
 public function restart($server_id, $confirm = false)
 {
     $this->load->helper('date');
     if ($this->servers->get_server_data($server_id)) {
         // Получение прав на сервер
         $this->users->get_server_privileges($this->servers->server_data['id']);
         /* 
          * Проверка прав на управление сервером
          * Права пользователя храняться в $this->users->user_privileges
          * Серверы, которыми владеет пользователь $this->users->user_servers
          * Информация о сервере хранится в $this->servers->server_data
          * 
          * Если в привилегиях пользователя стоит 2, то он имеет права
          * на запуск любых серверов
          * Если в привилегиях стоит 1, то он имеет права на запуск
          * лишь своих серверов, в этом случае нужно еще проверить -
          * находится ли сервер в списке
          */
         if ($this->users->auth_privileges['srv_restart'] && $this->users->auth_servers_privileges['SERVER_RESTART']) {
             /* Заданы ли параметры запуска */
             if (!$this->servers->server_data['script_restart']) {
                 $this->_show_message(lang('server_command_restart_not_param'));
                 return false;
             }
             /* Подтверждение 
              * Чтобы избежать случаев случайного запуска сервера
              */
             if ($confirm == $this->security->get_csrf_hash()) {
                 // Обращаться к перезапуску можно не чаще 1 раза в минуту
                 if (!$this->users->auth_data['is_admin']) {
                     $this->panel_log->set_filter(array('type' => null, 'command' => 'restart', 'user_name' => $this->users->auth_data['login'], 'contents' => null, 'server_id' => $server_id));
                     $this->db->where('server_id', $server_id);
                     $this->db->where('date >', now() - 90);
                     if ($this->panel_log->get_count_all_log() >= 1) {
                         //~ $this->_show_message(lang(''));
                         $this->_show_message(lang('server_command_wait_one_minute_to_restart'));
                         return false;
                     }
                 }
                 try {
                     $response = $this->servers->restart($this->servers->server_data);
                     $message = $this->_get_message($response, $server_id);
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'restart';
                     $log_data['user_name'] = $this->users->auth_login;
                     $log_data['server_id'] = $this->servers->server_data['id'];
                     $log_data['msg'] = $message;
                     $log_data['log_data'] = $response . "\nCommand:\n" . get_last_command();
                     $this->panel_log->save_log($log_data);
                     $this->_show_message($message, site_url('admin/server_control/main/' . $server_id), lang('next'));
                     return true;
                 } catch (Exception $e) {
                     $message = $e->getMessage();
                     if ($this->users->auth_data['is_admin']) {
                         $message .= '<p>' . lang('server_command_sent_cmd') . ':<br /><code>' . get_last_command() . '</code></p>';
                     }
                     $this->_show_message($message, site_url('admin/server_control/main/' . $server_id));
                     // Сохраняем логи
                     $log_data['type'] = 'server_command';
                     $log_data['command'] = 'restart';
                     $log_data['user_name'] = $this->users->auth_login;
                     $log_data['server_id'] = $this->servers->server_data['id'];
                     $log_data['msg'] = 'Restart server Error';
                     $log_data['log_data'] = $e->getMessage() . "\n" . get_last_command();
                     $this->panel_log->save_log($log_data);
                     return false;
                 }
             } else {
                 /* Пользователь не подвердил намерения */
                 $confirm_tpl['message'] = lang('server_command_restart_confirm');
                 $confirm_tpl['confirmed_url'] = site_url('server_command/restart/' . $this->servers->server_data['id'] . '/' . $this->security->get_csrf_hash());
                 $this->tpl_data['content'] .= $this->parser->parse('confirm.html', $confirm_tpl, true);
             }
         } else {
             $message = lang('server_command_no_restart_privileges');
             $this->_show_message($message, site_url('admin/server_control/main/' . $server_id), lang('next'));
             return false;
             break;
         }
     } else {
         $message = lang('server_command_server_not_found');
         $this->_show_message($message, site_url('admin'), lang('next'));
         return false;
     }
     $this->parser->parse('main.html', $this->tpl_data);
 }