mirror of
https://gitlab.com/crafty-controller/crafty-4.git
synced 2024-08-30 18:23:09 +00:00
Working default backup
This commit is contained in:
parent
f8626633cf
commit
60d3ee1aa8
@ -75,7 +75,7 @@ class ManagementController:
|
|||||||
# Commands Methods
|
# Commands Methods
|
||||||
# **********************************************************************************
|
# **********************************************************************************
|
||||||
|
|
||||||
def send_command(self, user_id, server_id, remote_ip, command):
|
def send_command(self, user_id, server_id, remote_ip, command, action_id=None):
|
||||||
server_name = HelperServers.get_server_friendly_name(server_id)
|
server_name = HelperServers.get_server_friendly_name(server_id)
|
||||||
|
|
||||||
# Example: Admin issued command start_server for server Survival
|
# Example: Admin issued command start_server for server Survival
|
||||||
@ -86,7 +86,12 @@ class ManagementController:
|
|||||||
remote_ip,
|
remote_ip,
|
||||||
)
|
)
|
||||||
self.queue_command(
|
self.queue_command(
|
||||||
{"server_id": server_id, "user_id": user_id, "command": command}
|
{
|
||||||
|
"server_id": server_id,
|
||||||
|
"user_id": user_id,
|
||||||
|
"command": command,
|
||||||
|
"action_id": action_id,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
def queue_command(self, command_data):
|
def queue_command(self, command_data):
|
||||||
|
@ -207,9 +207,6 @@ class ServerInstance:
|
|||||||
self.server_scheduler.start()
|
self.server_scheduler.start()
|
||||||
self.dir_scheduler.start()
|
self.dir_scheduler.start()
|
||||||
self.start_dir_calc_task()
|
self.start_dir_calc_task()
|
||||||
self.backup_thread = threading.Thread(
|
|
||||||
target=self.backup_server, daemon=True, name=f"backup_{self.name}"
|
|
||||||
)
|
|
||||||
self.is_backingup = False
|
self.is_backingup = False
|
||||||
# Reset crash and update at initialization
|
# Reset crash and update at initialization
|
||||||
self.stats_helper.server_crash_reset()
|
self.stats_helper.server_crash_reset()
|
||||||
@ -940,8 +937,7 @@ class ServerInstance:
|
|||||||
WebSocketManager().broadcast_user(user, "send_start_reload", {})
|
WebSocketManager().broadcast_user(user, "send_start_reload", {})
|
||||||
|
|
||||||
def restart_threaded_server(self, user_id):
|
def restart_threaded_server(self, user_id):
|
||||||
bu_conf = HelpersManagement.get_backup_config(self.server_id)
|
if self.is_backingup:
|
||||||
if self.is_backingup and bu_conf["shutdown"]:
|
|
||||||
logger.info(
|
logger.info(
|
||||||
"Restart command detected. Supressing - server has"
|
"Restart command detected. Supressing - server has"
|
||||||
" backup shutdown enabled and server is currently backing up."
|
" backup shutdown enabled and server is currently backing up."
|
||||||
@ -1111,12 +1107,12 @@ class ServerInstance:
|
|||||||
f.write("eula=true")
|
f.write("eula=true")
|
||||||
self.run_threaded_server(user_id)
|
self.run_threaded_server(user_id)
|
||||||
|
|
||||||
def a_backup_server(self):
|
def a_backup_server(self, backup_id):
|
||||||
if self.settings["backup_path"] == "":
|
|
||||||
logger.critical("Backup path is None. Canceling Backup!")
|
|
||||||
return
|
|
||||||
backup_thread = threading.Thread(
|
backup_thread = threading.Thread(
|
||||||
target=self.backup_server, daemon=True, name=f"backup_{self.name}"
|
target=self.backup_server,
|
||||||
|
daemon=True,
|
||||||
|
name=f"backup_{self.name}",
|
||||||
|
args=[backup_id],
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Starting Backup Thread for server {self.settings['server_name']}."
|
f"Starting Backup Thread for server {self.settings['server_name']}."
|
||||||
@ -1144,7 +1140,7 @@ class ServerInstance:
|
|||||||
logger.info(f"Backup Thread started for server {self.settings['server_name']}.")
|
logger.info(f"Backup Thread started for server {self.settings['server_name']}.")
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def backup_server(self):
|
def backup_server(self, backup_id):
|
||||||
was_server_running = None
|
was_server_running = None
|
||||||
logger.info(f"Starting server {self.name} (ID {self.server_id}) backup")
|
logger.info(f"Starting server {self.name} (ID {self.server_id}) backup")
|
||||||
server_users = PermissionsServers.get_server_user_list(self.server_id)
|
server_users = PermissionsServers.get_server_user_list(self.server_id)
|
||||||
@ -1157,7 +1153,12 @@ class ServerInstance:
|
|||||||
).format(self.name),
|
).format(self.name),
|
||||||
)
|
)
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
conf = HelpersManagement.get_backup_config(self.server_id)
|
conf = HelpersManagement.get_backup_config(backup_id)
|
||||||
|
backup_location = conf["backup_location"]
|
||||||
|
if not backup_location:
|
||||||
|
Console.critical("No backup path found. Canceling")
|
||||||
|
self.is_backingup = False
|
||||||
|
return None
|
||||||
if conf["before"]:
|
if conf["before"]:
|
||||||
if self.check_running():
|
if self.check_running():
|
||||||
logger.debug(
|
logger.debug(
|
||||||
@ -1177,10 +1178,10 @@ class ServerInstance:
|
|||||||
self.stop_server()
|
self.stop_server()
|
||||||
was_server_running = True
|
was_server_running = True
|
||||||
|
|
||||||
self.helper.ensure_dir_exists(self.settings["backup_path"])
|
self.helper.ensure_dir_exists(backup_location)
|
||||||
try:
|
try:
|
||||||
backup_filename = (
|
backup_filename = (
|
||||||
f"{self.settings['backup_path']}/"
|
f"{backup_location}/"
|
||||||
f"{datetime.datetime.now().astimezone(self.tz).strftime('%Y-%m-%d_%H-%M-%S')}" # pylint: disable=line-too-long
|
f"{datetime.datetime.now().astimezone(self.tz).strftime('%Y-%m-%d_%H-%M-%S')}" # pylint: disable=line-too-long
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
@ -1188,36 +1189,24 @@ class ServerInstance:
|
|||||||
f" (ID#{self.server_id}, path={self.server_path}) "
|
f" (ID#{self.server_id}, path={self.server_path}) "
|
||||||
f"at '{backup_filename}'"
|
f"at '{backup_filename}'"
|
||||||
)
|
)
|
||||||
excluded_dirs = HelpersManagement.get_excluded_backup_dirs(self.server_id)
|
excluded_dirs = HelpersManagement.get_excluded_backup_dirs(backup_id)
|
||||||
server_dir = Helpers.get_os_understandable_path(self.settings["path"])
|
server_dir = Helpers.get_os_understandable_path(self.settings["path"])
|
||||||
if conf["compress"]:
|
|
||||||
logger.debug(
|
self.file_helper.make_backup(
|
||||||
"Found compress backup to be true. Calling compressed archive"
|
Helpers.get_os_understandable_path(backup_filename),
|
||||||
)
|
server_dir,
|
||||||
self.file_helper.make_compressed_backup(
|
excluded_dirs,
|
||||||
Helpers.get_os_understandable_path(backup_filename),
|
self.server_id,
|
||||||
server_dir,
|
conf["compress"],
|
||||||
excluded_dirs,
|
)
|
||||||
self.server_id,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
logger.debug(
|
|
||||||
"Found compress backup to be false. Calling NON-compressed archive"
|
|
||||||
)
|
|
||||||
self.file_helper.make_backup(
|
|
||||||
Helpers.get_os_understandable_path(backup_filename),
|
|
||||||
server_dir,
|
|
||||||
excluded_dirs,
|
|
||||||
self.server_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
while (
|
while (
|
||||||
len(self.list_backups()) > conf["max_backups"]
|
len(self.list_backups(backup_location)) > conf["max_backups"]
|
||||||
and conf["max_backups"] > 0
|
and conf["max_backups"] > 0
|
||||||
):
|
):
|
||||||
backup_list = self.list_backups()
|
backup_list = self.list_backups()
|
||||||
oldfile = backup_list[0]
|
oldfile = backup_list[0]
|
||||||
oldfile_path = f"{conf['backup_path']}/{oldfile['path']}"
|
oldfile_path = f"{backup_location}/{oldfile['path']}"
|
||||||
logger.info(f"Removing old backup '{oldfile['path']}'")
|
logger.info(f"Removing old backup '{oldfile['path']}'")
|
||||||
os.remove(Helpers.get_os_understandable_path(oldfile_path))
|
os.remove(Helpers.get_os_understandable_path(oldfile_path))
|
||||||
|
|
||||||
@ -1297,28 +1286,26 @@ class ServerInstance:
|
|||||||
except:
|
except:
|
||||||
return {"percent": 0, "total_files": 0}
|
return {"percent": 0, "total_files": 0}
|
||||||
|
|
||||||
def list_backups(self):
|
def list_backups(self, backup_location):
|
||||||
if not self.settings["backup_path"]:
|
if not backup_location:
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Error putting backup file list for server with ID: {self.server_id}"
|
f"Error putting backup file list for server with ID: {self.server_id}"
|
||||||
)
|
)
|
||||||
return []
|
return []
|
||||||
if not Helpers.check_path_exists(
|
if not Helpers.check_path_exists(
|
||||||
Helpers.get_os_understandable_path(self.settings["backup_path"])
|
Helpers.get_os_understandable_path(backup_location)
|
||||||
):
|
):
|
||||||
return []
|
return []
|
||||||
files = Helpers.get_human_readable_files_sizes(
|
files = Helpers.get_human_readable_files_sizes(
|
||||||
Helpers.list_dir_by_date(
|
Helpers.list_dir_by_date(
|
||||||
Helpers.get_os_understandable_path(self.settings["backup_path"])
|
Helpers.get_os_understandable_path(backup_location)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
"path": os.path.relpath(
|
"path": os.path.relpath(
|
||||||
f["path"],
|
f["path"],
|
||||||
start=Helpers.get_os_understandable_path(
|
start=Helpers.get_os_understandable_path(backup_location),
|
||||||
self.settings["backup_path"]
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
"size": f["size"],
|
"size": f["size"],
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ class TasksManager:
|
|||||||
)
|
)
|
||||||
|
|
||||||
elif command == "backup_server":
|
elif command == "backup_server":
|
||||||
svr.a_backup_server()
|
svr.a_backup_server(cmd["action_id"])
|
||||||
|
|
||||||
elif command == "update_executable":
|
elif command == "update_executable":
|
||||||
svr.jar_update()
|
svr.jar_update()
|
||||||
|
@ -273,7 +273,7 @@ def api_handlers(handler_args):
|
|||||||
handler_args,
|
handler_args,
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
r"/api/v2/servers/([a-z0-9-]+)/action/([a-z_]+)/?",
|
r"/api/v2/servers/([a-z0-9-]+)/action/([a-z_]+)/([a-z0-9-]+)/?",
|
||||||
ApiServersServerActionHandler,
|
ApiServersServerActionHandler,
|
||||||
handler_args,
|
handler_args,
|
||||||
),
|
),
|
||||||
|
@ -10,7 +10,7 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
class ApiServersServerActionHandler(BaseApiHandler):
|
class ApiServersServerActionHandler(BaseApiHandler):
|
||||||
def post(self, server_id: str, action: str):
|
def post(self, server_id: str, action: str, action_id=None):
|
||||||
auth_data = self.authenticate_user()
|
auth_data = self.authenticate_user()
|
||||||
if not auth_data:
|
if not auth_data:
|
||||||
return
|
return
|
||||||
@ -54,7 +54,7 @@ class ApiServersServerActionHandler(BaseApiHandler):
|
|||||||
return self._agree_eula(server_id, auth_data[4]["user_id"])
|
return self._agree_eula(server_id, auth_data[4]["user_id"])
|
||||||
|
|
||||||
self.controller.management.send_command(
|
self.controller.management.send_command(
|
||||||
auth_data[4]["user_id"], server_id, self.get_remote_ip(), action
|
auth_data[4]["user_id"], server_id, self.get_remote_ip(), action, action_id
|
||||||
)
|
)
|
||||||
|
|
||||||
self.finish_json(
|
self.finish_json(
|
||||||
@ -93,7 +93,6 @@ class ApiServersServerActionHandler(BaseApiHandler):
|
|||||||
new_server_name,
|
new_server_name,
|
||||||
new_server_id,
|
new_server_id,
|
||||||
new_server_path,
|
new_server_path,
|
||||||
new_backup_path,
|
|
||||||
new_server_command,
|
new_server_command,
|
||||||
server_data.get("executable"),
|
server_data.get("executable"),
|
||||||
new_server_log_path,
|
new_server_log_path,
|
||||||
|
@ -101,8 +101,8 @@
|
|||||||
</button>
|
</button>
|
||||||
<button data-backup={{ backup.backup_id }} data-toggle="tooltip"
|
<button data-backup={{ backup.backup_id }} data-toggle="tooltip"
|
||||||
title="{{ translate('serverBackups', 'run', data['lang']) }}"
|
title="{{ translate('serverBackups', 'run', data['lang']) }}"
|
||||||
class="btn btn-outline-warning test-socket">
|
class="btn btn-outline-warning run-backup backup_now_button">
|
||||||
<i class="fa-solid fa-vial"></i>
|
<i class="fa-solid fa-forward"></i>
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -218,9 +218,10 @@
|
|||||||
return r ? r[1] : undefined;
|
return r ? r[1] : undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function backup_started() {
|
async function backup_started(backup_id) {
|
||||||
const token = getCookie("_xsrf")
|
const token = getCookie("_xsrf")
|
||||||
let res = await fetch(`/api/v2/servers/${server_id}/action/backup_server`, {
|
console.log(backup_id)
|
||||||
|
let res = await fetch(`/api/v2/servers/${server_id}/action/backup_server/${backup_id}/`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'X-XSRFToken': token
|
'X-XSRFToken': token
|
||||||
@ -322,53 +323,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(document).ready(function () {
|
$(document).ready(function () {
|
||||||
$("#backup-form").on("submit", async function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
const token = getCookie("_xsrf")
|
|
||||||
let backupForm = document.getElementById("backup-form");
|
|
||||||
|
|
||||||
let formData = new FormData(backupForm);
|
|
||||||
//Remove checks that we don't need in form data.
|
|
||||||
formData.delete("after-check");
|
|
||||||
formData.delete("before-check");
|
|
||||||
//Create an object from the form data entries
|
|
||||||
let formDataObject = Object.fromEntries(formData.entries());
|
|
||||||
//We need to make sure these are sent regardless of whether or not they're checked
|
|
||||||
formDataObject.compress = $("#compress").prop('checked');
|
|
||||||
formDataObject.shutdown = $("#shutdown").prop('checked');
|
|
||||||
let excluded = [];
|
|
||||||
$('input.excluded:checkbox:checked').each(function () {
|
|
||||||
excluded.push($(this).val());
|
|
||||||
});
|
|
||||||
if ($("#root_files_button").hasClass("clicked")) {
|
|
||||||
formDataObject.exclusions = excluded;
|
|
||||||
}
|
|
||||||
delete formDataObject.root_path
|
|
||||||
console.log(excluded);
|
|
||||||
console.log(formDataObject);
|
|
||||||
// Format the plain form data as JSON
|
|
||||||
let formDataJsonString = JSON.stringify(formDataObject, replacer);
|
|
||||||
|
|
||||||
console.log(formDataJsonString);
|
|
||||||
|
|
||||||
let res = await fetch(`/api/v2/servers/${server_id}/backups/`, {
|
|
||||||
method: 'PATCH',
|
|
||||||
headers: {
|
|
||||||
'X-XSRFToken': token
|
|
||||||
},
|
|
||||||
body: formDataJsonString,
|
|
||||||
});
|
|
||||||
let responseData = await res.json();
|
|
||||||
if (responseData.status === "ok") {
|
|
||||||
window.location.reload();
|
|
||||||
} else {
|
|
||||||
|
|
||||||
bootbox.alert({
|
|
||||||
title: responseData.error,
|
|
||||||
message: responseData.error_data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if ($('#backup_path').val() == '') {
|
if ($('#backup_path').val() == '') {
|
||||||
@ -461,8 +415,8 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
$("#backup_now_button").click(function () {
|
$(".backup_now_button").click(function () {
|
||||||
backup_started();
|
backup_started($(this).data('backup'));
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user