aboutsummaryrefslogtreecommitdiffstats
path: root/cron
diff options
context:
space:
mode:
authorbwarsaw <>2003-09-22 02:29:51 +0000
committerbwarsaw <>2003-09-22 02:29:51 +0000
commit33ad4402b372695b9526f57c33dd8f05c0eeddb3 (patch)
tree22a731818f773f8bf4828a333f452049f1b04d82 /cron
parentc6e5c888e2cfc4829e02badf397d2b85b3f39f74 (diff)
downloadmailman2-33ad4402b372695b9526f57c33dd8f05c0eeddb3.tar.gz
mailman2-33ad4402b372695b9526f57c33dd8f05c0eeddb3.tar.xz
mailman2-33ad4402b372695b9526f57c33dd8f05c0eeddb3.zip
Backporting from the HEAD -- bin and cron scripts
Diffstat (limited to 'cron')
-rw-r--r--cron/disabled20
-rwxr-xr-xcron/gate_news14
-rwxr-xr-xcron/mailpasswds22
3 files changed, 48 insertions, 8 deletions
diff --git a/cron/disabled b/cron/disabled
index dcf05f25..75972e55 100644
--- a/cron/disabled
+++ b/cron/disabled
@@ -1,19 +1,19 @@
#! @PYTHON@
#
-# Copyright (C) 2001,2002 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2003 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
-#
+#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-#
+#
# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
+# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
"""Process disabled members, recommended once per day.
@@ -73,6 +73,7 @@ from Mailman import Utils
from Mailman import MailList
from Mailman import Pending
from Mailman import MemberAdaptor
+from Mailman import Errors
from Mailman.Bouncer import _BounceInfo
from Mailman.Logging.Syslog import syslog
from Mailman.i18n import _
@@ -198,7 +199,16 @@ def main():
for member in notify:
syslog('bounce', 'Notifying disabled member %s for list: %s',
member, mlist.internal_name())
- mlist.sendNextNotification(member)
+ try:
+ mlist.sendNextNotification(member)
+ except Errors.NotAMemberError:
+ # There must have been some problem with the data we have
+ # on this member. Most likely it's that they don't have a
+ # password assigned. Log this and delete the member.
+ syslog('bounce',
+ 'NotAMemberError when sending disabled notice: %s',
+ member)
+ mlist.ApprovedDeleteMember(member, 'cron/disabled')
mlist.Save()
finally:
mlist.Unlock()
diff --git a/cron/gate_news b/cron/gate_news
index 3fe466d4..19ccb2c6 100755
--- a/cron/gate_news
+++ b/cron/gate_news
@@ -1,6 +1,6 @@
#! @PYTHON@
#
-# Copyright (C) 1998,1999,2000,2001,2002 by the Free Software Foundation, Inc.
+# Copyright (C) 1998-2003 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -67,6 +67,13 @@ class _ContinueLoop(Exception):
pass
+try:
+ True, False
+except NameError:
+ True = 1
+ False = 0
+
+
def usage(status, msg=''):
if code:
@@ -83,12 +90,15 @@ def usage(status, msg=''):
_hostcache = {}
def open_newsgroup(mlist):
+ # Split host:port if given
+ nntp_host, nntp_port = Utils.nntpsplit(mlist.nntp_host)
# Open up a "mode reader" connection to nntp server. This will be shared
# for all the gated lists having the same nntp_host.
conn = _hostcache.get(mlist.nntp_host)
if conn is None:
try:
- conn = nntplib.NNTP(mlist.nntp_host, readermode=1,
+ conn = nntplib.NNTP(nntp_host, nntp_port,
+ readermode=True,
user=mm_cfg.NNTP_USERNAME,
password=mm_cfg.NNTP_PASSWORD)
except (socket.error, nntplib.NNTPError, IOError), e:
diff --git a/cron/mailpasswds b/cron/mailpasswds
index 348ca336..86f49d18 100755
--- a/cron/mailpasswds
+++ b/cron/mailpasswds
@@ -42,6 +42,7 @@ import sys
import os
import errno
import getopt
+from types import UnicodeType
import paths
# mm_cfg must be imported before the other modules, due to the side-effect of
@@ -78,6 +79,13 @@ def usage(code, msg=''):
+def tounicode(s, enc):
+ if isinstance(s, UnicodeType):
+ return s
+ return unicode(s, enc, 'replace')
+
+
+
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'l:h',
@@ -142,7 +150,15 @@ def main():
continue
# Group by the lower-cased address, since Mailman always
# treates person@dom.ain the same as PERSON@dom.ain.
- password = mlist.getMemberPassword(member)
+ try:
+ password = mlist.getMemberPassword(member)
+ except Errors.NotAMemberError:
+ # Here's a member with no passwords, which I think was
+ # possible in older versions of Mailman. Log this and
+ # move on.
+ syslog('error', 'password-less member %s for list %s',
+ member, mlist.internal_name())
+ continue
optionsurl = mlist.GetOptionsURL(member)
lang = mlist.getMemberLanguage(member)
info = (listaddr, password, optionsurl, lang)
@@ -176,6 +192,7 @@ def main():
if cnt > langcnt:
poplang = lang
langcnt = cnt
+ enc = Utils.GetCharSet(poplang)
# Craft the table header
header = '%-40s %-10s\n%-40s %-10s' % (
_('List'), _('Password // URL'), '----', '--------')
@@ -190,6 +207,9 @@ def main():
'exreq' : sitereq,
'owner' : siteowner,
}, lang=poplang)
+ # Coerce everything to Unicode
+ text = tounicode(text, enc)
+ table = [tounicode(_t, enc) for _t in table]
# Add the table to the end so it doesn't get wrapped/filled
text += (header + '\n' + NL.join(table))
# Translate the message and headers to user's suggested lang