Files
ServerSync/sync.py

61 lines
1.9 KiB
Python
Raw Normal View History

2026-02-12 02:28:23 +02:00
import os
import lib.questionary as qs
import json
from os import stat
from pathlib import Path
from lib.ftp import SFTPSync
def load_config(filename=".SyncNode.config"):
path = Path(filename)
if path.exists():
with open(path, "r") as f:
return json.load(f)
return None
def get_smart_staged_paths(root_dir, config):
blacklist = config.get("blacklist", [])
auto_sync = config.get("autoSync", [])
choices = []
# Use .iterdir() to stay in the ROOT only
for p in Path(root_dir).iterdir():
rel_path = p.name
if rel_path in blacklist or rel_path.startswith('.'):
continue
is_auto = rel_path in auto_sync
choices.append(qs.Choice(rel_path, checked=is_auto))
return qs.checkbox("Select top-level folders/files to sync:", choices=choices).ask()
config = load_config()
def handle_upload():
current_dir = Path.cwd()
config = load_config()
if config is None:
print("\n[!] Configuration Missing")
print(f"[*] No '.SyncNode.config' found in: {current_dir}")
print("[*] Please run 'ServerSync init' (or setup) in this directory first.\n")
return
print(f"[*] Scanning for files in: {current_dir}")
selected = get_smart_staged_paths(current_dir, config)
if not selected:
print("[~] No files selected for sync.")
return
client = SFTPSync(config['ip'], config['user'], config['password'], config['port'])
if client.connect() is True:
for item in selected:
local_path = current_dir / item
if local_path.is_dir():
client.upload_directory(str(local_path), config['directory'])
else:
client.upload_with_progress(str(local_path), config['directory'])
client.disconnect()
print("\n[✔] Staged Sync Complete!")