20 июл. 2000 г.

Язык bash часть 4 (ssmtp)

Резервное копирование домашней папки на getdropbox.com, плюс отсылка логов об этом себе на почту через gmail.com


Цель данной работы — создать архив домашней папки пользователя, положить данный архив в какую-либо локальную папку, скопировать архив в папку dropbox, послать на нужную почту отчет об этом факте, воспользовавшись для этого SMTP-сервером gmail.com.

Я это делаю в ubuntu, но принципиальные отличия для других дистрибутивов будут разве что в установке ssmtp, в остальном отличий быть не должно.


0. Заводим себе аккаунт на getdropbox.com. Кстати — если уж будете регистрироваться, пожалуста, вспользуйтесь моей ссылкой:
getdropbox.com. Вам в этом случае сразу отпилят в виде бонуса +250 Мб (при регистрации «напрямую» этого не будет), и мне собственно — тоже, те же самые 250 Мб. Мелочь, а приятно — мегабайты лишними быть не могут.

1. Ставим ssmtp, при помощи которого будем отсылать почту:


root@sysadm-desktop:~# apt-get install ssmtp -y


2. Идем на gmail.com и заводим там себе аккаунт. У нас будет robot@gmail.com.
3. Идем в свою домашнюю папку, и смотрим, что нам нужно бэкапить, а что нет. В соответствии с этим составляем команду для архиватора. У меня вышло вот что:


tar czvf /tmp/sysadm.tar.gz /home/sysadm/.* /home/sysadm/* --exclude=.gvfs --exclude=В\ плеер --exclude=Видео --exclude=Nexuiz --exclude=VBox --exclude=video --exclude=. --exclude=.. --exclude=/home/sysadm/.thumbnails/

Я наисключал некоторые каталоги, которые слишком объемные, и данные из них в резервном копировании не нуждаются.

Запускаем, смотрим как оно отработало.


4. Настраиваем ssmtp.

root@sysadm-desktop:~# cat /etc/ssmtp/ssmtp.conf 
root=robot@gmail.com
mailhub=smtp.gmail.com:587
hostname=smtp.gmail.com:587
UseSTARTTLS=YESAuthUser=robot@gmail.comAuthPass=yarobotFromLineOverride=YES

root@sysadm-desktop:~# cat /etc/ssmtp/revaliases 
root:robot@gmail.com:smtp.gmail.com:587
sysadm:robot@gmail.com:smtp.gmail.com:587


В файле /etc/ssmtp/revaliases я описал двоих пользователей — от root будем выполнять собственно всю работу через crontab, а для sysadm — для проверки, ну и просто — пусть будет.

5. Проверяем, как все фурычит:


root@sysadm-desktop:~# echo "Test" | ssmtp sysadm@gmail.com


Идем в почтовый ящик sysadm@gmail.com, и в папке «Спам» находим свое письмо. Если находим — то все отлично работает! Что бы такие письма не попадали в спам, нужно создать фильтр, и применять на письма от robot@gmail.com какой-нибудь ярлык.

6. Пишем скрипт для всего того, что мы обозначили в самом начале.


root@sysadm-desktop:~# cat /etc/cron.daily/arc_sysadm 
#!/bin/bash

home_dir=/home/sysadm
tmp_dir=/home/sysadm/files
arc_dir=/home/sysadm/Dropbox/backups
arc_name=sysadm_backup.tar.gz
log=/root/log_arc.log
log_tar=/root/log_tar.log
log_tar_error=/root/log_tar_error.log
log_mail=/root/log_mail.log
# --------------------------------------------------------

echo_log ()
{
echo $(date '+%d-%m-%y %H:%M:%S') $1
echo $(date '+%d-%m-%y %H:%M:%S') $1 >> $log}
# --------------------------------------------------------

echo > $log
echo > $log_tar
echo > $log_mail
echo > $log_tar_error

echo_log "Резервное копирование начинается"


echo_log "home_dir="$home_dir
echo_log "tmp_dir="$tmp_dir
echo_log "arc_dir="$arc_dir
echo_log "arc_name="$arc_name
echo_log "log="$log
echo_log "log_tar="$log_tar
echo_log "log_tar_error="$log_tar_error
echo_log "log_mail="$log_mail

tar czvf $tmp_dir/$arc_name $home_dir/.* $home_dir/* --exclude=.gvfs --exclude=В\ плеер --exclude=Видео --exclude=Nexuiz --exclude=VBox --exclude=video --exclude=. --exclude=.. --exclude=/home/sysadm/.thumbnails/ 1>> $log_tar 2>> $log_tar_error

echo_log "Резервное копирование закончено"

echo "Subject: Резервное копирование домашней папки sysadm" >> $log_mail
echo >> $log_mail
cat $log >> $log_mail
echo >> $log_mail

echo === Error-лог tar-а: ================================ >> $log_mail
echo >> $log_mail
cat $log_tar_error >> $log_mail
echo >> $log_mail

echo === Лог tar-а: ===================================== >> $log_mail
cat $log_tar >> $log_mail

cat $log_mail | ssmtp sysadm@gmail.com

rm -f $arc_dir/$arc_name
cp $tmp_dir/$arc_name $arc_dir/$arc_name


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

Не забываем сделать:


root@sysadm-desktop:~# chmod +x /etc/cron.daily/arc_sysadm 


Наш скрипт будет выполняться раз в сутки.

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


 
Но кажется сдесь присутствующие не понимают как работает эта папочка "~/Dropbox"… Это же не файловая система, а тупо папка, поэтому свободное место там не посмотреть.
И еще вы забываете, что дропбох не удаляет файлы, когда вы их удаляете из этой папки или в вебморде самого дропбокса. Он их просто тупо скрывает, чтобы вы всегда могли их восстановить. Чтобы их удалить надо зайти в вебморду и выбрать режим «показывать удаленные файлы» (или как-то так), а потом уже удалять скрытые файлы. У меня как-то было, что залил я 3 файла по 600 метров, потом один удалил и решил залить другой, на гиг (у меня было 2.25 гига тогда), ан нифига, не вышло, места типа не хватает (через вебморду тогда лил). А вот когда этот скрытый файлик удалил, тогда все оке стало.
Хотя щас может уже и пофиксили, не знаю.

По скрипту (несколько «придирок»):
1. tmp_dir=/home/sysadm/files
Не понимаю, зачем временные файлы хранить в домашнем каталоге. Для них есть папка "/tmp". Просто так правильнее. А временные папки лучше делать так «tmp_dir=$(mktemp -d)», при этом папка т.ж. будет сразу создана и имя у нее будет уникальным.

2. Если мне не изменяет память, такая запись — "--exclude=file1;file2;path3" — тоже допустима (да и понятнее, имхо)

3. А нафига такой простенький скрипт выполнять от рута? Все можно сделать и от обычного пользователя! А в кроне можно задать имя юзера, от которого будет выполняться скрипт. Для этого в /etc/crontab надо добавить строку:

00 01   * * *   sysadm     /path/to/arc_sysadm
Теперь скрипт будет работать от юзера sysadm и запускаться каждый день в час ночи.

ЗЫЖ Есть классная команда «dropbox puburl ~/Dropbox/Public/FILE», которая возвращает URL к этому файлу ;)
ЗЗЫЖ В вики дропбокса есть скрипт на питоне Dropbox Linux CLI. У меня на убунте 9.04 и 8.10 он не заработал, ругался, что у меня плохой интерпретатор и он не может найти путь, хотя все другое работает на ура. Разбираться в чем дело не было времени. Упомянул я его потому, что мне что-то подсказывает, что через него можно будет узнать сколько места на дропбоксе осталось (хотя на все 100 сказать не могу).