Apply 79_archiver_slash.patch
[mspang/vmailman.git] / bin / rmlist
1 #! @PYTHON@
2 #
3 # Copyright (C) 1998-2003 by the Free Software Foundation, Inc.
4 #
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
19 """Remove the components of a mailing list with impunity - beware!
20
21 This removes (almost) all traces of a mailing list.  By default, the lists
22 archives are not removed, which is very handy for retiring old lists.
23
24 Usage:
25     rmlist [-a] [-h] listname
26
27 Where:
28     --archives
29     -a
30         Remove the list's archives too, or if the list has already been
31         deleted, remove any residual archives.
32
33     --help
34     -h
35         Print this help message and exit.
36
37 """
38
39 import os
40 import sys
41 import getopt
42 import shutil
43
44 import paths
45 from Mailman import mm_cfg
46 from Mailman import Utils
47 from Mailman import MailList
48 from Mailman.i18n import _
49
50 try:
51     True, False
52 except NameError:
53     True = 1
54     False = 0
55
56
57 \f
58 def usage(code, msg=''):
59     if code:
60         fd = sys.stderr
61     else:
62         fd = sys.stdout
63     print >> fd, _(__doc__)
64     if msg:
65         print >> fd, msg
66     sys.exit(code)
67
68
69 \f
70 def remove_it(listname, filename, msg):
71     if os.path.islink(filename):
72         print _('Removing %(msg)s')
73         os.unlink(filename)
74     elif os.path.isdir(filename):
75         print _('Removing %(msg)s')
76         shutil.rmtree(filename)
77     elif os.path.isfile(filename):
78         os.unlink(filename)
79     else:
80         print _('%(listname)s %(msg)s not found as %(filename)s')
81
82
83 \f
84 def main():
85     try:
86         opts, args = getopt.getopt(sys.argv[1:], 'ah',
87                                    ['archives', 'help'])
88     except getopt.error, msg:
89         usage(1, msg)
90
91     if len(args) <> 1:
92         usage(1)
93     listname = args[0].lower().strip()
94
95     removeArchives = False
96     for opt, arg in opts:
97         if opt in ('-a', '--archives'):
98             removeArchives = True
99         elif opt in ('-h', '--help'):
100             usage(0)
101
102     if not Utils.list_exists(listname):
103         if not removeArchives:
104             usage(1, _('No such list (or list already deleted): %(listname)s'))
105         else:
106             print _(
107                 'No such list: %(listname)s.  Removing its residual archives.')
108
109     if not removeArchives:
110         print _('Not removing archives.  Reinvoke with -a to remove them.')
111
112
113     REMOVABLES = []
114     if Utils.list_exists(listname):
115         mlist = MailList.MailList(listname, lock=0)
116
117         # Do the MTA-specific list deletion tasks
118         if mm_cfg.MTA:
119             modname = 'Mailman.MTA.' + mm_cfg.MTA
120             __import__(modname)
121             sys.modules[modname].remove(mlist)
122
123         REMOVABLES = [
124             (os.path.join('lists', listname), _('list info')),
125             ]
126
127     # Remove any stale locks associated with the list
128     for filename in os.listdir(mm_cfg.LOCK_DIR):
129         fn_listname = filename.split('.')[0]
130         if fn_listname == listname:
131             REMOVABLES.append((os.path.join(mm_cfg.LOCK_DIR, filename),
132                                _('stale lock file')))
133
134     if removeArchives:
135         REMOVABLES.extend([
136             (os.path.join('archives', 'private', listname),
137              _('private archives')),
138             (os.path.join('archives', 'private', listname + '.mbox'),
139              _('private archives')),
140             (os.path.join('archives', 'public', listname),
141              _('public archives')),
142             (os.path.join('archives', 'public', listname + '.mbox'),
143              _('public archives')),
144             ])
145
146     for dirtmpl, msg in REMOVABLES:
147         dir = os.path.join(mm_cfg.VAR_PREFIX, dirtmpl)
148         remove_it(listname, dir, msg)
149
150
151 \f
152 if __name__ == '__main__':
153     main()