ó đ v_c@skddlZddlZddlZddlZddlZejdƒZd„Zddd„ƒYZ dS(i˙˙˙˙Ns\$(\w+)cCsˇ|s |Sg}x—|rŠtj|ƒ}|s?|j|ƒPn|jdƒjƒ}|j||jƒƒ}|jƒ\}}|j|| ƒ|j|ƒ||}qWdj|ƒS(sPerform variable replacement @param raw: String to perform substitution on. @param vars: Dictionary of variables to replace. Key is variable name (without $ prefix). Value is replacement string. @return: Input raw string with substituted values. it(t_KEYCREtsearchtappendtgrouptlowertgettspantjoin(trawtvarstdonetmtvarnamet replacementtstarttend((s./usr/lib/python2.7/site-packages/yum/parser.pyt varReplace s    tConfigPreProcessorcBsSeZdZd d„Zdd„Zd„Zd„Zd„Zd„Z d„Z RS( sĄ ConfigParser Include Pre-Processor File-like Object capable of pre-processing include= lines for a ConfigParser. The readline function expands lines matching include=(url) into lines from the url specified. Includes may occur in included files as well. Suggested Usage:: cfg = ConfigParser.ConfigParser() fileobj = confpp( fileorurl ) cfg.readfp(fileobj) cCsŇ||_d|_d|_tj|ƒd}|dkrˆ|ddkr{ytjƒd}Wn d}nX||}nd|}n|}g|_g|_|j |ƒ}|dkrÎt j d|‚ndS(NtriRt/sfile://sError accessing file: %s( t_varstNonet_sectiontmodeturlparsetostgetcwdt _incstackt_alreadyincludedt _pushfiletErrorst ConfigError(tselft configfileR tschemetrootdirturltfo((s./usr/lib/python2.7/site-packages/yum/parser.pyt__init__=s$          icCs2d}xňt|jƒdkrú|jd}|jƒ}t|ƒdkrítjd|ƒ}|rź|jdƒ}t|ƒdkr˜tjd|j‚qęt ||j ƒ}|j |ƒ}q÷tjd|ƒ}|ré|jdƒ|_ nPq |j ƒq Wtjd |ƒ}|r"|jƒ}nt ||j ƒS( sÖ Implementation of File-Like Object readline function. This should be the only function called by ConfigParser according to the python docs. We maintain a stack of real FLOs and delegate readline calls to the FLO on top of the stack. When EOF occurs on the topmost FLO, it is popped off the stack and the next FLO takes over. include= lines found anywhere cause a new FLO to be opened and pushed onto the top of the stack. Finally, we return EOF when the bottom-most (configfile arg to __init__) FLO returns EOF. Very Technical Pseudo Code:: def confpp.readline() [this is called by ConfigParser] open configfile, push on stack while stack has some stuff on it line = readline from file on top of stack pop and continue if line is EOF if line starts with 'include=' then error if file is recursive or duplicate otherwise open file, push on stack continue else return line return EOF Rii˙˙˙˙s\s*include\s*=\s*(?P.*)R%s>Error parsing config %s: include must specify file to include.s\s*\[(?P
.*)\]tsections\s+\[(?P
.*)\](tlenRtreadlinetretmatchRRR tnameRRRRt_popfiletlstrip(R!tsizetlineR&R R%tsecmatchtbroken_sec_match((s./usr/lib/python2.7/site-packages/yum/parser.pyR*as,  cCs3t|jƒdkr|Stj|jƒ|ƒSdS(sî Returns an absolute url for the (possibly) relative url specified. The base url used to resolve the missing bits of url is the url of the file currently being included (i.e. the top of the stack). iN(R)RRturljointgeturl(R!R%((s./usr/lib/python2.7/site-packages/yum/parser.pyt_absurl¤scCsľ|j|ƒ}||jf}|j|ƒr1dSytjj|ƒ}Wntjjk rh}d}nX|dk rĄ||_|j j |ƒ|j j |ƒnt j d|‚|S(sĺ Opens the url specified, pushes it on the stack, and returns a file like object. Returns None if the url has previously been included. If the file can not be opened this function exits. s"Error accessing file for config %sN(R6Rt_isalreadyincludedRt urlgrabbertgrabberturlopent URLGrabErrorR-RRRRR (R!R%tabsurlt includetupleR&te((s./usr/lib/python2.7/site-packages/yum/parser.pyR˛s     cCsT|jjƒ}|jƒt|jƒdkrG|jdjƒ|_n d|_dS(sW Pop a file off the stack signaling completion of including that file. ii˙˙˙˙N(RtpoptcloseR)R5R-R(R!R&((s./usr/lib/python2.7/site-packages/yum/parser.pyR.Ós  cCs(x!|jD]}||kr dSq WdS(sˆ Checks if the tuple describes an include that was already done. This does not necessarily have to be recursive ii(R(R!ttupletetuple((s./usr/lib/python2.7/site-packages/yum/parser.pyR7ßs cCs|jS(N(R-(R!((s./usr/lib/python2.7/site-packages/yum/parser.pyR5ésN( t__name__t __module__t__doc__RR'R*R6RR.R7R5(((s./usr/lib/python2.7/site-packages/yum/parser.pyR+s $ C  ! (( R+RR8tos.pathRRtcompileRRR(((s./usr/lib/python2.7/site-packages/yum/parser.pyts