from configparser import ConfigParser from pathlib import Path from json import dump import subprocess from tkinter import * from tkinter.ttk import * config = ConfigParser() options = {"ftp": ["host", "user", "pass", "lftp"], "file": ["local", "remote"]} def check_config_valid(config: ConfigParser, options: dict[str, list[str]]) -> bool: for sec in options: if not config.has_section(sec): return False for opt in options[sec]: if not config.has_option(sec, opt): return False return True def set_default_config(config: ConfigParser, options: dict[str, list[str]]) -> None: config.clear() for sec in options: config.add_section(sec) for opt in options[sec]: config[sec][opt] = "" with open("config.ini", "w") as f: config.write(f) config.read("config.ini") if not check_config_valid(config, options): set_default_config(config, options) def generate_db(config: ConfigParser) -> None: local_dir = Path(config["file"]["local"]) categories = Path(local_dir, "categories") output = [] for category in categories.iterdir(): if not category.is_dir(): continue output_category = {"name": category.name, "files": []} for file in category.iterdir(): output_category["files"].append(file.name) output.append(output_category) with open(Path(local_dir, "db.json"), "w") as f: dump(output, f) # generate_db(config) sync_all_command = [ config["ftp"]["lftp"], f'-e mirror -R -e --parallel=10 {config["file"]["local"]} {config["file"]["remote"]}; exit', "-u", f'{config["ftp"]["user"]},{config["ftp"]["pass"]}', config["ftp"]["host"], ] sync_files_command = [ config["ftp"]["lftp"], f'-e mirror -R -e --parallel=10 {config["file"]["local"]}/categories {config["file"]["remote"]}/categories; exit', "-u", f'{config["ftp"]["user"]},{config["ftp"]["pass"]}', config["ftp"]["host"], ] def tfunc(txt: str) -> None: print(txt) # print(subprocess.run(sync_files_command)) root = Tk() ftp_header_frm = Frame(root) ftp_header_frm.grid(row=0, column=0) Label(ftp_header_frm, text="FTP Settings").grid(row=0, column=0, padx=5, pady=5) ftp_settings_frm = Frame(root) ftp_settings_frm.grid(row=1, column=0) Label(ftp_settings_frm, text="Host").grid(row=0, column=0, padx=5, pady=5) host_entry = Entry(ftp_settings_frm) host_entry.insert(0, config["ftp"]["host"]) host_entry.grid(row=0, column=1, padx=5, pady=5) Label(ftp_settings_frm, text="Username").grid(row=1, column=0, padx=5, pady=5) user_entry = Entry(ftp_settings_frm) user_entry.insert(0, config["ftp"]["user"]) user_entry.grid(row=1, column=1, padx=5, pady=5) Label(ftp_settings_frm, text="Password").grid(row=2, column=0, padx=5, pady=5) pass_entry = Entry(ftp_settings_frm) pass_entry.insert(0, config["ftp"]["pass"]) pass_entry.grid(row=2, column=1, padx=5, pady=5) Label(ftp_settings_frm, text="lftp Path").grid(row=3, column=0, padx=5, pady=5) lftp_entry = Entry(ftp_settings_frm) lftp_entry.insert(0, config["ftp"]["lftp"]) lftp_entry.grid(row=3, column=1, padx=5, pady=5) file_header_frm = Frame(root) file_header_frm.grid(row=2, column=0) Label(file_header_frm, text="File Path Settings").grid( row=0, column=0, columnspan=2, padx=5, pady=5 ) file_settings_frm = Frame(root) file_settings_frm.grid(row=3, column=0) Label(file_settings_frm, text="Local Path").grid(row=0, column=0, padx=5, pady=5) local_entry = Entry(file_settings_frm) local_entry.insert(0, config["file"]["local"]) local_entry.grid(row=0, column=1, padx=5, pady=5) Label(file_settings_frm, text="Remote Path").grid(row=1, column=0, padx=5, pady=5) remote_entry = Entry(file_settings_frm) remote_entry.insert(0, config["file"]["remote"]) remote_entry.grid(row=1, column=1, padx=5, pady=5) # Button(ftp_settings_frm, text="Save Config").grid(row=5, column=0, columnspan=2, padx=5, pady=5) root.mainloop()