Вся система стартуется ppp-on а дальше из него : redialer и dial_up_services доки по модулям которые юзаются ниже... ------------------------------------------------------------------------------- NAME InMail DESCRIPTION модуль для скачивания почтовых сообщений по протоколу pop3 SYNOPSIS * init($file_name,$all_user) - создает объект $file_name - файл конфигурации $all_user - Если один то не производит разбор по опциям, правилам, времени. Используется в программе конфигурирования... * get_from_pop3($self,$user_name) - забирает почту пользователя $self - объект возвращенный init $user_name - имя пользователь чью почту скачивать CONFIG FILE - Секция CFG STATISTIC_LOG - Имя и путь к файлу статистики MESSAGE_LOG - Имя и путь к файлу с отладочной информацией TMP_DIR - Темп директория SPOOL - Директория для хранения почтовых ящиков BLOCK_READ - Читать сообщения построково - 0 Читать сообщения блочно - 1 1 - работает с глюками... - Секция SERVERS SERVERS - Имя сервера MIN_CPS - Минимальный CPS с сервером (надо для таймаута) TIME_OUT - Тайм аут по умолчанию LOCAL_HOST - IP локального хоста (если не динамический) PORT - Порт удаленного сервера DEVICE - Имя сетевого интерфейса,если не undef то LOCAL_HOST берется с этого устройства. INIT_CNT - Число попыток инициализации сетевого интерфейса INIT_SLEEP - Промежуток времени при инициализации сетевого интерфейса DEBUG - Уровень отладки (0 || 1 || 2) - Секция USERS USERS - Имя пользователя (полное те gosha@ms.com) PASS - Пароль OPTIONS - Опции MAX_LENGTH_ALL - Максимальная длина сообщений в КБ MAX_LENGTH_MSG - Максимальная длина одного сообщения MBOX - Файл почтового ящика относительно {SPOOL} - Секция RULES RULES - Имя пользователя для которого данное правило SET_RULE - _опции_через_запятую_ _имя_файла_почтового_ящика_ ... - Сами регэкспы Опции: DEF - по умолчанию те качается все письма без проверки TOP_O - скачивается только заголовок для скачивания письма целиком можно использовать секцию RULES TOSS - скачать письмо если оно соответствует образцу в SET_RULE TOSS=xxx - скачать письмо если оно соответствует образцу в SET_RULE и размер сообщения не больше xxx килобайт STAT_O - только статистика SKIP - пропустить пользователя CLEAR - удалить сообщения из почтового ящика LOGIN_O - только проверяет пароль NO_DEL - не удалять сообщение из ящика DELE - удалить сообщение ! Опций может быть несколько (через запятую) те например: TOSS=500,NO_DEL ! Заголовок содержится в переменной $_ - Секция WORK_TIME WORK_TIME - Время когда скачивать письма... Формат: WORK_TIMES gosha@alisa.prv.nnov.ru * : 2..59 : 8..23,0,1 : * : * : * : * : * : * : = 20 = = * : 2..59 : 2..7 : * : * : * : * : * : * : = 10 = TOP_O = т.е. 3 поля через '=' 1 - образец времени 2 - размер сообщений 3 - опции 4 - почтовый ящик формат даты через ':' 0 1 2 3 4 5 6 7 8 $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst EXAMPLE use DialUp::InMail; my $self1 = DialUp::InMail->init($ARGV[0]); foreach (keys %{$self1->{USERS}} ) { next if /DEFAULT/; &my_warn("Пользователь : $_ (OPTIONS = '$self1->{USERS}->{$_}->{OPTIONS}')",0); $self1->get_from_pop3($_); } &my_warn("Скачено $self1->{CFG}->{TOSS_MSG_CNT} из"); &my_warn(" $self1->{CFG}->{ALL_MSG_CNT} сообщений,"); &my_warn(" $self1->{CFG}->{RECV_SIZE} байт",0); &my_warn("Отправлено $self1->{CFG}->{SENT_SIZE} байт",0); REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME InNews DESCRIPTION модуль для скачивания сообщений из NEWS конференций SYNOPSIS * init($file_name,$bool,$math,$all_group) - создает объект $file_name - Имя файла конфигурации $bool - Если 1 то не производится настройка текущих сообщений $math - Число. Количество сообщений из конфига умножается на это число и получаем текущее значение сообщений подлежащих скачиванию в данной сессии. $all_group - Если один то не производит разбор по опциям, правилам, времени. Используется в программе конфигурирования... * get_news($self,$proc_num) - забирает сообщения с NEWS сервера $self - обьект полученный от init $proc_num - номер процесса * get_groups_list($self,$server,$out_file) - скачивает список всех групп с сервера $self - обьект полученный от init $server - имя сервера с которого будет качаться список групп $out_file - если не undef то в этот файл записывается дамп групп CONFIG FILE - Секция CFG STATISTIC_LOG - Имя и путь к файлу статистики MESSAGE_LOG - Имя и путь к файлу с отладочной информацией TMP_DIR - Темп директория должна иметь следующие поддиректории: IN - Директория для временного хранения сообщений LOCK - Служебная SPOOL - Директория с почтовыми ящиками MAX_FORK - Число процессов (0 - один,...) CFG_DIR - Директория в которой хранится текущее состояние групп... DEF_SERVER - NNTP сервер по умолчанию. Используется если news группа описана без сервера. ARTICLE_JOIN - Разделитель статей во временном файле. По умолчанию: "From InNews ".(scalar localtime) QUOTE - Служебная строка, по ней потом разгребается spool файл. По умолчанию: 'From ' Последние две желательно (читай надо) прописывать в самом скрипте. - Секция SERVERS SERVERS - Имя сервера MIN_CPS - Минимальный CPS с сервером (надо для таймаута) TIME_OUT - Тайм аут по умолчанию LOCAL_HOST - IP локального хоста (если не динамический) PORT - Порт удаленного сервера DEVICE - Имя сетевого интерфейса,если не undef то LOCAL_HOST берется с этого устройства. INIT_CNT - Число попыток инициализации сетевого интерфейса INIT_SLEEP - Промежуток времени при инициализации сетевого интерфейса DEBUG - Уровень отладки (0 || 1 || 2) - Секция GROUPS GROUPS - Имя группы OPTIONS - Опции : DEF - по умолчанию те качается вся статья без проверки HEAD_O - скачивается только заголовок для скачивания статьи целиком можно использовать секцию RULES TOSS - скачать статью если она соответствует образцу в SET_RULE STAT_O - только статистика SKIP - пропустить группу MBOX - Путь к почтовому ящику относительно {TMP_DIR}/IN/ MAX_MSG - Число сообщений скачиваемых за один сеанс (0 - все...) MAX_MSG_SIZE - Максимальная длина всех сообщений группы (0 - без ограничения) ! пока не работает... EDGE - При чтении данной группы скачивает последние сообщения начиная с этого числа. Т.е. если в группе 1000 новых сообщений а EDGE равно 100 то первые 900 игнорируются. RESERVE_MSG - Если есть эта опция то сообщения этой группы качаются _ВСЕГДА_ если в других группах есть расхождение в MAX_MSG и CNT. Т.е. например есть группа 'A' у нее MAX_MSG = 100 и есть группа 'B' которая прописана в WORK_TIMES и сейчас 'не ее день' но у нее установленно RESERVE_MSG 20, Реально на сервере всего 40 новых сообщений для группы 'A', тогда для группы 'B' тоже скачиваем 20 сообщений. Если реальное количество недока- ченных сообщений меньше чем сумма всех RESERVE_MSG то RESERVE_MSG уменьшается (т.е. вычисляем %) - Секция RULES RULES - Имя группы для которой данное правило SET_RULE - _опции_через_запятую_ _имя_файла_почтового_ящика_ ... - Регэкспы Опции: DEF - по умолчанию те качается вся статья без проверки HEAD_O - скачивается только заголовок для скачивания статьи целиком можно использовать секцию RULES TOSS - скачать статью если она соответствует образцу в SET_RULE STAT_O - только статистика SKIP - пропустить группу ! Опций может быть несколько (через запятую) ! сейчас пока одна TOSS... ! Заголовок содержится в переменной $_ - Секция WORK_TIME WORK_TIME - Время когда скачивать ту или иную группу Формат: WORK_TIMES to@alisa.prv.nnov.ru * : 2..59 : 8..23,0,1 : * : * : * : * : * : * : = 20 = = * : 2..59 : 2..7 : * : * : * : * : * : * : = 10 = HEAD_O = т.е. 3 поля через '=' 1 - образец времени 2 - число сообщений 3 - опции 4 - почтовый ящик формат даты через ':' 0 1 2 3 4 5 6 7 8 $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst EXAMPLE use DialUp::InNews; my $self = DialUp::InNews->init($ARGV[0],$ARGV[1]); exit if $ARGV[1]; #get_groups_list($self,$server,'groups-list'); if ($self) { if (fork) { $self->get_news(0); } else { $self->get_news(1); } #$self->clear_spool(); } REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME OutMail DESCRIPTION модуль для отправки почтовых сообщений SYNOPSIS * init($file_name,$bool) - инициализирует обьект $file_name - файл конфигурации $bool - 1 || 0. используется при настройке. * send_mail($self) - отправляет почту из директории спула $self - обьект созданный init * send_mail($self,{}) - отправляет почту из аргументов процедуры $self - обьект созданный init {} - хеш MAIL_FROM - от кого почта MAIL_TO - кому почта RELAY - сервер через который отправить сообщение DATA - заголовок и тело письма CONFIG FILE - Секция CFG STATISTIC_LOG - Имя и путь к файлу статистики MESSAGE_LOG - Имя и путь к файлу с отладочной информацией TMP_DIR - Темп директория SPOOL_DIR - Директория для временного хранения исходящих сообщений SPOOL_FILE - Файл почтового ящика на локальной машине с исходящими сообщениями MAIL_SERVER - Адрес почтового сервера по умолчанию PROMPT_TO - Метка приглашения To: PROMPT_FROM - Метка приглашения From: PROMPT_CC - Метка приглашения Cc: PROMPT_BCC - Метка приглашения Bcc: PROMPT_RELAY - Метка приглашения релея (если присутствует то сообщения посылаем через этот сервер) PROMPT_APPEND - Метка приглашения. (содержимое данной строки дописывается в конец заголовка письма) - Секция SERVERS SERVERS - Имя сервера MIN_CPS - Минимальный CPS с сервером (надо для таймаута) TIME_OUT - Тайм аут по умолчанию LOCAL_HOST - IP локального хоста (если не динамический) PORT - Порт удаленного сервера DEVICE - Имя сетевого интерфейса,если не undef то LOCAL_HOST берется с этого устройства. INIT_CNT - Число попыток инициализации сетевого интерфейса INIT_SLEEP - Промежуток времени при инициализации сетевого интерфейса DEBUG - Уровень отладки (0 || 1 || 2) -Секция ALIAS описывает алиасы пользователя например: --- ALIAS bill.ms.com From: gosha --- если встретится в заголовке строка From: gosha то адрес фром заменится на From: bill.ms.com Приоритет перебора алиасов в порядке их записи в конфиге EXAMPLE use DialUp::OutMail; my $self1 = DialUp::OutMail->init($ARGV[0]); unless ($ARGV[1]) { $self1->send_mail(); } else { $self1->send_mail({ MAIL_FROM => 'gosha@alisa.prv.nnov.ru', MAIL_TO => 'gosha@alisa.prv.nnov.ru', DATA => "Subject: test\nFrom: bill gey...ts\n\nHello bill\n" }); } &my_warn("Отправлено : "); &my_warn(" $self1->{CFG}->{SEND_MSG_CNT} из,"); &my_warn(" $self1->{CFG}->{ALL_MSG_CNT} сообщений,"); &my_warn(" $self1->{CFG}->{SENT_SIZE} байт",0); &my_warn("Принято $self1->{CFG}->{RECV_SIZE} байт",0); REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME OutNews DESCRIPTION модуль для отправки сообщений в NEWS группы SYNOPSIS * init($file_name,$bool) - создает обьект $file_name - имя файла конфигурации $bool - 1 || 0. используется при настройке. * send_news($self) - отправляет сообщения на NEWS сервер из спул директории $self - обьект созданный init * send_news($self,{}) - отправляет сообщения на NEWS сервер из аргументов процедуры $self - обьект созданный init {} - хеш MAIL_FROM - от кого сообщения MAIL_TO - имя NEWS группы RELAY - через кого посылаем сообщение USER - имя пользователя если нужна авторизация PSWD - пароль пользователя DATA - заголовок и тема сообщения CONFIG FILE - Секция CFG STATISTIC_LOG - Имя и путь к файлу статистики MESSAGE_LOG - Имя и путь к файлу с отладочной информацией TMP_DIR - Темп директория SPOOL_DIR - Директория для временного хранения исходящих сообщений SPOOL_FILE - Файл почтового ящика на локальной машине с исходящими сообщениями MAIL_SERVER - Адрес почтового сервера по умолчанию PROMPT_TO - Метка приглашения To: PROMPT_FROM - Метка приглашения From: PROMPT_CC - Метка приглашения Cc: PROMPT_BCC - Метка приглашения Bcc: PROMPT_RELAY - Метка приглашения релея (если присутствует то сообщения посылаем через этот сервер) PROMPT_APPEND - Метка приглашения. (содержимое данной строки дописывается в конец заголовка письма) - Секция SERVERS SERVERS - Имя сервера MIN_CPS - Минимальный CPS с сервером (надо для таймаута) TIME_OUT - Тайм аут по умолчанию LOCAL_HOST - IP локального хоста (если не динамический) PORT - Порт удаленного сервера DEVICE - Имя сетевого интерфейса,если не undef то LOCAL_HOST берется с этого устройства. INIT_CNT - Число попыток инициализации сетевого интерфейса INIT_SLEEP - Промежуток времени при инициализации сетевого интерфейса DEBUG - Уровень отладки (0 || 1 || 2) -Секция ALIAS описывает алиасы пользователя например: --- ALIAS bill.ms.com From: gosha --- если встретится в заголовке строка From: gosha то адрес фром заменится на From: bill.ms.com Приоритет перебора алиасов в порядке их записи в конфиге EXAMPLE use DialUp::OutNews; use DialUp::Utils qw(:local); my $self1 = DialUp::OutNews->init($ARGV[0]); unless ($ARGV[1]) { DialUp::Utils::get_mail_local($self1); $self1->send_news(); } else { $self1->send_news({ MAIL_FROM => 'gosha@alisa.prv.nnov.ru', MAIL_TO => 'to@alisa.prv.nnov.ru', DATA => "Newsgroups: to\nSubject: test\nFrom: gosha@alisa.prv.nnov.ru\n\nHello bill\n" }); } &my_warn("Отправлено : "); &my_warn(" $self1->{CFG}->{SEND_MSG_CNT} из,"); &my_warn(" $self1->{CFG}->{ALL_MSG_CNT} сообщений,"); &my_warn(" $self1->{CFG}->{SENT_SIZE} байт",0); &my_warn("Принято $self1->{CFG}->{RECV_SIZE} байт",0); REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME Utils DESCRIPTION служебные процедуры для пакета DialUp SYNOPSIS * my_open ($f_handle,$f_name,$f_mode) открывает и блокирует файл $f_hindle - ссылка на дескриптор файла $f_name - имя файла $f_mode - как открывать файл '<','>','<<','>>' и тд * get_local_addr($self,$host) определяет динамический локальный адрес $self - объект полученный от init $host - имя сервера с которым нужно соединится * my_warn($str,$log_livel) выводит сообщения об ошибках $str - строка сообщения $log_livel - уровень отладочной информации 0 - MESG 1 - WARN 2 - ERRO 3 - SENT 4 - RECV * print_to_sock($self,$host,$str,[$log_str]) посылает данные в сокет $self - обьект полученный от init $host - имя сервера $str - строка посылаемая в сокет $log_str - строка записываемая в логи (для паролей и тд) * read_from_sock($self,$host,$bool,$time_out) читает строку из сокета $self - обьект полученный от init $host - имя сервера $bool - указывает на то когда выводить отладочную информацию $time_out - если не 0 то прибавляется к тайм ауту по умолчанию для данного сервера * read_msg_from_sock($self,$host,$ptr,$time_out,$bool) читает сообщение из сокета $self - обьект полученный от init $host - имя сервера $ptr - указатель на дескриптор файла или переменную в который записывать данные $time_out - если не 0 то прибавляется к тайм ауту по умолчанию для данного сервера $bool - если 1 то читается сообщение до '\s+' если 0 то до '\.\s+' * read_block_from_sock($self,$host,$cnt,$time_out) читает указанное количество байт из сокета $self - обьект полученный от init $host - имя сервера $cnt - число байт для чтения $time_out - если не 0 то прибавляется к тайм ауту по умолчанию для данного сервера * my_undef($ref1,$ref2,...) устанавливает переменную в undef $ref1,... - указатели на HASH,ARRAY,SCALAR * any_connects($self,$host) соединяется с удаленной машиной $self - обьект полученный от init $host - имя сервера * get_local_mail($self) преобразует сообщения из локального почтового ящика в формат для процедур send_mail и send_news $self - обьект полученный от init REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME dial_up_services DESCRIPTION Скрипт для скачивания отправления новостей и почты REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME Redialer - dialer script for pppd DESCRIPTION Использовать в pppd для дозвонки вместо стандартного скрипта с chat'от FUNCTIONS * main() основная процедура * modem_init() вызывается один раз для инициализации модема * hung_down() 'вешает трубку' * dialer($phone) используется для дозвона $phone Номер телефона по которому звонить * connect_str_analis($str) Вызывается при получении строки коннекта $str строка полученная из модема * post_connect_check() для сбора статистики из модема после коннекта * go_exit($status) выход из программы $status 1 - выход с ошибкой, 0 - все хорошо * expect_data($time_out,$out_str,$in_str) пишет/читает и анализирует данные данные из модема. Возвращает 1 - Все Ok; 0 - Приняла строку из $ABORT; -1 - Time out чтения из модема. $time_out тайм аут $out_str строка для передачи модему $in_str строку которую ждать от модема REVISION $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $ ------------------------------------------------------------------------------- NAME create_cfg.pl - Утилита для создания и редактирования конфигурационных файлов пакета DialUp. Но у кого есть желание может и для других аналогичных по формату конфигов попробовать настроить... SYNOPSIS Командная строка: create_cfg.pl file file - Путь к конфигурационному файлу create_cfg. -c - Имя редактируемого файла конфигурации KEYS * общие кнопки... 'm' - вид списка горизонтальный/вертикальный 's' - сохранить изменения (работает только в первом окне) 'a' - о программе. 'd' - удалить обьект 'u' - восстановить удаленный обьект 'w' - поиск в активной колонке '/' - глобальный поиск 'o' - сортировка по активной колонке (строковая) 'n' - сортировка по активной колонке (числовая) * клавиши навигации по списку: '>' - сдвинуть окно на 1 колонку вправо '<' - сдвинуть окно на 1 колонку влево 'q' - выход ']' - сделать активной колонку справа '[' - сделать активной колонку слева 'space' - выделить (отменить выделение) строки 'ENTER' - редактировать '+' - увеличить ширину активной колонки '-' - уменьшить ширину активной колонки 'Up' - передвинуть курсор вверх на одну строку 'Down' - передвинуть курсор на одну строку вниз 'PgDn' - .......................... страницу вверх 'PgUp' - .......................... страницу вниз 'Home' - перейти в начало списка 'End' - перейти в конец списка * Клавиши навигации по тексту (help'у): 'Up' - перейти вверх на одну строку 'Down' - перейти вниз на одну строку 'PgDn' - перейти вверх на страницу 'PgUp' - перейти вниз на страницу 'Home' - перейти на первую строку 'End' - перейти на последнюю строку '>' - перейти в конец строки '<' - перейти в начало строки 'q' - выход CONFIGURE В конфиге должна содержаться анонимная процедура которая создает обьекты вида: $ptr->{'CFG'}->{'DATA'} = [ qw( STATISTIC_LOG MESSAGE_LOG ) ]; $ptr->{'CFG'}->{'TYPE'} = [ qw( 1 1 ) ]; $ptr->{'CFG'}->{'ATTR'} = 2; $ptr->{'CFG'}->{'DESC'} = 'Настройки для запуска проги'; DATA - Имена колонок и ключи хеша. DESC - Описание секции TYPE - Тип редактирования: 0 - не редактировать 1 - данные одно строковые 2 - вызывается внешний редактор ( $ENV{EDITOR} || 'vi' ) ATTR - Тип передаваемых данный: 1 - Секция имеет вид : SERVERS alisa DEV lo CPS 215 т.е. описывается метка (SERVERS), потом ключ (alisa), затем значения короче надо что то такое : $self->{SERVERS}->{alisa}->{DEV} = ... 2 - Секция имеет вид: CFG SPOOL /var/spool TMP_DIR /tmp т.е. $self->{CFG}->{SPOOL} = ... 3 - Секция имеет вид: RULES gosha #^From: gosha# #^From: root# т.е. $self->{RULES}->{gosha} = '#^From: gosha#\n#^From: root\n#' 4 - Секция имеет вид: ALIAS beerman@alisa.prv.nnov.ru #^From: aliex# ALIAS max@kpmi.prv.ru #^From: max# т.е. $self->{ALIAS}->[0]->{ALIAS} = 'beerman....' [0]->{DATA} = '#^From: aliex' $self->{ALIAS}->[1]->{ALIAS} = 'max...' [1]->{DATA} = '#^From: amax' короче если важен порядок следования... потом идет load_help для загрузки помощи к редактируемому конфигу: load_help($help_data,'DialUp/InMail.pm',$type); $help_data - так и оставьте... $type = undef - ищется файл (второй аргумент) и с ним делается pod2text 1 - делается 'man (второй аргумент) | col -b' 2 - данные читается из файла (второй аргумент). Процедура вызывается с параметром - ссылкой на хеш аргументов командной строки. Например : sub { my ( $ARGS ) = @_; my ( $help_data, $self ); my $LIVELS = {}; $help_data = load_help('MY_COOL_MODULE',1); use MY_COOL_MODULE; $ARGS->{'-c'} = 'config/coll.cfg' unless exists $ARGS->{'-c'}; $LIVELS->{'CFG'}->{'DATA'} = [ qw( STATISTIC_LOG MESSAGE_LOG TMP_DIR ) ]; $LIVELS->{'CFG'}->{'TYPE'} = [ qw( 1 1 1 ) ]; $LIVELS->{'CFG'}->{'ATTR'} = 2; $LIVELS->{'CFG'}->{'DESC'} = 'Настройки для запуска проги и тд...'; unless ( $self = MY_COOL_MODULE->init($ARGS->{'-c'},1) ) { print STDERR "Can't parse file $ARGS->{'-c'}\n"; return 0; } return ( $LIVELS, $self, $help_data ); }; P.S. А вообще куда удобнее редактировать конфиги старым добрым vim'ом... P.S.S. В Curses::Widgets имеется неприятная штука: при вводе слова длтннее области ввода все подвисает пока память не кончится... Здесь эта процедура используется при поиске и редактировании данных... В SQL-DB_VIEW есть пропатченый модуль Curses::Widgets, правда и укороченный... COPYRIGHT Copyright (C) Okunev Igor gosha@prv.mts-nn.ru 2001 $Id: Read_me.txt,v 1.9 2002/03/02 16:14:59 gosha Exp $