Hi-Track

{Net|Echo}mail tracker [+ BSO-packer]
Copyright © 2000-2003 by Dmitry Liman


СОДЕРЖАНИЕ

  1. Лицензионное соглашение
  2. Общая информация
  3. Установка и настройка
  4. Препроцессор
  5. Раздел параметров
  6. Раздел сценариев
  7. Регулярные выражения
  8. Контактная информация

ЛИЦЕНЗИОННОЕ СОГЛАШЕНИЕ

Данное программное обеспечение (ПО) является свободным (freeware). Вы можете свободно распространять данное ПО и/или вносить в него изменения в соответствии с Лицензией GNU GPL. Данное ПО распространяется в надежде, что оно будет полезным, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, даже без подразумеваемой гарантии коммерческой ценности и пригодности для конкретной цели. Для получения подробных сведений смотрите оригинальный текст GNU General Public License.

к содержанию >>

ОБЩАЯ ИНФОРМАЦИЯ

Первая версия Hi-Track была написана как-то вечером после мученических попыток настоить FastEcho для перевода в ReadOnly нескольких даунлинков по различным эхоконференциям :) Hi-Track запускался фастэхой как внешняя программа между распаковкой бандлов и тоссингом извлечённых пакетов, просматривал PKT-шники и выгрызал из них нужные (точнее, ненужные) сообщения.

В данный момент Hi-Track представляет собой довольно мощный трекер нетмейловых и эхомейловых сообщений со средствами роутинга нетмейла в BSO. При проектировании очень хотелось следовать принципу адекватности целей и средств: по этой идее простые решения должны достигаться несколькими интуитивно понятными строками конфига, а более сложные сущности привлекаться только по мере необходимости решить пропорционально более сложную задачу. Настолько это удалось - судите сами .)

к содержанию >>

УСТАНОВКА И НАСТРОЙКА

Работой Hi-Track управяет конфигурационный файл HITRACK.CFG, который должен находиться в том же каталоге, что и HITRACK.EXE. Для получения дополнительной гибкости настроек применён несколько нетрадиционный способ обработки параметров командной строки: все они трактуются, как дефайны одноимённых макропеременных препроцессора. Например, запуск:
	hitrack -pkt backup
равносилен добавлению в начало конфига такого текста:
	#define -pkt
	#define backup
Далее в тексте конфига Вы можете анализировать наличие соответствующей макропеременной директивами #ifdef или #ifndef, либо использовать значение переменной для макроподстановки.

"Содержательную" часть конфига (т.е. то, что получается на выходе препроцессора) условно можно разделить на раздел параметров и раздел сценариев. Раздел параметров определяет несколько общих для всей системы значений - таких, как FTN-адрес, пути к требуемым каталогам, смещение UTC и т.п. Раздел сценариев содержит описание алгоритма обработки входящих сообщений на некотором встроенном скриптоподобном языке.

Перейти к описаниям:

  • Препроцессор;
  • Раздел параметров;
  • Раздел сценариев;

    к содержанию >>

    ПРЕПРОЦЕССОР

    Препроцессор Hi-Track работает аналогично си-шному, поддерживаются следующие директивы:
    	#define SYMBOL [VALUE]
    
    Создаёт макропеременную с именем SYMBOL и значением VALUE. Если значение не указано, переменная создаётся с пустым значением. Повторное определение переменной не считается ошибкой, а просто изменяет её значение.
    	
    	#undef SYMBOL
    
    Уничтожает макропеременную с именем SYMBOL. Если такой переменной не существует, никаких действий не производится.
    	#ifdef SYMBOL
    	...SOMETHING...
    	#else
    	...SOMETHING...
    	#endif
    
    Если макропеременная с именем SYMBOL существует, препроцессор переходит к разбору последовательности строк, заключенной между #ifdef и #else, иначе - к последовательности между #else и #endif. Если ветка "иначе" не нужна, оператор #else можно опустить.

    Все другие операторы вида #ifчто-то работают аналогично, разница лишь в смысле аргументов.

    	#ifndef SYMBOL
    
    Срабатывает, если переменная с именем SYMBOL не существует.
    	#iftime TIME_INTERVAL
    
    TIME_INTERVAL - временной промежуток по правилам SF-Mail/T-Mail. Оператор срабатывает, если текущее системное время попадает в указанный промежуток.
    	#ifflag FILE_NAME
    
    FILE_NAME - имя файла-семафора, при существовании которого сребатывает данный if.
    	#raise FILE_NAME
    
    Создаёт файл-семафор с именем FILE_NAME.
    	#drop FILE_NAME
    
    Удаляет файл-семафор с именем FILE_NAME.

    к содержанию >>

    РАЗДЕЛ ПАРАМЕТРОВ

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

    Итак, описание параметров с их дефолтовыми значениями:

    	Address 2:461/79
    
    Первичный FTN-адрес Вашей системы. AKA пока не предусмотрены, но если нужно - сделаем :)
    	Robot_Addr 2:461/79.99
    
    Адрес робота, который будет проставлен, например, в поле ORIG создаваемых PKT-шников. Может совпадать с первичным адресом.
    	Robot_Name Hi-Track
    
    Имя, которое будет проставлено в поле FROM создаваемых от имени робота сообщений.
    	Inbound c:\fido\inbound
    
    Путь к каталогу инбаунда Вашей системы. Здесь будут порождаться создаваемые PKT-шники и этот каталог будет использован по-умолчанию для сканировнания PKT-базы сообщений (target PKT).
    	Outbound c:\fido\outbound
    
    Путь к корневому каталогу Binkley-Style Outbound Вашей системы. Сюда будут упаковываться сообщения при выполнении Action Route, и отсюда же будут по-умолчанию распаковываться соообщения из BSO-базы (target BSO).
    	Netmail c:\fido\netmail
    
    Путь к первичному каталогу нетмейла Вашей системы. Здесь будут порождаться созаваемые нетмейловые сообщения и этот каталог будет использован по-умолчанию для сканирования MSG-базы сообщений (target MSG).
    	Nodelist c:\fido\nodelist\nodelist.*
    
    Полнопутевая маска нодлистов, из которых будет выбран наиболее свежий по дате. Параметров Nodelist может быть несколько (порядок важен!), результирующий индекс будет построен, как замещающее объединение всех объявленых нодлистов. Средства роутинга текущей версии Hi-Track работают только в пределах одной FTN-зоны, соответственно, мультизональные нодлисты не поддерживаются (строка Zone игнорируется).

    Никаких специальных действий для компиляции нодлистов предпренимать не нужно. Индекс нодлиста подключается автоматически по первому фактическому требованию основаной на нодлисте информации. Перекомпиляция происходит также автоматом: отслеживаются даты нодлистов и файла индекса (HITRACK.NLI в том же каталоге, что и HITRACK.EXE). Если всё-же индекс необходимо принудительно обновить, просто удалите файл HITRACK.NLI.

    	UTC 3
    
    Смещение UTC (в положительную сторону :)
    	Log c:\fido\log\hi-track.log
    
    Где создавать файл протокола. По-умолчанию используется HITRACK.LOG в том же каталоге, что и HITRACK.EXE.
    	Origin Тебя нашла себе во мне
    
    Текст, который будет использован при необходимости генерации нового ориджина. Параметров Origin может быть несколько, в этом случае из них всякий раз будет выбираться случайный вариант. Если же этот параметр вообще не указан, используется некий предопределённый нейтральный текст.

    к содержанию >>

    РАЗДЕЛ СЦЕНАРИЕВ

    После определения всех необходимых глобальных параметров следует раздел сценариев, которые, собственно, и задают алгоритм насилия над входящими сообщениями :)

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

    Перейти к описанию:

  • Целей
  • Ловушек

    к содержанию >>

    Описание Целей

    Цели описываюся последовательностью операторов target, имеющих следующий формат:
    	target {MSG|PKT|BSO} [MAINTENANCE] [PATH]
    
    Первый аргумент оператора target является обязательным и определяет тип почтовой базы:

    Необязательный параметр MAINTENANCE представляет собой опцию обслуживания, которая определяет некоторые служебные действия, которые необходимо произвести с почтовой базой прежде, чем подавать из неё сообщения на вход ловушек. Опции обслуживания специфичны для каждого типа базы, и на данный момент определены следующим образом:

    Необязательный параметр PATH задаёт путь к базе сообщений, являющейся целью данного оператора target. Если параметр PATH опущен, будут использованы значения по-умолчанию, заданные в разделе параметров:

  • Для target MSG - значение параметра Netmail;
  • Для target PKT - значение параметра Inbound;
  • Для target BSO - значение параметра Outbound.

    к содержанию >>

    Описание Ловушек

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

    Сейчас Hi-Track поддерживает два типа ловушек:

    к содержанию >>

    Ловушки: Оператор EasyRoute

    	easyroute FLAVOR ROUTE-TO DEST [DEST ...]
    
    Где: Если упаковыаемое сообщение имеет атрибут Kill-Sent, оно после успешной упаковки унижчтожается, иначе на него проставляется атрибут Sent. Сообщения, имеющие адресом назначения наш основной адрес, всегда игнорируются ловушкой easyroute.

    Пример задания правил роутинга:

    	easyroute hold * 2:461/79.*
    
    Сообщения для поинтов узла 2:461/79 роутятся на них напрямую с флавором Hold.
    	easyroute direct 2:461/58 hub:2:461/58 hub:2:461/141
    
    Сообщения, для узлов из подхабников 461/58 и 461/141 роутятся напрямую на 461/58.
    	easyroute direct hub 2:461/*
    
    Сообщения для остальных услов сети 461 роутятся на их хабов.
    	easyroute direct 2:461/0 *
    
    Всё остальное роутится на наш сетевой хост.

    к содержанию >>

    Ловушки: Блок Catch

    Блок catch предназначен для описания сложных манипуляций с проходящими сообщениями. Более того, ловушка easyroute фактически является макросом, прозрачно для пользователя транслирующимся в блок catch. Начнём с простого примера:
    	target PKT c:\fido\inbound
    	
    	catch
    	include kharkov.sysop
    	mask Bill Gates, 2:461/95.*
    	action delete
    	end
    
    Смысл этой ловушки заключается в переводе некоего сисопа, пишущего под именем 'Bill Gates' с любого из поинтовых адресов узла 2:461/95 (включая и нодовый адрес 2:461/95 == 2:461/95.0) в режим ReadOnly по эхоконференции kharkov.sysop. Целью ловушки является PKT-база сообщений, раположенная в каталоге 'c:\fido\inbound'.

    Теперь попытаемся, отталкиваясь от этого примера, перейти к более общему описанию. Итак, блок catch представляет собой некую последовательность операторов, заключённую в операторые скобки catch -- end. Операторы записываются по одному в строке, регистр безразличен (кроме специальных случаев вроде регулярных выражений :) Все операторы условно делятся на три раздела примерно так:

    	catch
    	  Фильтр эхотегов
    	  Фильтр сообщений
    	  Список действий
    	end
    
    Перейти к описанию:
  • Фильтр эхотегов;
  • Фильтр сообщений;
  • Список действий.

    к содержанию >>

    Ловушки: Блок Catch: Фильтр эхотегов

    Этот раздел представляет собой набор операторов Include/Exclude, которые определяют фильтр для тегов эхоконференций, к которым будет применяться данная ловушка. Нетмейл в этом контексте ничем не отличается от эхомейла и имеет зарезервированный тег Netmail. Синтаксис операторов следующий:
    	include UNIX_MASK
    	exclude UNIX_MASK
    
    где UNIX_MASK - это файловая маска (ну, там, где звёздочки с вопросительными знаками:) эхотегов, соответственно, включаемых в список или исключаемых из списка проверки для данной ловушки. При создании ловушки список эхотегов пуст, так что exclude без include не имеет смысла. Количество этих операторов в ловушке (равно как и любых других конструкций) ограничено только Вашим здравым смыслом.

    Примеры:

    	include kharkov.sysop
    
    Активна единственная эхоконференция kharkov.sysop.
    	include kharkov.*
    
    Активны все эхоконференции иерархии kharkov.
    	include *
    	exclude netmail
    
    Активны все существующие в системе эхоконференции, нетмейл не активен.

    к содержанию >>

    Ловушки: Блок Catch: Фильтр сообщений

    В этом разделе Вы определяете маски, которым должно удовлетворять сообщение, чтобы пойматься в данную ловушку. В простейшем случае это набор (последовательность) операторов Mask, которые считаются связанными по или (т.е. сообщение "поймается", если удовлетворит хотя бы одной маске). Для сложных критериев отбора используется блок XMask (расширенная маска), который может быть записан в любом месте, где может стоять оператор Mask.

    к содержанию >>

    Ловушки: Блок Catch: Фильтр сообщений: Оператор Mask

    Синтаксис оператора mask выглядит примерно так:
    	mask FROM[, ORIG[, TO[, DEST[,SUBJ[, ATTR ]]]]]
    
    Смысл аргументов следующий:
  • FROM - Имя отправителя (текстовая маска);
  • ORIG - FTN-адрес отправителя (адресная маска);
  • TO - Имя адресата (текстовая маска);
  • DEST - FTN-адрес адресата (адресная маска);
  • SUBJ - Тема сообщения (текстовая маска);
  • ATTR - Атрибуты сообщения (маска атрибутов).

    Обилие квадратных скобок обозначает, что если значения последних нескольких аргументов безразлично, их можно не указывать :)

  • Текстовые маски
  • Текстовые маски Hi-Track трактует, как обычные UNIX-маски.

  • Адресные маски
  • Адресная маска отличается от FTN-адреса лишь тем, что вместо конкретных значений номера зоны, сети, узла или поинта может cтоять символ * (звёздочка), под этим понимается, что значение соответствующего поля проверяемого адреса может быть любым. Кроме того, маска может состоять из единственного символа *, такой маске удовлетворит любой FTN-адрес.

    Примеры:

    	2:461/79.*
    
    Все поинтовые адреса (нулевой поинтовый равен нодовому) узла 2:461/79.
            2:*/0
    
    Все сетевые хосты второй зоны.
            *
    
    Любой FTN-адрес.

  • Маски атрибутов
  • Hi-Track понимает следующие аттрибуты FTN-сообщений: Для использования атрибутов в маске перед значением каждого атрибута необходимо указывать + (плюс), если наличие данного атрибута необходимо для срабатывания ловушки, или - (минус), если для срабатывания необходимо отсутствие данного атрибута). Значение атрибутов, которые не указаны в маске, считается безразличным. Если необходимо указать более одного атрибута, все они (с необходимыми префиксами + или -) записываются подряд, без пробелов.

    Примеры:

    	-FIL-FRQ
    
    Кроме аттачей и фреков.

    к содержанию >>

    Ловушки: Блок Catch: Фильтр сообщений: Оператор Name

    Этот сервисный оператор не вводит новой функциональности, его просто удобнее (нагляднее) использовать для отлова сообщений от/для некоего имени. Например, для твитовалки :)

    Конструкция

    	name Vadim Marcus
    
    эквивалентна последовательности двух операторов Mask:
    	mask Vadim Marcus
    	mask *, *, Vadim Marcus
    

    к содержанию >>

    Ловушки: Блок Catch: Фильтр сообщений: Блок XMask

    При помощи набора описанных выше операторов Mask довольно трудно выбрать, например, все сообщения, адресованые моим поинтам, но не мне, включая мой нодовый адрес и мои поинтовые AKA. В подобных случаях удобнее :) использовать такую вот конструкцию:
    	xmask
    	  dest 2:461/79.*
    	  dest !2:461/79.0
    	  dest !2:461/79.55
    	end
    
    Перечисленые внутри блока условия считаются связаными по и, то есть xmask срабатывает, если сообщение удовлетворяет всем перечисленым в блоке условиям. Условия внутри блока можно задавать следующим образом: Некоторый набор условий врутри блока xmask можно связать между собой по или - для этого связываемую последовательность нужно заключить в операторные скобки union - end, например:
    	xmask
    	  orig 2:461/79
    	  dest 2:461/79.*
    	  dest !2:461/79.0
    	  union
    	    from AllFix*
    	    from FastEcho
    	  end
    	end
    
    Сюда поймаются сообщения роботов узла 2:461/79, адресованые поинтам этого узла.

    Результат "выполнения" union можно проинвертировать, для этого после слова union нужно указать ключевое слово inverted:

    	union inverted
    	  from AllFix*
    	  from FastEcho
    	end
    

    к содержанию >>

    Ловушки: Блок Catch: Список действий

    В этом разделе Вы описываете последовательность действий, которые Hi-Track должен произвести с поймавшимся в ловушку сообщениями. Действия выполняются в том порядке, в котором они записаны в описании ловушки. Реинкарнация в сообщениях не происходит, то есть при выполнении, например, действия Bounce текущим всё равно остаётся оригинальное сообщение, и последующие ловушки видят именно его, а не только что родившееся баунсанутое .)

    Текущая версия Hi-Track поддерживает следующие виды действий:

    1. Rewrite - перезапись заголовка сообщения;
    2. Bounce - возврат сообщения отправителю;
    3. Delete - удаление сообщения;
    4. Save - запись сообщения в файл;
    5. Copy - копирование сообщения в другую область;
    6. Forward - пересылка сообщения;
    7. Route - Упаковка сообщения в BSO по роутингу.
    8. Kill-Sent - Удаление/маркировка отправленного сообщения.

    к содержанию >>

    Ловушки: Блок Catch: Список действий: Rewrite

    	action rewrite FROM[, ORIG[, TO[, DEST[,SUBJ[, ATTR ]]]]]
    
    Результатом выполнения данного действия будет изменение соответствующих значений заголовка текущего сообщения. Смысл аргументов здесь тот же, что и в операторе Mask. Логика замены следующая: для текстовых аргументов (FROM, TO, SUBJ) подставляется значение, указаное в соответствующем поле оператора action rewrite, в котором каждое вхождение символа * заменяется на первоначальное содержимое данного поля в обрабатываемом сообщении. Для адресных аргументов ORIG и DEST логику проще выразить на псевдо-C, чем по-русски :)
    	if ( mask == NULL || mask == '*' )
    	   out_addr = in_addr
    	else
    	{
    	   out_addr.zone  = mask.zone  == '*' ? in_addr.zone  : mask.zone;
    	   out_addr.net   = mask.net   == '*' ? in_addr.net   : mask.net;
    	   out_addr.node  = mask.node  == '*' ? in_addr.node  : mask.node;
    	   out_addr.point = mask.point == '*' ? in_addr.point : mask.point;
    	}
    
    Проще всего с аргументами FTN-атрибутов: для того, чтобы включить некоторый атрибут, нужно его указать с префиксом +, для того, чтобы атрибут погасить - с префиксом -.

    Примеры:

    	mask *, *, Sysop, 2:461/79
    	mask *, *, *, 2:461/79.55
    	action rewrite *, *, Dmitry Liman, 2:461/79
    
    Заменяет безликое Sysop для мого узла на моё настоящее имя, а также всю пришедшую на мой поинтовый AKA почту перенаправляет на мой узловой адрес.
    	xmask
    	  dest 2:461/79.*
    	  dest !2:461/79.0
    	end
    	action rewrite *, *, *, 2:461/800.*
    
    Переадресовывает всю почту, пришедшую на адреса поинтов узла 2:461/79 (но не на нодовый адрес) на аналогичные поинтовые номера узла 2:461/800.
    	xmask
    	  dest !2:461/79
    	  attr -K/S
    	end
    	action rewrite *, *, *, *, *, +K/S
    
    Проставляет kill-sent на всю не мою почту, если кто-то (как правило, какой-то робот) забыл этот атрибут включить.

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Bounce

    	action bounce TEMPLATE
    
    Возвращает отправителю нетмейлом текущее сообщение, используя файл шаблона (темплет), имя которого задаётся аргументом TEMPLATE. Темплет представляет собой простой текстовый файл, который копируется в выходной поток с учётом следующих макроподстановок:

    %PID Program ID (Hi-Track);
    %NOW Текущая системная дата/время;
    %ATTR Список включённых FTN-атрибутов исходного сообщения;
    %DATE Дата создания исходного сообщения;
    %AREA Эхотег или Netmail для нетмейлового сообщения;
    %SUBJ Тема исходного сообщения;
    %ORIG Адрес отправителя исходного сообщения;
    %DEST Адрес получателя, взятый из исходного сообщения;
    %FROM Полное имя отправителя исходного сообщения;
    %TO Полное имя получателя, взятое из исходного сообщения;
    %FFROM Только первое слово имени отправителя исходного сообщения;
    %FTO Только первое слово имени получателя, взятое из ... ;
    %BODY Текст (тело) исходного сообщения, приведённое к печатному виду

    Пример:

    Попробуем привести полный пример ловушки, которая возвращает отправителю сообщения, адресованые несуществующим поинтам моего узла:
    	catch
    	include netmail
    	xmask
    	  dest 2:461/79.*
    	  dest !2:461/79.0
    	  dest !2:461/79.1
    	  dest !2:461/79.2
    	  dest !2:461/79.55
    	end
    	action bounce no_point.tpl
    	action delete
    	end
    
    Темплет no_point.tpl может выглядеть, например, так:
    Драстуй, %FFROM!
    
    Тута от табе пришло письмишко на адрес %DEST,
    так такого поинта у меня нету, поэтому оное возвращается взад .)
    
    Оригинальная мессага:
    
    ---------------------------------------------------------------------
    ¦ * From : %FROM (%ORIG)
    ¦ * To   : %TO (%DEST)
    ¦ * Subj : %SUBJ
    ¦ * Date : %DATE
    ¦ * Attr : %ATTR
    ==========
    
    %BODY
    
    •••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••••
    
    Использованный в данном примере оператор action delete описан ниже.

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Delete

    	action delete
    
    Текущее сообщение уничтожается. Если оным является нетмейловое сообщение из MSG-базы, то уничтожение производится путём удаления соответствующего MSG-файла. Для PKT-базы порождается новый PKT-файл, из которого выгрызено уничтожаемое сообщение. Исходный PKT-шник, естественно, целиком прибивается. В списке действий оператор action delete должен стоять последним, так как после его выполнения текущее сообщение не определено.

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Save

    	action save FILE_NAME
    
    Сохраняет текущее сообщение в текстовом файле с именем FILE_NAME. Если указаный файл существует, сообщение дописывается ему в хвост. Сохранение происходит со всей служебной информацией, преобразованой к читабельному виду.

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Copy

    	action copy {ECHOTAG|*} [ALTERNATE_PATH]
    
    Копирует текущее сообщение в [эхо]область ECHOTAG. Исходное сообщение остаётся неизменным. Копирование осуществляется путём создания нового файла (MSG для нетмейла или PKT для эхомейла), в который помещается полная копия исходного сообщения (MSGID тоже остаётся прежним) с соответствующим кладжем AREA и включённым атрибутом LOC. Если необходимо, формируется строки Origin и Tearline.

    Необязательный параметр ALTERNATE_PATH указывает альтернативный путь для размещения файла выходного сообщения, вместо заданного параметром inbound или netmail. Таким способом можно "откладывать" определенные сообщения в виде готовых к тоссингу PKT-шников или разбрасывать нетмейловые сообщения по персональным мейлбоксам. Если указан ALTERNATE_PATH, то вместо эхотега области можно указать символ * (звёздочка). В этом случае эхотег входного сообщения будет сохранен в выходном.

    Не советую использовать action copy для переброски эхомейловых сообщений в нетмейл: из них, вообще говоря, не всегда можно извлечь достаточно информации для правильного определения FTN-адресов отправителя/получателя.

    Пример:

    Оператор action copy можно использовать для "гейтования" некоторой нетмейловой рассылки в эхоконференцию таким вот образом:
    	catch
    	include netmail
    	mask *, *, CML Reader
    	action rewrite *, 2:461/79
    	action copy CML
    	action delete
    	end
    

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Forward

    	action forward ECHOTAG [,REWRITE]
    
    Пересылает куда-то текущее сообщение :) Исходное сообщение остаётся без изменений. Смысл аргументов: Логика выполнения: создаётся новое сообщение (в виде PKT для эхомейла или MSG для нетмейла) с тегом области ECHOTAG, к нему применяются действия, аналогичные выполнению соответствующей операции action rewrite. Генерируется новый MSGID, если нужно - ориджин и тирлайн, в начало текста сообщения добавляются кладжи FWD (FSC-0092); строки seen-by, path, via обрезаются.

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Route

    	action route FLAVOR TARGET
    
    Осуществляет маршрутизацию текущего нетмейлового сообщения путём упаковки его согласно правилам формирования Binkley-Style Outbound. Смысл аргументов: В процессе упаковки никаких "подразумеваемых" действий вроде простановки атрибута SNT или прибивания сообщения с атрибутом K/S не производится, для этого есть action rewrite или action kill-sent .)

    к списку действий >>
    к содержанию >>

    Ловушки: Блок Catch: Список действий: Kill-Sent

    	action kill-sent
    
    Используется только непосредственно после action route и удаляет текущее сообщение, если оно имеет атрибут K/S, в противном случае устанавливает ему атрибут SNT.

    к списку действий >>
    к содержанию >>

    Регулярные выражения

    У меня не нашлось под рукой русского перевода, а самому делать его лень :)

    regexp - Copyright (c) 1986 by University of Toronto. Written by Henry Spencer.

    *** Syntax

    A regular expression is zero or more branches, separated by `|'. It matches anything that matches one of the branches.

    A branch is zero or more pieces, concatenated. It matches a match for the first, followed by a match for the second, etc.

    A piece is an atom possibly followed by `*', `+', or `?'. An atom followed by `*' matches a sequence of 0 or more matches of the atom. An atom followed by `+' matches a sequence of 1 or more matches of the atom. An atom followed by `?' matches a match of the atom, or the null string.

    An atom is a regular expression in parentheses (matching a match for the regular expression), a range (see below), `.' (matching any single character), `^' (matching the null string at the beginning of the input string), `$' (matching the null string at the end of the input string), a `\' followed by a single character (matching that character), or a single character with no other significance (matching that character).

    A range is a sequence of characters enclosed in `[]'. It normally matches any single character from the sequence. If the sequence begins with `^', it matches any single character not from the rest of the sequence. If two characters in the sequence are separated by `-', this is shorthand for the full list of ASCII characters between them (e.g. `[0-9]' matches any decimal digit). To include a literal `]' in the sequence, make it the first character (following a possible `^'). To include a literal `-', make it the first or last character.

    *** Ambiguity

    If a regular expression could match two different parts of the input string, it will match the one which begins earliest. If both begin in the same place but match different lengths, or match the same length in different ways, life gets messier, as follows.

    In general, the possibilities in a list of branches are considered in left-to-right order, the possibilities for `*', `+', and `?' are considered longest-first, nested constructs are considered from the outermost in, and concatenated constructs are considered leftmost-first. The match that will be chosen is the one that uses the earliest possibility in the first choice that has to be made. If there is more than one choice, the next will be made in the same manner (earliest possibility) subject to the decision on the first choice. And so forth.

    For example, `(ab|a)b*c' could match `abc' in one of two ways. The first choice is between `ab' and `a'; since `ab' is earlier, and does lead to a successful overall match, it is chosen. Since the `b' is already spoken for, the `b*' must match its last possibility-the empty string-since it must respect the earlier choice.

    In the particular case where no `|'s are present and there is only one `*', `+', or `?', the net effect is that the longest possible match will be chosen. So `ab*', presented with `xabbbby', will match `abbbb'. Note that if `ab*' is tried against `xabyabbbz', it will match `ab' just after `x', due to the begins-earliest rule. (In effect, the decision on where to start the match is the first choice to be made, hence subsequent choices must respect it even if this leads them to less-preferred alternatives.)

    к содержанию >>

    Контактная информация

    По всем вопросам, связаным с использованием Hi-Track, Hi-Files, или других продуктов, в которых угадывается моё авторство :) обращайтесь к первоисточнику .) Удачи!

    к содержанию >>