APPENDIX B
Примеры smail Файлов Конфигурации
Этот раздел показывает типовые файлы конфигурации для пункта UUCP в локальной вычислительной сети. Они основаны на типовых файлах, включенных в исходное распределение smail-3.1.28. Хотя я делаю слабую попытку объяснить, как эти файлы работают. Первый показанный файл - файл программ маршрутизации, который описывает набор программ маршрутизации для smail. Когда smail должен послать сообщение к данному адресу, он вручает адрес всем программам маршрутизации по очереди, пока одна из них не найдет соответствие. Соответствие здесь означает что программа маршрутизации находит host адресата в базе данных, буть это файл paths, /etc/hosts, или любой механизм маршрутизации. Входы в smail файлах конфигурации всегда начинаются с уникального имени, идентифицирующего программу маршрутизации, транспорт, или руководитель. Они сопровождаются списком атрибутов, которые определяют поведение. Этот список состоит из набора глобальных атрибутов, типа драйвера, и частных атрибутов, которые понятны только этому специфическому драйверу. Атрибуты отделяются запятыми, в то время как наборы глобальных и частных атрибутов отделяются от друг друга, используя точку с запятой. В smail, Вы можете определять две программы маршрутизации в файле программ маршрутизации, обе из которых используют pathalias драйвер. Этот драйвер ищет hostnames в pathalias базе данных. Он ожидает имя файла в частном атрибуте:
# # pathalias database for intra-domain routing domain paths: driver=pathalias, # look up host in a paths file transport=uux; # if matched, deliver over UUCP file=paths/domain, # file is /usr/lib/smail/paths/domain proto=lsearch, # file is unsorted (linear search) optional, # ignore if the file does not exist required=vbrew.com, # look up only *.vbrew.com hosts # # pathalias database for routing to hosts outside our domain world paths: driver=pathalias, # look up host in a paths file transport=uux; # if matched, deliver over UUCP file=paths/world, # file is /usr/lib/smail/paths/world proto=bsearch, # file is sorted with sort(1) optional, # ignore if the file does not exist -required, # no required domains domain=uucp, # strip ending ".uucp" before searching
Второй атрибут глобальной переменной, данный в каждом из двух входов программ маршрутизации выше определяет транспорт, который должен использоваться, когда программа маршрутизации обрабатывает адрес. В нашем случае, сообщение будет передано используя uux транспорт. Транспорты определены в файле transports, который объяснсется ниже. Вы можете подстраивать, которым транспортом сообщение будет передаваться, если Вы определяете mathod файл вместо атрибута transports. Файлы методов обеспечивают отображение целевого hostnames на transports. Мы не будем иметь дело с ними здесь. Следующий файл программ маршрутизации определяет программы маршрутизации для локальной вычислительной сети, которые сделают запрос библиотеки решающих устройств. На host Internet, однако, Вы хотели бы использовать программу маршрутизации, которая обрабатывает записи MX. Вы должны следовательно разкомментировать альтернативную inet программу маршрутизации, которая использует встроенный драйвер BIND smail. В среде, которая смешивает UUCP и TCP/IP, Вы можете сталкиваться с проблемой, что Вы имеете главные ЭВМ в вашем файле /etc/hosts, с которыми Вы имеете только случайный SLIP или PPP контакт. Обычно, Вы все еще хотели бы посылать любую почту для них по UUCP. Чтобы предотвращать inet драйвер главных ЭВМ от соответствия этих главных ЭВМ, Вы должны поместить их в файл paths/force. Это - другая база данных pathalias-стилей, она проверяется прежде чем smail делает запрос решающего устройства.
# A sample /usr/lib/smail/routers file # # force - force UUCP delivery to certain hosts, even when # they are in our /etc/hosts force: driver=pathalias, # look up host in a paths file transport=uux; # if matched, deliver over UUCP file=paths/force, # file is /usr/lib/smail/paths/force optional, # ignore if the file does not exist proto=lsearch, # file is unsorted (linear search) -required, # no required domains domain=uucp, # strip ending ".uucp" before searching # inet addrs - match domain literals containing literal # IP addresses, such as in janet@[191.72.2.1] inet addrs: driver=gethostbyaddr, # driver to match IP domain literals transport=smtp; # deliver using SMTP over TCP/IP fail if error, # fail if address is malformed check for local, # deliver directly if host is ourself # inet hosts - match hostnames with gethostbyname(3N) # Comment this out if you wish to use the BIND version instead. inet hosts: driver=gethostbyname, # match hosts with the library function transport=smtp; # use default SMTP -required, # no required domains -domain, # no defined domain suffixes -only local domain, # don't restrict to defined domains # inet hosts - alternate version using BIND to access the DNS #inet hosts: # driver=bind, # use built-in BIND driver # transport=smtp; # use TCP/IP SMTP for delivery # # defnames, # use standard domain searching # defer no connect, # try again if the nameserver is down # -local mx okay, # fail (don't pass through) an MX # # to the local host # # pathalias database for intra-domain routing domain paths: driver=pathalias, # look up host in a paths file transport=uux; # if matched, deliver over UUCP file=paths/domain, # file is /usr/lib/smail/paths/domain proto=lsearch, # file is unsorted (linear search) optional, # ignore if the file does not exist required=vbrew.com, # look up only *.vbrew.com hosts # # pathalias database for routing to hosts outside our domain world paths: driver=pathalias, # look up host in a paths file transport=uux; # if matched, deliver over UUCP file=paths/world, # file is /usr/lib/smail/paths/world proto=bsearch, # file is sorted with sort(1) optional, # ignore if the file does not exist -required, # no required domains domain=uucp, # strip ending ".uucp" before searching # smart host - a partically specified smarthost director # If the smart path attribute is not defined in # /usr/lib/smail/config, this router is ignored. # The transport attribute is overridden by the global # smart transport variable smart host: driver=smarthost, # special-case driver transport=uux; # by default deliver over UUCP -path, # use smart path config file variable
Обработка почты для локальных адресов конфигурирована в файле directors. Это сделано точно так же как файл программ маршрутизации, со списком входов, которые определяют руководителя каждой. Руководители не посылают сообщение, они просто выполняют всю переадресацию, которая является возможной, например через aliases, пересылку почты, и т.п.. При поставке почты к локальному адресу, типа janet, smail передает имя usr всем directors по очереди. Если director соответствует, это или определяет транспорт, которым сообщение должно быть передано (например, к mailbox файлу пользователя), или генерирует новый адрес (например, после специальной оценки). Из-за включаемых проблем защиты, directors обычно делает множество проверок того, могут ли файлы которые они используют быть скомпрометированы или нет. Адреса, полученные несколько сомнительным способом (например от world -перезаписываемый файл aliases) помечены как небезопасные. Некоторые транспортные драйверы отвергнут такие адреса, например транспорт, который передает сообщение файлу. Кроме этого, smail также связывает пользователя с каждым адресом. Любая запись или операции чтения выполняется как пользователь. Для получения в, скажем mailbox janet, адрес конечно связан с janet. Другие адреса, типа тех что получены из файла aliases, имеют других пользователей, связанных с ними, например, пользователь nobody. Для подробностей этих возможностей, пожалуйста обратитесь к smail manpage.
# A sample /usr/lib/smail/directors file # aliasinclude - expand ":include:filename" addresses produced # by alias files aliasinclude: driver=aliasinclude, # use this special-case driver nobody; # access file as nobody user if unsecure copysecure, # get permissions from alias director copyowners, # get owners from alias director # forwardinclude - expand ":include:filename" addrs produced # by forward files forwardinclude: driver=forwardinclude, # use this special-case driver nobody; # access file as nobody user if unsecure checkpath, # check path accessibility copysecure, # get perms from forwarding director copyowners, # get owners from forwarding director # aliases - search for alias expansions stored in a database aliases: driver=aliasfile, # general-purpose aliasing director -nobody, # all addresses are associated # with nobody by default anyway sender okay, # don't remove sender from expansions owner=owner-$user; # problems go to an owner address file=/usr/lib/aliases, # default: sendmail compatible modemask=002, # should not be globally writable optional, # ignore if file does not exist proto=lsearch, # unsorted ASCII file # dotforward - expand .forward files in user home directories dotforward: driver=forwardfile, # general-purpose forwarding director owner=real-$user, # problems go to the user's mailbox nobody, # use nobody user, if unsecure sender okay; # sender never removed from expansion file=~/.forward, # .forward file in home directories checkowner, # the user can own this file owners=root, # or root can own the file modemask=002, # it should not be globally writable caution=0-10:uucp:daemon, # don't run things as root or daemons # be extra careful of remotely accessible home directories unsecure="~ftp:~uucp:~nuucp:/tmp:/usr/tmp", # forwardto - expand a "Forward to " line at the top of # the user's mailbox file forwardto: driver=forwardfile, owner=Postmaster, # errors go to Postmaster nobody, # use nobody user, if unsecure sender okay; # don't remove sender from expansion file=/var/spool/mail/${lc:user}, # location of user's mailbox forwardto, # enable "Forward to " check checkowner, # the user can own this file owners=root, # or root can own the file modemask=0002, # under System V, group mail can write caution=0-10:uucp:daemon, # don't run things as root or daemons # user - match users on the # local host with delivery to their mailboxes user: driver=user; # driver to match usernames transport=local, # local transport goes to mailboxes # real user - match usernames when prefixed with the string "real-" real user: driver=user; # driver to match usernames transport=local, # local transport goes to mailboxes prefix="real-", # for example, match real-root # lists - expand mailing lists stored below /usr/lib/smail/lists lists: driver=forwardfile, caution, # flag all addresses with caution nobody, # and then associate the nobody user sender okay, # do NOT remove the sender owner=owner-$user; # the list owner # map the name of the mailing list to lower case file=lists/${lc:user},
После успешно маршрутизации или направления сообщения, smail вручает сообщение транспорту, заданному программой маршрутизации или director, который соответствовал(согласовал) адресу. Эти transports определен в файле transports. Снова, транспорт определен набором глобальных и частных опций. Наиболее важная опция, определенная каждым входом - драйвер, который обрабатывает транспорт, например драйвер трубопровода, который вызывает команду, заданную в cmd атрибуте. Кроме этого, имеется число глобальных атрибутов, которые транспорт может использовать, которые выполняют различные преобразования заголовка сообщения, и возможно тела сообщения.
# A sample /usr/lib/smail/transports file # local - deliver mail to local users local: driver=appendfile, # append message to a file return path, # include a Return-Path: field from, # supply a From envelope line unix from hack, # insert > before From in body local; # use local forms for delivery file=/var/spool/mail/${lc:user}, # location of mailbox files group=mail, # group to own file for System V mode=0660, # group mail can access suffix="\n", # append an extra newline # pipe - deliver mail to shell commands pipe: driver=pipe, # pipe message to another program return path, # include a Return-Path: field from, # supply a From envelope line unix from hack, # insert > before From in body local; # use local forms for delivery cmd="/bin/sh -c $user", # send address to the Bourne Shell parent env, # environment info from parent addr pipe as user, # use user-id associated with address ignore status, # ignore a non-zero exit status ignore write errors, # ignore write errors, i.e., broken pipe umask=0022, # umask for child process -log output, # do not log stdout/stderr # file - deliver mail to files file: driver=appendfile, return path, # include a Return-Path: field from, # supply a From envelope line unix from hack, # insert > before From in body local; # use local forms for delivery file=$user, # file is taken from address append as user, # use user-id associated with address expand user, # expand ~ and $ within address suffix="\n", # append an extra newline mode=0600, # set permissions to 600 # uux - deliver to the rmail program on a remote UUCP site uux: driver=pipe, uucp, # use UUCP-style addressing forms from, # supply a From envelope line max addrs=5, # at most 5 addresses per invocation max chars=200; # at most 200 chars of addresses
cmd="/usr/bin/uux - -r -a$sender -g$grade $host!rmail $(($user)$)", pipe as sender, # have uucp logs contain caller log output, # save error output for bounce messages # defer child errors, # retry if uux returns an error # demand - deliver to a remote rmail program, # polling immediately demand: driver=pipe, uucp, # use UUCP-style addressing forms from, # supply a From envelope line max addrs=5, # at most 5 addresses per invocation max chars=200; # at most 200 chars of addresses cmd="/usr/bin/uux - -a$sender -g$grade $host!rmail $(($user)$)", pipe as sender, # have uucp logs contain caller log output, # save error output for bounce messages # defer child errors, # retry if uux returns an error # hbsmtp - half-baked BSMTP. The output files must # be processed regularly and sent out via UUCP. hbsmtp: driver=appendfile, inet, # use RFC 822-addressing hbsmtp, # batched SMTP w/o HELO and QUIT -max addrs, -max chars; # no limit on number of addresses file="/var/spool/smail/hbsmtp/$host", user=root, # file is owned by root mode=0600, # only read-/writeable by root. # smtp - deliver using SMTP over TCP/IP smtp: driver=tcpsmtp, inet, -max addrs, -max chars; # no limit on number of addresses short timeout=5m, # timeout for short operations long timeout=2h, # timeout for longer SMTP operations service=smtp, # connect to this service port # For internet use: uncomment the below 4 lines # use bind, # resolve MX and multiple A records # defnames, # use standard domain searching # defer no connect, # try again if the nameserver is down # -local mx okay, # fail an MX to the local host