1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
class TestPostfixChroot(TestBase):
"""
Verify that postfix is not using chroots.
"""
class ErrorPostfixChrootSync(ErrorBase):
def __str__(self):
return "Postfix init script is syncing the chroots."
def fixable(self):
return False
def fix(self):
return False
class ErrorPostfixChroot(ErrorBase):
def __str__(self):
return "Postfix has chrooted service in master.cf"
def fixable(self):
return True
def fix(self):
return not TestPostfixChroot.process_mastercf(fix=True)
@staticmethod
def process_mastercf(fix=False):
import re
has_chroot = False
split = re.compile("([^\s]+)")
f = open("/etc/postfix/master.cf", "r")
if fix:
fixed = open("/etc/postfix/master.cf.fixed", "w")
for line in f.readlines():
# ignore lines with leading whitespace (extra options) and comments
if line[0].isspace() or line[0] == '#':
if fix: fixed.write(line)
continue
col = split.split(line)
# primitive check we "understand" this line...
if col[3] in ["unix","inet","fifo"] \
and col[5] in ["-", "y", "n"] \
and col[7] in ["-", "y", "n"] \
and col[9] in ["-", "y"]:
has_chroot = True
if fix:
col[9] = 'n'
fixed.write("".join(col))
else:
if fix: fixed.write(line)
f.close()
if fix:
fixed.close()
return has_chroot
@staticmethod
def test():
import os, re
r = re.compile(r'^\s*SYNC_CHROOT=(.*n|\s*$|\s*""$)')
result = []
if os.access("/usr/sbin/postfix", os.F_OK):
sync = True
if os.access("/etc/default/postfix", os.F_OK):
f = open("/etc/default/postfix","r")
for line in f.readlines():
if r.match(line):
sync = False
f.close()
if sync:
result.append(TestPostfixChroot.ErrorPostfixChrootSync())
if os.access("/etc/postfix/master.cf", os.F_OK):
if TestPostfixChroot.process_mastercf(fix=False):
result.append(TestPostfixChroot.ErrorPostfixChroot())
return result
register_test(TestPostfixChroot)
|