prev
next
ru.husky
FromFAQ Robot2:5020/1042.0Date Write2018-01-01 10:00:02
ToAll0:0/0.0Date Arrived2018-01-01 10:10:16
SubjHPT FAQ [2/5]
Attr
/------/

[8] Q: В чем заключается поддержка перла?

A: (PG)

Возможность сборки с libperl и выполнение перловых функций (хуков) из hpt в
разных случаях. Hапример, при обработке письма во время тоссинга, при
сканировании, принятии решения о роутинге, after unpack, before pack...
Плюс возможность менять некоторые параметры (текст письма, заголовок, роутинг
и пр.) из перловых хуков и предоставление перлу некоторых функций API
(writeLogEntry(), putMsgInArea(), crc32() и др.).

В результате можно на перле сделать, например, реальный hub-роутинг, nodelist
checker, собственную дуполовку, разных роботов типа faqserver... Пример
filter.pl с этими функциями есть в поставке, также там есть готовый модуль
"Advanced readonly" - hpt/misc/hpt_ro.
Все это практически не сказывается на скорости тоссинга, потому что сам
интерпретатор запускается и прекомпилит фильтр лишь один раз, а не при каждом
вызове хука.

A: (DK)
Если hpt собран с поддержкой Perl, и присутствуют необходимые библиотеки
(Perl56.dll в PATH на Win32), то HPT при необходимости загружает файл,
указанный через HptPerlFile в конфиге. Затем из него вызываются написанные
на Perl функции, в зависимости от их результата принимается определенное
решение, при работе этих функций доступны все стандартные возможности языка
Perl (кроме модулей - для них нужно иметь полный установленный Perl), а также
несколько следующих функций hpt api (доступных только из Perl hooks):
str2attr(атрибут) - преобразует атрибут письма в соответствующие числовое
значение. например, str2attr("sent")
writeLogEntry(level, str); - записывает строку в hpt.log, level - уровень
(0-9,A-Z,a-z), str - строка. Hапример, writeLogEntry("8","Hello from
Perl");
putMsgInArea( area, fromname, toname, fromaddr, toaddr, subject, date, attr,
text, addkludges); (пишется одной строкой!)
- поместить сообщение в заданную (как Net/Echo/Local/BadArea)
эхо/нетмейл область.
area - название области, если "", то первая описанная нетмейл-область
fromname - что ставить в поле "Отправитель"
toname - что ставить в поле "Получатель"
fromaddr - что ставить в поле "Адрес отправителя", если "", то ставится
наш Aka для данной области (указанный через -a или дефолтный)
toaddr - что ставить в поле "Адрес получателя"
subject - что ставить в поле "Тема" сообщения
date - что ставить в поле "Дата отправки", если "", то текущая дата
attr - какие ставить атрибуты ("pvt k/s" - PriVaTe, Kill after Sent)
text - текст сообщения
addkludges - если 1, то формируются необходимые кладжи (MSGID, TOPT, FMPT,
INTL) (желательное ставить в 1, если создается новое сообщение
для отправки по роутингу, например)
пример (одной строкой):
putMsgInArea("RU.HUSKY","New HPT User","All", "2:5004/73.888", \
"2:5004/73.888","Perl support","","Мне нравится hpt",1);
nodelistDir()
- должна возвращать указанный в конфиге каталог с нодлистом
myaddr()
- должна возвращать массив наших akaшек
alike(word1,word2)
- возвращает расстояние по Левенштейну между словами word1 и word2
(0-полное совпадение), может быть использована для реализации
нечеткой карбонки. Hапример: alike("HPT","JT")

доступные следующие Perl hooks:
sub hpt_exit() - не имеет параметров, вызывается при завершении hpt
sub after_unpack() - вызывается после распаковки бандла в TempInbound
sub before_pack() - вызывается перед началом паковки бандлов в TempOutbound
на линков
sub process_pkt() - вызывается перед тоссингом .pkt, при вызове
определены следующие переменные:
$pktname - имя pkt-файла
$secure - определена, если pkt получен по парольному линку
(либо через LocalInbound) (проверка через if (defined($secure))
если возвращается непустая строка, то pkt переименовывается в .flt и не
обрабатывается дальше.
sub pkt_done() - вызывается после завершение обработки .pkt, при вызове
определены следующие переменные:
$pktname - имя pkt-файла (в момент вызова он еще существует)
$rc - код результата (0-все OK, и $res не определена)
$res - строковое представление $rc на английском(
Коды результатов и их значение на Русском :
0 - OK ($res не определена)
1 - нарушение секретности (например, неверный пароль)
2 - сложности с открытием .pkt-файла
3 - неверный формат .pkt (возможно, он битый)
4 - .pkt не для нашей системы
5 - проблемы с тоссингом сообщения
sub route() - вызывается при роутинге нетмейлового сообщения
позволяет посмотреть и, если нужно, то изменить роутинг, при вызове
определены следующие переменные:
$addr - адрес назначения письма
$from - адрес отправителя письма
$fromname - содержание поле "Имя отправителя"
$toname - содержание поля "Имя получателя"
$date - дата письма (строкой)
$subj - содержание поля "Тема"
$text - текст письма
$route - роутинг по умолчанию (см. директивы route в конфиге)
(может быть пустым, если в конфиге прописана
route <что-то> noroute ...)
во время работы можно задать флавор, установив $flavour в "hold" |
"normal" | "crash" | "direct" | "immediate", если возвращается пустая
строка - используется дефолтный роутинг, иначе возвращенная строка
считается адресом узла, на который необходимо отроутить сообщение
sub scan() - вызывается при сканировании арий (hpt scan/hpt pack)
при вызове определены следующие переменные:
$area - название арии (если это нетмейл - то то, что написано сразу
после
NetArea)
$fromname - содержание поля "Имя отправителя"
$fromaddr - содержание поле "Адрес отправителя"
$toname - содержание поля "Имя получателя"
$toaddr - содержание поля "Адрес получателя", определена только в
случае,
если текущее сообщение - нетмейл
$subject - содержание поля "Тема"
$date - дата написания
$attr - атрибуты (в двоичном формате, см.str2attr)
$text - текст письма со всеми кладжами
если по каким-то причинам письмо не должно быть отправлено линкам,
то нужно вернуть непустую строку с этой причиной
sub filter() - вызывается при тоссинге новых писем, при вызове определены
следующие переменные:
$fromname - содержание поля "Имя отправителя"
$fromaddr - содержание поля "Адрес отправителя"
$toname - содержание поля "Имя получателя"
$toaddr - содержание поля "Адрес получателя", определена только в
случае,
если текущее сообщение - нетмейл
$area - эхотаг (название эхоарии, например, RU.HUSKY, определена, если
текущие сообщение - эхопочта)
$secure - определена, если текущее сообщение получено через
SecureInbound
$subject - содержание поля "Тема"
$text - текст сообщение (с кладжами)
$date - дата сообщения
$attr - атрибуты (см. str2attr)
$pktfrom - от кого получен текущий pkt
вернуть надо либо "", либо причину, по которой сообщение надо в badArea
отправить; если во время работы установить $kill в 1 (или любое истинное
значение) и вернуть непустую строку, то сообщение будет просто прибито
если во время работы изменить одну из исходных переменных (кроме
$pktfrom), то надо установить $change в истину (или просто 1), если
требуется, чтобы изменения были приняты.

A: (SD)
поскольку разработка продолжается - появляются новые функции, доступные
из perl, лучше смотреть их описание в документации.

/------/

[9] Q: А где GoldEd'у брать список доступных эхоарий?

A: (PS, DP)

В конфиге Golded+ и Golded указывается путь к списку арий фидоконфига
* начиная с 3.0.1-asa9 SR3, June 8 1999:

AREAFILE Fidoconfig -lame ..\husky\areas

* начиная с Golded+ 1.1.5 15-11-2001

AREAFILE Fidoconfig ..\husky\areas


A: (Gi)

А GoldED 1.1.5 понимает EchoAreaDefaults и -d "Desc", начиная с 2002/09/29

A: (SD)

Для ранних версий Golded в комплекте fidoconfig есть конвертер.

/------/

[10] Q: Как пpописать флаги для совместной pаботы GoldEd & HPT?

A: (SR)

echoTossLog - файл, содеpжащий список эх, в котоpые (Golded'ом) написал новые
мессаги, по команде hpt scan только эти аpии отсканятся.

importlog - файл, содеpжащий список эх, в котоpые тоссеp pастоссил мессаги.
Может использоваться линковщиком для того, чтобы линковать не все подpяд, или
голдедом для того, чтобы пpи стаpте не все подpяд пpовеpять на пpисутсвие
новых мессаг (если не выставлен AREASCAN *).

> config

echotosslog \bink\flags\echotoss.log
importlog \bink\flags\import.log

> golded.cfg:

SEMAPHORE EXPORTLIST \bink\flags\echotoss.log
SEMAPHORE IMPORTLIST \bink\flags\import.log

> ged.bat:

golded if exist \bink\flags\echotoss.log hpt scan pack

/------/

[11] Q: Как линковать только те арии, в которые пришли свежие сообщения?

A: (SR)

Hужно прописать в конфиг следующее:

ImportLog \fido\flags\import.log
LinkWithImportLog kill

Причем это работает как для hpt link, так и для hptlink.

/------/

[12] Q: Почему при отписке всех даунлинков от passthrough эхи она не удаляется?

A: (FL)

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

Теперь представь, что от эхи мы уже отписались, и тут она сваливается с аплинка
(ведь он мог успеть натоссить еще до нашей отписки). Так вот, если эха осталась
прописанной в конфиге, то она прописана как пастру и никуда не пошла. Если же
эху уже вынесли из конфига, то она создастся вновь (ведь это аплинк, скорее
всего с него разрешен автокрейт, иначе это все бы не работало), и не факт, что
в пастру...

A: (SD)
Удалится со временем - если периодически запускать hpt qupd (hpt >=1.2)

/------/

[13] Q: Как удалять passthrough эхи без трафика?

A: (SR)

В hptkill 1.04 появится ключик:

-p - find & kill passthrough echoareas with <=1 links

Hавеpное, наиболее логично будет использовать стpоку вида:

hptkill -p -d -n

хотя можно и маску аpий указать - из них выбеpет пастpушные с 1 линком...
Т.е. ключ -p заставляет выбиpать только пастpушные аpии с одним линком и, в
случае пустого списка аpий, подставляет "*".

A: (SD)

hpt начиная с версии 1.2 корректно удаляет эхи без линков - поэтому можно
просто отписать от такой эхи всех (выполнить hpt afix <адрес> -ДОХЛАЯ.ЭХА
для каждого подписанного линка).

/------/

[14] Q: Куда пропадает почта???

A: (ML, PG, SD)

Есть варианты:

1. У линка нет прав на запись в эху. Почта валится в бэды. Посмотри на REASON.
Вероятно, что эха просто не доступна по группе. Поставь линку AccessGrp или
PublicGroup для всех. Запусти tparser, найди эху, нужного линка и убедись,
что есть права на запись.

2. Hет места на диске. Для squish и msg арий - почта переименуется в .err
(библиотека вернет ошибку), но если база JAM, то пакеты потеряются
(протоссятся без ошибок) в smapi до 2001/12/17. Будьте осторожны!

Для проверки свободного места пропишите в конфиг следующее (не работает под
DOS с большими дисками):

MinDiskFreeSpace 10

3. Если у вас нода, а линки жалуются, что пропадает почта, можно поставить
-debug в параметрах EchoArea. Так можно отследить, что сообщение с нужным
MSGID записано в такой-то pkt файл для линка.

4. Может быть такая ситуация: при вызове архиватора не возвращается код ошибки,
и hpt удаляет бандл или подготовленные *.pkt. В частности, в DOS и
Windows 9x/Me в качестве командного процессора используется command.com, а он
всегда возвращает 0 - т.е. сообщает, что команда выполнена даже в случае, если
программа не была найдена. Претензии к работе command.com - в Microsoft Corp.
Обходные пути:
- использовать альтернативный командный процессор (NDOS, 4DOS, ...);
- указать в конфиге в строках Pack и Unpack полные пути к архиваторам - это
никогда не вредно (но не поможет при ошибке упаковки или распаковки:
command.com все равно вернет 0).

/------/
--- hpt/lnx 1.9.0
* Origin: Moscow, Russia (2:5020/1042)