mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Fix broken unloaded servers
This commit is contained in:
parent
b039eec857
commit
5cbb8f7018
@ -102,6 +102,11 @@ class ServersController(metaclass=Singleton):
|
|||||||
server_instance.update_server_instance()
|
server_instance.update_server_instance()
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def update_unloaded_server(server_obj):
|
||||||
|
ret = HelperServers.update_server(server_obj)
|
||||||
|
return ret
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def set_download(server_id):
|
def set_download(server_id):
|
||||||
srv = ServersController().get_server_instance_by_id(server_id)
|
srv = ServersController().get_server_instance_by_id(server_id)
|
||||||
|
@ -934,6 +934,14 @@ class Controller:
|
|||||||
|
|
||||||
counter += 1
|
counter += 1
|
||||||
|
|
||||||
|
def remove_unloaded_server(self, server_id):
|
||||||
|
try:
|
||||||
|
HelpersManagement.delete_scheduled_task_by_server(server_id)
|
||||||
|
except DoesNotExist:
|
||||||
|
logger.info("No scheduled jobs exist. Continuing.")
|
||||||
|
# remove the server from the DB
|
||||||
|
self.servers.remove_server(server_id)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def clear_unexecuted_commands():
|
def clear_unexecuted_commands():
|
||||||
HelpersManagement.clear_unexecuted_commands()
|
HelpersManagement.clear_unexecuted_commands()
|
||||||
|
@ -573,9 +573,39 @@ class AjaxHandler(BaseHandler):
|
|||||||
self.get_remote_ip(),
|
self.get_remote_ip(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for server in self.controller.servers.failed_servers:
|
||||||
|
if server["server_id"] == int(server_id):
|
||||||
|
return
|
||||||
self.tasks_manager.remove_all_server_tasks(server_id)
|
self.tasks_manager.remove_all_server_tasks(server_id)
|
||||||
self.controller.remove_server(server_id, True)
|
self.controller.remove_server(server_id, True)
|
||||||
|
|
||||||
|
elif page == "delete_unloaded_server":
|
||||||
|
if not permissions["Config"] in user_perms:
|
||||||
|
if not superuser:
|
||||||
|
self.redirect("/panel/error?error=Unauthorized access to Config")
|
||||||
|
return
|
||||||
|
server_id = self.get_argument("id", None)
|
||||||
|
logger.info(
|
||||||
|
f"Removing server and all associated files for server: "
|
||||||
|
f"{self.controller.servers.get_server_friendly_name(server_id)}"
|
||||||
|
)
|
||||||
|
|
||||||
|
server_data = self.controller.servers.get_server_data_by_id(server_id)
|
||||||
|
server_name = server_data["server_name"]
|
||||||
|
|
||||||
|
self.controller.management.add_to_audit_log(
|
||||||
|
exec_user["user_id"],
|
||||||
|
f"Deleted server {server_id} named {server_name}",
|
||||||
|
server_id,
|
||||||
|
self.get_remote_ip(),
|
||||||
|
)
|
||||||
|
|
||||||
|
self.tasks_manager.remove_all_server_tasks(server_id)
|
||||||
|
for item in self.controller.servers.failed_servers[:]:
|
||||||
|
if item["server_id"] == int(server_id):
|
||||||
|
self.controller.servers.failed_servers.remove(item)
|
||||||
|
self.controller.remove_unloaded_server(server_id)
|
||||||
|
|
||||||
def check_server_id(self, server_id, page_name):
|
def check_server_id(self, server_id, page_name):
|
||||||
if server_id is None:
|
if server_id is None:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
|
@ -157,6 +157,10 @@ class PanelHandler(BaseHandler):
|
|||||||
if server_id is None:
|
if server_id is None:
|
||||||
self.redirect("/panel/error?error=Invalid Server ID")
|
self.redirect("/panel/error?error=Invalid Server ID")
|
||||||
return None
|
return None
|
||||||
|
for server in self.controller.servers.failed_servers:
|
||||||
|
if int(server_id) == server["server_id"]:
|
||||||
|
self.failed_server = True
|
||||||
|
return server_id
|
||||||
# Does this server exist?
|
# Does this server exist?
|
||||||
if not self.controller.servers.server_id_exists(server_id):
|
if not self.controller.servers.server_id_exists(server_id):
|
||||||
self.redirect("/panel/error?error=Invalid Server ID")
|
self.redirect("/panel/error?error=Invalid Server ID")
|
||||||
@ -207,6 +211,7 @@ class PanelHandler(BaseHandler):
|
|||||||
|
|
||||||
@tornado.web.authenticated
|
@tornado.web.authenticated
|
||||||
async def get(self, page):
|
async def get(self, page):
|
||||||
|
self.failed_server = False
|
||||||
error = self.get_argument("error", "WTF Error!")
|
error = self.get_argument("error", "WTF Error!")
|
||||||
|
|
||||||
template = "panel/denied.html"
|
template = "panel/denied.html"
|
||||||
@ -504,9 +509,11 @@ class PanelHandler(BaseHandler):
|
|||||||
server_id = self.check_server_id()
|
server_id = self.check_server_id()
|
||||||
if server_id is None:
|
if server_id is None:
|
||||||
return
|
return
|
||||||
|
if not self.failed_server:
|
||||||
server_obj = self.controller.servers.get_server_instance_by_id(server_id)
|
server_obj = self.controller.servers.get_server_instance_by_id(
|
||||||
page_data["backup_failed"] = server_obj.last_backup_status()
|
server_id
|
||||||
|
)
|
||||||
|
page_data["backup_failed"] = server_obj.last_backup_status()
|
||||||
server_obj = None
|
server_obj = None
|
||||||
|
|
||||||
valid_subpages = [
|
valid_subpages = [
|
||||||
@ -518,18 +525,57 @@ class PanelHandler(BaseHandler):
|
|||||||
"admin_controls",
|
"admin_controls",
|
||||||
"schedules",
|
"schedules",
|
||||||
]
|
]
|
||||||
|
if not self.failed_server:
|
||||||
server = self.controller.servers.get_server_instance_by_id(server_id)
|
server = self.controller.servers.get_server_instance_by_id(server_id)
|
||||||
# server_data isn't needed since the server_stats also pulls server data
|
# server_data isn't needed since the server_stats also pulls server data
|
||||||
page_data["server_data"] = self.controller.servers.get_server_data_by_id(
|
page_data["server_data"] = self.controller.servers.get_server_data_by_id(
|
||||||
server_id
|
server_id
|
||||||
)
|
)
|
||||||
page_data["server_stats"] = self.controller.servers.get_server_stats_by_id(
|
if not self.failed_server:
|
||||||
server_id
|
page_data[
|
||||||
)
|
"server_stats"
|
||||||
page_data["downloading"] = self.controller.servers.get_download_status(
|
] = self.controller.servers.get_server_stats_by_id(server_id)
|
||||||
server_id
|
else:
|
||||||
)
|
server_temp_obj = self.controller.servers.get_server_data_by_id(
|
||||||
|
server_id
|
||||||
|
)
|
||||||
|
page_data["server_stats"] = {
|
||||||
|
"server_id": {
|
||||||
|
"server_id": server_id,
|
||||||
|
"server_name": server_temp_obj["server_name"],
|
||||||
|
"server_uuid": server_temp_obj["server_uuid"],
|
||||||
|
"path": server_temp_obj["path"],
|
||||||
|
"log_path": server_temp_obj["log_path"],
|
||||||
|
"executable": server_temp_obj["executable"],
|
||||||
|
"execution_command": server_temp_obj["execution_command"],
|
||||||
|
"stop_command": server_temp_obj["stop_command"],
|
||||||
|
"executable_update_url": server_temp_obj[
|
||||||
|
"executable_update_url"
|
||||||
|
],
|
||||||
|
"auto_start_delay": server_temp_obj["auto_start_delay"],
|
||||||
|
"server_ip": server_temp_obj["server_ip"],
|
||||||
|
"server_port": server_temp_obj["server_port"],
|
||||||
|
"logs_delete_after": server_temp_obj["logs_delete_after"],
|
||||||
|
"auto_start": server_temp_obj["auto_start"],
|
||||||
|
"crash_detection": server_temp_obj["crash_detection"],
|
||||||
|
"show_status": server_temp_obj["show_status"],
|
||||||
|
},
|
||||||
|
"running": False,
|
||||||
|
"crashed": False,
|
||||||
|
"server_type": "N/A",
|
||||||
|
"cpu": "N/A",
|
||||||
|
"mem": "N/A",
|
||||||
|
"int_ping_results": [],
|
||||||
|
"version": "N/A",
|
||||||
|
"desc": "N/A",
|
||||||
|
"started": "False",
|
||||||
|
}
|
||||||
|
if not self.failed_server:
|
||||||
|
page_data["downloading"] = self.controller.servers.get_download_status(
|
||||||
|
server_id
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
page_data["downloading"] = False
|
||||||
page_data["server_id"] = server_id
|
page_data["server_id"] = server_id
|
||||||
try:
|
try:
|
||||||
page_data["waiting_start"] = self.controller.servers.get_waiting_start(
|
page_data["waiting_start"] = self.controller.servers.get_waiting_start(
|
||||||
@ -538,7 +584,10 @@ class PanelHandler(BaseHandler):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Failed to get server waiting to start: {e}")
|
logger.error(f"Failed to get server waiting to start: {e}")
|
||||||
page_data["waiting_start"] = False
|
page_data["waiting_start"] = False
|
||||||
page_data["get_players"] = server.get_server_players()
|
if not self.failed_server:
|
||||||
|
page_data["get_players"] = server.get_server_players()
|
||||||
|
else:
|
||||||
|
page_data["get_players"] = []
|
||||||
page_data["active_link"] = subpage
|
page_data["active_link"] = subpage
|
||||||
page_data["permissions"] = {
|
page_data["permissions"] = {
|
||||||
"Commands": EnumPermissionsServer.COMMANDS,
|
"Commands": EnumPermissionsServer.COMMANDS,
|
||||||
@ -555,12 +604,14 @@ class PanelHandler(BaseHandler):
|
|||||||
] = self.controller.server_perms.get_user_id_permissions_list(
|
] = self.controller.server_perms.get_user_id_permissions_list(
|
||||||
exec_user["user_id"], server_id
|
exec_user["user_id"], server_id
|
||||||
)
|
)
|
||||||
page_data["server_stats"]["crashed"] = self.controller.servers.is_crashed(
|
if not self.failed_server:
|
||||||
server_id
|
page_data["server_stats"][
|
||||||
)
|
"crashed"
|
||||||
page_data["server_stats"][
|
] = self.controller.servers.is_crashed(server_id)
|
||||||
"server_type"
|
if not self.failed_server:
|
||||||
] = self.controller.servers.get_server_type_by_id(server_id)
|
page_data["server_stats"][
|
||||||
|
"server_type"
|
||||||
|
] = self.controller.servers.get_server_type_by_id(server_id)
|
||||||
if subpage not in valid_subpages:
|
if subpage not in valid_subpages:
|
||||||
logger.debug("not a valid subpage")
|
logger.debug("not a valid subpage")
|
||||||
if not subpage:
|
if not subpage:
|
||||||
@ -640,6 +691,7 @@ class PanelHandler(BaseHandler):
|
|||||||
return
|
return
|
||||||
page_data["java_versions"] = Helpers.find_java_installs()
|
page_data["java_versions"] = Helpers.find_java_installs()
|
||||||
server_obj: Servers = self.controller.servers.get_server_obj(server_id)
|
server_obj: Servers = self.controller.servers.get_server_obj(server_id)
|
||||||
|
page_data["failed"] = self.failed_server
|
||||||
page_java = []
|
page_java = []
|
||||||
page_data["java_versions"].append("java")
|
page_data["java_versions"].append("java")
|
||||||
for version in page_data["java_versions"]:
|
for version in page_data["java_versions"]:
|
||||||
@ -1467,7 +1519,15 @@ class PanelHandler(BaseHandler):
|
|||||||
server_obj.auto_start = auto_start
|
server_obj.auto_start = auto_start
|
||||||
server_obj.crash_detection = crash_detection
|
server_obj.crash_detection = crash_detection
|
||||||
server_obj.logs_delete_after = logs_delete_after
|
server_obj.logs_delete_after = logs_delete_after
|
||||||
self.controller.servers.update_server(server_obj)
|
failed = False
|
||||||
|
for servers in self.controller.servers.failed_servers:
|
||||||
|
if servers["server_id"] == int(server_id):
|
||||||
|
failed = True
|
||||||
|
if not failed:
|
||||||
|
self.controller.servers.update_server(server_obj)
|
||||||
|
else:
|
||||||
|
self.controller.servers.update_unloaded_server(server_obj)
|
||||||
|
self.controller.servers.init_all_servers()
|
||||||
self.controller.servers.crash_detection(server_obj)
|
self.controller.servers.crash_detection(server_obj)
|
||||||
|
|
||||||
self.controller.servers.refresh_server_settings(server_id)
|
self.controller.servers.refresh_server_settings(server_id)
|
||||||
|
@ -32,12 +32,14 @@
|
|||||||
<div class="col-sm-12 grid-margin">
|
<div class="col-sm-12 grid-margin">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body pt-0">
|
<div class="card-body pt-0">
|
||||||
|
{% if not data['failed'] %}
|
||||||
<span class="d-none d-sm-block">
|
<span class="d-none d-sm-block">
|
||||||
{% include "parts/server_controls_list.html %}
|
{% include "parts/server_controls_list.html %}
|
||||||
</span>
|
</span>
|
||||||
<span class="d-block d-sm-none">
|
<span class="d-block d-sm-none">
|
||||||
{% include "parts/m_server_controls_list.html %}
|
{% include "parts/m_server_controls_list.html %}
|
||||||
</span>
|
</span>
|
||||||
|
{% end %}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6 col-sm-12">
|
<div class="col-md-6 col-sm-12">
|
||||||
@ -117,7 +119,6 @@
|
|||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="stop_command">{{ translate('serverConfig', 'serverStopCommand', data['lang']) }} <small
|
<label for="stop_command">{{ translate('serverConfig', 'serverStopCommand', data['lang']) }} <small
|
||||||
class="text-muted ml-1"> - {{ translate('serverConfig', 'serverStopCommandDesc', data['lang'])
|
class="text-muted ml-1"> - {{ translate('serverConfig', 'serverStopCommandDesc', data['lang'])
|
||||||
@ -176,35 +177,41 @@
|
|||||||
<div class="form-check-flat">
|
<div class="form-check-flat">
|
||||||
<label for="auto_start" class="form-check-label ml-4 mb-4">
|
<label for="auto_start" class="form-check-label ml-4 mb-4">
|
||||||
{% if data['server_stats']['server_id']['auto_start'] %}
|
{% if data['server_stats']['server_id']['auto_start'] %}
|
||||||
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" checked="" data-toggle="toggle"
|
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" checked=""
|
||||||
value="1"> {{ translate('serverConfig', 'serverAutoStart', data['lang']) }}
|
data-toggle="toggle" value="1"> {{ translate('serverConfig', 'serverAutoStart',
|
||||||
|
data['lang']) }}
|
||||||
{% else %}
|
{% else %}
|
||||||
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" value="1" data-toggle="toggle"> {{
|
<input type="checkbox" class="form-check-input" id="auto_start" name="auto_start" value="1"
|
||||||
|
data-toggle="toggle"> {{
|
||||||
translate('serverConfig', 'serverAutoStart', data['lang']) }}
|
translate('serverConfig', 'serverAutoStart', data['lang']) }}
|
||||||
{% end %}
|
{% end %}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label for="crash_detection" class="form-check-label ml-4 mb-4">
|
<label for="crash_detection" class="form-check-label ml-4 mb-4">
|
||||||
{% if data['server_stats']['server_id']['crash_detection'] %}
|
{% if data['server_stats']['server_id']['crash_detection'] %}
|
||||||
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection" data-toggle="toggle"
|
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection"
|
||||||
checked="" value="1"> {{ translate('serverConfig', 'serverCrashDetection', data['lang']) }}
|
data-toggle="toggle" checked="" value="1"> {{ translate('serverConfig',
|
||||||
|
'serverCrashDetection', data['lang']) }}
|
||||||
{% else %}
|
{% else %}
|
||||||
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection" data-toggle="toggle"
|
<input type="checkbox" class="form-check-input" id="crash_detection" name="crash_detection"
|
||||||
value="1"> {{ translate('serverConfig', 'serverCrashDetection', data['lang']) }}
|
data-toggle="toggle" value="1"> {{ translate('serverConfig', 'serverCrashDetection',
|
||||||
|
data['lang']) }}
|
||||||
{% end %}
|
{% end %}
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
{% if data['super_user'] %}
|
{% if data['super_user'] %}
|
||||||
<label for="show_status" class="form-check-label ml-4 mb-4">
|
<label for="show_status" class="form-check-label ml-4 mb-4">
|
||||||
{% if data['server_stats']['server_id']['show_status'] %}
|
{% if data['server_stats']['server_id']['show_status'] %}
|
||||||
<input type="checkbox" class="form-check-input" id="show_status" name="show_status" data-toggle="toggle"
|
<input type="checkbox" class="form-check-input" id="show_status" name="show_status"
|
||||||
checked="" value="1"> {{ translate('serverConfig', 'showStatus', data['lang']) }}
|
data-toggle="toggle" checked="" value="1"> {{ translate('serverConfig', 'showStatus',
|
||||||
{% else %}
|
data['lang']) }}
|
||||||
<input type="checkbox" class="form-check-input" id="show_status" name="show_status" data-toggle="toggle"
|
{% else %}
|
||||||
value="1"> {{ translate('serverConfig', 'showStatus', data['lang']) }}
|
<input type="checkbox" class="form-check-input" id="show_status" name="show_status"
|
||||||
|
data-toggle="toggle" value="1"> {{ translate('serverConfig', 'showStatus',
|
||||||
|
data['lang']) }}
|
||||||
|
{% end %}
|
||||||
|
</label>
|
||||||
{% end %}
|
{% end %}
|
||||||
</label>
|
|
||||||
{% end %}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{
|
<button type="submit" class="btn btn-success mr-2"><i class="fas fa-save"></i> {{
|
||||||
@ -238,8 +245,13 @@
|
|||||||
<button onclick="send_command(serverId, 'update_executable');" id="update_executable"
|
<button onclick="send_command(serverId, 'update_executable');" id="update_executable"
|
||||||
style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1">{{ translate('serverConfig',
|
style="max-width: 7rem;" class="btn btn-warning m-1 flex-grow-1">{{ translate('serverConfig',
|
||||||
'update', data['lang']) }}</button>
|
'update', data['lang']) }}</button>
|
||||||
|
{% if not data['failed'] %}
|
||||||
<button onclick="deleteConfirm()" class="btn btn-sm btn-danger">{{ translate('serverConfig',
|
<button onclick="deleteConfirm()" class="btn btn-sm btn-danger">{{ translate('serverConfig',
|
||||||
'deleteServer', data['lang']) }}</button>
|
'deleteServer', data['lang']) }}</button>
|
||||||
|
{% else %}
|
||||||
|
<button onclick="deleteUnloadedConfirm()" class="btn btn-sm btn-danger">{{ translate('serverConfig',
|
||||||
|
'deleteServer', data['lang']) }}</button>
|
||||||
|
{% end %}
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -255,19 +267,19 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<style>
|
<style>
|
||||||
.toggle-handle {
|
.toggle-handle {
|
||||||
background-color: white !important;
|
background-color: white !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toggle-on {
|
.toggle-on {
|
||||||
color: black !important;
|
color: black !important;
|
||||||
background-color: blueviolet !important;
|
background-color: blueviolet !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.toggle {
|
.toggle {
|
||||||
height: 0px !important;
|
height: 0px !important;
|
||||||
background-color: grey !important;
|
background-color: grey !important;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<!-- content-wrapper ends -->
|
<!-- content-wrapper ends -->
|
||||||
|
|
||||||
@ -275,7 +287,7 @@
|
|||||||
|
|
||||||
{% block js %}
|
{% block js %}
|
||||||
<script>
|
<script>
|
||||||
$(function() {
|
$(function () {
|
||||||
$('.form-check-input').bootstrapToggle({
|
$('.form-check-input').bootstrapToggle({
|
||||||
on: '',
|
on: '',
|
||||||
off: ''
|
off: ''
|
||||||
@ -430,6 +442,54 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function deleteUnloadedConfirm() {
|
||||||
|
path = "{{data['server_stats']['server_id']['path']}}";
|
||||||
|
name = "{{data['server_stats']['server_id']['server_name']}}";
|
||||||
|
bootbox.confirm({
|
||||||
|
size: "",
|
||||||
|
title: "{% raw translate('serverConfig', 'deleteServerQuestion', data['lang']) %}",
|
||||||
|
closeButton: false,
|
||||||
|
message: "{% raw translate('serverConfig', 'deleteServerQuestionMessage', data['lang']) %}",
|
||||||
|
buttons: {
|
||||||
|
confirm: {
|
||||||
|
label: "{{ translate('serverConfig', 'yesDelete', data['lang']) }}",
|
||||||
|
className: 'btn-danger',
|
||||||
|
},
|
||||||
|
cancel: {
|
||||||
|
label: "{{ translate('serverConfig', 'noDelete', data['lang']) }}",
|
||||||
|
className: 'btn-link',
|
||||||
|
}
|
||||||
|
},
|
||||||
|
callback: function (result) {
|
||||||
|
if (!result) {
|
||||||
|
return;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var token = getCookie("_xsrf")
|
||||||
|
setTimeout(function () { window.location = '/panel/dashboard'; }, 5000);
|
||||||
|
bootbox.dialog({
|
||||||
|
backdrop: true,
|
||||||
|
title: '{% raw translate("serverConfig", "sendingDelete", data['lang']) %}',
|
||||||
|
message: '<div align="center"><i class="fas fa-spin fa-spinner"></i> {% raw translate("serverConfig", "bePatientDelete", data['lang']) %} </div>',
|
||||||
|
closeButton: false
|
||||||
|
})
|
||||||
|
$.ajax({
|
||||||
|
type: "DELETE",
|
||||||
|
headers: { 'X-XSRFToken': token },
|
||||||
|
url: '/ajax/delete_unloaded_server?id=' + serverId,
|
||||||
|
data: {
|
||||||
|
},
|
||||||
|
success: function (data) {
|
||||||
|
console.log("got response:");
|
||||||
|
console.log(data);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user