[Mailman-Users] problem installing on FreeBSD 3.0-RELEASE, Python 1.5.1, Apache, sendmail
Barry A. Warsaw
bwarsaw at cnri.reston.va.us
Sun Jul 18 22:06:29 CEST 1999
>>>>> "james" == <james at perforce.com> writes:
james> First of all, let me say that I think Mailman (and Python!)
james> are the greatest things since sliced bread.
Yay!
james> I do, however, have a 1.0rc3 install problem which I'm at a
james> loss to solve. The web interface works fine but I just
james> can't send email to a test list - I have the dreaded
james> "unknown mailer error 2" blues.
Hmm. you might have to send the bounce message so we can see the
details. But...
james> I tried copying the misc directory over and rerunning
james> check_perms and I got: Traceback (innermost last):
Here's the current version of check_perms. Please run it and let us
know what it says.
-Barry
-------------------- snip snip --------------------
#! /usr/bin/env python
"""Check the permissions for the Mailman installation.
Usage: %(PROGRAM)s [-f] [-v] [-h]
With no arguments, just check and report all the files that have bogus
permissions or group ownership. With -f (and run as root), fix all the
permission problems found. With -v be verbose.
"""
import sys
import os
import errno
import getopt
import grp
from stat import *
import paths
from Mailman import mm_cfg
MAILMAN_GRPNAME = 'mailman'
MAILMAN_GID = grp.getgrnam(MAILMAN_GRPNAME)[2]
PROGRAM = sys.argv[0]
class State:
FIX = 0
VERBOSE = 0
ERRORS = 0
STATE = State()
def statmode(path):
return os.stat(path)[ST_MODE]
def statgidmode(path):
stat = os.stat(path)
return stat[ST_MODE], stat[ST_GID]
def checkwalk(arg, dirname, names):
for name in names:
path = os.path.join(dirname, name)
if arg.VERBOSE:
print 'checking gid and modes for', path
try:
mode, gid = statgidmode(path)
except os.error, (code, msg):
if code == errno.ENOENT:
continue
raise
if gid <> MAILMAN_GID:
arg.ERRORS = arg.ERRORS + 1
print path, 'bad gid (has: %s, expected %s)' % (
grp.getgrgid(gid)[0], MAILMAN_GRPNAME),
if STATE.FIX:
print '(fixing)'
os.chown(path, -1, MAILMAN_GID)
else:
print
# all directories must be setgid
if S_ISDIR(mode) and not mode & S_ISGID:
arg.ERRORS = arg.ERRORS + 1
print path, 'directory is not setgid',
if STATE.FIX:
print '(fixing)'
os.chmod(path, mode | S_ISGID)
else:
print
def checkall():
os.path.walk(mm_cfg.PREFIX, checkwalk, STATE)
def checkarchives():
private = mm_cfg.PRIVATE_ARCHIVE_FILE_DIR
if STATE.VERBOSE:
print 'checking perms on', private
# private archives must not be other readable
mode = statmode(private)
if mode & S_IROTH:
STATE.ERRORS = STATE.ERRORS + 1
print private, 'must not be other-readable',
if STATE.FIX:
print '(fixing)'
os.chmod(private, mode & ~S_IROTH)
else:
print
def checkcgi():
exes = os.listdir(mm_cfg.CGI_DIR)
for f in exes:
path = os.path.join(mm_cfg.CGI_DIR, f)
if STATE.VERBOSE:
print 'checking set-gid for', path
mode = statmode(path)
if mode & S_IXGRP and not mode & S_ISGID:
STATE.ERRORS = STATE.ERRORS + 1
print path, 'must be set-gid',
if STATE.FIX:
print '(fixing)'
os.chmod(path, mode | S_ISGID)
else:
print
def checkmail():
wrapper = os.path.join(mm_cfg.WRAPPER_DIR, 'wrapper')
if STATE.VERBOSE:
print 'checking set-gid for', wrapper
mode = statmode(wrapper)
if not mode & S_ISGID:
STATE.ERRORS = STATE.ERRORS + 1
print wrapper, 'must be set-gid',
if STATE.FIX:
print '(fixing)'
os.chmod(wrapper, mode | S_ISGID)
def checkadminpw():
adminpw = os.path.join(mm_cfg.DATA_DIR, 'adm.pw')
targetmode = S_IFREG | S_IRUSR | S_IWUSR | S_IRGRP
if STATE.VERBOSE:
print 'checking perms on', adminpw
try:
mode = statmode(adminpw)
except os.error, (code, msg):
# adm.pw may not exist
if code == errno.ENOENT:
return
raise
if mode <> targetmode:
STATE.ERRORS = STATE.ERRORS + 1
print adminpw, 'permissions must be exactly 0640 (got %s)' % oct(mode)
if STATE.FIX:
print '(fixing)'
os.chmod(adminpw, targetmode)
def usage(code=0, msg=''):
print __doc__ % globals()
if msg:
print msg
sys.exit(code)
if __name__ == '__main__':
try:
opts, args = getopt.getopt(sys.argv[1:],
'fvh',
['fix', 'verbose', 'help'])
except getopt.error, msg:
usage(1, msg)
for opt, arg in opts:
if opt in ('-h', '--help'):
usage()
elif opt in ('-f', '--fix'):
STATE.FIX = 1
elif opt in ('-v', '--verbose'):
STATE.VERBOSE = 1
checkall()
checkarchives()
checkcgi()
checkmail()
checkadminpw()
if not STATE.ERRORS:
print 'No problems found'
else:
print 'Problems found:', STATE.ERRORS
print 'Re-run as root with -f flag until no errors are found'
More information about the Mailman-Users
mailing list