Есть такой менеджер списков рассылки: Mailman.
Все хорошо, две неприятности:
1. Проблемы с декодированием символа «@» в «( at )» при кривой кодировке письма.
2. Не совсем верно работает ключ «-s» для mailmanctl.
Подробности и решения:
1. Иногда в логах milman появляется сообщение вида:
Jun 28 15:50:47 2007 (29717) Uncaught runner exception: 'ascii' codec can't decode byte 0xce in position 1: ordinal not in range(128)
Jun 28 15:50:47 2007 (29717) Traceback (most recent call last):
File "/var/mailman/Mailman/Queue/Runner.py", line 112, in _oneloop
self._onefile(msg, msgdata)
File "/var/mailman/Mailman/Queue/Runner.py", line 170, in _onefile
keepqueued = self._dispose(mlist, msg, msgdata)
File "/var/mailman/Mailman/Queue/ArchRunner.py", line 73, in _dispose
mlist.ArchiveMail(msg)
File "/var/mailman/Mailman/Archiver/Archiver.py", line 216, in ArchiveMail
h.processUnixMailbox(f)
File "/var/mailman/Mailman/Archiver/pipermail.py", line 580, in processUnixMailbox
self.add_article(a)
File "/var/mailman/Mailman/Archiver/pipermail.py", line 621, in add_article
filename))
File "/var/mailman/Mailman/Archiver/HyperArch.py", line 1117, in write_article
f.write(article.as_text())
File "/var/mailman/Mailman/Archiver/HyperArch.py", line 575, in as_text
atmark = unicode(_(' at '), cset)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 1: ordinal not in range(128)
И письмо вместо архива попадает в папку «shunt».
Вот решение: Mailman/Archiver/HyperArch.py
--- Mailman/Archiver/HyperArch.py.orig 2006-12-15 14:49:46.000000000 +0300
+++ Mailman/Archiver/HyperArch.py 2007-06-29 12:28:46.000000000 +0400
@@ -572,7 +572,10 @@
if mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS:
otrans = i18n.get_translation()
try:
- atmark = unicode(_(' at '), cset)
+ try:
+ atmark = unicode(_(' at '), cset)
+ except UnicodeDecodeError:
+ atmark = u' at '
i18n.set_language(self._lang)
body = re.sub(r'([-+,.\w]+)@([-+.\w]+)',
'\g<1>' + atmark + '\g<2>', body)
Спасибо за патч Алексею Мичурину.
2. Про «mailmanctl -s» в доке написано, что:
-s/--stale-lock-cleanup
If mailmanctl finds an existing master lock, it will normally exit
with an error message. With this option, mailmanctl will perform an
extra level of checking. If a process matching the host/pid described
in the lock file is running, mailmanctl will still exit, but if no
matching process is found, mailmanctl will remove the apparently stale
lock and make another attempt to claim the master lock.
Судя по доку для проверки нормальной работы mailman можно просто раз в 10 минут из крона запускать «mailmanctl -s». И если с mailman'ом все хорошо и такой процесс есть и его pid совпадает с pid'ом в лок-файле, то ничего не произойдет, а если плохо, то он корректно запустится.
Но на деле все не так: даже если mailman работает и существует в процессах и pid совпадает, ключ «-s» это игнорирует и поднимают вторую копию mailman. :(
Вот такой вот патч решает проблему с «-s»: bin/mailmanctl
--- bin/mailmanctl.orig 2007-12-03 14:14:16.000000000 +0300
+++ bin/mailmanctl 2007-12-03 14:16:40.000000000 +0300
@@ -201,6 +201,10 @@
except LockFile.TimeOutError:
if not force:
raise
+ status = qrunner_state()
+ if status == 1:
+ # host matches and proc exists
+ raise
# Force removal of lock first
lock._disown()
hostname, pid, tempfile = get_lock_data()
Теперь можно безбоязненно запускать «mailman -s» и получить обещенное «extra level of checking».









Оставить комментарий