Python-рецепты. E-mail и backup.


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

  1. блог ориентирован на python-программистов;
  2. используя питон в качестве основы, мы получаем практически безграничный потенциал для дальнейшего усовершенствования скрипта;
  3. заодно рассмотрим возможности питона при работе с электронной почтой.

Итак, суть проблемы и ее предыстория. Как я уже говорил, у меня на «иждивении» находится интернет-проект, который (как я планирую) будет моим основным источником дохода. В сети недавно, еще не раскручен, клиентская база только начинает набираться – вот в принципе и все что можно сказать о проекте на данный момент. Запущен он на средненькой VDS-ке у одного очень нехорошего хостера (воздержусь от конкретных имен, так как черный пиар все равно остается пиаром): в начале недели по его вине моей VDS-ке пришел «пушной зверек». Без возможности восстановления. Данные двух клиентов (в MySQL-базе) были безвозвратно утеряны.

Так как проект коммерческий, утеря данных абсолютно недопустима. Поэтому, тщательно поматерившись, я решил организовать систему автоматического резервного копирования. Заниматься этим мне приходится впервые, но читать длинные мануалы о бэкапах совсем не охота: попробую изобрести велосипед :) .

Подробные условия задачи:  скрипт должен архивировать каталог с файлами (медиаданные), делать бэкап БД и тоже архивировать, отправлять архивы на мейл с темой письма в виде даты.

Исходный код скрипта с комментариями:

# -*- coding: utf-8
import os
import time
from smtplib import SMTP
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import Encoders

# от кого и кому отправлять 
fromaddr = "from@rambler.ru"
toaddr = "to@yandex.ru"

# дамп БД и медиафайлы сжимаем в файл buckup.tar.gz
os.system("mysqldump -u [пользователь] --password=[пароль] [БД] [таблица1] [таблица2]> dump.sql")
os.system("tar -zcf backup.tar.gz dump.sql [путь к каталогу с медиа файлами]")

# создаем почтовое сообщение
msg = MIMEMultipart()
# заполняем поля отправителя, адресата и тему сообщения
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = 'backup '+time.asctime()

# текстовая часть сообщения (не забываем указать кодировку)
msg.attach(MIMEText("Текстовое вложение", "plain", "utf-8"))

# прикрепляем файл backup.tar.gz к почтовому сообщению
att = MIMEBase('application', 'octet-stream')
att.set_payload(open("backup.tar.gz", "rb").read())
Encoders.encode_base64(att)
att.add_header('Content-Disposition', 'attachment; filename="backup.tar.gz"')
msg.attach(att)

# соединяемся с почтовым сервером и выполняем авторизацию
server = SMTP('mail.rambler.ru', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login("почтовый логин", "пароль")

# отправляем сформированное сообщение, после чего выходим
server.sendmail(fromaddr, toaddr, msg.as_string())
server.quit()

Ставим скрипт в cron и отдыхаем :)

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

P.S. Разумеется в скрипт для стабильности нужно добавить конструкцию try…except и при невозможности отправки почты через определенный временной промежуток повторить отправку.

, ,



  1. #1 by alex on 14 Ноябрь 2010 - 17:49

    согласен что пайтон лучше всего для скриптинга. имхо, лучше не на мыло, а делать коммит на секурный сервер, например типа svn, bzr, git… мусора на почте нет, а на секурном сервере можно завести миррор-бекап.

    • #2 by toly on 15 Ноябрь 2010 - 12:32

      Мне нужно было рассмотреть отправку почты с вложениями с помощью питона.

(никто не узнает)