diff -r 6f2fa633f1a1 -r e43e4e7e9ec0 VirtualMailManager/ext/Postconf.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VirtualMailManager/ext/Postconf.py Tue Sep 16 05:55:54 2008 +0000 @@ -0,0 +1,92 @@ +# -*- coding: UTF-8 -*- +# Copyright 2007-2008 VEB IT +# See COPYING for distribution information. +# $Id$ + +"""A small - r/o - wrapper class for Postfix' postconf.""" + +from VirtualMailManager.constants.VERSION import VERSION + +__author__ = 'Pascal Volk ' +__version__ = VERSION +__revision__ = 'rev '+'$Rev$'.split()[1] +__date__ = '$Date$'.split()[1] + +import re +from subprocess import Popen, PIPE + +import VirtualMailManager.constants.ERROR as ERR +from VirtualMailManager.Exceptions import VMMException + +RE_PC_PARAMS = """^\w+$""" +RE_PC_VARIABLES = r"""\$\b\w+\b""" + +class Postconf: + def __init__(self, postconf_bin): + """Creates a new Postconf instance. + + Keyword arguments: + postconf_bin -- absolute path to Postfix' postconf binary (str) + """ + self.__bin = postconf_bin + self.__val = '' + re.compile(RE_PC_PARAMS) + re.compile(RE_PC_VARIABLES) + + def read(self, parameter, expand_vars=True): + """Returns the parameters value. + + If expand_vars is True (default), all variables in the value will be + expanded: + e.g. mydestination -> mail.example.com, localhost.example.com, localhost + Otherwise the value may contain one or more variables. + e.g. mydestination -> $myhostname, localhost.$mydomain, localhost + + Keyword arguments: + parameter -- the name of a Postfix configuration parameter (str) + expand_vars -- default True (bool) + """ + if not re.match(RE_PC_PARAMS, parameter): + raise VMMException(_(u'The value »%s« looks not like a valid\ + postfix configuration parameter name.'), ERR.INVALID_AGUMENT) + self.__val = self.__read(parameter) + if expand_vars: + self.__expandVars() + return self.__val + + def __expandVars(self): + while True: + pvars = set(re.findall(RE_PC_VARIABLES, self.__val)) + pvars_len = len(pvars) + if pvars_len < 1: + break + if pvars_len > 1: + self.__expandMultiVars(self.__readMulti(pvars)) + continue + for var in pvars: + self.__val = self.__val.replace(var, self.__read(var[1:])) + + def __expandMultiVars(self, old_new): + for old, new in old_new.items(): + self.__val = self.__val.replace('$'+old, new) + + def __read(self, parameter): + out, err = Popen([self.__bin, '-h', parameter], stdout=PIPE, + stderr=PIPE).communicate() + if len(err): + raise Exception, err.strip() + return out.strip() + + def __readMulti(self, parameters): + cmd = [self.__bin] + for parameter in parameters: + cmd.append(parameter[1:]) + out, err = Popen(cmd, stdout=PIPE, stderr=PIPE).communicate() + if len(err): + raise Exception, err.strip() + par_val = {} + for line in out.splitlines(): + par, val = line.split(' = ') + par_val[par] = val + return par_val +