Pull to refresh

100500-й способ резервного копирования

В какой-то момент, в конторе, где я время от времени админю, понадобилось организовать резервное копирование содержимого NAS сервера.

Во-первых, любое железо имеет свойство умирать. Во-вторых, зловреды в лице шифровальщиков-вымогателей не зря получают свои биткойны. Не то, чтобы инфа у нас была суперконфиденциальная, однако терять все равно не хотелось.

В общей папке каждый день сидело десятка полтора юристов, которые скидывали в нее рабочие документы. Таким образом, общая папка (по нашей внутренней терминологии "Хранилище") - это сердце компании, ну или его склад.

Ежедневно получая новости о том, что в той или иной компании были зашифрованы рабочие документы (и имея печальный опыт у другого клиента, где был уплачен выкуп в размере 500$, но после его отправки дешифратор так и не был получен) я решил не ограничиваться только одной копией.

Схема была придумана следующая: локальный комп каждый день сканирует хранилище на предмет измененных файлов и если находит таковые, то копирует их себе на жесткий диск. В свою очередь, на нем же, установлена программа ЯндексДиск, где арендован 1 террабайт места. Нам нужна была поддержка истории изменений файла. А такие возможности есть только на платных тарифах. Да и тех 15 Гб, которые выдаются по умолчанию нам бы все равно не хватило.

Решено было писать скрипт на Python, который обходит заданные папки и просто копирует файл себе, если его раньше не существовало или, если он был изменен с момента последнего обхода.

Ну и раз уж мы пишем свою программу, то почему бы не добавить в нее функцию отправки отчета, когда операция по бэкапу завершена.

Ниже полностью функциональный скрипт по резервному копированию и отправке уведомлений на электронную почту. Данные для доступа к ящику (от mail.ru) подставляйте свои.

Для копирования используется модуль dirsync

import smtplib
from dirsync import sync
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

#Список исходных каталогов, дополнительный слэш нужен для экранирования       
source_list_path = ['E:\\folder1','E:\\folder2', 'E:\\folder3'] 

#Каталог для бэкапа
target_path = 'E:\\YandexDisk\\backup'

#Цикл обхода
for i in source_list_path:
    sync(i, target_path, 'sync')

## Данные для входа в ящик с которого будут уходить отчеты
from_email = 'my_backup@mail.ru'
password = 'U]tf3afasfQ@2'

msg = MIMEMultipart()

message = 'Синхронизация данных в CompanyName завершена'
msg.attach(MIMEText(message, 'plain'))
server = smtplib.SMTP('smtp.mail.ru: 587')
to_email = 'my_email@mail.ru' #Ящик на который будут уходить отчеты

server.starttls()
server.login(from_email, password)
server.sendmail(from_email, to_email, msg.as_string())
server.quit()

Надеюсь, что гуру пайтона не будут меня сильно ругать, если можно было найти более элегантное решение. Все-таки, изучать язык я начал недавно - когда началась пандемия, да и то, в качестве хобби.

Через сервис sms.ru у меня подключена услуга email2sms, когда ты отправляя электронное письмо на заранее заданный ящик, получаешь текст письма себе на телефон в виде СМС.

Очень удобно как раз для таких штук, тем более, что до 5 смс в день это бесплатно. Главное, нужно настроить адрес с которого будет приходить письмо и обязательно указать свой номер для уведомлений.

Сам скрипт можно засунуть в bat файл и запускать через планировщик заданий, либо через автозапуск компьютера.

Вот в принципе и все. Рад, если данный текст вам помог.

P.S.: если вам или вашим знакомым нужен стажер или джун по направлению Python - пишите в телегу.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.