61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
|
|
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!")
|