# -*- coding: utf-8 -*- from ftplib import FTP import os from datetime import date import re import socket import threading import io today = date.today() ftp = FTP('SERVER IP', 'LOGIN', 'PASS', '', TIMEOUT) print("Zalogowano.") ftp.set_debuglevel(2) ftp.encoding = 'windows-1252' ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) ftp.set_pasv(True) target_dir = "wp-content/" def _is_ftp_dir(ftp_handle, name, guess_by_extension=True): if name[-1] == '.': return False original_cwd = ftp_handle.pwd() try: ftp_handle.cwd(name) ftp_handle.cwd(original_cwd) return True except: return False def _make_parent_dir(fpath): """ ensures the parent directory of a filepath exists """ dirname = os.path.dirname(fpath) while not os.path.exists(dirname): try: os.makedirs(dirname) print("Utworzono {0}".format(dirname.encode('windows-1252').decode('utf-8'))) except OSError: _make_parent_dir(dirname) def _download_ftp_file(path_ftp, ftp_handle, name, dest, overwrite): """ downloads a single file from an ftp server """ _make_parent_dir(dest.lstrip("/")) if name[-1] == '.': return False if not os.path.exists(dest) or overwrite is True: try: print("Pobieram: {0}".format(dest.encode('windows-1252').decode('utf-8'))) with open(dest.encode('windows-1252').decode('utf-8'), 'wb') as f: ftp_handle.retrbinary("RETR "+dest, f.write) #HERE I GOT THE ERROR, EVEN WHEN I USE dest.encode('windows-1252').decode('utf-8') print("Pobrano: {0}".format(dest.encode('windows-1252').decode('utf-8'))) except FileNotFoundError: print("FAILED: {0}".format(dest.encode('windows-1252').decode('utf-8'))) else: print("already exists: {0}".format(dest.encode('windows-1252').decode('utf-8'))) def _file_name_match_patern(pattern, name): """ returns True if filename matches the pattern""" if pattern is None: return True else: return bool(re.match(pattern, name)) def _mirror_ftp_dir(path_ftp, ftp_handle, name, overwrite, guess_by_extension, pattern): """ replicates a directory on an ftp server recursively """ for item in ftp_handle.nlst(name.encode('windows-1252').decode('utf-8')): if _is_ftp_dir(ftp_handle, item, guess_by_extension): _mirror_ftp_dir(path_ftp, ftp_handle, item, overwrite, guess_by_extension, pattern) else: if _file_name_match_patern(pattern, name): _download_ftp_file(path_ftp, ftp_handle, item, item, overwrite) else: # quietly skip the file pass def download_ftp_tree(path_ftp, ftp_handle, path, destination, pattern=None, overwrite=True, guess_by_extension=True): path = path.lstrip("/") original_directory = os.getcwd() # remember working directory before function is executed os.chdir(destination) # change working directory to ftp mirror directory _mirror_ftp_dir( path_ftp, ftp_handle, path, pattern=pattern, overwrite=overwrite, guess_by_extension=guess_by_extension) os.chdir(original_directory) # reset working directory to what it was before function exec #DE print("Rozpoczynam backup...") local_dir = "LOCAL_PATH_FOR_BACKUPS\\"+today.strftime("%d.%m.%Y") os.makedirs(local_dir) ftp.cwd("/domains/XYZXYZXYZ.PL/public_html/") path_ftp = "/domains/XYZXYZXYZ.PL/public_html/" download_ftp_tree(path_ftp, ftp, target_dir, local_dir) print("Backup skonczony.") ftp.quit() print("Koniec. Jest w pyte.")