first commit
This commit is contained in:
121
scripts/reports/upload_report_ftp.py
Normal file
121
scripts/reports/upload_report_ftp.py
Normal file
@@ -0,0 +1,121 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user