Moved VirtualMailManager/Exceptions to VirtualMailManager/errors.
Renamed VMM*Exception classes to *Error.
No longer add the attribute 'message' to VMMError if it doesn't exist, like in
Python 2.4. It has been deprecated as of Python 2.6.
Also removed the methods code() and msg(), the values are now accessible via
the attributes 'code' and 'msg'.
# -*- coding: UTF-8 -*-# Copyright (c) 2008 - 2010, Pascal Volk# See COPYING for distribution information."""A small - r/o - wrapper class for Postfix' postconf."""importrefromsubprocessimportPopen,PIPEimportVirtualMailManager.constants.ERRORasERRfromVirtualMailManager.errorsimportVMMErrorRE_PC_PARAMS="""^\w+$"""RE_PC_VARIABLES=r"""\$\b\w+\b"""classPostconf(object):__slots__=('__bin','__val','__varFinder')def__init__(self,postconf_bin):"""Creates a new Postconf instance. Keyword arguments: postconf_bin -- absolute path to the Postfix postconf binary (str) """self.__bin=postconf_binself.__val=''self.__varFinder=re.compile(RE_PC_VARIABLES)defread(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) """ifnotre.match(RE_PC_PARAMS,parameter):raiseVMMError(_(u'The value “%s” doesn\'t look like a valid\ postfix configuration parameter name.')%parameter,ERR.VMM_ERROR)self.__val=self.__read(parameter)ifexpand_vars:self.__expandVars()returnself.__valdef__expandVars(self):whileTrue:pvars=set(self.__varFinder.findall(self.__val))pvars_len=len(pvars)ifpvars_len<1:breakifpvars_len>1:self.__expandMultiVars(self.__readMulti(pvars))continuepvars=pvars.pop()self.__val=self.__val.replace(pvars,self.__read(pvars[1:]))def__expandMultiVars(self,old_new):forold,newinold_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()iflen(err):raiseVMMError(err.strip(),ERR.VMM_ERROR)returnout.strip()def__readMulti(self,parameters):cmd=[self.__bin]forparameterinparameters:cmd.append(parameter[1:])out,err=Popen(cmd,stdout=PIPE,stderr=PIPE).communicate()iflen(err):raiseVMMError(err.strip(),ERR.VMM_ERROR)par_val={}forlineinout.splitlines():par,val=line.split(' = ')par_val[par]=valreturnpar_val