xM писал(а):DenisKh писал(а):...{\N^v=spf.*/2\s\-all\N}...
Он завтра на /3 или /1 сменит маску и все.
Выше анонимус дал более правильный вариант, однако же и более мудрёный.
Как вариант. Исходя из идеи проверять маску из поля TXT.
Код: Выделить всё
/usr/sbin/exim -be
${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=gogomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
Что делает данный код?
1. Вытащить из ДНС строку txt для некоторого домена. Если записи нет - принудительный отказ fail
2. Замена пробелов на ;. У меня не получилось указать явно разделитель " ". Если есть способ - сообщите, поправлю (просто меньше выражение будет).
3. Фильтр списка, полученного на предыдущем этапе, - все что БЕЗ "/" удалить, т.е. остается список вида: ip4:IP1/MASK;ip4:IP2/MASK;*****
4. Далее применяется функция forany, которая возвращает true, если маска любого элемента списка МЕНЬШЕ 16.
5. Функция extract собственно берет из элемента ip4:IP1/MASK часть ДО символа "/", затем идет сравнение с числом 16.
Проверка:
Код: Выделить всё
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=jomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
yes
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=mail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
no
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=ya.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
no
> ${if forany {<; ${filter{<; ${sg {${lookup dnsdb{txt=gogomail.ru}{$value}fail}}{\N \N}{\N;\N}}}{match{$item}{/}} }}{ < {${extract{-1}{/}{$item}}}{16}}{yes}{no}}
yes
>
Может кто предложит лучший вариант, либо здраво покритикует данную конструкцию.