diff options
author | <> | 2003-01-02 05:25:50 +0000 |
---|---|---|
committer | <> | 2003-01-02 05:25:50 +0000 |
commit | b132a73f15e432eaf43310fce9196ca0c0651465 (patch) | |
tree | c15f816ba7c4de99fef510e3bd75af0890d47441 /bin/list_members | |
download | mailman2-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-x | bin/list_members | 232 |
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() |