aboutsummaryrefslogtreecommitdiffstats
path: root/bin/list_members
diff options
context:
space:
mode:
author <>2003-01-02 05:25:50 +0000
committer <>2003-01-02 05:25:50 +0000
commitb132a73f15e432eaf43310fce9196ca0c0651465 (patch)
treec15f816ba7c4de99fef510e3bd75af0890d47441 /bin/list_members
downloadmailman2-b132a73f15e432eaf43310fce9196ca0c0651465.tar.gz
mailman2-b132a73f15e432eaf43310fce9196ca0c0651465.tar.xz
mailman2-b132a73f15e432eaf43310fce9196ca0c0651465.zip
This commit was manufactured by cvs2svn to create branch
'Release_2_1-maint'.
Diffstat (limited to 'bin/list_members')
-rwxr-xr-xbin/list_members232
1 files changed, 232 insertions, 0 deletions
diff --git a/bin/list_members b/bin/list_members
new file mode 100755
index 00000000..3ad10f51
--- /dev/null
+++ b/bin/list_members
@@ -0,0 +1,232 @@
+#! @PYTHON@
+#
+# Copyright (C) 1998,1999,2000,2001,2002 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
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+"""List all the members of a mailing list.
+
+Usage: %(PROGRAM)s [options] listname
+
+Where:
+
+ --output file
+ -o file
+ Write output to specified file instead of standard out.
+
+ --regular / -r
+ Print just the regular (non-digest) members.
+
+ --digest[=kind] / -d [kind]
+ Print just the digest members. Optional argument can be "mime" or
+ "plain" which prints just the digest members receiving that kind of
+ digest.
+
+ --nomail[=why] / -n [why]
+ Print the members that have delivery disabled. Optional argument can
+ be "byadmin", "byuser", "bybounce", or "unknown" which prints just the
+ users who have delivery disabled for that reason. It can also be
+ "enabled" which prints just those member for whom delivery is
+ enabled.
+
+ --fullnames / -f
+ Include the full names in the output.
+
+ --preserve
+ -p
+ Output member addresses case preserved the way they were added to the
+ list. Otherwise, addresses are printed in all lowercase.
+
+ --help
+ -h
+ Print this help message and exit.
+
+ listname is the name of the mailing list to use.
+
+Note that if neither -r or -d is supplied, both regular members are printed
+first, followed by digest members, but no indication is given as to address
+status.
+"""
+
+import sys
+
+import paths
+from Mailman import mm_cfg
+from Mailman import MailList
+from Mailman import Errors
+from Mailman import MemberAdaptor
+from Mailman.i18n import _
+
+from email.Utils import formataddr
+
+PROGRAM = sys.argv[0]
+WHYCHOICES = {'enabled' : MemberAdaptor.ENABLED,
+ 'unknown' : MemberAdaptor.UNKNOWN,
+ 'byuser' : MemberAdaptor.BYUSER,
+ 'byadmin' : MemberAdaptor.BYADMIN,
+ 'bybounce': MemberAdaptor.BYBOUNCE,
+ }
+
+
+def usage(code, msg=''):
+ if code:
+ fd = sys.stderr
+ else:
+ fd = sys.stdout
+ print >> fd, _(__doc__)
+ if msg:
+ print >> fd, msg
+ sys.exit(code)
+
+
+
+def whymatches(mlist, addr, why):
+ # Return true if the `why' matches the reason the address is enabled, or
+ # in the case of why is None, that they are disabled for any reason
+ # (i.e. not enabled).
+ status = mlist.getDeliveryStatus(addr)
+ if why is None:
+ return status <> MemberAdaptor.ENABLED
+ return status == WHYCHOICES[why]
+
+
+
+def main():
+ # Because of the optional arguments, we can't use getopt. :(
+ outfile = None
+ regular = None
+ digest = None
+ preserve = None
+ nomail = None
+ why = None
+ kind = None
+ fullnames = 0
+
+ # Throw away the first (program) argument
+ args = sys.argv[1:]
+ if not args:
+ usage(0)
+
+ while 1:
+ try:
+ opt = args.pop(0)
+ except IndexError:
+ usage(1)
+ if opt in ('-h', '--help'):
+ usage(0)
+ elif opt in ('-f', '--fullnames'):
+ fullnames = 1
+ elif opt in ('-p', '--preserve'):
+ preserve = 1
+ elif opt in ('-r', '--regular'):
+ regular = 1
+ elif opt in ('-o', '--output'):
+ try:
+ outfile = args.pop(0)
+ except IndexError:
+ usage(1)
+ elif opt == '-n':
+ nomail = 1
+ if args and args[0] in WHYCHOICES.keys():
+ why = args.pop(0)
+ elif opt.startswith('--nomail'):
+ nomail = 1
+ i = opt.find('=')
+ if i >= 0:
+ why = opt[i+1:]
+ if why not in WHYCHOICES.keys():
+ usage(1, _('Bad --nomail option: %(why)s'))
+ elif opt == '-d':
+ digest = 1
+ if args and args[0] in ('mime', 'plain'):
+ kind = args.pop(0)
+ elif opt.startswith('--digest'):
+ digest = 1
+ i = opt.find('=')
+ if i >= 0:
+ kind = opt[i+1:]
+ if kind not in ('mime', 'plain'):
+ usage(1, _('Bad --digest option: %(kind)s'))
+ else:
+ # No more options left, push the last one back on the list
+ args.insert(0, opt)
+ break
+
+ if len(args) <> 1:
+ usage(1)
+
+ listname = args[0].lower().strip()
+
+ if regular is None and digest is None:
+ regular = digest = 1
+
+ if outfile:
+ try:
+ fp = open(outfile, 'w')
+ except IOError:
+ print >> sys.stderr, _('Could not open file for writing:'), outfile
+ sys.exit(1)
+ else:
+ fp = sys.stdout
+
+ try:
+ mlist = MailList.MailList(listname, lock=0)
+ except Errors.MMListError, e:
+ print >> sys.stderr, _('No such list: %(listname)s')
+ sys.exit(1)
+
+ # Get the lowercased member addresses
+ rmembers = mlist.getRegularMemberKeys()
+ dmembers = mlist.getDigestMemberKeys()
+
+ if preserve:
+ # Convert to the case preserved addresses
+ rmembers = mlist.getMemberCPAddresses(rmembers)
+ dmembers = mlist.getMemberCPAddresses(dmembers)
+
+ if regular:
+ rmembers.sort()
+ for addr in rmembers:
+ name = fullnames and mlist.getMemberName(addr)
+ # Filter out nomails
+ if nomail and not whymatches(mlist, addr, why):
+ continue
+ enc = sys.getdefaultencoding()
+ s = formataddr((name, addr)).encode(enc, 'replace')
+ print >> fp, s
+ if digest:
+ dmembers.sort()
+ for addr in dmembers:
+ name = fullnames and mlist.getMemberName(addr)
+ # Filter out nomails
+ if nomail and not whymatches(mlist, addr, why):
+ continue
+ # Filter out digest kinds
+ if mlist.getMemberOption(addr, mm_cfg.DisableMime):
+ # They're getting plain text digests
+ if kind == 'mime':
+ continue
+ else:
+ # They're getting MIME digests
+ if kind == 'plain':
+ continue
+ enc = sys.getdefaultencoding()
+ s = formataddr((name, addr)).encode(enc, 'replace')
+ print >> fp, s
+
+
+
+if __name__ == '__main__':
+ main()