Помогите с acl exim. Проверка существования переменной.

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-04 17:16:31

Приветствую всех.
Помогите с 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}
Но проблема в том, что эта проверка срабатывает, если в переменной пусто. А мне нужно проверять только существование переменной.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

ChihPih
ст. прапорщик
Сообщения: 568
Зарегистрирован: 2009-09-04 12:23:30
Откуда: Где-то в России...
Контактная информация:

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение ChihPih » 2013-04-04 20:38:31

Попробуйте так:

Код: Выделить всё

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}}
www.info-x.org - информационный ресурс о ОС FreeBSD.

deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-05 10:07:53

Данный кондишн не верный

Код: Выделить всё

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} кондишн бы срабатывал если в переменной пусто.

ChihPih
ст. прапорщик
Сообщения: 568
Зарегистрирован: 2009-09-04 12:23:30
Откуда: Где-то в России...
Контактная информация:

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение ChihPih » 2013-04-05 11:58:04

Поправка:

Код: Выделить всё

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} кондишн бы срабатывал если в переменной пусто.
Чёй то? В первом условии проверяется существование самой переменной. И пусть даже она будет существовать, то вступит второе условие, которое проверяет наличие каких-либо символов в значении переменной. То есть кондишен сработает, когда переменная будет не объявлена, либо пустой.
www.info-x.org - информационный ресурс о ОС FreeBSD.

deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-05 12:22:18

В том то и дело, что мне нужно, чтобы срабатывал кондишен только если переменная необъявлена, а если она объявлена и пустая или содержит значение - не срабатывал.

def:acl_m_helo_check_a - вот это срабатывает если переменная объявлена или пуста.

deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-05 12:40:00

Попробовал сделать через 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' :cz2:

Код: Выделить всё

...
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"
...
Как такое может быть?

deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-05 12:44:03

В прочем, 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"
...

deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-05 12:47:50

Но если сделать простой тестовый скриптик

Код: Выделить всё

#!/usr/bin/perl
sub def_helo_check_a {
if (defined $testvalue) {
	return 0
   } else {
	return 1
   }
}
print def_helo_check_a;
То при выполнении из командной строки скрипт возвращает '1'.

Видимо дело в

Код: Выделить всё

Exim::expand_string('$acl_m_helo_check_a')
или в чём-то ещё....

ChihPih
ст. прапорщик
Сообщения: 568
Зарегистрирован: 2009-09-04 12:23:30
Откуда: Где-то в России...
Контактная информация:

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение ChihPih » 2013-04-05 17:24:24

Как вариант можно так - задайте переменной какое-нибудь значение по умолчанию и если оно не изменилось, тогда пусть кондишен отрабатывает...
www.info-x.org - информационный ресурс о ОС FreeBSD.

deisler
рядовой
Сообщения: 35
Зарегистрирован: 2009-03-18 17:56:17

Re: Помогите с acl exim. Проверка существования переменной.

Непрочитанное сообщение deisler » 2013-04-09 9:07:47

Реализовал через начальное значение переменной.
Других вариантов не вижу.