Google
 
Web avtobazar.com.ua
 

                                                              6. Другая Конфигурация

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

6.1. Параметры в BuildTools/OS/$oscf

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

 NDBM
                   Если установлен, то будет использоваться новая версия библиотеки DBM, разрешающая разнообразные базы данных. Если не установлено ни NDBM, ни NEWDB,
                   используется наименее эффективный метод просмотра псевдонимов.
 NEWDB
                   Если он указан, использовать новый пакет баз данных от Berkeley (с 4.4BSD). Этот пакет существенно быстрее, чем DBM или NDBM. Если указаны и NEWDB и NDBM, sendmail
                   будет читать файлы DBM, но будет создавать и использовать файлы NEWDB.
 NIS
                   Включить поддержку NIS. Если указанно вместе с NEWDB и NDBM, sendmail будет создавать и DBM и NEWDB файлы только в том случае, если файл псевдонимов включает
                   подстроку "/yp/" в имени. Это предназначено для совместимости с программой mkalias от Sun Microsystems, используемой на мастерах YP.
 NISPLUS
                   Вкомпилировать поддержку NIS+.
 NETINFO
                   Вкомпилировать поддержку NetInfo (рабочие станции NeXT).
 LDAPMAP
                   Вкомпилировать поддержку запросов LDAP X500. Требует libldap и liblber от Umich LDAP 3.2 или 3.3 release.
 HESIOD
                   Вкомпилировать поддержку Hesiod.
 _PATH_SENDMAILCF
                   Путь к файлу sendmail.cf.
 _PATH_SENDMAILPID
                   Путь к файлу sendmail.pid.
 

Есть также несколько флагов компиляции для указания среды, например "_AIX3" и "_SCO_unix_". Смотри файл src/READ_ME, содержащий самое свежее описание собрание этих флагов.

6.2. Параметры в src/conf.h

Параметры и опции компиляции определяются в conf.h. Большинство из них обычно не трогают; все общие параметры находятся в sendmail.cf. Однако, размеры конкретных простейших
векторов и т.д., включены в этот файл. Числа, стоящие после параметров означают их значения по умолчанию.

Этот документ не лучший источник информации о флагах компиляции в conf.h - лучше смотреть src/READ_ME или сам src/conf.h.

Существует множество других опций компиляции. Они определяют включать или нет в компиляцию определенные части кода. Отмеченные знаком | имеют значения 0/1.
 NETINET|
               Если установлена, вкомпилируется поддержка сетевого протокола Internet. Предыдущие версии sendmail устанавливали ее опцией DAEMON; это старое использование теперь
               неправильно. По умолчанию включена; выключите ее, если ваша система не поддерживает протоколы Internet.
 NETISO|
               Если установлена, вкомпилируется поддержка сетевого протокола ISO (она может быть соответственно определена как #define в Makefile вместо conf.h).
 LOG
               Если установлена, то используется программа syslog. Она делает информационные записи в протокол при каждой обработке сообщения, и делает запись в лог более высокого
               приоритета при внутренних ошибках системы. ОЧЕНЬ РЕКОМЕНДУЕТСЯ - если вам не нужно протоколирование, выключите его в файле конфигурации.
 MATCHGECOS|
               Вкомпилировать код для "нечеткого совпадения " в поле GECOSв /etc/passwd. Также требует, чтобы опция MatchGECOS была включена.
 NAMED_BIND|
               Вкомпилировать код для использования сервера Berkeley Internet Name Domain (BIND) для определения TCP/IP имен хостов.
 NOTUNIX
               Если вы используете почтовый формат, отличный от UNIX, вы можете выставить этот флаг, чтобы отключить специальную обработку строк "From" в стиле UNIX.
 QUEUE|
               Этот флаг должен быть выставлен для включения кода очереди. Если он не установлен, почтовые программы должны принимать почту немедленно, или она будет
               возвращена отправителю.
 SMTP|
               Если установлен, то будет вкомпилирован код для обработки пользовательского и серверного SMTP. Необходим только в случае, если ваша машина имеет почтовые
               программы, говорящие на SMTP (то есть большинство машин).
 USERDB|
               Включить экспериментальный пакет Berkeley user Information database. Это добавит новый уровень расширения локальных имен между псевдонимизированием и
               перенаправлением. Использует пакет NEWDB. Может быть изменено в будущих выпусках.
 

Следующие опции обычно включаются в описаниях операционных систем в conf.h.

 IDENTPROTO|
                  Вкомпилировать протокол IDENT определенный в RFC 1413. По умолчанию включена для всех систем, кроме Ultrix, которая, видимо, имеет такую интересную "особенность",
                  что при получении сообщения "host unreachable", она закрывает все открытые соединения к тому хосту. Из-за того, что некоторые файервольные шлюзы посылают этот
                  код ошибки при соединении с неавторизованным портом (типа 113, используемого IDENT), Ultrix не может получать email с таких хостов.
 SYSTEM5
                  Устанавливает все параметры компиляции, подходящие для System V.
 HASFLOCK|
                  Использовать для блокировки Berkeley-style flock вместо SystemV lockf. Вследствие очень необычной семантики блокировок между разветвлениями в lockf, эта опция, по
                  возможности, всегда должна быть использована.
 HASINITGROUPS
                  Выставьте эту опцию, если ваша система имеет вызов initgroups()(если вы имеете поддержку множественных групп). Используется по умолчанию, если не определена
                  SYSTEM5, или если у вас HPUX.
 HASUNAME
                  Установите ее, если у ваша система имеет системный вызов uname(2) (или соответствующую библиотечную подпрограмму). Используется по умолчанию, если определена
                  SYSTEM5.
 HASGETDTABLESIZE
                  Установите ее, если вы имеете системный вызов getdtablesize(2).
 HASWAITPID
                  Установите ее, если вы имеете системный вызов haswaitpid(2).
 SFS_TYPE
                  Механизм, который может быть использован для получения информации об объеме файловой системы. Значение может быть одним из SFS_USTAT (использует
                  системный вызов ustat(2)), SFS_4ARGS (использует системный вызов statfs(2) с четырьмя аргументами), SFS_VFS (использует системный вызов statfs(2) с двумя
                  аргументами, включая <sys/vfs.h>), SFS_MOUNT (использует системный вызов statfs(2) с двумя аргументами, включая <sys/mount.h>), SFS_STATFS (использует
                  системный вызов statfs(2) с двумя аргументами, включая <sys/statfs.h>), SFS_STATVFS (использует системный вызов statfs(2) с двумя аргументами, включая
                  <sys/statvfs.h>), или SFS_NONE (никаким образом нельзя получить эту информацию).
 LA_TYPE
                  Тип средней загрузки. Подробности описаны ниже.
 

Существует несколько встроенных способов подсчета средней загрузки. Sendmail пытается автоматически сконфигурировать их на основе несовершенных догадок; вы можете выбрать один из
них используя опцию cc -DLA_TYPE=type, где type - это:

 LA_INT
          Ядро хранит среднюю загрузку в ядре как целые числа типа long. Настоящие значения масштабируются коэффициентом FSCALE (по умолчанию 256).
 LA_SHORT
          Ядро хранит среднюю загрузку в ядре как целые числа типа short. Настоящие значения масштабируются коэффициентом FSCALE (по умолчанию 256).
 LA_FLOAT
          Ядро хранит среднюю загрузку в ядре как массив чисел с плавающей точкой двойной точности.
 LA_MACH
          Использовать средние загрузки в стиле MACH.
 LA_SUBR
          Вызывать программу getloadavg для получения средних загрузок в виде массива чисел типа double.
 LA_ZERO
          Всегда в качестве средней загрузки возвращать ноль. Это крайний случай.
 

Если определен тип LA_INT, LA_SHORT, или LA_FLOAT, вам также может понадобиться определить _PATH_UNIX (путь к вашим системным бинарникам) и LA_AVENRUN (имя переменной,
содержащей среднюю загрузку в ядре; обычно "_avenrun" или "avenrun").

6.3. Конфигурация в src/conf.c

В conf.c могут быть сделаны следующие изменения.

6.3.1. Встроенные Семантики Заголовков

Не все семантики заголовков определяются в файле конфигурации. Строки заголовков, которые могут быть включены только определенными почтовыми программами (так же как и другие
более скрытые семантики) могут быть определены в таблице HdrInfo в conf.c. Эта таблица содержит имя заголовка (которое должно быть в символах нижнего регистра) и набор управляющих
флагов заголовка (описанных ниже). Флаги таковы:

 H_ACHECK
             Обычно, когда сделана проверка совместимости строки заголовка с почтовой программой, sendmail не удаляет существующую строку. Если этот флаг выставлен, sendmail будет
             удалять существующие строки заголовка. То есть, если этот бит выставлен, и почтовая программа не имеет установленные биты флагов, пересекающиеся с требуемыми
             почтовой программой флагами в определении заголовка в sendmail.cf, строка заголовка всегда уничтожается.
 H_EOH
             Если установлено это поле заголовка, обращаться с ним, как с пустой строкой, т.е. оно сигнализирует о конце заголовка и начале текста сообщения
 H_FORCE
             Добавить это вхождение в заголовок, даже если в сообщении такое уже было. Если вхождение заголовка не имеет этот бит выставленным, sendmail не добавит в заголовок еще
             одну строку, если строка с таким именем уже имеется в заголовке. Это обычно может быть использовано для того, чтобы каждый, кто обрабатывал это сообщение, оставлял в
             нем отметку.
 H_TRACE
             Если этот флаг установлен, то это поле временной метки (трассировки). Если количество полей трассировки в сообщении превышает предустановленное значение, сообщение
             возвращается по подозрению в псевдонимной петле.
 H_RCPT
             Если выставлен, то это поле содержит адреса получателей. Это поле используется флагом -t, когда он собирает получателей из сообщения, чтобы определить, кому посылать.
 H_FROM
             Этот флаг указывает, что это поле определяет отправителя. Порядок этих полей в таблице HdrInfo определяет предпочтение sendmail, по какому полю отправлять сообщения об
             ошибке.
 H_ERRORSTO
             Адреса в этом заголовке должны получить сообщения об ошибке.
 H_CTE
             Этот заголовок является заголовком Content-Transfer-Encoding.
 H_CTYPE
             Этот заголовок является заголовком Content-Type.
 H_STRIPVAL
             Обрезать значение из заголовка (для Bcc:).
 

Давайте взглянем на пример спецификации HdrInfo:

        struct hdrinfo                          HdrInfo[] =
        {
                /* originator fields, most to least significant */
                "resent-sender",                H_FROM,
                "resent-from",                  H_FROM,
                "sender",                       H_FROM,
                "from",                         H_FROM,
                "full-name",                    H_ACHECK,
                "errors-to",                    H_FROM|H_ERRORSTO,
                /* destination fields */
                "to",                           H_RCPT,
                "resent-to",                    H_RCPT,
                "cc",                           H_RCPT,
                "bcc",                          H_RCPT|H_STRIPVAL,
                /* message identification and control */
                "message",                      H_EOH,
                "text",                         H_EOH,
                /* trace fields */
                "received",                     H_TRACE|H_FORCE,
                /* miscellaneous fields */
                "content-transfer-encoding",    H_CTE,
                "content-type",                 H_CTYPE,
                NULL,                           0,
        };

Эта структура показывает, что поля "To:", "ResentTo:", и "Cc:" - все они определяют адреса получателей. Любое поле "Full-Name:" будет удалено, пока требуемый флаг почтовой программы
(указанный в файле конфигурации) не будет определен. Поля "Message:" и "Text:" будут заканчивать заголовок; они используются различными несогласными протестантами в сетевом мире.
Поле "Received:" всегда будет добавлено, и может быть использовано для трассировки сообщений.

Здесь имеется большое количество важных точек. Во-первых, поля заголовка не добавляются автоматически просто потому, что они имеются в структуре HdrInfo; для того, чтобы они
добавлялись в сообщение, они должны быть определены в файле конфигурации. Ко всем полям, упомянутым в файле конфигурации, но не упомянутым в структуре HdrInfo применяется
обработка по умолчанию; то есть, они добавляются, если их еще нет в сообщении. Во-вторых, структура HdrInfo всего лишь определяет банальную обработку; конкретные заголовки
обрабатываются отдельно, специальным кодом, вне зависимости от статуса, определенного в HdrInfo. Например, поля "Sender:" и "From:" всегда просматриваются в почте ARPANET для
определения отправителя1; это используется для выполнения функции "вернуть отправителю". Поля "From:" и "Full-Name:" используются для определения полного имени отправителя, если
это возможно; оно сохраняется в макросе $x и используется во многих случаях.

6.3.2. Ограничение использования Email

Если существует необходимость ограничить прохождение почты через ретранслятор (relay), может быть изменена подпрограмма checkcompat. Эта подпрограмма вызывается для каждого
адреса получателя. Она возвращает статус выхода, показывающий статус сообщения. Статус EX_OK принимает адрес, EX_TEMPFAIL ставит сообщение в очередь для более поздней попытки, а
другие значения (обычно EX_UNAVAILABLE) отвергают сообщение. При отвержении сообщения checkcompat выдается сообщение об ошибке (используя usrerr). Например, checkcompat может
быть такой:

        int
        checkcompat(to, e)
                register ADDRESS *to;
                register ENVELOPE *e;
        {
                register STAB *s;
                s = stab("private", ST_MAILER, ST_FIND);
                if (s != NULL && e->e_from.q_mailer != LocalMailer &&
                        to->q_mailer == s->s_mailer)
                {
                        usrerr("No private net mail allowed through this machine");
                        return (EX_UNAVAILABLE);
                }
                if (MsgSize > 50000 && bitnset(M_LOCALMAILER, to->q_mailer))
                {
                        usrerr("Message too large for non-local delivery");
                        e->e_flags |= EF_NORETURN;
                        return (EX_UNAVAILABLE);
                }
                return (EX_OK);
        }

Такая конструкция будет отвергать сообщения размером более 50000 байт, если они не локальны. Для подавления возврата тела сообщения при ошибке, в e->e flags может быть выставлен
флаг EF NORETURN. Конкретное использование этой подпрограммы очень зависит от реализации, и должно быть ограниченным.

6.3.3. Классы Преобразований Новой Базы Данных

Новые ключевые преобразования могут быть добавлены созданием функции инициализации класса и функции просмотра. Они потом добавляются в подпрограмму setupmaps.

Функция инициализации вызывается так:

xxx map init(MAP *map, char *args)

где map является внутренней структурой данных; args - это указатель на кусок строки файла конфигурации с последующим именем класса преобразования; флаги и имена файлов могут быть
взяты из этой строки. Функция инициализации должна возвращать TRUE, если она успешно открыла преобразование, и FALSE в другом случае.

Функция просмотра вызывается так:

xxx map lookup(MAP *map, char buf[], char **av, int *statp)

где map внутренне определяет преобразование; buf имеетв входной ключ; Он может быть (и даже очень часто так оно и есть) использован разрушающе; av - список аргументов, передаваемых
внутрь из переписываемой строки. Функция просмотра должна возвращать указатель на новое значение. Если просмотр преобразования не успешен, *statp должен быть выставлен на код
статуса выхода; в частности, если была произведена попытка восстановления кодом более высокого уровня, он должен быть выставлен в EX_TEMPFAIL,.

6.3.4. Функция Организации Очереди

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

        bool
        shouldqueue(pri, ctime)
                long pri;
                time_t ctime;
        {
                if (CurrentLA < QueueLA)
                        return (FALSE);
                return (pri > (QueueFactor / (CurrentLA - QueueLA + 1)));
        }

Если текущая средняя загрузка (глобальная переменная CurrentLA, определяемая до вызова функции) меньше, чем нижний порог средней загрузки (опция x, переменная QueueLA), shouldqueue
немедленно возвращает FALSE (то есть, оно не должно быть поставлено в очередь). Если текущая средняя загрузка превышает верхний порог средней загрузки (опция X, переменная
RefuseLA), shouldqueue немедленно возвращает TRUE. В других случаях, она подсчитывает функцию основанную на приоритете сообщения, коэффициенте очереди (опция q, глобальная
переменная QueueFactor), и текущей и пороговой средней загрузке.

Реализация, которая берет в рассмотрение настоящий возраст сообщения, может также использовать параметр ctime, который является временем первого представления сообщения в
sendmail. Заметьте, что параметр pri уже учтен в количестве попыток отсылки сообщения (хотя, со временем это приводит к понижению приоритета сообщения); в ожидании того, что ctime
будет использован как "оператор выхода" для гарантии того, что сообщение, в конце концов, обработано.

6.3.5. Отвержение Входящих Соединений SMTP

Если входящее соединение SMTP должно быть отвергнуто, функция refuseconnections возвращает TRUE. Текущая реализация основана исключительно на текущей средней загрузке и опции
средней загрузки отказа (опция X, глобальная переменная RefuseLA):

        bool
        refuseconnections()
        {
                return (CurrentLA >= RefuseLA);
        }

Более умная реализация должна смотреть на большее количество системных ресурсов.

6.3.6. Подсчет Средней Загрузки

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

6.4. Конфигурация в src/daemon.c

Файл src/daemon.c содержит большое количество подпрограмм, зависящих от локальной сетевой среды. Поставляемая версия подразумевает, что вы имеете сокеты в стиле BSD.

В предыдущих выпусках, если вы хотели обобщить просмотры $[ ... $], мы рекомендовали вам изменить подпрограмму maphostname. Теперь, вместо этого, мы рекомендуем вам создавать
новое ключевое преобразование.
 

    1.На самом деле, в SMTP такого больше нет; эта информация содержится на конверте. Старые протоколы ARPANET не полностью отличали заголовок от конверта.
    2.Если вы это сделаете, пожалуйста, присылайте изменения по адресу sendmail@Sendmail.ORG.

                                                                        Назад | Содержание | Вперед