Страница 1 из 1
Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-04 17:16:31
deisler
Приветствую всех.
Помогите с acl.
Есть данная проверка.
В ней мы помещаем результать в переменную acl_m_helo_check_a.
Код: Выделить всё
warn log_message = "HELO test A record is [$acl_m_helo_check_a]"
!authenticated = *
hosts = !127.0.0.1 : !localhost : *
condition = ${if !eq{$acl_m_helo_is_fqdn}{}}
set acl_m_helo_check_a = ${lookup dnsdb{>: a=$sender_helo_name}{$value}}
Если А запись существует, в переменной будет содержаться ip адрес(а).
Если А запись не существует, переменная объявится но в ней ничего не будет.
Далее мне нужно сделать проверку, объявлена(существует) ли переменная acl_m_helo_check_a, если не существует - то выдавать defer
Пробовал так:
Код: Выделить всё
defer !authenticated = *
hosts = !127.0.0.1 : !localhost : *
condition = ${if !def:acl_m_helo_check_a}
Но проблема в том, что эта проверка срабатывает, если в переменной пусто. А мне нужно проверять только существование переменной.
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-04 20:38:31
ChihPih
Попробуйте так:
Код: Выделить всё
defer !authenticated = *
hosts = !127.0.0.1 : !localhost : *
condition = ${if or{!def:acl_m_helo_check_a}{={strlen:$acl_m_helo_check_a}{0}{yes}{no}}
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 10:07:53
deisler
Данный кондишн не верный
Код: Выделить всё
failed to expand ACL string "${if or{!def:acl_m_helo_check_a}{={strlen:$acl_m_helo_check_a}{0}{yes}{no}}": each subcondition inside an "or{...}" condition must be in its own {}
да и потом, если был бы верный, всё равно не решал бы задачу, ибо при проверке {!def:acl_m_helo_check_a} кондишн бы срабатывал если в переменной пусто.
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 11:58:04
ChihPih
Поправка:
Код: Выделить всё
defer !authenticated = *
hosts = !127.0.0.1 : !localhost : *
condition = ${if or{\
{!def:acl_m_helo_check_a}\
{={${strlen:$acl_m_helo_check_a}}{0}}\
}}
да и потом, если был бы верный, всё равно не решал бы задачу, ибо при проверке {!def:acl_m_helo_check_a} кондишн бы срабатывал если в переменной пусто.
Чёй то? В первом условии проверяется существование самой переменной. И пусть даже она будет существовать, то вступит второе условие, которое проверяет наличие каких-либо символов в значении переменной. То есть кондишен сработает, когда переменная будет не объявлена, либо пустой.
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 12:22:18
deisler
В том то и дело, что мне нужно, чтобы срабатывал кондишен только если переменная необъявлена, а если она объявлена и пустая или содержит значение - не срабатывал.
def:acl_m_helo_check_a - вот это срабатывает если переменная объявлена или пуста.
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 12:40:00
deisler
Попробовал сделать через perl скрипт, проверить объявлена ли переменная:
Кондишины:
Код: Выделить всё
warn log_message = "HELO test A record is [$acl_m_helo_check_a]"
!authenticated = *
hosts = !127.0.0.1 : !localhost : *
condition = ${if !eq{$acl_m_helo_is_fqdn}{}}
set acl_m_helo_check_a = ${lookup dnsdb{>: a=$sender_helo_name}{$value}}
warn !authenticated = *
log_message = "DEFER IS TRUE: $acl_m_testtest"
hosts = !127.0.0.1 : !localhost : *
set acl_m_testtest = ${perl{def_helo_check_a}}
Perl скрипт
Код: Выделить всё
#!/usr/bin/perl
sub def_helo_check_a {
if (defined Exim::expand_string('$acl_m_helo_check_a')) {
return 0
} else {
return 1
}
}
Но при том, что переменная не объявлена, perl скрипт, почему-то считает, что переменная объявлена и возвращает '0'
Код: Выделить всё
...
processing "warn"
check !authenticated = *
check hosts = !127.0.0.1 : !localhost : *
gethostbyname2(af=inet6) returned 2 (TRY_AGAIN)
gethostbyname2 looked up these IP addresses:
name=localhost.localdomain address=127.0.0.1
host in "!127.0.0.1 : !localhost : *"? yes (matched "*")
check condition = ${if !eq{$acl_m_helo_is_fqdn}{}}
= true
search_open: dnsdb "NULL"
search_find: file="NULL"
key=">: a=ya.ru" partial=-1 affix=NULL starflags=0
LRU list:
internal_search_find: file="NULL"
type=dnsdb key=">: a=ya.ru"
database lookup required for >: a=ya.ru
dnsdb key: ya.ru
DNS lookup of ya.ru (A) gave TRY_AGAIN
ya.ru in dns_again_means_nonexist? no (option unset)
returning DNS_AGAIN
lookup deferred:
warn: condition test deferred in ACL "acl_check_rcpt"
LOG: MAIN
H=(ya.ru) [62.117.85.73] Warning: ACL "warn" statement skipped: condition test deferred: failed to expand ACL string "${lookup dnsdb{>: a=$sender_helo_name}{$value}}": lookup of ">: a=ya.ru" gave DEFER:
processing "warn"
check !authenticated = *
check hosts = !127.0.0.1 : !localhost : *
gethostbyname2(af=inet6) returned 2 (TRY_AGAIN)
gethostbyname2 looked up these IP addresses:
name=localhost.localdomain address=127.0.0.1
host in "!127.0.0.1 : !localhost : *"? yes (matched "*")
Starting Perl interpreter
check set acl_m_testtest = ${perl{def_helo_check_a}}
= 0
warn: condition test succeeded in ACL "acl_check_rcpt"
LOG: MAIN
H=(ya.ru) [x.x.x.x] Warning: "DEFER IS TRUE: 0"
processing "deny"
...
Как такое может быть?
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 12:44:03
deisler
В прочем, perl в любом случае считает, что переменная объявлена...
Код: Выделить всё
...
processing "warn"
check !authenticated = *
check hosts = !127.0.0.1 : !localhost : *
gethostbyname2(af=inet6) returned 4 (NO_DATA)
gethostbyname2 looked up these IP addresses:
name=localhost.localdomain address=127.0.0.1
host in "!127.0.0.1 : !localhost : *"? yes (matched "*")
check condition = ${if !eq{$acl_m_helo_is_fqdn}{}}
= true
search_open: dnsdb "NULL"
search_find: file="NULL"
key=">: a=ya.ru" partial=-1 affix=NULL starflags=0
LRU list:
internal_search_find: file="NULL"
type=dnsdb key=">: a=ya.ru"
database lookup required for >: a=ya.ru
dnsdb key: ya.ru
DNS lookup of ya.ru (A) succeeded
lookup yielded: 93.158.134.3:93.158.134.203:213.180.193.3:213.180.204.3:77.88.21.3:87.250.250.3:87.250.250.203:87.250.251.3
check set acl_m_helo_check_a = ${lookup dnsdb{>: a=$sender_helo_name}{$value}}
= 93.158.134.3:93.158.134.203:213.180.193.3:213.180.204.3:77.88.21.3:87.250.250.3:87.250.250.203:87.250.251.3
warn: condition test succeeded in ACL "acl_check_rcpt"
LOG: MAIN
H=(ya.ru) [62.117.85.73] Warning: "HELO test A record is [93.158.134.3:93.158.134.203:213.180.193.3:213.180.204.3:77.88.21.3:87.250.250.3:87.250.250.203:87.250.251.3]"
processing "warn"
check !authenticated = *
check hosts = !127.0.0.1 : !localhost : *
gethostbyname2(af=inet6) returned 4 (NO_DATA)
gethostbyname2 looked up these IP addresses:
name=localhost.localdomain address=127.0.0.1
host in "!127.0.0.1 : !localhost : *"? yes (matched "*")
Starting Perl interpreter
check set acl_m_testtest = ${perl{def_helo_check_a}}
= 0
warn: condition test succeeded in ACL "acl_check_rcpt"
LOG: MAIN
H=(ya.ru) [x.x.x.x] Warning: "DEFER IS TRUE: 0"
processing "deny"
...
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 12:47:50
deisler
Но если сделать простой тестовый скриптик
Код: Выделить всё
#!/usr/bin/perl
sub def_helo_check_a {
if (defined $testvalue) {
return 0
} else {
return 1
}
}
print def_helo_check_a;
То при выполнении из командной строки скрипт возвращает '1'.
Видимо дело в
или в чём-то ещё....
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-05 17:24:24
ChihPih
Как вариант можно так - задайте переменной какое-нибудь значение по умолчанию и если оно не изменилось, тогда пусть кондишен отрабатывает...
Re: Помогите с acl exim. Проверка существования переменной.
Добавлено: 2013-04-09 9:07:47
deisler
Реализовал через начальное значение переменной.
Других вариантов не вижу.