GUI Rsync Python + Tkinter dengan Fitur History
Berikut adalah skrip Python GUI sederhana menggunakan Tkinter untuk menjalankan rsync antar folder. Fitur unggulannya adalah:
- Memilih folder sumber dan tujuan
- Opsi --delete-before, --delete-after, atau tanpa delete
- Dropdown riwayat sinkronisasi yang otomatis tersimpan
Struktur dan Fungsi
- browse_source() dan browse_dest() → untuk memilih folder
- run_rsync() → menjalankan rsync menggunakan subprocess.run
- save_history() dan apply_history() → menyimpan dan memuat riwayat sinkronisasi ke file ~/.rsync_history
Kode Lengkap GUI Rsync Python
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import subprocess
import shlex
import os
HISTORY_FILE = os.path.expanduser("~/.rsync_history")
def browse_source():
folder = filedialog.askdirectory()
if folder:
source_entry.delete(0, tk.END)
source_entry.insert(0, folder + '/')
def browse_dest():
folder = filedialog.askdirectory()
if folder:
dest_entry.delete(0, tk.END)
dest_entry.insert(0, folder + '/')
def save_history(source, dest):
line = f"{source} => {dest}"
try:
if os.path.exists(HISTORY_FILE):
with open(HISTORY_FILE, "r") as f:
history = [l.strip() for l in f.readlines()]
else:
history = []
if line not in history:
with open(HISTORY_FILE, "a") as f:
f.write(line + "\n")
history_dropdown['values'] = history + [line] # update dropdown
except Exception as e:
print(f"Gagal menyimpan history: {e}")
def apply_history(event=None):
selection = history_var.get()
if " => " in selection:
source, dest = selection.split(" => ", 1)
source_entry.delete(0, tk.END)
dest_entry.delete(0, tk.END)
source_entry.insert(0, source)
dest_entry.insert(0, dest)
def load_history():
if os.path.exists(HISTORY_FILE):
with open(HISTORY_FILE, "r") as f:
return [l.strip() for l in f.readlines()]
return []
def run_rsync():
source = source_entry.get().strip()
dest = dest_entry.get().strip()
delete_mode = delete_var.get()
if not source or not dest:
messagebox.showerror("Error", "Source dan Destination tidak boleh kosong.")
return
command = [
"sudo", "rsync", "-aW", "--no-i-r", "--info=progress2", "--info=name0"
]
if delete_mode == "before":
command.append("--delete-before")
elif delete_mode == "after":
command.append("--delete-after")
command += [source, dest]
print("\n[PERINTAH]")
print(" ".join(shlex.quote(arg) for arg in command))
print("\n[OUTPUT]")
try:
subprocess.run(command, check=True)
print("\n✅ Sinkronisasi selesai!\a")
save_history(source, dest)
messagebox.showinfo("Selesai", "✅ Sinkronisasi selesai!")
except subprocess.CalledProcessError as e:
print("\n[ERROR]")
print(e)
messagebox.showerror("Gagal", f"Gagal menjalankan rsync:\n{e}")
# === GUI ===
root = tk.Tk()
root.title("GUI Rsync dengan History")
# History Dropdown
tk.Label(root, text="Riwayat Sinkronisasi:").grid(row=0, column=0, sticky="w", padx=5)
history_var = tk.StringVar()
history_dropdown = ttk.Combobox(root, textvariable=history_var, width=60)
history_dropdown['values'] = load_history()
history_dropdown.grid(row=0, column=1, columnspan=2, padx=5, pady=5, sticky="we")
history_dropdown.bind("<>", apply_history)
# Source
tk.Label(root, text="Source Folder:").grid(row=1, column=0, sticky="w", padx=5, pady=5)
source_entry = tk.Entry(root, width=50)
source_entry.grid(row=1, column=1, padx=5)
tk.Button(root, text="Browse", command=browse_source).grid(row=1, column=2, padx=5)
# Destination
tk.Label(root, text="Destination Folder:").grid(row=2, column=0, sticky="w", padx=5, pady=5)
dest_entry = tk.Entry(root, width=50)
dest_entry.grid(row=2, column=1, padx=5)
tk.Button(root, text="Browse", command=browse_dest).grid(row=2, column=2, padx=5)
# Delete mode
tk.Label(root, text="Delete Mode:").grid(row=3, column=0, sticky="w", padx=5, pady=5)
delete_var = tk.StringVar(value="before")
tk.OptionMenu(root, delete_var, "before", "after", "none").grid(row=3, column=1, sticky="w", padx=5)
# Sync button
tk.Button(root, text="Jalankan Rsync", command=run_rsync, bg="#4CAF50", fg="white").grid(row=4, column=1, pady=10)
root.mainloop()
Contoh Perintah yang Dihasilkan
[PERINTAH]
sudo rsync -aW --no-i-r --info=progress2 --info=name0 --delete-before /source/ /dest/
Catatan
- Perlu hak akses sudo untuk menulis ke direktori sistem.
- Gunakan dengan hati-hati, terutama saat menggunakan opsi --delete-before.
- Riwayat disimpan di file ~/.rsync_history
cara menjalankannya
python3 sync.py