Exim + sh + condition

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-23 17:27:27

Задача - отвергать письмо при условии, которое задается внешним скриптом (0 - отвергать, остальное - принимать)

deny message = Nafig!
set acl_m1 = ${run{/usr/local/script.sh}{$value}{error}}
condition = ${if eq{$acl_m1}{0}}

Сам скрипт script.sh, допустим:

#!/bin/sh
echo 0

Проблема вот в чем - скрипт запускается, но в переменную acl_m1 не помещается значение стандартного вывода скрипта, т.е. 0. Ну или 1, или не важно что там выставить. Сам скрипт экзимом дергается, но пропускает все письма, т.к. в любом случае условие не true.

Ткните плиз в ошибку, моск кипит уже :)

Хостинговая компания 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/

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-24 12:39:49

что, никто не подскажет? :(

Аватара пользователя
liet
мл. сержант
Сообщения: 78
Зарегистрирован: 2012-01-04 13:47:43
Откуда: UA, Kiev
Контактная информация:

Re: Exim + sh + condition

Непрочитанное сообщение liet » 2013-01-24 17:55:29

привет бион.

а чего там по поводу прав и иже с ними?
xxx: Иногда лучше сказать: "Я не знаю", чем пытаться что-то донести до дурака.

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-24 18:50:42

liet писал(а):привет бион.

а чего там по поводу прав и иже с ними?
Ы, и ты тут :) хай.

Прав на что? за сш? ставил и 777. Юзверь/группа тот же, под каким и exim. Да и дело не в том, ибо сам скрипт запускается, но вот $value (как я понял она отвечает за результат деятельности скрипта), которая должна раскрытся и передаццо на acl_m1 - не передается.

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-24 19:17:07

а с какого лешего $value а не $zalupe...откуда имя такое?

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-24 19:22:02

mak_v_ писал(а):а с какого лешего $value а не $zalupe...откуда имя такое?
Не поверите из документации по Exim.

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-24 19:50:27

Ну так почитайте документацию по stdout

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-29 20:14:27

mak_v_ писал(а):Ну так почитайте документацию по stdout
Что вы хотите этим сказать?

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-29 20:49:46

Ссылку на гуглтранслейт дать?

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

 ${run{<command> <args>}{<string1>}{<string2>}}

    The command and its arguments are first expanded separately, and then the command is run in a separate process, but under the same uid and gid. As in other command executions from Exim, a shell is not used by default. If you want a shell, you must explicitly code it.

    The standard input for the command exists, but is empty. The standard output and standard error are set to the same file descriptor. If the command succeeds (gives a zero return code) <string1> is expanded and replaces the entire item; during this expansion, the standard output/error from the command is in the variable $value. If the command fails, <string2>, if present, is expanded and used. Once again, during the expansion, the standard output/error from the command is in the variable $value.

    If <string2> is absent, the result is empty. Alternatively, <string2> can be the word “fail” (not in braces) to force expansion failure if the command does not succeed. If both strings are omitted, the result is contents of the standard output/error on success, and nothing on failure.

    The return code from the command is put in the variable $runrc, and this remains set afterwards, so in a filter file you can do things like this:

    if "${run{x y z}{}}$runrc" is 1 then ...
      elif $runrc is 2 then ...
      ...
    endif

    If execution of the command fails (for example, the command does not exist), the return code is 127 – the same code that shells use for non-existent commands.

    Warning: In a router or transport, you cannot assume the order in which option values are expanded, except for those preconditions whose order of testing is documented. Therefore, you cannot reliably expect to set $runrc by the expansion of one option, and use it in another.

    The redirect router has an option called forbid_filter_run which locks out the use of this expansion item in filter files.

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-29 21:35:24

mak_v_ писал(а):Ссылку на гуглтранслейт дать?
Именно этим текстом я и руководствуюсь, отсюда же "during this expansion, the standard output/error from the command is in the variable $value" - и переменная $value, в которой и должен сохранятся "выхлоп" скрипта. Но почему-то не работает.

Причем

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

set acl_m1 = ${run{/usr/local/script.sh}{$value}fail}
- так же не дает необходимого результата.

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-29 23:22:19

Читать внимательно

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

The standard output and standard error are set to the same file descriptor. If the command succeeds (gives a zero return code) <string1> is expanded and replaces the entire item; during this expansion, the standard output/error from the command is in the variable $value. If the command fails, <string2>, if present, is expanded and used. Once again, during the expansion, the standard output/error from the command is in the variable $value.

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-30 1:01:19

mak_v_ писал(а):Читать внимательно

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

The standard output and standard error are set to the same file descriptor. If the command succeeds (gives a zero return code) <string1> is expanded and replaces the entire item; during this expansion, the standard output/error from the command is in the variable $value. If the command fails, <string2>, if present, is expanded and used. Once again, during the expansion, the standard output/error from the command is in the variable $value.
Если честно - читал несколько раз. Но все равно, имхо, написано мутновато. На сколько я понял, если скрипт выполнился успешно, то по дефолту передается значение об успешности выполнения. Если успешно и есть <string1> - то оно раскрывается, если не успешно, то раскрывается <string2>.

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-30 2:03:55

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

Стандартный вывод и стандартная ошибка устанавливается на тот же дескриптор файла. Если команда выполняется успешно (возвращенный код равен нулю) <string1> раскрывается и замещает весь элемент; во время этого расширения, стандартный вывод / ошибка из команды в переменной $ значение. Если команда не выполняется, <string2>, если присутствует, расширен и использован. Еще раз, во время расширения, стандартный вывод / ошибка из команды в переменной $ значение.
Хугле не ясно?
stdout
если выполнился успешно - то в stdout будет 0, если неуспешно, то1. Соответственно подставиться значение либо <первые стринги> либо <вторые панталоны>

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-30 15:42:06

mak_v_ писал(а):

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

Стандартный вывод и стандартная ошибка устанавливается на тот же дескриптор файла. Если команда выполняется успешно (возвращенный код равен нулю) <string1> раскрывается и замещает весь элемент; во время этого расширения, стандартный вывод / ошибка из команды в переменной $ значение. Если команда не выполняется, <string2>, если присутствует, расширен и использован. Еще раз, во время расширения, стандартный вывод / ошибка из команды в переменной $ значение.
Хугле не ясно?
stdout
если выполнился успешно - то в stdout будет 0, если неуспешно, то1. Соответственно подставиться значение либо <первые стринги> либо <вторые панталоны>
А.. И что, никак нельзя выхлоп sh скрипта подставить? :(

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-30 17:32:10

наверное можно каким-то костылем: записать в файл\базу результат, а потом считать его в проверке

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-31 15:40:49

mak_v_ писал(а):наверное можно каким-то костылем: записать в файл\базу результат, а потом считать его в проверке
Не подскажете, как правильно подобное написать?

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-31 16:23:09

я ж не знаю задачи...реализацию вы выдумали и показали...отколь я знаю что вы хотите.

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-31 17:05:00

mak_v_ писал(а):я ж не знаю задачи...реализацию вы выдумали и показали...отколь я знаю что вы хотите.
Мне необходимо что бы при приходе каждого письма запускался скрипт, который отдает значение "да" или "нет", и исходя из этого значения письмо или отвергалось или проходило.


mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-31 17:45:44

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

echo $? 
возвратит статус последней выполненной команды
Например

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

cat VASYA
#cat: VASYA: No such file or directory
#echo $?
1
#cat: vasya
text from file vasya
#echo $?
0

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-31 17:50:41

mak_v_ писал(а):

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

 set acl_m1 = ${run{/usr/local/script.sh}{true}{false}}
Кхм. И что же оно будет возвращать в переменную acl_m1 ? Удачно ли оно запустилось?

Я имел в виду - отрабатывает скрипт, на выхлопе которого каким-то образом будет "да" / "нет".

Т.е. к примеру в скрипте такое:

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

#!/bin/sh
AVAIL=`df -m | grep $1 | awk '{ print $4 }'`
if [ "$AVAIL" -gt 10 ]
then
echo 0
else echo 1
fi
Т.е. в зависимости от того, больше 10 или меньше метров - надо запретить приходить письмам. Сразу забредая вперед, отвечаю на вопрос "а зачем?" - надо. Квотирование методом ZFS сделано, причем хитро.

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-31 18:00:41

Вы что, по диагонали читаете?
Если команда выполняется успешно (возвращенный код равен нулю) <string1> раскрывается и замещает весь элемент; во время этого расширения, стандартный вывод / ошибка из команды в переменной $ значение. Если команда не выполняется, <string2>, если присутствует, расширен и использован. Еще раз, во время расширения, стандартный вывод / ошибка из команды в переменной $ значение.
Ваш скрипт всегда будет выполнен успешно, т.е всегда в stdout будет 1, а acl_m1 будет равен true, т.е. первым стрингам
Можете преобразовать скрипт к виду:

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

#!/bin/sh
AVAIL=`df -m | grep $1 | awk '{ print $4 }'`
if [ "$AVAIL" -gt 10 ]
then
вапыцуролываорфывлою.
else echo 1
fi
Тогда скрипт вывалится с "command not found" и в stdout будет 0, acl_m1 будет равен false, т.е. "вторым стрингам" .
Не очень красиво, но работать будет

Кстати надо имя команды "вапыцуролываорфывлою" запатентовать после этого :-)

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-31 18:33:00

Тогда еще вопрос, можно ли подставить аргумент?

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

${run{/usr/local/etc/hostcontrol/scripts/disk_space_check.sh $domain}{0}{1}}
не срабатывает, ни так, ни в кавычках.

Полностью правило такое:

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

acl_check_rcpt:

   deny  message        = net mesta!
         set acl_m1     = ${run{/usr/local/check.sh $domain}{0}{1}}
         condition      = ${if eq{$acl_m1}{0}}

mak_v_
проходил мимо

Re: Exim + sh + condition

Непрочитанное сообщение mak_v_ » 2013-01-31 19:16:28

простите, а пользователю из под которого работает екзим можно ваш скрипт выполнять?

cj_bionic
рядовой
Сообщения: 17
Зарегистрирован: 2013-01-23 17:21:05

Re: Exim + sh + condition

Непрочитанное сообщение cj_bionic » 2013-01-31 19:31:20

mak_v_ писал(а):простите, а пользователю из под которого работает екзим можно ваш скрипт выполнять?
конечно можно, права соблюдены :) Ну и сам скрипт выполняется, проверял методом echo Работает >> /var/log/лалал.лог