122 lines
3.7 KiB
Python
122 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Upload raportu HTML na serwer FTP (adspro.projectpro.pl).
|
|
|
|
Użycie:
|
|
python scripts/reports/upload_report_ftp.py --local-dir output/studio-zoe.pl/2026-02/ --remote-path /raporty/studio-zoe/2026-02/
|
|
"""
|
|
|
|
import argparse
|
|
import ftplib
|
|
import os
|
|
import sys
|
|
import io
|
|
from pathlib import Path
|
|
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8", errors="replace")
|
|
|
|
ROOT = Path(__file__).parent.parent.parent
|
|
sys.path.insert(0, str(ROOT))
|
|
from src.gads_v2.config import load_env
|
|
|
|
load_env(ROOT / ".env")
|
|
|
|
|
|
def ftp_mkdirs(ftp, path):
|
|
"""Create nested directories on FTP server."""
|
|
dirs = path.strip("/").split("/")
|
|
current = ""
|
|
for d in dirs:
|
|
current += f"/{d}"
|
|
try:
|
|
ftp.cwd(current)
|
|
except ftplib.error_perm:
|
|
try:
|
|
ftp.mkd(current)
|
|
print(f" Utworzono katalog: {current}")
|
|
except ftplib.error_perm:
|
|
pass # already exists or no permission
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Upload raportu na FTP")
|
|
parser.add_argument("--local-dir", required=True, help="Lokalny folder z raportem")
|
|
parser.add_argument("--remote-path", required=True, help="Sciezka na serwerze (np. /raporty/studio-zoe/2026-02/)")
|
|
args = parser.parse_args()
|
|
|
|
host = os.environ["ADSPRO_HOST"]
|
|
user = os.environ["ADSPRO_USERNAME"]
|
|
password = os.environ["ADSPRO_PASSWORD"]
|
|
base_path = os.environ["ADSPRO_REMOTE_PATH"]
|
|
|
|
local_dir = Path(args.local_dir)
|
|
if not local_dir.is_absolute():
|
|
local_dir = ROOT / "scripts" / "reports" / local_dir
|
|
|
|
if not local_dir.exists():
|
|
print(f"Blad: folder {local_dir} nie istnieje")
|
|
sys.exit(1)
|
|
|
|
# Fix Git Bash path mangling on Windows (e.g. /raporty -> C:/Program Files/Git/raporty)
|
|
remote_path = args.remote_path
|
|
if "Program Files/Git" in remote_path or ":" in remote_path:
|
|
# Extract the intended path after the Git prefix
|
|
import re
|
|
match = re.search(r'/raporty/.+', remote_path)
|
|
if match:
|
|
remote_path = match.group(0)
|
|
else:
|
|
remote_path = "/" + remote_path.split("/")[-3] + "/" + remote_path.split("/")[-2] + "/" + remote_path.split("/")[-1]
|
|
|
|
remote_full = base_path.rstrip("/") + "/" + remote_path.strip("/")
|
|
|
|
print(f"Laczenie z {host}...")
|
|
|
|
# Try FTP_TLS first, fallback to plain FTP
|
|
try:
|
|
ftp = ftplib.FTP_TLS(host, timeout=30)
|
|
ftp.login(user, password)
|
|
ftp.prot_p()
|
|
print(" Polaczono (FTP TLS)")
|
|
except Exception:
|
|
ftp = ftplib.FTP(host, timeout=30)
|
|
ftp.login(user, password)
|
|
print(" Polaczono (FTP)")
|
|
|
|
ftp.encoding = "utf-8"
|
|
|
|
# Create remote directory structure
|
|
print(f"Tworzenie katalogow: {remote_full}")
|
|
ftp_mkdirs(ftp, remote_full)
|
|
ftp.cwd(remote_full)
|
|
|
|
# Upload all files
|
|
files_uploaded = 0
|
|
for file_path in local_dir.rglob("*"):
|
|
if file_path.is_file():
|
|
relative = file_path.relative_to(local_dir)
|
|
remote_file = str(relative).replace("\\", "/")
|
|
|
|
# Create subdirectories if needed
|
|
if "/" in remote_file:
|
|
subdir = "/".join(remote_file.split("/")[:-1])
|
|
ftp_mkdirs(ftp, remote_full + "/" + subdir)
|
|
ftp.cwd(remote_full)
|
|
|
|
print(f" Uploading: {remote_file} ({file_path.stat().st_size:,} bytes)")
|
|
with open(file_path, "rb") as f:
|
|
ftp.storbinary(f"STOR {remote_file}", f)
|
|
files_uploaded += 1
|
|
|
|
ftp.quit()
|
|
|
|
domain_part = args.remote_path.strip("/")
|
|
url = f"https://adspro.projectpro.pl/{domain_part}/"
|
|
|
|
print(f"\nUpload zakonczony! {files_uploaded} plikow.")
|
|
print(f"URL: {url}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|