240 lines
7.8 KiB
Python
Executable File
240 lines
7.8 KiB
Python
Executable File
#! /usr/bin/python
|
||
#
|
||
# Copyright (C) 1998-2018 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
||
# USA.
|
||
|
||
"""Create a new, unpopulated mailing list.
|
||
|
||
Usage: %(PROGRAM)s [options] [listname [listadmin-addr [admin-password]]]
|
||
|
||
Options:
|
||
|
||
-l language
|
||
--language=language
|
||
Make the list's preferred language `language', which must be a two
|
||
letter language code.
|
||
|
||
-u urlhost
|
||
--urlhost=urlhost
|
||
Gives the list's web interface host name.
|
||
|
||
-e emailhost
|
||
--emailhost=emailhost
|
||
Gives the list's email domain name.
|
||
|
||
-q/--quiet
|
||
Normally the administrator is notified by email (after a prompt) that
|
||
their list has been created. This option suppresses the prompt and
|
||
notification.
|
||
|
||
-a/--automate
|
||
This option suppresses the prompt prior to administrator notification
|
||
but still sends the notification. It can be used to make newlist
|
||
totally non-interactive but still send the notification, assuming
|
||
listname, listadmin-addr and admin-password are all specified on the
|
||
command line.
|
||
|
||
-h/--help
|
||
Print this help text and exit.
|
||
|
||
You can specify as many of the arguments as you want on the command line:
|
||
you will be prompted for the missing ones.
|
||
|
||
Every Mailman list has two parameters which define the default host name for
|
||
outgoing email, and the default URL for all web interfaces. When you
|
||
configured Mailman, certain defaults were calculated, but if you are running
|
||
multiple virtual Mailman sites, then the defaults may not be appropriate for
|
||
the list you are creating.
|
||
|
||
You also specify the domain to create your new list in by typing the command
|
||
like so:
|
||
|
||
newlist --urlhost=www.mydom.ain mylist
|
||
|
||
where `www.mydom.ain' should be the base hostname for the URL to this virtual
|
||
hosts's lists. E.g. with this setting people will view the general list
|
||
overviews at http://www.mydom.ain/mailman/listinfo. Also, www.mydom.ain
|
||
should be a key in the VIRTUAL_HOSTS mapping in mm_cfg.py/Defaults.py if
|
||
the email hostname to be automatically determined.
|
||
|
||
If you want the email hostname to be different from the one looked up by the
|
||
VIRTUAL_HOSTS or if urlhost is not registered in VIRTUAL_HOSTS, you can specify
|
||
`emailhost' like so:
|
||
|
||
newlist --urlhost=www.mydom.ain --emailhost=mydom.ain mylist
|
||
|
||
where `mydom.ain' is the mail domain name. If you don't specify emailhost but
|
||
urlhost is not in the virtual host list, then mm_cfg.DEFAULT_EMAIL_HOST will
|
||
be used for the email interface.
|
||
|
||
For backward compatibility, you can also specify the domain to create your
|
||
new list in by spelling the listname like so:
|
||
|
||
mylist@www.mydom.ain
|
||
|
||
where www.mydom.ain is used for `urlhost' but it will also be used for
|
||
`emailhost' if it is not found in the virtual host table. Note that
|
||
'--urlhost' and '--emailhost' have precedence to this notation.
|
||
|
||
If you spell the list name as just `mylist', then the email hostname will be
|
||
taken from DEFAULT_EMAIL_HOST and the url will be taken from DEFAULT_URL_HOST
|
||
interpolated into DEFAULT_URL_PATTERN (as defined in your Defaults.py file or
|
||
overridden by settings in mm_cfg.py).
|
||
|
||
Note that listnames are forced to lowercase.
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import getpass
|
||
import getopt
|
||
|
||
import paths
|
||
from Mailman import mm_cfg
|
||
from Mailman import MailList
|
||
from Mailman import Utils
|
||
from Mailman import Errors
|
||
from Mailman import Message
|
||
from Mailman import i18n
|
||
|
||
_ = i18n._
|
||
C_ = i18n.C_
|
||
|
||
PROGRAM = sys.argv[0]
|
||
|
||
|
||
|
||
def usage(code, msg=''):
|
||
if code:
|
||
fd = sys.stderr
|
||
else:
|
||
fd = sys.stdout
|
||
print >> fd, C_(__doc__)
|
||
if msg:
|
||
print >> fd, msg
|
||
sys.exit(code)
|
||
|
||
|
||
|
||
def main():
|
||
try:
|
||
opts, args = getopt.getopt(sys.argv[1:], 'hqal:u:e:',
|
||
['help', 'quiet', 'automate', 'language=',
|
||
'urlhost=', 'emailhost='])
|
||
except getopt.error, msg:
|
||
usage(1, msg)
|
||
|
||
lang = mm_cfg.DEFAULT_SERVER_LANGUAGE
|
||
quiet = False
|
||
automate = False
|
||
urlhost = None
|
||
emailhost = None
|
||
for opt, arg in opts:
|
||
if opt in ('-h', '--help'):
|
||
usage(0)
|
||
if opt in ('-q', '--quiet'):
|
||
quiet = True
|
||
if opt in ('-a', '--automate'):
|
||
automate = True
|
||
if opt in ('-l', '--language'):
|
||
lang = arg
|
||
if opt in ('-u', '--urlhost'):
|
||
urlhost = arg
|
||
if opt in ('-e', '--emailhost'):
|
||
emailhost = arg
|
||
|
||
# Is the language known?
|
||
if lang not in mm_cfg.LC_DESCRIPTIONS.keys():
|
||
usage(1, C_('Unknown language: %(lang)s'))
|
||
|
||
if len(args) > 0:
|
||
listname = args[0]
|
||
else:
|
||
listname = raw_input(C_('Enter the name of the list: '))
|
||
listname = listname.lower()
|
||
|
||
if '@' in listname:
|
||
# note that --urlhost and --emailhost have precedence
|
||
listname, domain = listname.split('@', 1)
|
||
urlhost = urlhost or domain
|
||
emailhost = emailhost or mm_cfg.VIRTUAL_HOSTS.get(domain, domain)
|
||
|
||
urlhost = urlhost or mm_cfg.DEFAULT_URL_HOST
|
||
host_name = emailhost or \
|
||
mm_cfg.VIRTUAL_HOSTS.get(urlhost, mm_cfg.DEFAULT_EMAIL_HOST)
|
||
web_page_url = mm_cfg.DEFAULT_URL_PATTERN % urlhost
|
||
|
||
if Utils.list_exists(listname):
|
||
usage(1, C_('List already exists: %(listname)s'))
|
||
|
||
if len(args) > 1:
|
||
owner_mail = args[1]
|
||
else:
|
||
owner_mail = raw_input(
|
||
C_('Enter the email of the person running the list: '))
|
||
|
||
if len(args) > 2:
|
||
listpasswd = args[2]
|
||
else:
|
||
listpasswd = getpass.getpass(C_('Initial %(listname)s password: '))
|
||
# List passwords cannot be empty
|
||
listpasswd = listpasswd.strip()
|
||
if not listpasswd:
|
||
usage(1, C_('The list password cannot be empty'))
|
||
|
||
mlist = MailList.MailList()
|
||
try:
|
||
pw = Utils.sha_new(listpasswd).hexdigest()
|
||
# Guarantee that all newly created files have the proper permission.
|
||
# proper group ownership should be assured by the autoconf script
|
||
# enforcing that all directories have the group sticky bit set
|
||
oldmask = os.umask(002)
|
||
try:
|
||
try:
|
||
if lang == mm_cfg.DEFAULT_SERVER_LANGUAGE:
|
||
langs = [lang]
|
||
else:
|
||
langs = [lang, mm_cfg.DEFAULT_SERVER_LANGUAGE]
|
||
mlist.Create(listname, owner_mail, pw, langs=langs,
|
||
emailhost=host_name, urlhost=urlhost)
|
||
finally:
|
||
os.umask(oldmask)
|
||
except Errors.BadListNameError, s:
|
||
usage(1, C_('Illegal list name: %(s)s'))
|
||
except Errors.EmailAddressError, s:
|
||
usage(1, C_('Bad owner email address: %(s)s') +
|
||
C_(' - owner addresses need to be fully-qualified names'
|
||
' like "owner@example.com", not just "owner".'))
|
||
except Errors.MMListAlreadyExistsError:
|
||
usage(1, C_('List already exists: %(listname)s'))
|
||
|
||
# Assign domain-specific attributes
|
||
mlist.host_name = host_name
|
||
mlist.web_page_url = web_page_url
|
||
|
||
# And assign the preferred language
|
||
mlist.preferred_language = lang
|
||
|
||
mlist.Save()
|
||
finally:
|
||
mlist.Unlock()
|
||
|
||
|
||
|
||
if __name__ == '__main__':
|
||
main()
|