From 1f4c4529f7c84f316c94cf5c80865f4a5bca2d78 Mon Sep 17 00:00:00 2001 From: Samuel Walker Date: Fri, 21 Jun 2024 14:39:44 -0600 Subject: [PATCH] moved FTP operations to separate file --- Backend.py | 141 +++++++++-------------------------------------------- Upload.py | 18 ++----- 2 files changed, 26 insertions(+), 133 deletions(-) diff --git a/Backend.py b/Backend.py index ad13053..c8cadc4 100644 --- a/Backend.py +++ b/Backend.py @@ -1,4 +1,3 @@ -from ftplib import FTP_TLS as FTP import io import json import tempfile @@ -7,12 +6,10 @@ import time import os import datetime import zipfile -from customtkinter import * -import time -import math import tarfile from pathlib import Path import shutil +from FTP import * def install_prism(): global data_dir @@ -22,11 +19,8 @@ def install_prism(): if os.name == "posix": suff = "lin.tar.gz" prism_file = "prism/prism-"+suff - ftp = FTP("gitea.piwalker.net") - ftp.login() - ftp.prot_p() with io.BytesIO() as buff: - ftp.retrbinary("RETR "+prism_file, buff.write) + ftpDownload(prism_file, buff) buff.seek(0) if os.name == "nt": with zipfile.ZipFile(buff) as zip: @@ -35,11 +29,10 @@ def install_prism(): with tarfile.open(fileobj=buff) as tar: tar.extractall(os.path.join(data_dir, "prism")) with io.BytesIO() as buff: - ftp.retrbinary("RETR prism/prismlauncher.cfg", buff.write) + ftpDownload("prism/prismlauncher.cfg", buff) buff.seek(0) with open(os.path.join(data_dir, "prism", "prismlauncher.cfg"), 'wb') as file: file.write(buff.getbuffer()) - ftp.close() suff = "win" cmd = "java.exe" if os.name == "posix": @@ -54,12 +47,8 @@ def install_prism(): data[ind] = "JavaPath="+data_dir.replace("\\", "/")+"/java/java-21-"+suff+"/bin/"+cmd+"\n" with open(os.path.join(data_dir, "prism", "prismlauncher.cfg"), 'w') as file: file.writelines(data) - - - - def get_tar_members_stripped(tar, n_folders_stripped = 1): @@ -111,11 +100,8 @@ def install_java(java): java_path = "java/java-"+str(java)+"-"+suff+ext if not os.path.exists(data_dir+"/java/java-"+str(java)+"-"+suff): print("Downloading Java "+str(java)) - ftp = FTP("gitea.piwalker.net") - ftp.login() - ftp.prot_p() with io.BytesIO() as buff: - ftp.retrbinary("RETR "+java_path,buff.write) + ftpDownload(java_path, buff) if os.name == "posix": buff.seek(0) with tarfile.open(fileobj=buff) as tar: @@ -154,14 +140,10 @@ def perform_installation(instance_name, prism_command, prism_instance_path, pack try: - ftp = FTP("gitea.piwalker.net") - ftp.login() - ftp.prot_p() - ftp.cwd(pack) # Fetching versions.json from FTP bio = io.BytesIO() - ftp.retrbinary("RETR versions.json", bio.write) + ftpDownload(pack+"/versions.json", bio) bio.seek(0) versions = json.load(bio) bio.close() @@ -182,7 +164,7 @@ def perform_installation(instance_name, prism_command, prism_instance_path, pack with tempfile.TemporaryDirectory() as temp_dir: modpack_file_path = os.path.join(temp_dir, instance_name + ".mrpack") with open(modpack_file_path, 'wb') as modpack: - ftpDownload(ftp, versions[-1]["File"], modpack) + ftpDownload(pack+"/"+versions[-1]["File"], modpack) # Running PrismLauncher with modpack subprocess.Popen([prism_command, '-I', modpack_file_path]) @@ -239,16 +221,13 @@ def perform_installation(instance_name, prism_command, prism_instance_path, pack def upload_pack(username, password, version_tag, fileName, pack): - ftp = FTP("gitea.piwalker.net", username, password) - ftp.prot_p() - ftp.cwd(pack) bio = io.BytesIO() - ftp.retrbinary("RETR versions.json", bio.write) + ftpDownload(pack+"/versions.json", bio) bio.seek(0) versions = json.load(bio) bio.close() time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") - versions.append({"Version":version_tag, "Date":time, "File":"Versions/"+pack+time+".mrpack"}) + versions.append({"Version":version_tag, "Date":time, "File":"Versions/"+pack+"-"+time+".mrpack"}) with zipfile.ZipFile(fileName, 'r') as zin: zipbytes = io.BytesIO() zout = zipfile.ZipFile(zipbytes, 'w') @@ -258,128 +237,52 @@ def upload_pack(username, password, version_tag, fileName, pack): zout.writestr(item, buffer) zout.writestr("overrides/version.txt", version_tag) zout.close() - zipbytes.seek(0) - ftp.storbinary("STOR "+versions[len(versions)-1]["File"], zipbytes) + ftpUpload(pack+"/"+versions[-1]["File"], zipbytes, username, password) bio = io.BytesIO() bio.write(json.dumps(versions).encode()) - bio.seek(0) - ftp.storbinary("STOR versions.json", bio) + ftpUpload(pack+"/versions.json", bio, username, password) bio.close() - modpackUpdate(pack, ftp) - ftp.close() + modpackUpdate(pack, username, password) def getModpacks(): - ftp = FTP("gitea.piwalker.net") - ftp.login() - ftp.prot_p() bio = io.BytesIO() - ftp.retrbinary("RETR modpacks.json", bio.write) + ftpDownload("modpacks.json", bio) bio.seek(0) - ftp.close() return json.load(bio) -def uploadModpacks(modpacks, ftp): - ftp.cwd("/ftp"); +def uploadModpacks(modpacks, username, password): bio = io.BytesIO() bio.write(json.dumps(modpacks).encode()) - bio.seek(0) - ftp.storbinary("STOR modpacks.json", bio) + ftpUpload("modpacks.json", bio, username, password) bio.close() -def modpackUpdate(id, ftp): +def modpackUpdate(id, username, password): modpacks = getModpacks() time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") for modpack in modpacks: if modpack["id"] == id: modpack["last-updated"] = time - uploadModpacks(modpacks, ftp); + uploadModpacks(modpacks, username, password); def createModpack(id, name, username, password): modpacks = getModpacks() time = datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S") modpacks.append({"id":id, "name":name, "last-updated":time}) - ftp = FTP("gitea.piwalker.net", username, password) - ftp.prot_p() - uploadModpacks(modpacks,ftp) - ftp.mkd(id) - ftp.cwd(id) + uploadModpacks(modpacks, username, password) + ftpMakeDirectory(id, username, password) versions = [] bio = io.BytesIO() bio.write(json.dumps(versions).encode()) - bio.seek(0) - ftp.storbinary("STOR versions.json", bio) - ftp.mkd("Versions") - ftp.close() + ftpUpload(id+"/versions.json", bio, username, password) + ftpMakeDirectory(id+"/Versions", username, password) def deleteModpack(username, password, id): - ftp = FTP("gitea.piwalker.net", username, password) - ftp.prot_p() modpacks = getModpacks() for pack in modpacks: if pack["id"] == id: modpacks.remove(pack) break - uploadModpacks(modpacks, ftp) - deleteFolder(ftp, id) + uploadModpacks(modpacks, username, password) + ftpDeleteDirectory(id, username, password) -def deleteFolder(ftp, path): - print("Deleting folder: "+path) - ftp.cwd(path) - for item in ftp.nlst(): - try: - print("deleting file: "+path) - ftp.delete(item) - except: - deleteFolder(ftp, item) - ftp.cwd("..") - ftp.rmd(path) - -def ftpDownload(ftp, file, stream): - #create tkinter window - print("downloading file: "+file) - dialog = CTk() - if os.name == 'posix': - dialog.attributes('-type', 'dialog') - dialog.title("Downloading Modpack") - set_appearance_mode("dark") - set_default_color_theme("blue") - - global pbar - pbar = CTkProgressBar(master=dialog) - pbar.pack(padx=20, pady=20) - global progress - global ETA - progress = StringVar() - ETA = StringVar() - progress_label = CTkLabel(master=dialog, textvariable=progress) - progress_label.pack() - eta_label = CTkLabel(master=dialog, textvariable=ETA) - eta_label.pack() - size = ftp.size(file) - global total - total = 0 - global start - global timer - timer = 0 - start = time.time() - dialog.update() - - def downloadCallback(data): - global total - global pbar - global start - global progress - global ETA - global timer - stream.write(data) - total += len(data) - if time.time() - timer >= 1: - progress.set(str(round(total/1048576, 1))+" MB / "+str(round(size/1048576, 1))+" MB @ " + str(round((total/1048576)/(time.time()-start), 3))+" MB/s") - time_left = (size-total)/(total/(time.time()-start)) - ETA.set("ETA: " + str(datetime.timedelta(seconds=math.ceil(time_left)))) - pbar.set(total/size) - timer = time.time() - dialog.update() - ftp.retrbinary("RETR " + file, downloadCallback) - dialog.destroy() diff --git a/Upload.py b/Upload.py index 09972be..b095145 100644 --- a/Upload.py +++ b/Upload.py @@ -7,15 +7,12 @@ global version global modpack global modpack_name global modpack_id -global username -global password global modpacks def get_credentials(): - global username - global password username = simpledialog.askstring("username", "Username: ") password = simpledialog.askstring("password", "Password: ", show="*") + return username, password def select_file(): global fileName @@ -28,11 +25,9 @@ def select_file(): def update_pack(): global modpacks global fileName - global username - global password global modpack global version - get_credentials() + username, password = get_credentials() pack_id = None for pack in modpacks: if pack["name"] == modpack.get(): @@ -41,8 +36,6 @@ def update_pack(): messagebox.Message(title="complete", message="Modpack updated successfuly").show() def create_pack(): - global username - global password global modpacks global modpack_id global modpack_name @@ -55,17 +48,15 @@ def create_pack(): if pack["name"] == modpack_name.get(): messagebox.Message(title="Error", message="Pack name already exists").show() return - get_credentials() + username, password = get_credentials() Backend.createModpack(modpack_id.get(), modpack_name.get(), username, password) Backend.upload_pack(username, password, version.get(), fileName, modpack_id.get()) messagebox.Message(title="complete", message="Modpack created successfully").show() def delete_pack(): - global username - global password global modpacks global modpack_delete - get_credentials() + username, password = get_credentials() pack_id = None for pack in modpacks: if pack["name"] == modpack_delete.get(): @@ -82,7 +73,6 @@ def main(): global modpack_name global modpack_delete fileName = "modpack.mrpack" - app = CTk() if os.name == 'posix': app.attributes('-type', 'dialog')