Архив для ‘ Work ’ Категории

Mutt, ssmtp

Спасибо: http://habrahabr.ru/post/82919/ + afiskon + 
paskal

Mutt, ssmtp и отправка отчетов

В свое время, когда меня еще не было на Хабре, эта статья была опубликована в песочнице. К сожалению, она никому не понравилась и со временем была удалена. Долго думал, что с ней делать — забить, запостить таки на Хабре или в своем блоге Записки программиста. Решил, раз она писалась для Хабра, пусть на нем и будет опубликована. Итак, под катом — статья о практике отправки отчетов по e-mail. Сейчас, перечитывая текст, понимаю, что статья — не фонтан, но может кому-нибудь пригодится.

Часто передо мной встает задача вроде такой: необходимо ежемесячно (или еженедельно/ежедневно) обработать такие-то логи, построить по ним отчет и отправить его на заданный E-Mail. В этой статье я как раз хотел бы рассказать о второй части такой задачи, а именно об отправке отчетов. Казалось бы, такая рутинная операция, но трудности с ней возникают чаще, чем может показаться на первый взгляд.

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

Для отправки отчетов я пользуюсь mutt. В нем меня привлекает простота интерфейса, возраст (читай — стабильность) программы и то, что mutt портирован если не под все, то почти под все unix-like системы. В моей любимой FreeBSD искать его следует в /usr/ports/mail/mutt.

Чтобы при помощи mutt послать письмо с аттачем, достаточно команды

mutt -s Subject -a File User@Host.com

где Subject — тема сообщения, File — имя прикрепляемого файла, а User@Host.com — получатель письма. К письму можно прикрепить несколько файлов или указать несколько получателей. Текст письма программа читает из stdin.

По умолчанию mutt использует sendmail в качестве MTA. Обычно с этим не возникает трудностей — после установки mutt мы можем сразу приступить к написанию скриптов и все будет прекрасно работать. Но мне приходилось сталкиваться с ситуацией, когда посылка писем напрямую с сервера просто запрещена правилами фаервола. В этом случае следует использовать сторонний SMTP сервер.

Проблема в том, что mutt не имеет функций MTA, то есть работа с SMTP — не его задача. Тем не менее, можно научить его слать почту через заданный smtp-сервер и поможет ему в этом программа ssmtp.

Строго говоря, ssmtp является не MTA, а просто smtp-клиентом, эмулирующим работу sendmail. Если вы, как и я, пользуетесь FreeBSD, то можете поставить ssmtp из портов — /usr/ports/mail/ssmtp.

Настройка ssmtp производится путем редактирования файла /usr/local/etc/ssmtp/ssmtp.conf (в вашей ОС путь к файлу может быть другим). Вот как он примерно выглядит:

root=reports@example.ru # от чьего имени шлем письма
mailhub=smtp.example.ru:465 # smtp-сервер и порт
hostname=localhost # имя нашего хоста, желательно вписать верное
UseTLS=Yes # используем зашифрованное соединение
AuthUser=reports@example.ru # логин
AuthPass=qwerty # пароль
FromLineOverride=Yes # Поле From: может задавать mutt

Если вы хотите слать отчеты через Gmail, конфиг будет выглядеть немного иначе:

root=reports@gmail.com
mailhub=smtp.gmail.com:587
hostname=localhost
UseSTARTTLS=YES
AuthUser=reports@gmail.com
AuthPass=qwerty

Пытаемся послать тестовое письмо с помощью ssmtp:

echo "" | ssmtp -v -s Hello admin@example.ru

Если письмо успешно дошло, значит все было сделано правильно. Если ssmtp говорит нечто вроде:

. . .
[->] MAIL FROM:<root@localhost>
[<-] 573 root@localhost failed to route the address
ssmtp: 573 root@localhost failed to route the address

тоже не проблема, просто ssmtp указал неверный адрес отправителя, и smtp-сервер это заметил. Когда будем слать почту через mutt, все будет задано верно.

Чтобы mutt слал почту через ssmtp, в домашнем каталоге пользователя, от имени которого мы собираемся слать отчеты, нужно подправить файл .muttrc

set sendmail="/usr/sbin/ssmtp" # путь к ssmtp
set realname="Example Report System" # имя отправителя
set from="reports@example.ru" # e-mail отправителя

Проверяем работу mutt:

echo "" | mutt -s Hello admin@example.ru

Письмо должно успешно дойти до получателя. Если вы хотите использовать mutt в скриптах, запускаемых по крону, нужно иметь ввиду, что mutt находится в каталоге /usr/local/bin, который по умолчанию не прописан в переменную окружения PATH в вашем crontab. Решения два — либо исправить переменную окружения PATH в кронтабе, либо использовать полное имя mutt в скриптах.

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

Настройка Smtp Relay Server — Ssmtp

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

Обычно настраивается postfix или sendmail или ещё что-нибудь громоздкое. Я предлагаю вам вместо этого настроить smtp relay server, ssmtp, который предназначен именно для пересылки отправляемых писем на “большой” сервер —Яндекс почта для доменаGoogle Apps for domain, или просто почтовый аккаунт Gmail или Yandex, если вам потребуется посылать письма только себе.

Настройка на примере Ubuntu.

Сначала уставновим ssmtp и отредактируем revaliases. Вставьте либо секцию для gmail, либо секцию для yandex mail, заменив ubuntu на ваше имя пользователя, а sendlogs на имя пользователя почты. Если вы используете почту для домена, просто введите полное имя пользователя своего домена, например, noreply@realmfpa.ru. Ctrl+OEnter для сохранения, Ctrl+X для выхода.

sudo apt-get install ssmtp
sudo nano /etc/ssmtp/revaliases

#for yandex
root:sendlogs@yandex.ru:smtp.yandex.ru:465
ubuntu:sendlogs@yandex.ru:smtp.yandex.ru:465
#for gmail
root:sendlogs@gmail.com:smtp.gmail.com:587
ubuntu:sendlogs@gmail.com:smtp.gmail.com:587

Далее отредактируем ssmtp.conf. Вместо имеющегося текста вставьте приведенную здесь секцию general, и либо секцию для gmail, либо секцию для yandex mail. Советую использовать для учетной записи отправки почты пароль только из букв и цифр; мне не удалось заставить сервер понимать пароль со специальными символами — он выдавал ошибку при попытке отправить письмо.

sudo nano /etc/ssmtp/ssmtp.conf

#general
hostname=localhost
FromLineOverride=NO
AuthUser=yourrobotuser@domain.com
AuthPass=password
#for yandex
mailhub=smtp.yandex.ru:465
UseTLS=YES
#for gmail
mailhub=smtp.gmail.com:587
UseSTARTTLS=YES

Если вы хотите настроить отправку писем для своего веб-сайта, использующего php, сделайте следующие изменения в файле php.ini:

#for apache
sudo nano /etc/php5/apache2/php.ini
#for nginx and php-fpm
sudo nano /etc/php5/fpm/php.ini[/bash]

Найдите (Ctrl+W) строку sendmail_path (она задокументирована с помощью ;) и ниже неё вставьте:

sendmail_path = ssmtp -t

Вот и всё, вы и ваш сайт можете отправлять письма. Для тестирования можете создать и отправить тестовое письмо:

nano test

To:youraccount@gmail.com
From:yourrobotuser@domain.com
Subject: Test

This is a test mail.

ssmtp -t < test

Если вылезает такое: 
Сообщение отправить не удалось, процесс-потомок вернул 127 (Exec error.).
Сообщение отправить не удалось. 
Значит смотри пути к MTA агенту!

Также Была проблема
Отправить файл по почте из консоли
$ ls > file.txt
$ echo "Смотри вложение" | mutt -x -s "Метод 3" -a file.txt -- zendzirou@gmail.com

Элементарный способ настройки архивации в linux.
В качестве архиватора был выбран 7z, который присутствует как на unix, так и на ms системах, отлично сжимает, а кроме того ещё и бесплатен. Установка пакета производится командой:

sudo apt-get install 7z

Команда архивации, для добавления в cron:

7z -t7z -mx=9 -r -ssc a "имя-архива"-$(date +%Y-%m-%d_%H).7z "каталог-который-жмем"

После радуемся жизни.
Источник 1
Источник 2

Решил кроме простого архивирования добавить автоматическую отправку архивов по почте с помощью mutt, где столкнулся с проблемой.
В моём случае получилась следующая команда:

7z -t7z -mx=9 -r -ssc a /backups/$(date +%Y-%m-%d)/ip-$(date +%Y-%m-%d).7z /share/bases/1c_base/!bases/ip && 7z -t7z -mx=9 -r -ssc a /share/backups/$(date +%Y-%m-%d)/ooo-$(date +%Y-%m-%d).7z /share/bases/1c_base/!bases/ooo && 7z -t7z -mx=9 -r -ssc a /share/backups/$(date +%Y-%m-%d)/service-$(date +%Y-%m-%d).7z /share/bases/service_base/!base/ && mutt -s “Backup” -a /backups/$(date +%Y-%m-%d)/*-$(date +%Y-%m-%d).7z - pupkin@bk.ru backup_files_at_$(date +%Y-%m-%d)

Архивация проходит на ура, а вот в:

mutt -s “Backup” -a /backups/$(date +%Y-%m-%d)/*-$(date +%Y-%m-%d).7z - pupkin@bk.ru backup_files_at_$(date +%Y-%m-%d)

появилась такая проблема:

Не удалось получить информацию о -: Нет такого файла или каталога
-: не удалось вложить файл.

Предполагаю, что ошибка кроется в маске для файлов вида

*-$(date +%Y-%m-%d).7z

, но если не так, то тогда как? О.о

Он ругается не на имя файла, а на ‘-‘ после имени
Поставь после файла не «-«, а «—»

mutt -s “Backup” -a /backups/$(date +%Y-%m-%d)/*-$(date +%Y-%m-%d).7z -- pupkin@bk.ru backup_files_at_$(date +%Y-%m-%d)
zhekas, спасибо, оно самое. 

Еще 
mkdir -v /var/log/mutt
mkdir -v /var/spool/mutt
: > /var/log/mutt/mail
: > /var/log/mutt/sent
: > /var/log/mutt/postponed
: > /var/spool/mutt/mail
chmod -R 644 /var/log/mutt
chown -R root.root /var/log/mutt
chmod 755 /var/log/mutt
chown root.root /var/spool/mutt
chown root.root /var/spool/mutt/mail
chmod 755 /var/spool/mutt
chmod 644 /var/spool/mutt/mail

и добавляем в /root/.murrrc 

set folder=«/var/log/mutt/mail»
set spoolfile=«/var/spool/mutt/mail»
#set record=«/var/log/mutt/sent» - если добавить то не отправляет....
set postponed=«/var/log/mutt/postponed»

Конечный мой вариант:
/etc/ssmtp/ssmtp.conf
#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=vash@domen.ru

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.yandex.ru:465

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=Server

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

UseTLS=Yes
AuthUser=info@jhfkjhgkutsikhgruck.ru
AuthPass=75486jfhfk
FromLineOverride=Yes
/etc/ssmtp/revaliases
# sSMTP aliases
#
# Format:       local_account:outgoing_address:mailhub
#
# Example: root:your_login@your.domain:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.
#for yandex
root:mail@domen.ru:smtp.yandex.ru:465
/root/.muttrc
set sendmail="/usr/sbin/ssmtp"
set realname="Daily Sale Report"
set from="info@jhfkjhgkutsikhgruck.ru"
set folder=«/var/log/mutt/mail»
set spoolfile=«/var/spool/mutt/mail»
#set record=«/var/log/mutt/sent»
set postponed=«/var/log/mutt/postponed»
/etc/weekly_report_usa
#!/bin/bash
if [ -d /mnt/0000000000/smsgate/ ]; then
echo "Existing buffer directory" | tee /var/log/mail.log
else
mkdir -p -m 777 /mnt/0000000000/smsgate/
echo "Created buffer created" | tee /var/log/mail.log
fi
echo "Send mail to xxx@xxx.com, yyy@yyy.ru" | tee /var/log/mail.log
echo "" | mutt -x -s "Weekly Report UTS" -a /mnt/0000000000/smsgate/WeeklyReport.xls -- xxx@yyy.com
echo "" | mutt -x -s "Weekly Report UTS " -a /mnt/0000000000/smsgate/WeeklyReport.xls -- xxx@yyy.ru
echo "Remove report.XLS file"
rm /mnt/0000000000/smsgate/WeeklyReport.xls

/etc/crontab

0 /2 * * 1 root /bin/bash /etc/weekly_report_usa

 

NTP

Настраиваем в локальной сети сервер точного времени NTP

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

Наиболее популярной программой сервера точного времени является демон ntpd из пакета ntp. Ntp обычно устанавливать не требуется, программа уже входит в минимальный набор программ устанавливаемый вместе с системой.

Конфигурация сервера достаточно проста — создаем файл /etc/ntpd.conf с таким содержимым


#сервера синхронизации времени. 0 сервер выбран основным
server 0.pool.ntp.org iburst prefer
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst

#Файл смещения - корректирует отклонение времени системных часов
driftfile /var/db/ntpd.drift
#логфайл демона ntpd
logfile /var/log/ntp.log

#разрешаем доступ на изменение времени через локальный интерфейс
restrict 127.0.0.1
# Разрешаем менять наше время с серверов с которыми сверяемся
restrict 0.pool.ntp.org noquery notrap
restrict 1.pool.ntp.org noquery notrap
restrict 2.pool.ntp.org noquery notrap
restrict 3.pool.ntp.org noquery notrap

#сервер времени может принимать запросы только из локальной сети
restrict 192.168.0.0 mask 255.255.0.0 nomodify notrap nopeer

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

Вот и вся настройка, от root или sudo запускаем сервер, если он не был запущен


#ntpd -c /etc/ntp.conf

если был запущен, как это обычно бывает в debian и ubuntu — перезапускаем ntpd


#sudo /etc/init.d/ntp restart

Убедимся что в логе /var/log/ntp.log нет ошибок и демон корректно запустился. Теперь надо подождать минут 15-20, пока пройдет полная синхронизация времени между вашим сервером и серверами интернет.
Проверяем сервера синхронизации. «+» показывает тот сервер с которым в последний раз была синхронизация


# ntpq -c peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*host-81.200.8.2 82.219.4.31      3 u   41  256  377   25.596   -3.286   0.181
+ns.mipt.ru      62.117.76.138    2 u  117  128  377   16.996    0.371   0.331
-95.140.94.2     193.79.237.14    2 u  111  128  377    9.457    5.808   0.349
+ddt2.static.cor 192.36.143.151   2 u  108  128  377   51.185   -5.608   1.775

Запрос на синхронизацию с самим собой


#ntpdate -q localhost
server 127.0.0.1, stratum 4, offset -0.000003, delay 0.02562
27 Sep 17:16:23 ntpdate[16306]: adjust time server 127.0.0.1 offset -0.000003 sec

Самой лучшей проверки работы сервера времени будет успешная синхронизация времени клиентского компьютера. Для клиентов ОС unix выполняем команду от root или sudo


#ntpdate <сервер времени>
например
# ntpdate gw
27 Sep 15:44:15 ntpdate[32159]: adjust time server 192.168.0.1 offset -0.272284 sec

Сервер работает и отдает правильное время — задача выполнена. Добавим загрузку демона в стартовые скрипты ОС и при необходимости открываем порт 123 udp.
Для FreeBSD


add pass udp from any to me 123 via <интерфейса_нашего_сервера>
add pass udp from me 123 to any via <интерфейса_нашего_сервера>

Для Linux


#пердполагается что все исходящее у нас разрешено по умолчанию
iptables -A INPUT -p udp -s 0/0 --sport 123 -d <ip_интерфейса_нашего_сервера> \
 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT

В большинстве linux дистрибутивов что-то дополнительно для прописывания в запуск не требуется, это делается автоматически при установке пакета ntp.
Для FreeBSD добавим в /etc/rc.conf


ntpd_enable="YES"
ntpd_config="/etc/ntp/ntp.conf"
ntpd_sync_on_start="YES"

Для сети с доменом из win машин в GPO AD указываем включение сервиса времени на всех ПК, и указать сервер с кем синхронизироваться.

Спасибо: http://ruunix.ru/1231-nastraivaem-v-lokalnoj-seti-server-tochnogo-vremeni.html

Windows server 2003

regedit > HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers

Сервер синхронизации времени ntp может работать на Windows 2000, Windows XP Prof, Windows Server 2003/2008 .

Итак, приступаем к настойке.

Начнем с ОС Windows XP Prof (Windows XP Home — то же самое).

Открываем реестр — Пуск -> выполнить -> regedit
идем в ветку:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControl\Set\Services\W32Time\Config

присваеваем параметру AnnounceFlags значение 5. Тем самым мы обьявим наш будущий NTP сервер, достоверным и компьютеры при синхронизации с ним не будут ругаться.
Далее Пуск -> выполнить -> mmc и добавляем оснастку «Редактор обьекта групповой полтики». Обьектом группвой политики выступит Локальный компьютер.

Идем по разделам Конфигурация компьютера -> Администрантивные шаблоны -> Система -> Служба времени Windows -> Поставщики времени. Там находим «Включить Windows NTP-сервер» и в свойствах выбираем позицию «включить». В заключении проходим в Службы, ищем «Служба времени Windows» и перезапускаем этот сервис. Если он не включен, то включаем его и ставим тип запуска «Авто».

Кроме этого на раздающем сервере необходимо изменить интервал через который он сам будет ходить в инет за временем.
Открываем реестр — Пуск -> выполнить -> regedit
идем в ветку:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\
NtpClient\SpecialPollInterval

По умолчанию интервал между обновлениями времени в Windows – 1 неделя (604800 сек). При низкой точности системных часов компьютера это слишком большой интервал. При такой настройке за 1 неделю часы Вашего компьютера могут получить погрешность величиной порядка минуты или даже нескольких минут. Рекомендую уменьшить интервал обновления до нескольких часов. Это изменение не увеличит ни трафика, ни нагрузки на NTP-сервер, при этом позволит поддерживать более высокую точность хода часов Вашего компьютера.

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

w32tm /config /update

И при необходимости выполнить немедленную синхронизацию

w32tm /resync

На этом настройка сервера закончена.

На клиентских компьютерах следуем в «Панель управления», тыкаем в «дата и время» и в закладке «Время интернета» меняем строку сервер на свой локальный сервер.
Вот и все.

Можно раскидать батник на рабочие станции:
w32tm /config /manualpeerlist:IP_адрес_сервера,0x1 /syncfromflags:MANUAL
net stop w32time
net start w32time
w32tm /resync

И запускаем его на клиентских машинах с правами Администратора.

Спасибо: http://www.korolevskiy.com/blog/90-server-sinxronizaczii-vremeni-v-lokalnoj-seti-windows.html

Debian 7 Long Live!!!

My Debian