Next Previous Contents

Один из способов - это использование lock-файлов. Идея состоит в следующем: вы создаёте скрипт, который будет поднимать ppp-интерфейс. При этом скрипт прописывает в lock-файле признак того, что этот сеанс связи с Интернет инициирован программой проверки почты/новостей или интерфейс просто поднят для работы в Интернет (сёрфинг, icq и т.д.) Скрипт /etc/ppp/ip-up.local, который запускается после того как связь установлена, содержит проверку lock-файла и поступает соответственно. Если связь была прервана в процессе приёма-передачи почты/новостей, то скрипт /etc/ppp/ip-up.local закончит свою работу обычным образом и, когда в следующий раз ppp-интерфейс будет повторно поднят, снова попытается отправить и принять почту/новости.

Если вы ещё помните, то я советовал вам создать два скрипта для подключения и отключения от Интернет. Пришло время их создать. Назовём их inet_on и inet_off и разместим в каталоге /etc/ppp.

/etc/ppp/inet_on: #!/bin/bash echo $1 > /etc/ppp/inet.lock /sbin/ifup ppp0 exit $?
/etc/ppp/inet_off: #!/bin/bash /sbin/if-down ppp0 exit $?

Как видите скрипт inet_on прописывает в файле /etc/ppp/inet.lock значение аргумента номер 1 из командной строки (не забудьте присвоить соответствующие права на запись lock-файлу). Если вы запускаете inet_on без ключа, то в lock-файл прописывается пустышка, иначе тот ключ, который вы укажете. Можно построить несколько ключей: только для отправки почты, только для приёма почты, только для новостей или общий ключ для всего вышеперечисленого. Я использую только один ключ (обозвал его fullchk), который заставляет принимать и отправлять почту.

Итак, наш скрипт /etc/ppp/ip-up.local приобретает более-менее законченный вид:

#!/bin/bash exec >/etc/ppp/ip-up.log exec 2>&1
# эта последовательность заставляет выводит корректно кириллицу на 11-й # консоли echo -ne "\033(K" >/dev/tty11 /usr/bin/open -c 11 -- tail --sleep-interval=1 -f /etc/ppp/ip-up.log
date
INET_MODE=`cat /etc/ppp/inet.lock`
if [ "$INET_MODE" = "fullchk" ]; then echo -e "\nРежим приёма-передачи почты..."
PATH="$PATH:/usr/local/bin"
/usr/local/bin/maildirsmtp /var/qmail/alias/pppdir alias-ppp- \ smtp.myisp.com `hostname`
echo -e "\nПроверка почты пользователя <alex>..." su alex -c /usr/lib/getmail/getmail
echo -e "\nПриём новостей с <news.myisp.com>..." su news -c /usr/local/sbin/fetchnews
/sbin/ifconfig ppp0 > /dev/null PPP_OK=$?
if [ "$PPP_OK" = 0 ]; then echo -e "\nПриём-передача почты завершена..." /etc/ppp/inet_off else echo -e "\nОшибка. Обрыв связи..." fi else echo -e "\nРежим выхода в Интернет..." fi
date cat /etc/ppp/ip-up.log >>/etc/ppp/ip-up.log.arch exit 0

Недостатком этого метода можно считать привязку к конкретному интерфейсу - ppp0. Если вам нужно что-то более сложное, то прочтите man по pppd, раздел SCRIPTS, там описаны перменные среды которые создаёт pppd. Ими можно воспользоваться из /etc/ppp/ip-up или /etc/ppp/ip-up.local.

Эта проблема решена в программе fetchmail (ключ -e). Если вы являетесь поклонником этой программы, то ничто не мешает вам использовать её. Возможностей этой программы хватит на пять таких программ, как getmail. Чего стоит один только список поддерживаемых протоколов: POP2, POP3, APOP, RPOP, KPOP, SDPS, IMAP. Достоинство же getmail в простоте. В любом случае, решать вам, что вы будете использовать, т.к. любая программа-аналог fetchmail или getmail, используя почтовые фильтры procmail или maildrop, может доставлять почту в ящики любого формата (mailbox или maildir).

Программа getmail возможностью отключения и подключения снова к pop3-севреру не обладает, но если хотите, то можете воспользоватся заплаткой, которая позволяет это сделать и заодно исправляет ошибку скрипта getmail - он возвращает неправильный код завершения getmail. Код всегда равен 0. Вот два патча на версию 2.1.1 [1] и 2.1.9 [2]. Для того, чтобы воспользоваться этой возможностью, вы дожны добавить в конфигурационный файл ~/.getmail/getmailrc опцию

size_commit = _размер_в_байтах_

Эта опция позволит отключаться от pop3-сервера после того, как размер принятых сообщений превысит величину _размер_в_байтах_ и подключаться снова. Если size_commit = 0, то getmail забирает почту за один раз.

Вот и всё. Если кто-то имел терпение дочитать всё это до конца - удачи! 8-)

Александр Куприн. ru_classic@mail.ru


Next Previous Contents
Используются технологии uCoz