shadowbrain / scripts /tools /rclone_installer.py
taemin1980's picture
๐Ÿ”ฑ Imperial Deployment: Shadow Brain Core ignition
d50a68d verified
Raw
History Blame Contribute Delete
2.94 kB
"""
Imperial Rclone Installer & Path Resolver
rclone ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
"""
import os
import sys
import platform
import subprocess
# Windows: %USERPROFILE%\.rclone\rclone.exe / ๊ธฐํƒ€: ~/.rclone/rclone
if platform.system() == "Windows":
RCLONE_EXE = os.path.join(os.path.expanduser("~"), ".rclone", "rclone.exe")
else:
RCLONE_EXE = os.path.join(os.path.expanduser("~"), ".rclone", "rclone")
def _rclone_in_path() -> str | None:
"""PATH์—์„œ rclone ์‹คํ–‰ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค."""
try:
result = subprocess.run(
["where" if platform.system() == "Windows" else "which", "rclone"],
capture_output=True, text=True, timeout=5,
encoding='utf-8', errors='replace'
)
if result.returncode == 0:
return result.stdout.strip().splitlines()[0]
except Exception:
pass
return None
def _ensure_boto3() -> bool:
"""boto3๊ฐ€ ์„ค์น˜๋ผ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์—†์œผ๋ฉด ์ž๋™ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค."""
try:
import boto3
return True
except ImportError:
pass
print("[Imperial Setup] boto3 ๋ฏธ์„ค์น˜ ๊ฐ์ง€ โ€” R2 ์ง์ ‘ ์ ‘์†์„ ์œ„ํ•ด ์ž๋™ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค...")
try:
result = subprocess.run(
[sys.executable, "-m", "pip", "install", "boto3", "--quiet"],
capture_output=True, text=True, timeout=120,
encoding='utf-8', errors='replace'
)
if result.returncode == 0:
print("[Imperial Setup] boto3 ์„ค์น˜ ์™„๋ฃŒ โœ“")
return True
else:
print(f"[Imperial Setup] boto3 ์„ค์น˜ ์‹คํŒจ: {result.stderr.strip()}")
return False
except Exception as e:
print(f"[Imperial Setup] boto3 ์ž๋™ ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜: {e}")
return False
def check_and_install_rclone() -> bool:
"""
rclone์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- PATH์— ์žˆ์œผ๋ฉด RCLONE_EXE๋ฅผ ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
- ~/.rclone/ ์— ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
- ์—†์œผ๋ฉด ๊ฒฝ๊ณ  ์ถœ๋ ฅ ํ›„ boto3 ํด๋ฐฑ์„ ์œ„ํ•ด boto3 ์ž๋™ ์„ค์น˜๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
๋ฐ˜ํ™˜๊ฐ’: rclone ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ (bool)
"""
global RCLONE_EXE
# boto3๋Š” ํ•ญ์ƒ ๋ณด์žฅ (rclone ์œ ๋ฌด์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ R2 ํด๋ฐฑ์šฉ์œผ๋กœ ํ•„์š”)
_ensure_boto3()
# 1. PATH ์šฐ์„  ํƒ์ƒ‰
path_exe = _rclone_in_path()
if path_exe and os.path.exists(path_exe):
RCLONE_EXE = path_exe
print(f"[Rclone] PATH์—์„œ ๋ฐœ๊ฒฌ: {RCLONE_EXE}")
return True
# 2. ~/.rclone/ ํƒ์ƒ‰
if os.path.exists(RCLONE_EXE):
print(f"[Rclone] ๋กœ์ปฌ ์„ค์น˜ ํ™•์ธ: {RCLONE_EXE}")
return True
# 3. ์—†์Œ โ€” boto3 ํด๋ฐฑ์œผ๋กœ R2๋Š” ๊ณ„์† ์‚ฌ์šฉ ๊ฐ€๋Šฅ
print("[Rclone] rclone ๋ฏธ์„ค์น˜ โ€” R2๋Š” boto3๋กœ ์ง์ ‘ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. Google Drive ๋™๊ธฐํ™”๋งŒ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.")
return False