ogfL3 dZdZdZddlZddlZddlZddlmZejdk\rddl m Z m Z m Z mZmZGd d e Zn'dd l m Z m Z mZmZe j"e _d Zee _d ZeeZdZdgZGdde Zy)z0Yaroslav Halchenko, Serg G. Brester (aka sebres)zHCopyright (c) 2007 Yaroslav Halchenko, 2015 Serg G. Brester (aka sebres)GPLN) getLogger)) ConfigParserBasicInterpolationInterpolationMissingOptionError NoOptionErrorNoSectionErrorc"eZdZdZfdZxZS)BasicInterpolationWithNameaDecorator to bring __name__ interpolation back. Original handling of __name__ was removed because of functional deficiencies: http://bugs.python.org/issue10489 commit v3.2a4-105-g61f2761 Author: Lukasz Langa Date: Sun Nov 21 13:41:35 2010 +0000 Issue #10489: removed broken `__name__` support from configparser But should be fine to reincarnate for our use case c|rNt|vrE|j}||d<|j||||tt|||||||g|i|SyyN__name__)rcopy_map_section_optionssuperr _interpolate_some) selfparseroptionaccumrestsectionmapargskwargs __class__s A/usr/lib/python3/dist-packages/fail2ban/client/configparserinc.pyrz,BasicInterpolationWithName._interpolate_some6sq x3 ((*CC O s; +T D VUD'3 A15 A9? AA 'g)r __module__ __qualname____doc__r __classcell__rs@rr r (s AAr r )SafeConfigParserr r r c^|j|||||j|||||g|i|SN)r_cp_interpolate_some)rrrrrrrrs rrrFs;GVT37 " " "65$ Vt Vv VVr cg}|D]n}|j|tjj|ddz}||vs>tjj |s^|j|p|S)z,Expands config files with local extension. rz.local)appendospathsplitextisfile) filenames newFilenamesfilename localnames r_expandConfFilesWithLocalr4Lsq"Xhggx(+h6)iBGGNN9$=y! " r SafeConfigParserWithIncludesceZdZdZdZej dZej dZej dZ e jdk\rdfd Z nddZ d ifd Z d Zed Zd ZgfdZgfdZdZdZddZddZddZxZS)r6a Class adds functionality to SafeConfigParser to handle included other configuration files (or may be urls, whatever in the future) File should have section [includes] and only 2 options implemented are 'files_before' and 'files_after' where files are listed 1 per line. Example: [INCLUDES] before = 1.conf 3.conf after = 1.conf It is a simple implementation, so just basic care is taken about recursion. Includes preserve right order, ie new files are inserted to the list of read configs before original, and their includes correspondingly so the list should follow the leaves of the tree. I wasn't sure what would be the right way to implement generic (aka c++ template) so we could base at any *configparser class... so I will leave it for the future INCLUDESz^([\w\-]+)/([^\s>]+)$z%\(([\w\-]+/([^\)]+))\)sz ^(\w+)(\?.+)$rrc~|j}t|d<d|d<tt||i|||_y)N interpolation;inline_comment_prefixes)rr rr6__init__ _cfg_share)r share_configrrrs rr>z%SafeConfigParserWithIncludes.__init__sH KKM6796/'*6 #$ %t5  !4?r cDtj|g|i|||_yr()r&r>r?)rr@rrs rr>z%SafeConfigParserWithIncludes.__init__s!T3D3F3!4?r Fcd}d|vrtjj|}|rh|jd}|jd}|j }|dk(rd|z|f}n |dk7r|fnd}|D]} |j ||| } | cS|j |||| } | S#t tf$r } Yd} ~ Hd} ~ wwxYw) zGet an option value for a given section. In opposite to `get`, it differentiate session-related option name like `sec/opt`. N/rknownKNOWN/default)DEFAULT)raw)rIvars)r6SECTION_OPTNAME_CREsearchgrouplowergetr r ) rrrrIrJsoptsecoptseclwrves rget_exz#SafeConfigParserWithIncludes.get_exs $F] & : : A A& I4 A3 A3 IIK6  W g &Dy(C6lD s #s $Q X  hhwCdh3! ( M *   s7B''C;CcJd|vsd|vryd}tjj|}|sy|D]\}}||vs |dt|} | j } | dk7r5d} | dk(r |j d|z|} n |j | } | |} nd} | r |j|} d}  ||<|S#t $rd} Y+wxYw#t $rYwxYw#t $rd} YKwxYw#t $rYwxYw#  |jd|<n# |j|<YnxYwYxYw) z Interpolates values of the section options (name syntax `%(section/option)s`). Fallback: try to wrap missing default options as "default/options" resp. "known/options" rCz%(rNrGrErFrD) r6SECTION_OPTSUBST_CREfindalllenrN _sectionsKeyError _defaults_maps) rrrrdefaultsrplcmntsoptreprPrRrQrSusedefrTs rrz1SafeConfigParserWithIncludes._map_section_optionss  _D( ' ( = = E Ed K'  *idC ( zS C YY[F V' >>(7* +C 0q nnS! s8q V  .. aGXd^G*V .Cvv   !hnnQdnnTsx'B4?CCC%+C44 CC CCCC C"!C"% C10C14D"7D  D" DD"c|jSr()r?rs rr@z)SafeConfigParserWithIncludes.share_configs r ct}|jrdt|ts|ndj |z}|jj |d\}}|;||j}|j |d}||f|j|<||fStjtkrtjtd|||fS|}|j |d}||fS)Nzinc:)NN)r@F) get_includesz Shared file: %s) r6r? isinstancelistjoinrOreadlogSysgetEffectiveLevellogLevellog)rr2SCPWIhashvcfgis r_getSharedSCPWIz,SafeConfigParserWithIncludes._getSharedSCPWIs &% __ :h#=86;;xCX Y5 OO  | 463 k T__ -C .A!1XDOOE q/   "h. JJx.9 q/ 3 xxux-1 q/r cVt|ts|g}t|}|jr`ddj |z}|jj |}|-g}|D]}||j ||z }||j|<|Sg}|D]}||j ||z }|S)Nz inc-path:rf)rhrir4r?rjrO2_SafeConfigParserWithIncludes__getIncludesUncached)rr0seenrq fileNamesFullr2s r _getIncludesz)SafeConfigParserWithIncludes._getIncludess It $}9' 2) __  I. /5??&&u-=MAd004@@]A*DOOE -?hD..x>>=? r ct} |j|\}}|sgS t j j|}dgfdgfg}|j|jvr|D]\} } | |j|jvs$|j|j| } | jdD]d} t j j| r| } n t j j|| } | |vrJ||gz}| |j| |z } f|dd|gz|ddzS#t$r'}tj d|d|gcYd}~Sd}~wwxYw) z Given 1 config resource returns list of included files (recursively) with the original one as well Simple loops are taken care about zError decoding config file 'z': Nbeforeafter rrD)r6rtUnicodeDecodeErrorrlerrorr,r-dirname SECTION_NAMEsectionsoptionsrOsplitisabsrjry)rresourcerwrprrsrU resourceDirnewFiles option_name option_list newResources newResourcerss r__getIncludesUncachedz2SafeConfigParserWithIncludes.__getIncludesUncachedsg '% ##H-961 I )+"~} .( 6??,,#+ -{KfnnU%7%788JJu11;?\$**40- { # q 77<< [ 1q d ( aT&&q!,,k- - !Q8* $x{1~ 55+   <<1EF 9 sD55 E%>E E% E%c|jSr()r]rds r get_defaultsz)SafeConfigParserWithIncludes.get_defaults7 r c|jSr()r[rds r get_sectionsz)SafeConfigParserWithIncludes.get_sections:rr c |j|}|r/t|j t|j zSt |j S#t$r t|wxYw)zReturn a list of option names for the given section name. Parameter `withDefault` controls the include of names from section `[DEFAULT]` )r[r\r setkeysr]ri)rr withDefaultoptss rrz$SafeConfigParserWithIncludes.options=sf ! .. !4 diik S0 00 diik  !   !s AA0c t|ts|g}g}|r||j|z }n|}|sgStj d||st |dkDrg}|j }|j}|D]x}|j|\}} | s|| z }|j|j |jjD]\} } tjj| } | r^| j\} } | j} | d=t| j#D]} | j%| }|| | | z<|j'| }t|t(r_|j+d| zt)t-|jD cgc] } | d| vs | c} d|j| | j|| <{|Stj/t0krtj3t0d|dt4j6dk\rt9j:||d St9j:||S#t $rYXwxYwcc} w) Nz Loading files: %srDrrFrz Reading file: %sr9zutf-8)encoding)rhriryrlinforZrrrtupdateitemsr6CONDITIONAL_REmatchgroupsrr\rpoprOdict merge_sectioniterrmrnrosys version_infor&rk)rr0rgrxretalldallsr2rrrsnrcondkrTs2s rrkz!SafeConfigParserWithIncludes.readLsJ It $}9-D%%i00==  9++#]3S'!+ 3    4    4 x  ! !( +FCAXS [[!!#$!!#))+A ) 8 8 > >q Ad wq$ 668q jMQVVX1 EE!H!d(  88A;b B  (1* bhhj) 7AQqTQYa 78"> yy|tAw+< : 8+ ::h. a0@A   mg FF   m 441   8s'I61 J>J6 JJc*|j} ||}|s|j|yi}|j D]%\}}|j |r|dk7s||||z<'|j|y#t$rtx||<}YzwxYwr)rr\rrr startswith) rrrprefrrQskrrTs rrz*SafeConfigParserWithIncludes.merge_sections   $ g3 ::g  "mmoda ,,t jBtAvJ**R.  4=3 sA77BBr()T)rr!r"r#rrecompilerKrXrrrr>rVrpropertyr@rtryrvrrrrkrr$r%s@rr6r6_s8!rzz":;" #>?"**-.""(-2 :7r  &)+*13 6D ;5z r ) __author__ __copyright__ __license__r,rrhelpersrr configparserrr&rr r r r rr)r4rrlrn__all__r6r rrs.@ Z  tAA A"4A2AA*:)K)K&W'8#  8   * *w#3wr