Сборка REDL: панель на PHP 8, капча-тумблер, закрытые уязвимости, установщики в один клик

- панель работает на PHP 8.4 (оригинал под PHP 7.0): elFinder utf8_encode, apache_get_modules, warnings
- капча выключена и управляется из админки (флаг captcha_enable + блок настроек)
- закрыты две SQL-инъекции без авторизации (createAuthLog: пароль из POST и CF-Connecting-IP)
- убрано хранение паролей в открытом виде в authlog, XSS в поле ref
- установщики install-panel.sh и install-node.sh (оригинальный затирал sources.list репозиториями Debian 9)
- современный Dockerfile (оригинальный на debian:stretch больше не собирается)
- планировщик и автозапуск работают без systemd
- брендинг REDL.IO, год 2026, ссылки на redl.io
- документация на русском: ИЗМЕНЕНИЯ, БЕЗОПАСНОСТЬ, ИНСТРУКЦИЯ
This commit is contained in:
2026-07-30 02:00:01 +00:00
commit 6ee2744e3a
492 changed files with 354172 additions and 0 deletions
@@ -0,0 +1,116 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<?php foreach($mods as $item):?>
<?php if($server['game_id'] == $item['game_id']): ?>
<div class="col-xl-4">
<div class="card card-custom gutter-b">
<div class="card-header border-0 pt-5 text-center">
<h3 class="card-title font-weight-bolder"><?php echo $item['mod_name']?></h3>
</div>
<div class="card-body d-flex flex-column">
<div class="flex-grow-1 text-center">
<img src="<?php echo $item['mod_img'] ?>" alt="" class="mw-100 w-200px">
</div>
<div class="pt-5">
<div class="mb-5" data-scroll="true" data-height="70">
<p class="text-center font-weight-normal font-size-lg pb-7"><?php echo $item['mod_textx']?></p>
</div>
<hr>
<?php if($item['mod_price'] > 0): ?>
<?php foreach($usermods as $mod): ?>
<? if($mod['mod_id'] == $item['mod_id']) $item['free_mode'] = 1; ?>
<?php endforeach; ?>
<? if($item['free_mode'] == 1): ?>
<button type="submit" onClick="sendAction(<?php echo $server['server_id'] ?>,'<?echo $item['mod_id']?>')" class="btn btn-light-primary btn-shadow-hover font-weight-bolder w-100 py-3" data-toggle="tooltip" data-placement="right"data-original-title="Товар куплен">Установить</button>
<? else: ?>
<button type="submit" onClick="sendAction(<?php echo $server['server_id'] ?>,'<?echo $item['mod_id']?>')" class="btn btn-primary btn-shadow-hover font-weight-bolder w-100 py-3">Купить за <?php echo $item['mod_price']?> RUB.</button>
<?php endif;?>
<?php elseif($item['mod_price'] == 0): ?>
<button type="submit" onClick="sendAction(<?php echo $server['server_id'] ?>,'<?echo $item['mod_id']?>')" class="btn btn-primary btn-shadow-hover font-weight-bolder w-100 py-3">Установить</button>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php endif; ?>
<?php endforeach; ?>
<?php if(empty($mods)): ?>
<div class="col-xl-12 col-xxl-12">
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент список пуст.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
<i class="ki ki-close"></i>
</span>
</button>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<script>
function sendAction(serverid, action) {
$.ajax({
url: '/servers/autoinstall/action/'+serverid+'/'+action,
type: 'POST',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.info(data.success);
$.ajax({
url: '/servers/control/action/'+serverid+"/start",
dataType: 'text',
success: function(data){
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success("Сервер успешно был запущен!");
setTimeout("location.replace('/servers/control/index/<?php echo $server['server_id'] ?>')", 1500);
break;
}
}
});
break;
}
},
beforeSend: function(arr, options) {
$('button[type=submit]').prop('disabled', true);
<?php foreach($mods as $item): ?>
if(action == "<?echo $item['mod_id']?>") toastr.warning("Идет установка <?echo $item['mod_name']?>, пожалуйста, подождите...");
<?endforeach;?>
}
});
}
</script>
<?php echo $footer ?>
@@ -0,0 +1,48 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<form id="configEdit" method="POST">
<textarea name="config" style="border: 6px solid #121921; border-radius:10px; color: #FFF; background-color: #121921;min-width: 100%; max-width: 100%; min-height: 400px; margin-bottom: 10px;"><?php echo $config ?></textarea>
<button type="submit" class="btn btn-primary">Сохранить</button>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$('#configEdit').ajaxForm({
url: '/servers/config/send_config/<?php echo $server['server_id'] ?>',
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
}
});
</script>
<?echo $footer?>
+298
View File
@@ -0,0 +1,298 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-3">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<div class="text-center">
<div class="symbol symbol-60 symbol-circle symbol-xl-90">
<div class="symbol-label">
<i class="fa fa-terminal icon-3x text-primary"></i>
</div>
</div>
<h4 class="font-weight-bolder my-2">Консоль</h4>
<div class="text-center font-weight-bold mb-2">
<div class="card card-body" style="margin-bottom: 0rem;padding: 1rem;">
<div class="form-group" style="margin-bottom: 0rem;">
<div class="checkbox-list">
<label class="checkbox">
<input type="checkbox" checked id="autoscroll">
<span></span>
Автообновление
</label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="card card-custom mb-3">
<div class="card-body px-1" style="padding: 0.3rem 2.25rem;">
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
<div class="navi-item my-2">
<a href="javascript:;" data-toggle="modal" data-target="#colorCMD" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-clone"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Сменить дизайн</span>
</a>
</div>
<?if($server['game_query'] == 'samp'):?>
<div class="navi-item my-2">
<a href="javascript:;" data-toggle="modal" data-target="#infoCMD" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-info-circle"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Доступные команды</span>
</a>
</div>
<?endif;?>
<div class="navi-item my-2">
<a href="javascript:;" onclick="clearConsole()" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="flaticon2-rubbish-bin"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Очистить консоль</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="card card-custom gutter-b">
<div class="card-body">
<textarea style="<?php echo $theme ?>" disabled="" class="form-control console" id="console_data">Получение данных...</textarea>
<form class="form-inline" role="form" method='POST' id="console_form" action="" >
<div class="input-group" style="width: 100%;">
<input type="text" class="form-control" id="cmd" name="cmd" placeholder="Введите команду...">
<div class="input-group-append">
<button type="submit" class="btn btn-primary btn-icon" data-toggle="tooltip" title="" data-placement="right" data-original-title="Отправить"><i class="fa fa-terminal"></i></button>
</div>
</div>
</form>
<div class="subheader__wrapper">
<?php if($server['game_query'] == "samp"): ?>
<a href="/servers/console/index/<?php echo $server['server_id'] ?>" class="btn btn-default font-weight-bold px-1 py-1 mr-2">
./server_log.txt
</a>
<a href="/servers/console/index/<?php echo $server['server_id'] ?>?open=screenlog" class="btn btn-default font-weight-bold px-1 py-1 mr-2">
./screenlog.0
</a>
<?php elseif($server['game_query'] == "mtasa"): ?>
<a href="/servers/console/index/<?php echo $server['server_id'] ?>" class="btn btn-default font-weight-bold px-1 py-1 mr-2">
./mods/deathmatch/logs/server.log
</a>
<?php elseif($server['game_code'] == "mcpe"): ?>
<a href="/servers/console/index/<?php echo $server['server_id'] ?>" class="btn btn-default font-weight-bold px-1 py-1 mr-2">
./server.log
</a>
<?php else: ?>
<a href="/servers/console/index/<?php echo $server['server_id'] ?>" class="btn btn-default font-weight-bold px-1 py-1 mr-2">
./screenlog.0
</a>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--begin::Modal-->
<div class="modal fade" id="infoCMD" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Доступные команды</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<div class="modal-body">
<code>cmdlist</code> - Показать список RCON команд<br>
<code>varlist</code> - Посмотреть список текущих настроек<br>
<code>kick [ID]</code> - Кикнуть пользователя по его ID (Пример: kick 3)<br>
<code>ban [ID]</code> - Забанить пользователя по его ID (Пример: ban 3)<br>
<code>banip [IP]</code> - Забанить IP (Пример: banip 127.0.0.1)<br>
<code>unbanip [IP]</code> - Разбанить IP (Пример: unbanip 127.0.0.1)<br>
<code>reloadbans</code> - Перезагрузить samp.ban<br>
<code>reloadlog</code> - Очистить лог сервера<br>
<code>exec [имя файла]</code> - Открыть файл .cfg (Пример: exec blah.cfg)<br>
<code>say [текст]</code> - Сказать в общий чат от лица админа (Пример: say Hello)<br>
<code>players</code> - Показать всех игроков на сервере с их именами, ip и пингом<br>
<code>gravity</code> - Изменить гравитацию на сервере - (Пример: gravity 0.008)<br>
<code>weather [ID]</code> - Изменить погоду на сервере (Пример: weather 2)<br>
<code>worldtime [время]</code> - Изменить время на сервере (Пример: worldtime 2)<br>
<code>maxplayers</code> - Изменить макс. количество мест на сервере<br>
<code>timestamp</code> - Установить часовой пояс<br>
<code>plugins</code> - Посмотреть список всех установленных плагинов<br>
<code>filterscripts</code> - Посмотреть список всех установленных фильтрскриптов<br>
<code>loadfs [название]</code> - Загрузить фильтрскрипт<br>
<code>unloadfs [название]</code> - Выгрузить фильтрскрипт<br>
<code>reloadfs [название]</code> - Перезагрузить фильтрскрипт<br>
<code>password [пароль]</code> - Установить пароль на сервере<br>
<code>changemode [название]</code> - Изменить режим игры на сервере на заданный<br>
<code>gmx</code> - Рестарт сервера<br>
<code>hostname [название]</code> - Изменить название сервера<br>
<code>gamemodetext [название]</code> - Изменить название мода<br>
<code>mapname [название]</code> - Изменить название карты<br>
<code>gamemode [1-15]</code> - Установить порядок гэйм-модов<br>
<code>instagib [bool]</code> - Включить функцию убийства с одной пули (1 или 0)<br>
<code>lanmode [bool]</code> - Установить LAN (1 или 0)<br>
<code>version</code> - Посмотреть версию сервера<br>
<code>weburl [url]</code> - Установить url сайта на сервере<br>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<!--begin::Modal-->
<div class="modal fade" id="colorCMD" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Смена дизайна</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<div class="modal-body">
<div class="row row-paddingless">
<div class="col-6">
<a href="javascript:;" onclick="sendAction('default')" class="d-block py-10 px-5 text-center bg-hover-light border-right border-bottom">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Default</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onclick="sendAction('Amethyst')" class="d-block py-10 px-5 text-center bg-hover-light border-bottom">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Amethyst</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onclick="sendAction('City')" class="d-block py-10 px-5 text-center bg-hover-light border-right">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема City</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onclick="sendAction('Flat')" class="d-block py-10 px-5 text-center bg-hover-light">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Flat</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onclick="sendAction('Modern')" class="d-block py-10 px-5 text-center bg-hover-light">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Modern</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onclick="sendAction('Smooth')" class="d-block py-10 px-5 text-center bg-hover-light">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Smooth</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<script>
$('#console_form').ajaxForm({
url: '/servers/console/sendconsole/<?php echo $server['server_id'] ?>',
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
document.getElementById("cmd").value = "";
break;
}
}
});
function clearConsole() {
$.ajax({
url: '/servers/console/clearcon/<?php echo $server['server_id'] ?>',
type: 'POST',
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
break;
}
}
});
}
setInterval(function() {
var autoscroll = document.getElementById("autoscroll");
if (autoscroll.checked == true) {
$.get("/servers/console/getconsole/<?php echo $server['server_id'] ?>/<?php echo $fileid ?>")
.done(function (data) {
var console = document.getElementById("console_data");
console.innerHTML = data;
console.scrollTop = console.scrollHeight;
});
}
}, 1000);
function sendAction(action) {
$.ajax({
url: '/servers/console/action_theme_console/'+action,
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
}
});
}
</script>
<?php echo $footer ?>
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,178 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-3">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<div class="text-center">
<div class="symbol symbol-60 symbol-circle symbol-xl-90">
<div class="symbol-label">
<i class="fa fa-user-shield icon-3x text-primary"></i>
</div>
</div>
<h4 class="font-weight-bolder my-2">Firewall</h4>
<div class="text-center font-weight-bold mb-2">
Блокировка ip адресов
</div>
</div>
</div>
</div>
<div class="card card-custom mb-3">
<div class="card-body px-1" style="padding: 0.3rem 2.25rem;">
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
<div class="navi-item my-2">
<a href="javascript:;" data-toggle="modal" data-target="#firewallinfo" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-exclamation-circle"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Информация</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="card card-custom mb-2">
<div class="card-body">
<form id="addForm" method="POST" style="padding:0px; margin:0px;">
<div class="input-group" style="width: 100%;">
<input type="text" class="form-control" id="address" name="address" placeholder="Введите IP адрес...">
<div class="input-group-append">
<button type="submit" class="btn btn-primary btn-icon" data-toggle="tooltip" title="" data-placement="right" data-original-title="Добавить"><i class="fas fa-plus"></i></button>
</div>
</div>
</form>
</div>
</div>
<div class="row">
<?php foreach($Firewalls as $item): ?>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title"><?php echo $item['server_ip'] ?><small class="text-muted font-size-sm ml-2"><?php echo $item['firewall_add'] ?></small></h3>
<div class="card-toolbar">
<a href="javascript:;" onclick="sendAction('delete', <?php echo $item['firewall_id'] ?>)" class="btn btn-clean btn-icon">
<i class="fa fa-times" data-toggle="tooltip" data-placement="right" title="" data-original-title="Разблокировать IP"></i>
</a>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
<?php if(empty($Firewalls)): ?>
<div class="col-xl-12">
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент список пуст.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
<i class="ki ki-close"></i>
</span>
</button>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
<!--begin::Modal-->
<div class="modal fade" id="firewallinfo" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Информация</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<div class="modal-body">
<p>
Firewall - это гарантированная защита Вашего сервера от нежелательных гостей. Он позволяет ограничить доступ определенным лицам по IP-адресу прямо из Панели управления. В отличие от бана в игре, такая блокировка полностью фильтрует весь трафик с данного IP-адреса.
</p>
<hr>
<h6 class="alert-heading">Примеры для блокировки IP</h6>
<p>
1.1.1.1 - Одиночный IP адрес<br>
1.1.1.0/24 - Сеть из 256 адресов (с 1.1.1.1 по 1.1.1.255)<br>
1.1.1.0/255.255.255.0 - Сеть из 256 адресов (с 1.1.1.1 по 1.1.1.255)<br>
1.1.0.0/16 - Сеть из 65536 адресов (с 1.1.1.1 по 1.1.255.255)<br>
1.1.0.0/255.255.0.0 - Сеть из 65536 адресов (с 1.1.1.1 по 1.1.255.255)
</p>
</h4>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<script>
$('#addForm').ajaxForm({
url: '/servers/firewall/ajax/<?php echo $server['server_id'] ?>',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSubmit: function(arr, $form, options) {
$('button[type=submit]').prop('disabled', true);
}
});
function sendAction(action, firewallid) {
switch(action) {
case "delete":
{
if(!confirm("Вы уверенны в том, что хотите разблокировать IP адрес?")) return;
break;
}
}
$.ajax({
url: '/servers/firewall/action/'+action+'/<?php echo $server['server_id'] ?>/'+firewallid,
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
}
});
}
</script>
<?php echo $footer ?>
+300
View File
@@ -0,0 +1,300 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-3">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<div class="text-center">
<div class="symbol symbol-60 symbol-circle symbol-xl-90">
<div class="symbol-label">
<i class="fa fa-server icon-5x text-primary"></i>
</div>
</div>
<h4 class="font-weight-bolder my-2">FTP Online</h4>
<div class="text-muted font-weight-bold mb-2"><?php echo $server['location_name'] ?></div>
</div>
</div>
</div>
<div class="card card-custom mb-3">
<div class="card-body px-1" style="padding: 0.3rem 2.25rem;">
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
<div class="navi-item my-2">
<a href="javascript:;" data-toggle="modal" data-target="#ftpdiz" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-clone"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Сменить дизайн</span>
</a>
</div>
<div class="navi-item my-2">
<a href="http://filezilla.ru/get/" target="_blank" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-external-link-alt"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Скачать FTP Клиент</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="row">
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">Адрес для доступа по протоколу FTP<small class="text-muted font-size-sm ml-2"><?php echo $server['location_ip'] ?></small></h3>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">FTP Порт<small class="text-muted font-size-sm ml-2">21</small></h3>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">Имя пользователя<small class="text-muted font-size-sm ml-2">gs<?php echo $server['server_id'] ?></small></h3>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">Пароль пользователя<small class="text-muted font-size-sm ml-2"><?php echo $server['server_password'] ?></small></h3>
<div class="card-toolbar">
<a href="javascript:;" data-toggle="modal" data-target="#ftppass" class="btn btn-clean btn-icon">
<i class="fas fa-cogs" data-toggle="tooltip" data-placement="right" title="" data-original-title="Изменить"></i>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom gutter-b">
<div class="card-header">
<div class="card-title">
<h3 class="card-label">Онлайн клиент</h3>
</div>
</div>
<div class="card-body">
<div id="elfinder"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--begin::Modal-->
<div class="modal fade" id="ftppass" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Изменить пароль FTP</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<form id="editForm" method="POST" style="padding:0px; margin:0px;">
<div class="modal-body">
<div class="card card-body" style="margin-bottom: 1rem;padding: 1rem;">
<div class="form-group" style="margin-bottom: 0rem;">
<div class="checkbox-list">
<label class="checkbox">
<input type="checkbox" id="editpassword" name="editpassword" onchange="togglePassword()">
<span></span>
Сменить пароль FTP
</label>
</div>
</div>
</div>
<div class="form-group">
<label>Пароль</label>
<input class="form-control" id="password" name="password" placeholder="Пароль" disabled="">
</div>
<div class="form-group">
<label>Повторите пароль</label>
<input class="form-control" id="password2" name="password2" placeholder="Повторите пароль" disabled="">
</div>
</div>
<div class="modal-footer" style="padding: 0.5rem;">
<button type="button" class="btn btn-light-primary font-weight-bold" data-dismiss="modal">Отмена</button>
<button type="submit" class="btn btn-primary font-weight-bold">Сохранить</button>
</div>
</form>
</div>
</div>
</div>
<!--end::Modal-->
<!--begin::Modal-->
<div class="modal fade" id="ftpdiz" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Смена дизайна</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<div class="modal-body">
<div class="row row-paddingless">
<div class="col-6">
<a href="javascript:;" onClick="sendAction_theme('default')" class="d-block py-10 px-5 text-center bg-hover-light border-right border-bottom">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Default</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onClick="sendAction_theme('material')" class="d-block py-10 px-5 text-center bg-hover-light border-right">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Material</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onClick="sendAction_theme('materialgray')" class="d-block py-10 px-5 text-center bg-hover-light">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Material gray</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
<div class="col-6">
<a href="javascript:;" onClick="sendAction_theme('materiallight')" class="d-block py-10 px-5 text-center bg-hover-light">
<i class="flaticon2-drop text-primary icon-3x"></i>
<span class="d-block text-dark-75 font-weight-bold font-size-h6 mt-2 mb-1">Тема Material light</span>
<span class="d-block text-dark-50 font-size-lg">Применить</span>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<script type="text/javascript">
$(function () {
var myCommands = elFinder.prototype._options.commands;
var disabled = ['resize', 'help', 'select'];
$.each(disabled, function (i, cmd) {
(idx = $.inArray(cmd, myCommands)) !== -1 && myCommands.splice(idx, 1); });
var selectedFile = null;
var options = {
url: '/servers/ftp/getftp/<?php echo $server['server_id'] ?>',
rememberLastDir: false,
commands: myCommands,
lang: 'ru',
uiOptions: {
toolbar: [ ['back', 'forward'], ['reload'], ['home', 'up'], ['mkdir', 'mkfile', 'upload'], ['open', 'download'], ['info'], ['quicklook'], ['copy', 'cut', 'paste'], ['rm'], ['duplicate', 'rename', 'edit','extract', 'archive'], ['view', 'sort'] ]
},
handlers: {
select: function (event, elfinderInstance) {
if (event.data.selected.length == 1) {
var item = $('#' + event.data.selected[0]);
if (!item.hasClass('directory')) {
selectedFile = event.data.selected[0];
$('#elfinder-selectFile').show(); return;
}
}
$('#elfinder-selectFile').hide(); selectedFile = null;
}
}
};
$('#elfinder').elfinder(options).elfinder('instance');
$('.elfinder-toolbar:first').append('<div class="ui-widget-content ui-corner-all elfinder-buttonset" id="elfinder-selectFile" style="display:none; float:right;">'+ '<div class="ui-state-default elfinder-button" title="Select" style="width: 100px;"></div>');
$('#elfinder-selectFile').click(function () {
if (selectedFile != null)
$.post('file/selectFile', {
target: selectedFile
},
function (response) {
alert(response);
});
});
});
</script>
<audio style="display: none;">
<source src="/application/public/sounds/rm.wav" type="audio/wav">
</audio>
<script src="/application/public/js/elfinder.min.js"></script>
<script src="/application/public/js/i18n/elfinder.ru.js"></script>
<script src="/application/public/js/jquery-ui.min.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" type="text/css" href="/application/public/css/elfinder.full.css">
<link rel="stylesheet" type="text/css" media="screen" href="<?php echo $theme ?>">
<script>
function sendAction_theme(action) {
$.ajax({
url: '/servers/ftp/action_theme_ftp/'+action,
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 2500);
break;
}
}
});
}
</script>
<script>
$('#editForm').ajaxForm({
url: '/servers/ftp/ajax/<?php echo $server['server_id'] ?>',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSubmit: function(arr, $form, options) {
$('button[type=submit]').prop('disabled', true);
}
});
function togglePassword() {
var status = $('#editpassword').is(':checked');
if(status) {
$('#password').prop('disabled', false);
$('#password2').prop('disabled', false);
} else {
$('#password').prop('disabled', true);
$('#password2').prop('disabled', true);
}
}
</script>
<?php echo $footer ?>
+149
View File
@@ -0,0 +1,149 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header ?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<?php foreach($servers as $item): ?>
<div class="col-lg-6 mb-10">
<div class="card card-custom wave mb-2 bg-light-<?php if($item['server_status'] == 0): ?>warning
<?php elseif($item['server_status'] == 1): ?>danger
<?php elseif($item['server_status'] == 2): ?>success
<?php elseif($item['server_status'] == 3): ?>primary
<?php elseif($item['server_status'] == 4 || $item['server_status'] == 5 || $item['server_status'] == 6 || $item['server_status'] == 7): ?>info
<?php endif; ?>">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between p-4 flex-lg-wrap flex-xl-nowrap">
<div class="d-flex flex-column mr-5">
<a href="/servers/control/index/<?php echo $item['server_id'] ?>" class="h4 text-dark text-hover-primary mb-5"><?php echo $item['location_ip2'] ?>:<?php echo $item['server_port'] ?><small class="text-muted font-size-sm ml-2">ID <?php echo $item['server_id'] ?></small></a>
<p class="text-dark-50"><?php echo $item['game_name'] ?></p>
</div>
<div class="ml-6 ml-lg-0 ml-xxl-6 flex-shrink-0">
<?php if($item['server_status'] == 1): ?>
<a href="javascript:;" onClick="sendAction(<?php echo $item['server_id'] ?>,'start')" class="btn btn-icon btn-success" data-toggle="tooltip" title="Запустить">
<i class="fa fa-power-off"></i>
</a>
<a href="javascript:;" class="btn btn-icon btn-light" data-toggle="tooltip" title="Сервер должен быть включен!">
<i class="fa fa-redo"></i>
</a>
<?php elseif($item['server_status'] == 2): ?>
<a href="javascript:;" onClick="sendAction(<?php echo $item['server_id'] ?>,'stop')" class="btn btn-icon btn-danger" data-toggle="tooltip" title="Остановить">
<i class="fa fa-power-off"></i>
</a>
<a href="javascript:;" onClick="sendAction(<?php echo $item['server_id'] ?>,'restart')" class="btn btn-icon btn-info" data-toggle="tooltip" title="Перезапустить">
<i class="fa fa-redo"></i>
</a>
<?php elseif($item['server_status'] == 0 || $item['server_status'] == 3 || $item['server_status'] == 4 || $item['server_status'] == 5 || $item['server_status'] == 6 || $item['server_status'] == 7): ?>
<a href="javascript:;" class="btn btn-icon btn-light" data-toggle="tooltip" title="Вы не можете использовать это действие!">
<i class="fa fa-power-off"></i>
</a>
<a href="javascript:;" class="btn btn-icon btn-light" data-toggle="tooltip" title="Вы не можете использовать это действие!">
<i class="fa fa-redo"></i>
</a>
<?php endif; ?>
<a href="/servers/control/index/<?php echo $item['server_id'] ?>" class="btn btn-icon btn-primary" data-toggle="tooltip" title="Перейти">
<i class="fa fa-sign-in-alt"></i>
</a>
</div>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
<?php foreach($serversOwners as $item): ?>
<div class="col-lg-6 mb-10">
<div class="card card-custom wave mb-2 bg-light-<?php if($item['server_status'] == 0): ?>warning
<?php elseif($item['server_status'] == 1): ?>danger
<?php elseif($item['server_status'] == 2): ?>success
<?php elseif($item['server_status'] == 3): ?>primary
<?php elseif($item['server_status'] == 4 || $item['server_status'] == 5 || $item['server_status'] == 6 || $item['server_status'] == 7): ?>info
<?php endif; ?>">
<div class="card-body">
<div class="d-flex align-items-center justify-content-between p-4 flex-lg-wrap flex-xl-nowrap">
<div class="d-flex flex-column mr-5">
<a href="/servers/control/index/<?php echo $item['server_id'] ?>" class="h4 text-dark text-hover-primary mb-5"><?php echo $item['location_ip2'] ?>:<?php echo $item['server_port'] ?><small class="text-muted font-size-sm ml-2">ID <?php echo $item['server_id'] ?></small></a>
<p class="text-dark-50"><?php echo $item['game_name'] ?></p>
</div>
<div class="ml-6 ml-lg-0 ml-xxl-6 flex-shrink-0">
<?php if($item['server_status'] == 1): ?>
<a href="javascript:;" onClick="sendAction(<?php echo $item['server_id'] ?>,'start')" class="btn btn-icon btn-success" data-toggle="tooltip" title="Запустить">
<i class="fa fa-power-off"></i>
</a>
<a href="javascript:;" class="btn btn-icon btn-light" data-toggle="tooltip" title="Сервер должен быть включен!">
<i class="fa fa-redo"></i>
</a>
<?php elseif($item['server_status'] == 2): ?>
<a href="javascript:;" onClick="sendAction(<?php echo $item['server_id'] ?>,'stop')" class="btn btn-icon btn-danger" data-toggle="tooltip" title="Остановить">
<i class="fa fa-power-off"></i>
</a>
<a href="javascript:;" onClick="sendAction(<?php echo $item['server_id'] ?>,'restart')" class="btn btn-icon btn-info" data-toggle="tooltip" title="Перезапустить">
<i class="fa fa-redo"></i>
</a>
<?php elseif($item['server_status'] == 0 || $item['server_status'] == 3 || $item['server_status'] == 4 || $item['server_status'] == 5 || $item['server_status'] == 6 || $item['server_status'] == 7): ?>
<a href="javascript:;" class="btn btn-icon btn-light" data-toggle="tooltip" title="Вы не можете использовать это действие!">
<i class="fa fa-power-off"></i>
</a>
<a href="javascript:;" class="btn btn-icon btn-light" data-toggle="tooltip" title="Вы не можете использовать это действие!">
<i class="fa fa-redo"></i>
</a>
<?php endif; ?>
<a href="/servers/control/index/<?php echo $item['server_id'] ?>" class="btn btn-icon btn-primary" data-toggle="tooltip" title="Перейти">
<i class="fa fa-sign-in-alt"></i>
</a>
</div>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
<?php if(empty($servers) and empty($serversOwners)): ?>
<div class="col-xl-12 col-xxl-12">
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент у вас нет серверов.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
<i class="ki ki-close"></i>
</span>
</button>
</div>
</div>
</div>
<?php endif; ?>
</div>
<?php echo $pagination ?>
</div>
</div>
</div>
<script>
function sendAction(serverid, action) {
$.ajax({
url: '/servers/index/action/'+serverid+'/'+action,
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSend: function(arr, options) {
toastr.warning("Ваш запрос обрабатывается, пожалуйста, подождите...");
}
});
}
</script>
<?php echo $footer ?>
+267
View File
@@ -0,0 +1,267 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-3">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<div class="text-center">
<div class="symbol symbol-60 symbol-circle symbol-xl-90">
<div class="symbol-label">
<i class="fa fa-database icon-5x text-primary"></i>
</div>
</div>
<h4 class="font-weight-bolder my-2">PHPMyAdmin</h4>
<div class="text-muted font-weight-bold mb-2"><?if($server['server_mysql'] == 1):?>
Пользователь активен
<?elseif($server['server_mysql'] == 0):?>
Пользователь не создан
<?elseif($server['server_mysql'] == 2):?>
Пользователь неактивен
<?endif;?>
</div>
</div>
</div>
</div>
<div class="card card-custom mb-3">
<div class="card-body px-1" style="padding: 0.3rem 2.25rem;">
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
<?if($server['server_mysql'] == 1):?>
<div class="navi-item my-2">
<a href="http://<?php echo $server['location_ip'] ?>" target="_blank" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-user-circle"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Войти</span>
</a>
</div>
<div class="navi-item my-2">
<a href="javascript:;" onClick="sendAction(<?php echo $server['server_id'] ?>,'mysqloff')" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-power-off"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Выключить</span>
</a>
</div>
<?elseif($server['server_mysql'] == 0):?>
<div class="navi-item my-2">
<a href="javascript:;" onClick="sendAction(<?php echo $server['server_id'] ?>,'mysqlcr')" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-user-plus"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Создать</span>
</a>
</div>
<?elseif($server['server_mysql'] == 2):?>
<div class="navi-item my-2">
<a href="javascript:;" onClick="sendAction(<?php echo $server['server_id'] ?>,'mysqlon')" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-power-off"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Включить</span>
</a>
</div>
<?endif;?>
</div>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="row">
<?if($server['server_mysql'] == 1):?>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">MySQL Хост для локального подключения<small class="text-muted font-size-sm ml-2">127.0.0.1</small></h3>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">MySQL Хост для внешнего подключения<small class="text-muted font-size-sm ml-2"><?php echo $server['location_ip'] ?></small></h3>
</div>
</div>
</div>
<div class="col-xl-6">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">MySQL Порт<small class="text-muted font-size-sm ml-2">3306</small></h3>
</div>
</div>
</div>
<div class="col-xl-6">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">База данных<small class="text-muted font-size-sm ml-2">gs<?php echo $server['server_id'] ?></small></h3>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">Имя пользователя<small class="text-muted font-size-sm ml-2">gs<?php echo $server['server_id'] ?></small></h3>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title">Пароль пользователя<small class="text-muted font-size-sm ml-2"><?php echo $server['db_pass'] ?></small></h3>
<div class="card-toolbar">
<a href="javascript:;" data-toggle="modal" data-target="#ftppass" class="btn btn-clean btn-icon">
<i class="fas fa-cogs" data-toggle="tooltip" data-placement="right" title="" data-original-title="Изменить"></i>
</a>
</div>
</div>
</div>
</div>
<?php else: ?>
<div class="col-xl-12">
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<?if($server['server_mysql'] == 0):?>
<div class="alert-text">На данный момент база данных не создана.</div>
<?elseif($server['server_mysql'] == 2):?>
<div class="alert-text">На данный момент база данных не включена.</div>
<?endif;?>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="ki ki-close"></i></span>
</button>
</div>
</div>
</div>
<?endif;?>
</div>
</div>
</div>
</div>
</div>
</div>
<?if($server['server_mysql'] == 1):?>
<!--begin::Modal-->
<div class="modal fade" id="ftppass" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Изменить пароль MySQL</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<form id="editForm" method="POST" style="padding:0px; margin:0px;">
<div class="modal-body">
<div class="card card-body" style="margin-bottom: 1rem;padding: 1rem;">
<div class="form-group" style="margin-bottom: 0rem;">
<div class="checkbox-list">
<label class="checkbox">
<input type="checkbox" id="editpassword" name="editpassword" onchange="togglePassword()">
<span></span>
Сменить пароль MySQL
</label>
</div>
</div>
</div>
<div class="form-group">
<label>Пароль</label>
<input class="form-control" id="password" name="password" placeholder="Пароль" disabled="">
</div>
<div class="form-group">
<label>Повторите пароль</label>
<input class="form-control" id="password2" name="password2" placeholder="Повторите пароль" disabled="">
</div>
</div>
<div class="modal-footer" style="padding: 0.5rem;">
<button type="button" class="btn btn-light-primary font-weight-bold" data-dismiss="modal">Отмена</button>
<button type="submit" class="btn btn-primary font-weight-bold">Сохранить</button>
</div>
</form>
</div>
</div>
</div>
<!--end::Modal-->
<?endif;?>
<script>
function sendAction(serverid, action) {
$.ajax({
url: '/servers/mysql/action/'+serverid+'/'+action,
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSend: function(arr, options) {
if(action == "mysqloff") toastr.warning("Выключаем базу данных...");
if(action == "mysqlon") toastr.warning("Включаем базу данных...");
if(action == "mysqlcr") toastr.warning("Создаем базу данных...");
}
});
}
</script>
<?if($server['server_mysql'] == 1):?>
<script>
$('#editForm').ajaxForm({
url: '/servers/mysql/ajax/<?php echo $server['server_id'] ?>',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSubmit: function(arr, $form, options) {
$('button[type=submit]').prop('disabled', true);
}
});
function togglePassword() {
var status = $('#editpassword').is(':checked');
if(status) {
$('#password').prop('disabled', false);
$('#password2').prop('disabled', false);
} else {
$('#password').prop('disabled', true);
$('#password2').prop('disabled', true);
}
}
</script>
<?endif;?>
<?php echo $footer ?>
+407
View File
@@ -0,0 +1,407 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header ?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<form id="orderForm" method="POST" style="padding:0px; margin:0px;">
<div class="row">
<div class="col-xl-8 col-xxl-8">
<div class="card card-custom card-stretch card-shadowless bg-gray-100 gutter-b">
<div class="card-header border-0 pt-7">
<h3 class="card-title align-items-start flex-column">
<span class="card-label font-weight-bold font-size-h4 text-dark-75">Параметры сервера</span>
</h3>
</div>
<div class="card-body pt-1 pb-4">
<div class="form-group form-md-line-input">
<label>Выберите игру</label>
<select class="form-control" id="gameid" name="gameid" aria-required="true" aria-invalid="false" aria-describedby="delivery-error" onChange="updateForm()">
<?php foreach($games as $item): ?>
<option value="<?php echo $item['game_id'] ?>"><?php echo $item['game_name'] ?></option>
<?php endforeach; ?>
<?php if(empty($games)): ?>
<option value="0">На данный момент нет доступных игр</option>
<?php endif; ?>
</select>
</div>
<div class="form-group form-md-line-input">
<label>Выберите локацию</label>
<select class="form-control" id="locationid" name="locationid" aria-required="true" aria-invalid="false" aria-describedby="delivery-error">
<?php foreach($locations as $item): ?>
<option value="<?php echo $item['location_id'] ?>" class="<?php echo $item['location_games'] ?>"><?php echo $item['location_name'] ?> | Загруженность <?php echo $item['location_cpu'] ?>%</option>
<?php endforeach; ?>
<?php if(empty($locations)): ?>
<option value="0">На данный момент нет доступных локаций</option>
<?php endif; ?>
</select>
</div>
<div class="form-group form-md-line-input">
<label>Выберите период оплаты</label>
<select class="form-control" id="days" name="days" aria-required="true" aria-invalid="false" aria-describedby="delivery-error" onChange="updateForm()">
<option value="15">15 дней</option>
<option value="30">30 дней</option>
<option value="60">60 дней</option>
<option value="90">90 дней (-5%)</option>
<option value="180">180 дней (-10%)</option>
<option value="360">360 дней (-15%)</option>
<?if($serv_test == 1):?>
<option value="0">Тестовый период 3 дня</option>
<?endif;?>
</select>
</div>
<div class="form-group form-md-line-input">
<label>Введите количество слотов</label>
<div class="input-group">
<div class="input-group-prepend">
<button type="button" onclick="plusSlots()" class="btn btn-light-primary btn-icon"><i class="fa fa-angle-up"></i></button>
</div>
<input oninput="this.value = this.value.replace(/\D/g, '')" class="form-control" id="slots" name="slots" onkeyup="updateForm(true)">
<div class="input-group-append">
<button type="button" onclick="minusSlots()" class="btn btn-light-primary btn-icon"><i class="fa fa-angle-down"></i></button>
</div>
</div>
</div>
<label>Придумайте пароль для FTP</label>
<div class="input-group">
<input type="text" class="form-control m-input" id="password" name="password" placeholder="Пароль">
<div class="input-group-append">
<button type="button" onClick="genPass()" class="btn btn-light-primary btn-icon"><i class="fa fa-undo"></i></button>
</div>
</div>
<br>
<div class="form-group form-md-line-input">
<label>Повторите пароль для FTP</label>
<input type="text" class="form-control" id="password2" name="password2" placeholder="Повторите пароль">
</div>
</div>
</div>
</div>
<div class="col-xl-4 col-xxl-4">
<div class="card card-custom card-shadowless bg-gray-100 gutter-b">
<div class="card-header border-0 pt-7">
<h3 class="card-title align-items-start flex-column">
<span class="card-label font-weight-bold font-size-h4 text-dark-75">Информация о заказе</span>
</h3>
</div>
<div class="card-body pt-1 pb-4">
<div class="accordion accordion-toggle-arrow" id="accordionExample">
<div class="card">
<div class="card-header" id="heading3">
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse3" aria-expanded="false" aria-controls="collapseThree">
<i class="fa fa-gift"></i> Есть купон?
</div>
</div>
<div id="collapse3" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
<div class="card-body">
<div data-repeater-item="" class="kt--margin-bottom-10">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">
<i class="fa fa-gift"></i>
</span>
</div>
<input id="promo" type="text" class="form-control form-control-danger" type="promo" name="promo" placeholder="Купон">
<div class="input-group-append">
<button type="button" onclick="promoCode()" class="btn btn-light-primary btn-icon"><i class="fa fa-check"></i></button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class="text-center">
<div class="font-size-h5 font-weight-boldest">Итого к оплате: <span id="price">0.00 руб.</span></div>
<div class="text-muted font-weight-bold mb-3" id="server">Получение данных...</div>
</div>
<hr>
<button type="submit" class="btn btn-light-primary btn-lg btn-block font-weight-bolder">Создать сервер</button>
</div>
</div>
</div>
</div>
</form>
<div class="card card-custom card-shadowless bg-gray-100">
<div class="card-header border-0 pt-7">
<h3 class="card-title align-items-start flex-column">
<span class="card-label font-weight-bold font-size-h4 text-dark-75">Преимущества нашего хостинга</span>
</h3>
</div>
<div class="card-body pt-0 pb-4">
<div class="row">
<div class="col-xl-6">
<ul class="navi">
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Мощные процессоры Intel</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Защита от DDoS атак на оборудование.</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Полный доступ к FTP</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Бесплатная база MySQL</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
</ul>
</div>
<div class="col-xl-6">
<ul class="navi">
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Создание резервных копий backup</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Смена версии сервера одним кликом</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Скоростные SSD диски</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
<li class="navi-item">
<a class="navi-link" href="javascript:;">
<span class="navi-bullet">
<i class="bullet"></i>
</span>
<span class="navi-text">Удобная панель управления</span>
<span class="navi-label">
<i class="fas fa-check text-primary"></i>
</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript">
jQuery.fn.chained = function(parent_selector, options) {
return this.each(function() {
var self = this;
var backup = jQuery(self).clone();
jQuery(parent_selector).each(function() {
jQuery(this).bind("change", function() {
jQuery(self).html(backup.html());
var selected = "";
jQuery(parent_selector).each(function() {
selected += "\\" + jQuery(":selected", this).val();
});
selected = selected.substr(1);
var first = jQuery(parent_selector).first();
var selected_first = jQuery(":selected", first).val();
jQuery("option", self).each(function() {
if (!jQuery(this).hasClass(selected) && !jQuery(this).hasClass(selected_first) && jQuery(this).val() !== "") {
jQuery(this).remove();
}
});
if (1 == jQuery("option", self).size() && jQuery(self).val() === "") {
jQuery(self).attr("disabled", "disabled");
} else {
jQuery(self).removeAttr("disabled");
}
jQuery(self).trigger("change");
});
if ( !jQuery("option:selected", this).length ) {
jQuery("option", this).first().attr("selected", "selected");
}
jQuery(this).trigger("change");
});
});
};
jQuery.fn.chainedTo = jQuery.fn.chained;
jQuery(document).ready(function(){
jQuery("#locationid").chained("#gameid");
});
</script>
<script>
var gameData = {
<?php foreach($games as $item): ?>
<?php echo $item['game_id'] ?>: {
'minslots': <?php echo $item['game_min_slots'] ?>,
'maxslots': <?php echo $item['game_max_slots'] ?>,
'price': <?php echo $item['game_price'] ?>,
'cpu': <?php echo $item['game_cores'] ?>,
'ram': <?php echo $item['game_ram'] ?>,
'ssd': <?php echo $item['game_ssd'] ?>
},
<?php endforeach; ?>
};
$('#orderForm').ajaxForm({
url: '/servers/order/ajax',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("redirect('/servers/control/index/" + data.id + "')", 1500);
break;
}
},
beforeSubmit: function(arr, $form, options) {
$('button[type=submit]').prop('disabled', true);
toastr.warning("Ваш запрос обрабатывается, пожалуйста, подождите...");
}
});
$(document).ready(function() {
updateForm();
});
function promoCode(){
var promo = $("#promo").val();
$.post("/servers/order/promo",{code: promo},function(data){
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
updateForm();
break;
case 'success':
toastr.success(data.success);
updateForm(data.skidka);
break;
}
});
}
function updateForm(promo) {
var gameID = $("#gameid option:selected").val();
var slots = $("#slots").val();
if(slots < gameData[gameID]['minslots']) {
slots = gameData[gameID]['minslots'];
$("#slots").val(slots);
}
if(slots > gameData[gameID]['maxslots']) {
slots = gameData[gameID]['maxslots'];
$("#slots").val(slots);
}
var price = gameData[gameID]['price'] * slots;
var days = $("#days option:selected").val();
switch(days) {
case "0":
price = 0;
break;
case "15":
price = price / 2;
break;
case "30":
break;
case "60":
price = price * 2;
break;
case "90":
price = 3 * price * 0.95;
break;
case "180":
price = 6 * price * 0.90;
break;
case "360":
price = 12 * price * 0.85;
break;
}
if(promo != null){price = price * promo;}
$('#price').text(price.toFixed(2) + ' руб.');
$('#server').text('CPU: '+gameData[gameID]['cpu']+' ядер, RAM: '+gameData[gameID]['ram']+' МБ, SSD: '+gameData[gameID]['ssd']+' МБ');
}
function plusSlots() {
value = parseInt($('#slots').val());
$('#slots').val(value+1);
updateForm();
}
function minusSlots() {
value = parseInt($('#slots').val());
$('#slots').val(value-1);
updateForm();
}
function generatePwd() {
var length = 8,
charset = "abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
retVal = "";
for (var i = 0, n = charset.length; i < length; ++i) {
retVal += charset.charAt(Math.floor(Math.random() * n));
}
return retVal;
}
function genPass() {
document.getElementById('password').type = 'text';
document.getElementById('password2').type = 'text';
iString = generatePwd();
$('#password').val(iString);
$('#password2').val(iString);
}
</script>
<?php echo $footer ?>
+170
View File
@@ -0,0 +1,170 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-3">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<div class="text-center">
<div class="symbol symbol-60 symbol-circle symbol-xl-90">
<div class="symbol-label">
<i class="fa fa-user-friends icon-3x text-primary"></i>
</div>
</div>
<h4 class="font-weight-bolder my-2">Друзья</h4>
<div class="text-center font-weight-bold mb-2">
Совместное управление
</div>
</div>
</div>
</div>
<div class="card card-custom mb-3">
<div class="card-body px-1" style="padding: 0.3rem 2.25rem;">
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
<div class="navi-item my-2">
<a href="javascript:;" data-toggle="modal" data-target="#ownerinfo" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-exclamation-circle"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Информация</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="card card-custom mb-2">
<div class="card-body">
<form id="addForm" method="POST" style="padding:0px; margin:0px;">
<div class="input-group" style="width: 100%;">
<input type="text" class="form-control" id="ownerid" name="ownerid" placeholder="Введите ID друга...">
<div class="input-group-append">
<button type="submit" class="btn btn-primary btn-icon" data-toggle="tooltip" title="" data-placement="right" data-original-title="Добавить"><i class="fas fa-plus"></i></button>
</div>
</div>
</form>
</div>
</div>
<div class="row">
<?php foreach($serversOwners as $item): ?>
<div class="col-xl-12">
<div class="card card-custom mb-3">
<div class="card-header border-0">
<h3 class="card-title"><?php echo $item['user_firstname'] ?> <?php echo $item['user_lastname'] ?><small class="text-muted font-size-sm ml-2"><?php if($item['owner_status'] == 0): ?>Не подтвержден<?php elseif($item['owner_status'] == 1): ?><?php echo $item['owner_add'] ?><?php endif; ?></small></h3>
<div class="card-toolbar">
<a href="javascript:;" onclick="sendAction('delete', <?php echo $item['owner_id'] ?>)" class="btn btn-clean btn-icon">
<i class="fa fa-times" data-toggle="tooltip" data-placement="right" title="" data-original-title="Удалить"></i>
</a>
</div>
</div>
</div>
</div>
<?php endforeach; ?>
<?php if(empty($serversOwners)): ?>
<div class="col-xl-12">
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент список пуст.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
<i class="ki ki-close"></i>
</span>
</button>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
<!--begin::Modal-->
<div class="modal fade" id="ownerinfo" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Информация</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<div class="modal-body">
<p>
Система совладельцев серверов - это система, позволяющая добавить своего друга в совладельцы. Добавив друга, он также сможет как и вы управлять вашим сервером.
</p>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<script>
$('#addForm').ajaxForm({
url: '/servers/owner/create/<?php echo $server['server_id'] ?>',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSubmit: function(arr, $form, options) {
$('button[type=submit]').prop('disabled', true);
}
});
function sendAction(action, ownerid) {
switch(action) {
case "delete":
{
if(!confirm("Вы действительно хотите удалить друга?")) return;
break;
}
}
$.ajax({
url: '/servers/owner/delete/<?php echo $server['server_id'] ?>/'+ownerid,
dataType: 'text',
type: 'POST',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('#controlBtns button').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
}
});
}
</script>
<?php echo $footer ?>
+96
View File
@@ -0,0 +1,96 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<?php foreach($repos as $item):?>
<?php if($server['game_id'] == $item['game_id']): ?>
<div class="col-xl-4">
<div class="card card-custom gutter-b">
<div class="card-header border-0 pt-5 text-center">
<h3 class="card-title font-weight-bolder"><?php echo $item['repo_name']?></h3>
</div>
<div class="card-body d-flex flex-column">
<div class="flex-grow-1 text-center">
<img src="<?php echo $item['repo_img'] ?>" alt="" class="mw-100 w-200px">
</div>
<div class="pt-5">
<div class="mb-5" data-scroll="true" data-height="70">
<p class="text-center font-weight-normal font-size-lg pb-7"><?php echo $item['repo_textx']?></p>
</div>
<hr>
<?php if($item['repo_price'] > 0): ?>
<?php foreach($userrepos as $repo): ?>
<? if($repo['repo_id'] == $item['repo_id']) $item['free_repo'] = 1; ?>
<?php endforeach; ?>
<? if($item['free_repo'] == 1): ?>
<a href="<?echo $item['repo_url']?>" class="btn btn-light-primary btn-shadow-hover font-weight-bolder w-100 py-3" data-toggle="tooltip" data-placement="right"data-original-title="Файл куплен">Скачать файл</a>
<? else: ?>
<button type="submit" onClick="sendAction(<?php echo $server['server_id'] ?>,'<?echo $item['repo_id']?>')" class="btn btn-primary btn-shadow-hover font-weight-bolder w-100 py-3">Купить за <?php echo $item['repo_price']?> RUB.</button>
<?php endif;?>
<?php elseif($item['repo_price'] == 0): ?>
<a href="<?echo $item['repo_url']?>" class="btn btn-primary btn-shadow-hover font-weight-bolder w-100 py-3">Скачать файл</a>
<?php endif; ?>
</div>
</div>
</div>
</div>
<?php endif; ?>
<?php endforeach; ?>
<?php if(empty($repos)): ?>
<div class="col-xl-12 col-xxl-12">
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент список пуст.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
<i class="ki ki-close"></i>
</span>
</button>
</div>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<script>
function sendAction(serverid, action) {
$.ajax({
url: '/servers/repo/action/'+serverid+'/'+action,
type: 'POST',
dataType: 'text',
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
},
beforeSend: function(arr, options) {
$('button[type=submit]').prop('disabled', true);
}
});
}
</script>
<?php echo $footer ?>
@@ -0,0 +1,302 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-lg-3">
<div class="d-flex align-items-center mb-3 bg-light-primary rounded p-5">
<div class="d-flex flex-column flex-grow-1 mr-2">
<a href="javascript:;" class="font-weight-bold text-dark-75 text-hover-primary font-size-lg mb-1">CPU</a>
</div>
<span class="font-weight-bolder text-primary py-1 font-size-lg" id="cpu">
<div class="spinner spinner-primary mr-5"></div>
</span>
</div>
</div>
<div class="col-lg-3">
<div class="d-flex align-items-center mb-3 bg-light-primary rounded p-5">
<div class="d-flex flex-column flex-grow-1 mr-2">
<a href="javascript:;" class="font-weight-bold text-dark-75 text-hover-primary font-size-lg mb-1">RAM</a>
</div>
<span class="font-weight-bolder text-primary py-1 font-size-lg" id="ram">
<div class="spinner spinner-primary mr-5"></div>
</span>
</div>
</div>
<div class="col-lg-3">
<div class="d-flex align-items-center mb-3 bg-light-primary rounded p-5">
<div class="d-flex flex-column flex-grow-1 mr-2">
<a href="javascript:;" class="font-weight-bold text-dark-75 text-hover-primary font-size-lg mb-1">SSD</a>
</div>
<span class="font-weight-bolder text-primary py-1 font-size-lg" id="ssd">
<div class="spinner spinner-primary mr-5"></div>
</span>
</div>
</div>
<div class="col-lg-3">
<div class="d-flex align-items-center mb-3 bg-light-primary rounded p-5">
<div class="d-flex flex-column flex-grow-1 mr-2">
<a href="javascript:;" class="font-weight-bold text-dark-75 text-hover-primary font-size-lg mb-1">Players</a>
</div>
<span class="font-weight-bolder text-primary py-1 font-size-lg" id="players">
<div class="spinner spinner-primary mr-5"></div>
</span>
</div>
</div>
<div class="col-lg-6">
<div class="card card-custom mb-3">
<div class="card-header">
<div class="card-title">
<h3 class="card-label">История количевства игроков</h3>
</div>
</div>
<div class="card-body" style="padding: 0.5rem 0.5rem;">
<div id="statsGraph"></div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card card-custom mb-3">
<div class="card-header">
<div class="card-title">
<h3 class="card-label">История нагрузки сервера</h3>
</div>
</div>
<div class="card-body" style="padding: 0.5rem 0.5rem;">
<div id="loads"></div>
</div>
</div>
</div>
<div class="col-lg-12">
<div class="card card-custom mb-3">
<div class="card-header">
<div class="card-title">
<h3 class="card-label">История операций с сервером</h3>
</div>
</div>
<div class="card-body">
<div class="scroll scroll-pull" data-scroll="true" style="height: 200px; overflow: auto;" data-mobile-height="200">
<div class="timeline timeline-2">
<div class="timeline-bar"></div>
<?$nofire = false;?>
<?php foreach($logs as $item): ?>
<? if($server['server_id'] == $item['server_id']): ?>
<?$nofire = true;?>
<div class="timeline-item">
<div class="timeline-badge <?if($item['status'] == 1):?>bg-success<?elseif($item['status'] == 2):?>bg-warning<?elseif($item['status'] == 3):?>bg-danger<?endif;?>"></div>
<div class="timeline-content d-flex align-items-center justify-content-between">
<span class="mr-3">
<?=$item['reason']?>
</span>
<span class="text-muted text-right"><?=$item['date']?></span>
</div>
</div>
<?endif;?>
<?php endforeach; ?>
</div>
<?php if(empty($logs) || $nofire == false): ?>
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент история чиста.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">
<i class="ki ki-close"></i>
</span>
</button>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
<script>
function updateData() {
$.ajax({
url: '/servers/statistics/getData/<?=$server['server_id']?>',
dataType: 'text',
success: function (data) {
data = $.parseJSON(data);
$("#cpu").text(data.cpu+"%");
$("#ram").text(data.ram+"%");
$("#ssd").text(data.ssd+"%");
$("#players").text(data.players);
}
})
}
$(document).ready(function() {
updateData();
});
var online = [
<?php foreach($stats as $item): ?>
[<?php echo strtotime($item['server_stats_date']) * 1000 ?>, <?php echo $item['server_stats_players'] ?>],
<?php endforeach; ?>
];
var loads1 = [
<?php foreach($stats as $item): ?>
[<?php echo strtotime($item['server_stats_date']) * 1000 ?>, <?php echo $item['server_stats_cpu'] ?>],
<?php endforeach; ?>
];
var loads2 = [
<?php foreach($stats as $item): ?>
[<?php echo strtotime($item['server_stats_date']) * 1000 ?>, <?php echo $item['server_stats_hdd'] ?>],
<?php endforeach; ?>
];
var loads3 = [
<?php foreach($stats as $item): ?>
[<?php echo strtotime($item['server_stats_date']) * 1000 ?>, <?php echo $item['server_stats_ram'] ?>],
<?php endforeach; ?>
];
const primary = '#6993FF';
const success = '#1BC5BD';
const info = '#8950FC';
const warning = '#FFA800';
const danger = '#F64E60';
var ApexChartsStats = function () {
var players_chart = function () {
const apexChart = "#statsGraph";
var options = {
chart: {
height: 350,
type: 'area',
defaultLocale: 'en',
locales: [{
name: 'en',
options: {
months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
shortMonths: ['Янв.', 'Фев.', 'Март.', 'Апр.', 'Май.', 'Июнь.', 'Июль.', 'Авг.', 'Сент.', 'Окт.', 'Ноя.', 'Дек.'],
days: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
shortDays: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
toolbar: {
exportToPNG: 'Скачать PNG',
exportToCSV: 'Скачать CSV',
exportToSVG: 'Скачать SVG',
selection: 'Выбор',
selectionZoom: 'Выбор Zoom',
zoomIn: 'Увеличить',
zoomOut: 'Уменьшить',
pan: 'Панорамирование',
reset: 'Сброс Масштаба',
}
}
}]
},
dataLabels: {
enabled: false
},
series: [{
name: 'Количевство игроков',
data: online
}],
xaxis: {
type: 'datetime'
},
tooltip: {
x: {
format: 'dd.MM.yy в HH:mm'
},
},
colors: [primary]
};
var chart = new ApexCharts(document.querySelector(apexChart), options);
chart.render();
}
var loads_chart = function () {
const apexChart = "#loads";
var options = {
series: [{
name: 'CPU (%)',
data: loads1
}, {
name: 'RAM (%)',
data: loads3
}, {
name: 'SSD (%)',
data: loads2
}],
chart: {
height: 350,
type: 'area',
defaultLocale: 'en',
locales: [{
name: 'en',
options: {
months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
shortMonths: ['Янв.', 'Фев.', 'Март.', 'Апр.', 'Май.', 'Июнь.', 'Июль.', 'Авг.', 'Сент.', 'Окт.', 'Ноя.', 'Дек.'],
days: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
shortDays: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
toolbar: {
exportToPNG: 'Скачать PNG',
exportToCSV: 'Скачать CSV',
exportToSVG: 'Скачать SVG',
selection: 'Выбор',
selectionZoom: 'Выбор Zoom',
zoomIn: 'Увеличить',
zoomOut: 'Уменьшить',
pan: 'Панорамирование',
reset: 'Сброс Масштаба',
}
}
}]
},
dataLabels: {
enabled: false
},
stroke: {
curve: 'smooth'
},
xaxis: {
type: 'datetime'
},
tooltip: {
x: {
format: 'dd.MM.yy в HH:mm'
},
},
colors: [primary, success, danger]
};
var chart = new ApexCharts(document.querySelector(apexChart), options);
chart.render();
}
return {
init: function () {
players_chart();
loads_chart();
}
};
}();
jQuery(document).ready(function () {
ApexChartsStats.init();
});
</script>
<?php echo $footer ?>
+219
View File
@@ -0,0 +1,219 @@
<?php
/*
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
*/
?>
<?php echo $header?>
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
<div class="d-flex flex-column-fluid">
<div class="container">
<div class="row">
<div class="col-xl-12">
<?php include 'application/views/common/menuserver.php';?>
</div>
<div class="col-xl-3">
<div class="card card-custom mb-3 pt-5">
<div class="card-body">
<div class="text-center">
<div class="symbol symbol-60 symbol-circle symbol-xl-90">
<div class="symbol-label">
<i class="fas fa-clock icon-5x text-primary"></i>
</div>
</div>
<h4 class="font-weight-bolder my-2">Планировщик задач</h4>
<div class="text-muted font-weight-bold mb-2">Выполнение команд по расписанию</div>
</div>
</div>
</div>
<div class="card card-custom mb-3">
<div class="card-body px-1" style="padding: 0.3rem 2.25rem;">
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
<div class="navi-item my-2">
<a href="javascript:;" data-toggle="modal" data-target="#tasksinfo" class="navi-link">
<span class="navi-icon mr-3">
<span class="svg-icon svg-icon-lg">
<i class="fa fa-exclamation-circle"></i>
</span>
</span>
<span class="navi-text font-weight-bolder font-size-lg">Информация</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-9">
<div class="row">
<div class="col-xl-12">
<div class="card card-custom gutter-b">
<div class="card-body">
<div class="form-group form-md-line-input">
<label>Задача</label>
<select class="form-control" id="task" name="task" onChange="editNewTask()">
<option value="enable" <?php if($server['server_status'] != 1): ?>disabled <?php endif; ?>>Включение</option>
<option value="disable" <?php if($server['server_status'] != 2): ?>disabled <?php endif; ?>>Выключение</option>
<option value="restart" <?php if($server['server_status'] != 2): ?>disabled <?php endif; ?>>Перезагрузка</option>
</select>
</div>
<div class="form-group form-md-line-input">
<label>Тип задачи</label>
<select class="form-control" id="type" name="type">
<option value="single">Одноразовая</option>
</select>
</div>
<div class="form-group form-md-line-input">
<label>Время выполнения</label>
<select class="form-control" id="time" name="time">
<option value="15min">15 Минут</option>
<option value="30min">30 Минут</option>
<option value="1hour">1 Час</option>
<option value="12hours">12 Часов</option>
<option value="24hours">24 Часа</option>
</select>
</div>
<button id="createTask" class="btn btn-primary">Создать задачу</button>
</div>
</div>
</div>
</div>
</div>
<div class="col-xl-12">
<div class="card card-custom gutter-b">
<div class="card-header">
<div class="card-title">
<h3 class="card-label">Список задач</h3>
</div>
</div>
<div class="card-body">
<?php foreach($tasks as $item): ?>
<div class="card card-custom bg-gray-100 mb-4" id="task-<?php echo $item['task_id'] ?>">
<div class="card-header border-0" style="min-height: 0;padding-top: 0.5rem;padding-bottom: 0.5rem;">
<h3 class="card-title"><span class="card-icon">
<a href="javascript:;" class="btn btn-icon btn-light-primary btn-sm" data-toggle="tooltip" data-placement="right" title="" data-original-title="Тип задачи: <?php echo str_replace("single", "Одноразовая", str_replace("repeating", "Повторяющаяся", $item['task_type'])) ?>">
<i class="fa fa-info-circle"></i>
</a></span><?php echo str_replace("restart", "Перезагрузка", str_replace("enable", "Включение", str_replace("disable", "Выключение", $item['task_name']))) ?><small class="text-muted font-size-sm ml-2"><?php echo str_replace("15min", "15 минут", str_replace("30min", "30 минут", str_replace("1hour", "1 час", str_replace("12hours", "12 часов", str_replace("24hours", "24 часа", $item['task_time']))))) ?></small>
</h3>
<div class="card-toolbar">
<span class="badge badge-primary" data-toggle="tooltip" data-placement="right" title="" data-original-title="Будет выполнена в" style="margin-right: .25rem"><?php echo date("d.m.Y в H:i", strtotime($item['task_lead_time'])) ?></span>
<a href="javascript:;" onClick="sendAction('deleteTask',<?php echo $item['task_id'] ?>)" class="btn btn-icon btn-light-danger btn-xs" data-toggle="tooltip" data-placement="right" title="" data-original-title="Удалить задачу">
<i class="fa fa-times"></i>
</a>
</div>
</div>
</div>
<?php endforeach; ?>
<?php if(empty($tasks)): ?>
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
<div class="alert-icon">
<i class="flaticon-exclamation"></i>
</div>
<div class="alert-text">На данный момент нет задач.</div>
<div class="alert-close">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true"><i class="ki ki-close"></i></span>
</button>
</div>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!--begin::Modal-->
<div class="modal fade" id="tasksinfo" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Информация</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<i aria-hidden="true" class="ki ki-close"></i>
</button>
</div>
<div class="modal-body">
<p>
Система планировщик задач - это система, позволяет автоматически выполнять определенные действия на сервере (запуск, рестарт, выключение и т.д.), с заданным временем или периодичностью.
</p>
</div>
</div>
</div>
</div>
<!--end::Modal-->
<script>
function editNewTask() {
setTimeout(function() {
var task = $('#task option:selected').val();
if (task == 'enable' || task == 'disable') {
$("#type option[value='repeating']").remove();
} else {
$("#type").append('<option value="repeating">Повторяющаяся</option>');
}
}, 100);
}
$(document).ready(function() {
editNewTask();
});
$('#createTask').on('click', function() {
$.ajax({
url: '/servers/tasks/createTask/<?php echo $server['server_id'] ?>',
type: 'POST',
data: {
'task': $("#task option:selected").val(),
'type': $("#type option:selected").val(),
'time': $("#time option:selected").val()
},
success: function(data) {
console.log(data);
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
$('button[type=submit]').prop('disabled', false);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
$('#createTask').removeClass('loading');
},
beforeSubmit: function(arr, $form, options) {
$('#createTask').addClass('loading');
}
});
});
function sendAction(action, task_id) {
switch(action) {
case "deleteTask":
{
if(!confirm("Вы действительно хотите удалить задачу ID-"+task_id+"?")) return;
break;
}
}
$.ajax({
url: '/servers/tasks/deleteTask/<?php echo $server['server_id'] ?>',
type: "POST",
data: {task_id: task_id},
dataType: 'text',
success: function(data) {
data = $.parseJSON(data);
switch(data.status) {
case 'error':
toastr.error(data.error);
break;
case 'success':
toastr.success(data.success);
setTimeout("reload()", 1500);
break;
}
}
});
}
</script>
<?php echo $footer ?>