Updated copyright notices to include the year 2010.
Also corrected the name of the copyright holder and updated the e-mail address.
# -*- coding: UTF-8 -*-# Copyright (c) 2008 - 2010, Pascal Volk# See COPYING for distribution information."""A small - r/o - wrapper class for Postfix' postconf."""fromsubprocessimportPopen,PIPEfrom__main__importre,ERRfromVirtualMailManager.ExceptionsimportVMMExceptionRE_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):raiseVMMException(_(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):raiseVMMException(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):raiseVMMException(err.strip(),ERR.VMM_ERROR)par_val={}forlineinout.splitlines():par,val=line.split(' = ')par_val[par]=valreturnpar_val