Страница 1 из 1

Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 12:25:46
DeVeO
Добрый день. Введена система auto_whitelist (dikens3-полезные скрипты). Введена без изменений (т.е. как в полезных скриптах). Все работает хорошо. Но время от времени в логах появляются записи типа

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

Warning: ACL "warn" statement skipped: condition test deferred: MYSQL: query failed: Duplicate entry 'box@moi_domen.ru-box1@domen.com' for key 1
Не могу понять с чем это связано. Версия mysql

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

mysql-client-5.0.27 Multithreaded SQL database (client)
mysql-server-5.0.27 Multithreaded SQL database (server)
Может кто поможет советом.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 12:46:19
strmaks
Ну, на лицо ошибка по пересечению первичного ключа, как вариант, замени команду INSERT на REPLACE должно избавить от подобных нюансов.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 13:15:49
Alex Keda
адресс транный - не находите?
=======
а вообще - там где пересечения должны быть - там прописано - он дупликате кей упдате....
======
или это не мои вайт-листы? =)

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 13:21:55
DeVeO
Насчет адреса - это я переписал (чтоб в форумах реальные адреса не светить). А белые листы - по dikens3 (первый скрипт в полезных скриптах). Вроде там пересечений не должно быть. Сейчас посмотрю ваши.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 14:29:08
dikens3
У меня такого не выдавало пока ещё.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 14:53:41
DeVeO
Прошу прощения - соврал-я все-таки немного подрихтовал конфиг dikens3. Наверное дело в этом. А рихтовал-потому что у меня пользователи локальной сети шлют почту без аутентификации. Соответственно, надо было отделить исходящие письма от своих пользователей не на свои домены. Ниже привожу этот кусок конфига.

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

# Закинем в переменные акла наличие в белых списках домена получателя, локальную часть получателя,
  # доменную часть получателя
  warn    set acl_m10 = ${lookup mysql{MYSQL_DOMAINS}}
             set acl_m11 = $local_part
             set acl_m12 = $domain 
         
# Для наших пользователей записываем наш $sender_address и адрес получателя($local_part@$domain).
# Существуют записи для данной пары src-dst email? Если нет, вернёт 0.
warn
        hosts         = +relay_from_hosts
        condition     = ${if and {{eq{$acl_m10}{}}{match_domain{$sender_address_domain}{$qualify_domain}} \
                                                  {match_ip{$sender_host_address}{127.0.0.0/8:192.168.0.0/24}}}{yes}{no}}       
        set acl_m19   = ${lookup mysql{MYSQL_TESTMYLIST}{$value}{0}}
        logwrite      = "acl_m10=$acl_m10"  
        logwrite      = "acl_m19=$acl_m19 (0-not exist)"  
        logwrite      = "sender_address_domain local?=${if match_domain{$sender_address_domain}{$qualify_domain}{yes}{no}}"  
        logwrite      = "sender_address_ip local?=${if match_ip{$sender_host_address}{127.0.0.0/8:192.168.0.0/24}{yes}{no}}"  
        logwrite      = "sender_address_domain=$sender_address_domain"
        logwrite      = "sender_address_ip=$sender_host_address"
                    
# Если существует, изменяем поле record_expire
warn
        hosts         = +relay_from_hosts
        condition     = ${if and {{eq{$acl_m10}{}}{!eq{$acl_m19}{0}}{match_domain{$sender_address_domain}{$qualify_domain}} \
                                 {match_ip{$sender_host_address}{127.0.0.0/8:192.168.0.0/24}}}{yes}{no}}
        set acl_m19   = ${lookup mysql{MYSQL_UPDATEMYLIST}}
        logwrite      = "update record expire=now"
        
# Если не существует такой записи, добавляем в базу.
warn
        hosts         = +relay_from_hosts
        condition     = ${if and {{eq{$acl_m10}{}}{eq{$acl_m19}{0}}{match_domain{$sender_address_domain}{$qualify_domain}} \
                                 {match_ip{$sender_host_address}{127.0.0.0/8:192.168.0.0/24}}}{yes}{no}}
        set acl_m19   = ${lookup mysql{MYSQL_MYLIST}}
        logwrite      = "new record expire=now"  


Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 15:07:48
dikens3
Ну почитай полезные скрипты, там есть отладка. Подставь свои данные (которые ошибку выдают) и смотри логи.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 15:12:05
DeVeO
Спасибо-попробую.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 16:32:51
DeVeO
У меня еще вопрос (прежде всего к dikens3-как автору конфига autowhite_list). Что если вставлять записи в таблицу mylist одним запросом (с IGNORE и ON DUPLICATE KEY UPDATE)? Например вот так

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

INSERT IGNORE INTO mylist(src_email,dst_email,record_expires) VALUES ('$sender_address','$acl_m11@$acl_m12',DATE_ADD(now(), INTERVAL 30 DAY)) ON DUPLICATE KEY UPDATE record_expires=DATE_ADD(now(), INTERVAL 30 DAY))
Вот описания опций
#
If you use the IGNORE keyword, errors that occur while executing the INSERT statement are treated as warnings instead. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error is issued. Data conversions that would trigger errors abort the statement if IGNORE is not specified. With IGNORE, invalid values are adjusted to the closest values and inserted; warnings are produced but the statement does not abort. You can determine with the mysql_info() C API function how many rows were actually inserted into the table.
#
If you specify ON DUPLICATE KEY UPDATE, and a row is inserted that would cause a duplicate value in a UNIQUE index or PRIMARY KEY, an UPDATE of the old row is performed. The affected-rows value per row is 1 if the row is inserted as a new row and 2 if an existing row is updated. See Section 12.2.5.3, “INSERT ... ON DUPLICATE KEY UPDATE Syntax”.
Вроде тогда контроль за пересечением первичного ключа отдается mysql и можно не волноваться что что-то не отработает. Или я не прав?

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 16:39:57
dikens3
Зачем делать то, что уже сделано?

Если запись уже есть, проще сделать проверку, а есть ли такая запись?
Мне кажется сама проверка не работает.

Re: Еще раз про auto_whitelist (в полезных скриптах)

Добавлено: 2008-12-03 17:10:37
DeVeO
Это понятно... Попробую плотнее заняться отладкой. Мне кажется уже, что проще (да и правильнее) настроить пользователей локалки на пересылку только через аутентификацию. Но просто вариант с ON DUPLICATE KEY UPDATE сократит и упростит код.