Python FTP Backup Script

Mein Konzept und mein Code für eine bessere Backup Alternative.

Heute werde ich sehr viel Zeit damit verbringen, mich mit python zu beschäftigen. Ich benutze aktuell für das sichern der WordPress Webseiten updraft, jedoch hat dieses Plugin eine für mich sehr relevante schwachstelle. Es ist auf den Aufruf der Webseite gebunden. Das bedeutet, dass wenn eine Webseite nicht aufgerufen wird, updraft nicht läuft, was wiederum bedeutet, dass:

  • Entweder die Seite überhaupt nicht gesichert wird
  • Die Sicherung nicht beendet wird
  • oder die Sicherung nicht auf den Remote Server hochgeladen wird

Das letzte Problem ist für mich das ausschlaggebendste Grund. Weil wenn es nicht auf den Remote Server hochgeladen wurde, wird es auch nicht hochgeladen wenn irgendwann jemand die Seite besucht. Deswegen möchte ich ein Python Script schreiben, welches die ganzen Dateien lokal herunterlädt. Zukünftig soll dieser Script an einen git Server verknüpft werden, um Platz zu sparen, da dann nur die Änderungen gepusht werden…

hostname = 'ftpHost'
username = 'ftpUser'
password = 'ftpPass'
start_directory = '/'
backup_dir = './'

import ftplib
import os
import datetime

def get_files_directories():

    dirlisting = []

    ftp_obj.retrlines('LIST',callback=dirlisting.append)

    files = []
    directories = []

    for l in dirlisting:
        lastspace = l.rindex(' ')
        file_name = l[lastspace+1:]
        if l[0] == 'd' and file_name != '.' and file_name != '..':
            directories.append(file_name)
        elif l[0] == '-':
            files.append(file_name)

    return files,directories

def backup_directory(local_dir,remote_dir):

    os.chdir(local_dir)
    try:
        ftp_obj.cwd(remote_dir)

        print('In directory '+remote_dir)

        files,directories = get_files_directories()

        for f in files:
            print('Backing up '+f)
            try:
                ftp_obj.retrbinary('RETR '+f, open(f, 'wb').write)
            except ftplib.error_perm:
                print('Skipping '+f+' due to permissions')

        for d in directories:
            newremote = remote_dir+d+'/'
            newlocal = local_dir+'/'+d
            os.mkdir(newlocal)
            print(newlocal)
            backup_directory(newlocal,newremote)
    except:
        print('Skipping '+remote_dir+' due to permissions!!!!!')


os.chdir(backup_dir)
datestring = str(datetime.date.today())

os.mkdir(datestring)
os.chdir(datestring)
local_dir = os.getcwd()

ftp_obj = ftplib.FTP(host=hostname, user=username, passwd=password)

remote_dir = start_directory

backup_directory(local_dir,remote_dir)

ftp_obj.quit()

Dieser Script logt sich in den ftp Server ein, erstellt einen Ordner vom aktuellen Tag und geht alle Ordner auf dem ftp Server durch um alles herunter zu laden. Jetzt muss ich nur noch dafür sorgen, dass Änderungen erkannt werden und die Änderungen lokal auf den selben Ordner angewandt werden um die Änderungen in eine git Repository zu pushen.

Themen

Backup Python Technik WordPress

Beitrag teilen

WhatsAppen

Folgen Sie uns