Facebook
From Rider7991, 4 Years ago, written in Python.
Embed
Download Paste or View Raw
Hits: 151
  1. # -*- coding: utf-8 -*-
  2. from ftplib import FTP
  3. import os
  4. from datetime import date
  5. import re
  6. import socket
  7. import threading
  8. import io
  9.  
  10. today = date.today()
  11.  
  12. ftp = FTP('SERVER IP', 'LOGIN', 'PASS', '', TIMEOUT)
  13. print("Zalogowano.")
  14. ftp.set_debuglevel(2)
  15. ftp.encoding = 'windows-1252'
  16. ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
  17. ftp.set_pasv(True)
  18. target_dir = "wp-content/"
  19.  
  20. def _is_ftp_dir(ftp_handle, name, guess_by_extension=True):
  21.     if name[-1] == '.':
  22.         return False
  23.  
  24.     original_cwd = ftp_handle.pwd()
  25.     try:
  26.         ftp_handle.cwd(name)
  27.         ftp_handle.cwd(original_cwd)
  28.         return True
  29.  
  30.     except:
  31.         return False
  32.  
  33. def _make_parent_dir(fpath):
  34.     """ ensures the parent directory of a filepath exists """
  35.     dirname = os.path.dirname(fpath)
  36.     while not os.path.exists(dirname):
  37.         try:
  38.             os.makedirs(dirname)
  39.             print("Utworzono {0}".format(dirname.encode('windows-1252').decode('utf-8')))
  40.         except OSError:
  41.             _make_parent_dir(dirname)
  42.  
  43.  
  44. def _download_ftp_file(path_ftp, ftp_handle, name, dest, overwrite):
  45.     """ downloads a single file from an ftp server """
  46.     _make_parent_dir(dest.lstrip("/"))
  47.     if name[-1] == '.':
  48.                 return False
  49.     if not os.path.exists(dest) or overwrite is True:
  50.         try:
  51.             print("Pobieram: {0}".format(dest.encode('windows-1252').decode('utf-8')))
  52.             with open(dest.encode('windows-1252').decode('utf-8'), 'wb') as f:
  53.                 ftp_handle.retrbinary("RETR "+dest, f.write) #HERE I GOT THE ERROR, EVEN WHEN I USE dest.encode('windows-1252').decode('utf-8')
  54.                 print("Pobrano: {0}".format(dest.encode('windows-1252').decode('utf-8')))
  55.         except FileNotFoundError:
  56.             print("FAILED: {0}".format(dest.encode('windows-1252').decode('utf-8')))
  57.     else:
  58.         print("already exists: {0}".format(dest.encode('windows-1252').decode('utf-8')))
  59.  
  60.  
  61. def _file_name_match_patern(pattern, name):
  62.     """ returns True if filename matches the pattern"""
  63.     if pattern is None:
  64.         return True
  65.     else:
  66.         return bool(re.match(pattern, name))
  67.  
  68.  
  69. def _mirror_ftp_dir(path_ftp, ftp_handle, name, overwrite, guess_by_extension, pattern):
  70.     """ replicates a directory on an ftp server recursively """
  71.     for item in ftp_handle.nlst(name.encode('windows-1252').decode('utf-8')):
  72.         if _is_ftp_dir(ftp_handle, item, guess_by_extension):
  73.             _mirror_ftp_dir(path_ftp, ftp_handle, item, overwrite, guess_by_extension, pattern)
  74.         else:
  75.             if _file_name_match_patern(pattern, name):
  76.                 _download_ftp_file(path_ftp, ftp_handle, item, item, overwrite)
  77.             else:
  78.                 # quietly skip the file
  79.                 pass
  80.  
  81.  
  82. def download_ftp_tree(path_ftp, ftp_handle, path, destination, pattern=None, overwrite=True, guess_by_extension=True):
  83.     path = path.lstrip("/")
  84.     original_directory = os.getcwd()  # remember working directory before function is executed
  85.     os.chdir(destination)  # change working directory to ftp mirror directory
  86.  
  87.     _mirror_ftp_dir(
  88.         path_ftp,
  89.         ftp_handle,
  90.         path,
  91.         pattern=pattern,
  92.         overwrite=overwrite,
  93.         guess_by_extension=guess_by_extension)
  94.  
  95.     os.chdir(original_directory)  # reset working directory to what it was before function exec
  96.  
  97. #DE
  98. print("Rozpoczynam backup...")
  99. local_dir = "LOCAL_PATH_FOR_BACKUPS\\"+today.strftime("%d.%m.%Y")
  100. os.makedirs(local_dir)
  101. ftp.cwd("/domains/XYZXYZXYZ.PL/public_html/")
  102. path_ftp = "/domains/XYZXYZXYZ.PL/public_html/"
  103. download_ftp_tree(path_ftp, ftp, target_dir, local_dir)
  104. print("Backup skonczony.")
  105. ftp.quit()
  106. print("Koniec. Jest w pyte.")
captcha