В какой-то момент, в конторе, где я время от времени админю, понадобилось организовать резервное копирование содержимого 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 - пишите в телегу.