Мысль с address_data принесла свои плоды:

begin routers
  smart_host:
    driver = manualroute
    transport = remote_smtp
    domains = ! +local_domains
    address_data = ${lookup{$domain}lsearch*{CONFDIR/smart-hosts} 
{${extract{auth}{$value} {auth-key=${quote:$value}}}}}
    route_data = ${lookup{$domain}lsearch*{CONFDIR/smart-hosts} 
{${extract{endpoints}{$value} {${sg{${sg{$value}{\N\^\N}{::}}}{,}{:}}}}}{}}
    verify = no

begin transports
  remote_smtp:
    driver = smtp
    hosts_require_auth = 
${extract{auth-key}{$address_data}{${lookup{${quote:$value}}lsearch{CONFDIR/auth-virtual-client}
 {$host} {}}}}

begin authenticators
  login:
    driver = plaintext
    client_send = 
${extract{auth-key}{$address_data}{${lookup{${quote::$value}}lsearch{CONFDIR/auth-virtual-client}
 {${extract{1}{::}{$value} {$value}{}}} {}}}} : 
${extract{auth-key}{$address_data}{${lookup{${quote::$value}}lsearch{CONFDIR/auth-virtual-client}
 {${extract{2}{::}{$value} {$value}{}}} {}}}}
    public_name = LOGIN
    server_condition = ${lookup{$auth1}lsearch{CONFDIR/auth-virtual-server} 
{${if crypteq{$auth2}{$value}}} {false}}
    server_prompts = User Name : Password

  plain:
    driver = plaintext
    client_send = 
${extract{auth-key}{$address_data}{${lookup{${quote::$value}}lsearch{CONFDIR/auth-virtual-client}
 {${reduce{$value}{}{$value^$item}}} {}}}}
    public_name = PLAIN
    server_condition = ${lookup{$auth2}lsearch{CONFDIR/auth-virtual-server} 
{${if crypteq{$auth3}{$value}}} {false}}


# cat smart-hosts
a: endpoints=a.org,b.org auth=mail.p.nyaka.org
b: endpoints=a.org,b.org^587,c.org^2025 auth="mail.p.nyaka org"
*: endpoints=mail.p.nyaka.org auth=mail.p.nyaka.org

# cat auth-virtual-client
mail.p.nyaka.org:login:password

login аутентификатор выглядит... несколько громоздко, но в целом работает все 
так как и хотелось/ожидалось. Даже perl расчехлять не пришлось. :)

> On Jun 15, 2016, at 5:33 PM, Dmitry Bogun <surabu...@surabujin.org.ua> wrote:
> 
> 
>> On Jun 15, 2016, at 3:04 PM, George L. Yermulnik <y...@yz.kiev.ua> wrote:
>> 
>> Hello!
>> 
>> On Wed, 15 Jun 2016 at 14:23:17 (-0500), Dmitry Bogun wrote:
>> 
>>> Проблема в том, что mail.p.nyaka.org - это CNAME(этого я изменить не могу)
>> 
>> RFC уже не в моде =(
> 
> Который именно? Это ж "ручной" роутинг, кто нам тут что запрещает? 
> Единственный "запрет" на CNAME в отношении почты, который я помню - для MX 
> записей. И то там не запрет, а "особое" поведение в случае CNAME.
> 
>>> И вот я не могу придумать как это исправить... "убрать" cname из имени 
>>> которое используется для smart-host'ов я не могу, отказаться от авторизации 
>>> на них тоже, плюс cname время от времени меняется, что отменяет возможность 
>>> "разрешить" его заранее и пользовать ip адрес вместо имени хоста.
>> 
>> Как подручная затычка: с периодичностью меньше самого минимального ttl
>> из всех используемых smart-host'ов прогонять цикл, который будет
>> резолвить cname (например, с помощью `dig +norecurse +short smart-host')
>> и записывать в CONFDIR/auth-virtual-client
>> Судя по всему, в итоге получится не однострочник, а целый скриптик с
>> проверками, но, если цель оправдывает средства, то почему бы и нет =)
> 
> Тоже вариант. Но мне он не нравится. Не люблю я poll скрипты.
> 
> На сейчас есть 2 недодуманные идеи:
> - в smart_host роутере добавлять в address_data ключик, куда он нас отроутил, 
> и потом уже по этому ключу искать login/password
> - извращаться через lookup dnsdb и "ловить" совпадение адресов. (Правда 
> match_ip ограничили в возможностях, есть подозрение что теперь такой "трюк" 
> будет уже невозможен).
> 
> Еще можно зайти по крупному и "взять" в руки perl.
> 
> _______________________________________________
> Exim-users mailing list
> Exim-users@mailground.net
> http://mailground.net/mailman/listinfo/exim-users
> 


_______________________________________________
Exim-users mailing list
Exim-users@mailground.net
http://mailground.net/mailman/listinfo/exim-users

Ответить