# -*- 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.")