/** * Переустановка игрового сервера * * */ 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); }
/** * Выполнение заданий * * @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'); }
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); }