+7 (927) 984-30-02

Python резервное копирование на FTP

05 июня 2024 г.
Python резервное копирование на FTP

    Всегда приходится делать резервное копирование на внешний ресурс. Ниже представлен простой скрипт для резервного копирования на внешний FTP ресурс.

    Скрипт написан на Python3

    #!/usr/bin/python3
    
    # -*- encoding: utf-8 -*-
    
    import zipfile, os, sys
    import datetime
    import io
    import shutil
    import ftplib
    import datetime
    
    host = 'прописать хост'
    user = 'Логин'
    password = 'Пароль'
    
    # Сколько копий хранить на FTP
    max_files = 5
    # Папка которую архивируем, либо несколько папок через запятую
    backup_dir = ['C:/Program Files (x86)/7-Zip']
    # Рабочий каталог в котором исполняемый файл тут же временный архив
    work_dir = 'D:/PythonProjects/FTPBackup/'
    # Текущая дата для архива
    now = datetime.datetime.now()
    print(os.path.join(backup_dir[0]))
    
    if __name__ == '__main__':
        print("ZIP to FTP Backup Tool")
        print("v1.0 - Andrey Garkin")
        print("a.garkin@itlab73.ru")
        print("\n====================")
    
        def progress():
            def callback(block):
                callback.uploaded += len(block)
                print('Upload %d bytes' % callback.uploaded)
            callback.uploaded = 0
            return callback
    
        # Функция удаления файлов
        def remove_old():
            #Удалить все старые файлы
            all_files = [x for x in ftp.nlst()]
            diff = len(all_files) - max_files
            if diff > 0:
                for file in all_files[:diff]:
                    ftp.delete(file)
        """
        def zip_directory(folder_path, zip_file):
            for folder_name, subfolders, filenames in os.walk(folder_path):
                for filename in filenames:
                    # Создаем полный путь до файла
                    file_path = os.path.join(folder_name, filename)
                    # Добавляем файлы в архив
                    zip_file.write(file_path)
        print("Create archive")
        zip_file = zipfile.ZipFile(work_dir + 'backup-' + now.strftime("%d-%m-%Y-%H-%M-%S") + '.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
        zip_directory(backup_dir, zip_file)
        # Закрываем архив
        zip_file.close()
        """
    
        def zip_directory(backup_dir, zip_file):
            for folder in backup_dir:
                for dirpath, dirnames, filenames in os.walk(folder):
                    for filename in filenames:
                        # Добавляем файлы в архив
                        zip_file.write(os.path.join(dirpath, filename), os.path.relpath(os.path.join(dirpath, filename), os.path.join(backup_dir[0], '../..')))
            # Закрываем архив
            zip_file.close()
    
        print("Create archive")
        zip_file = zipfile.ZipFile(work_dir + 'backup-' + now.strftime("%d-%m-%Y-%H-%M-%S") + '.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
        zip_directory(backup_dir, zip_file)
    
        print("\n=====")
        print("Connect to FTP server...")
        ftp = ftplib.FTP(host)
        print("Login to FTP server...")
        ftp.login(user,password)
        ftp.cwd('files')  # переходим в директорию files
        print("Get directories...")
        ftp.retrlines('LIST')
    
        print("Upload archive...")
    
        try:
            # get all files inside a specific folder r'D:\\PythonProjects\\FTPBackup'
            dir_path = work_dir
            for file in os.listdir(dir_path):
                if file.endswith(".zip"):
                    fullname = os.path.join(file)
                    print(fullname)
            ftp.storbinary('STOR ' + fullname, open(fullname, 'rb'), 8192, progress())
            print("Upload successful!")
    
            # Удаление файлов
            remove_old()
    
        except ftplib.all_errors as e:
            print(e)
            error = True
    
        print("Connection close...")
        ftp.close()
        print("Remove local archive...")
        os.remove(dir_path + fullname)
    
        # Для отладки видеть что происходит. На боевом отключить
        # Python 2
        # raw_input("Press enter to exit:")
        # Python 3
        input("Press enter to exit:")
    

    Если вдруг у Вас возникнут сложности с настройкой резервного копирования, Вы всегда можете обратиться ко мне за консультацией.


    Благодарность за статью 100 рублей.