ogfO4dZdZdZddlZddlZddlmZmZddlm Z m Z m Z dd l m Z mZmZmZe eZeed Zd ZGd d ZGdde ZGddeZy)z?Cyril Jaquier, Yaroslav Halchenko, Serg G. Brester (aka sebres)z\Copyright (c) 2004 Cyril Jaquier, 2007 Yaroslav Halchenko, 2015 Serg G. Brester (aka sebres)GPLN) NoOptionErrorNoSectionError)sysSafeConfigParserWithIncludeslogLevel) getLogger_as_bool _merge_dictssubstituteRecursiveTags)boolintc#Kt|ttfr,|D]&}t|dkDr|\}}}n|dc\}}}|||f(y|D]}||\}}|||fyw)zIterator over the options template with default options. Each options entry is composed of an array or tuple with: [[type, name, ?default?], ...] Or it is a dict: {name: [type, default], ...} r N) isinstancelisttuplelen)optionsoptnameopttypeoptvalues >/usr/lib/python3/dist-packages/fail2ban/client/configreader.py_OptionsTemplateGenr)swe %$g 'lQ!(GWh#*D Wg '8 ## $$gw'7H '8 ##$sAAc~eZdZdZddZdZdZedZddZ ddZ d Z d Z dd Z d Zd ZddZdifdZdZy) ConfigReaderzkGeneric config reader class. A caching adapter which automatically reuses already shared configuration. Nc d|_d|_|||_|||_||_d|_y|jt di||_yy)N) _cfg_share_cfg_cfg_share_kwargs_cfg_share_basedirConfigReaderUnshared)self use_config share_configkwargss r__init__zConfigReader.__init__DsX$/$)49!4?"4!4 yy#-f-49cb|jr|jj|y||_yN)r! setBaseDirr#r%basedirs rr-zConfigReader.setBaseDirRs# YY99 $4r*cf|jr|jjS|jSr,)r! getBaseDirr#r%s rr1zConfigReader.getBaseDirXs( YY ))     ! !!r*c|jSr,)r r2s rr'zConfigReader.share_config^s r*cR|js|j||r,|jj|jjStj d||jj |jj |}||j_|S)z Overloads a default (not shared) read of config reader. To prevent mutiple reads of config files with it includes, reads into the config reader, if it was not yet cached/shared by 'name'. z Loading configs for %s under %s )r!_create_unsharedread_cfg_fileslogSysinfor1read)r%nameoncerets rr9zConfigReader.readbs  dii&&2 )) " "" ++0$ 8L8L8NO t#!$)) *r*c|js|j|jj||_|jsqtdd|ji|j|_|j %|jj |j |j|j|<yytdi|j|_y)z Allocates and share a config file by it name. Automatically allocates unshared or reuses shared handle by given 'name' and init arguments inside a given shared storage. Nr'r)r!r getr$r"r#r-)r%r:s rr5zConfigReader._create_unsharedws t2""4(49 ))$\$//\TE[E[\DI * YY$112 IIDOOD  $=d&<&<=49r*ch d|jjDS#t$rgcYSwxYw)Nc3DK|]}|jdr|yw)zKNOWN/N) startswith).0ns r z(ConfigReader.sections..s I!,,x2H1 Is  )r!sectionsAttributeErrorr2s rrEzConfigReader.sectionss3 Idii((* II  9 s # 11cX |jj|S#t$rYywxYw)NF)r! has_sectionrF)r%secs rrHzConfigReader.has_sections. ))   $$  s  ))c|r|jj||S||jjj|ivSr,)r! has_option _sectionsr>)r%rIopt withDefaults rrKzConfigReader.has_optionsA+6  c3 '0 tyy""&&sB//0r*cV|jjj|yr,)r! get_defaultsupdate)r%ds rmerge_defaultszConfigReader.merge_defaultss))!!!$r*ct |jj|g|i|S#t$r t|wxYwr,)r! merge_sectionrFrr%sectionargsr(s rrUzConfigReader.merge_sectionsB! !$)) ! !' ;D ;F ;; !   !"7Fcl |jj||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!rrFr)r%rWrNs rrzConfigReader.optionss8 ! ))  G[ 11 !   !s3cr |jj||||S#t$r t|wxYw)N)rawvars)r!r>rFr)r%rIrMr\r]s rr>zConfigReader.gets< ))--Sc- 55   s!6ct |jj|g|i|S#t$r t|wxYwr,)r! getOptionsrFrrVs rr_zConfigReader.getOptionssB! $))  w 8 8 88 !   !rY)NN)T)F)__name__ __module__ __qualname____doc__r)r-r1propertyr'r9r5rErHrKrSrUrr>r_rr*rrr>sc .% "    *>   0%! !# !r*rc6eZdZdZdZd dZdZdZdZd dZ y) r$zUnshared config reader (previously ConfigReader). Do not use this class (internal not shared/cached represenation). Use ConfigReader instead. z /etc/fail2banNcftj|g|i|d|_|j|yr,)rr)r6r-)r%r/rXr(s rr)zConfigReaderUnshared.__init__s.''>t>v>$//'r*cT|tj}|jd|_y)N/)r$DEFAULT_BASEDIRrstrip_basedirr.s rr-zConfigReaderUnshared.setBaseDirs" _ ! 1 17..%$-r*c|jSr,)rmr2s rr1zConfigReaderUnshared.getBaseDirs r*c tjj|jst d|jz|j drtjj |}tjj|j|}tjd||j|dzg}|dz}|ttjd|zz }|j|dz|ttjd|zz }tttjj|}t|rtjd d j|t!j"||}|Dcgc] }||vs| }}|r%tj%d d j||ry tj%d ||j'ytj%d|zd|j'zdd j|zgt)t|zycc}w)Nz/Base configuration directory %s does not exist ./z Reading configs for %s under %s z.confz.dz %s/*.confz.localz %s/*.localzReading config files: %sz, zCould not read config files: %sTz0Found no accessible config files for %r under %sFz(Found no accessible config files for %r zunder %szamong existing ones: )ospathexistsrm ValueErrorrAabspathjoinr7debugsortedglobappendrfilterrrr9errorr1r)r%filenamebasename config_files config_dirconfig_files_readcfmisseds rr9zConfigReaderUnshared.reads  & E ==  ggooh'8 WW\\$-- 2(,,1HdmmLg%',$*&;#;<==,h)*&<*#<=>>,fRWW^^\:;, <<*DIIl,CD388|L' HR25F+Fb H6 H  LL2DIIf4EF  <<B"$  <<:XE ) )$))L"99 ;;?L@Q;R TUV  Is  I%Ic t}|i}t|D]L\}}} ||vr |j|||} | ||<|r%tj|} | r| B| | ||<N|S#t$r'} |rt j | | ||<Yd} ~ |d} ~ wt$r(| #t jd|d|d| | ||<Yt$r8t jd|zdz|zdzt| zdz| ||<YwxYw)Nr]'z' not defined in 'z'. Using default one: zWrong value for 'z' in 'z'. Using default one: ') dictrr> CONVERTERrr7r|rwarningrtrepr) r%rIrpOptions shouldExistconvertvaluesrrrvconves rr_zConfigReaderUnshared.getOptionss5 6& 8$7$@ gw   gH-AF7O MM' "T HQfWo: -%   LLOF7O    ^^ C#$VG_  NN&08;cA !#'>24789F7Os)4A+ A++ D 4B1D  =D D r,)NFT) rbrcrdrerkr)r-r1r9r_rr*rr$r$s( # & &d"r*r$c`eZdZdZgZdZdZdZdZdZ dZ dZ dd Z d Z d Zdd Zd Zy)DefinitionInitConfigReaderzConfig reader for files with options grouped in [Definition] and [Init] sections. Is a base class for readers of filters and actions, where definitions in jails might provide custom values for options defined in [Init] section. c tj|fi||jdrtjj |}|j ||j|||_t|_ t|_ y)Nrp) rr)rArqrrrusetFile setJailName _initOptsr_pOpts _defCache)r%file_jailNameinitOptsr(s rr)z#DefinitionInitConfigReader.__init__/sh'' d 77??5 !5,,u8$.$+6$.r*c ||_i|_yr,)_filer)r%fileNames rrz"DefinitionInitConfigReader.setFile9s$*$.r*c|jSr,)rr2s rgetFilez"DefinitionInitConfigReader.getFile=s r*c||_yr, _jailName)r%rs rrz&DefinitionInitConfigReader.setJailName@s $.r*c|jSr,rr2s r getJailNamez&DefinitionInitConfigReader.getJailNameCs r*cBtj||jSr,)rr9rr2s rr9zDefinitionInitConfigReader.readFs   4 ,,r*c|js|j|jtj|j|jSr,)r!r5rrr9r2s r readexplicitz'DefinitionInitConfigReader.readexplicitJs6 $ % * *499djj AAr*c|s t}jrt|j}tj dj |d_|_jdrzfd}jddD]_}|dk(r d}|jds|||}|jd|z<|jvsG|||}|j|<a|r\jdrJjdD]5}|dk(s|j vrjd|j |<7yyy) N DefinitionF)rInitc(jd|S)Nr)r>)rMr%s rz7DefinitionInitConfigReader.getOptions..\s-r*)rNrbzknown/) rrr rr_ _configOpts_optsrrHrrAr>)r%pOptsallgetoptrMrs` rr_z%DefinitionInitConfigReader.getOptionsOsE  65 ^^ t~~ .5&&t'''?$*$+ f -6ll6ul5s j( A >>( # vc{1$%T^^HSL! $..  vc{1T^^C T  l +ll<(2s jC4::-xhh|S1DJJsO2,Sr*c t|D]>\}}}tj|}|s|j|}|3 ||||<@y#t$r!tj d|||||||<YkwxYw)z:Convert interpolated combined options to expected type. Nz/Wrong %s value %r for %r. Using default one: %r)rrr>rtr7r)r%opts configOptsrrrrrs rconvertOptionsz)DefinitionInitConfigReader.convertOptionsms%8 $C  gw -- 4  Ay(!WT']   ^^E q'8%T']s A'A87A8c |j|S#t$rZ |jjd||j}n#t t tf$rd}YnwxYw||j|<|cYSwxYw)zGet combined definition option (as string) using pre-set and init options as preselection (values with higher precedence as specified in section). Can be used only after calling of getOptions. rrN)rKeyErrorr!get_exrrrrt)r%rrs r getCombOptionz(DefinitionInitConfigReader.getCombOption|sw  .. !!    wT[[AA =* 5  A 4>>' 8  s2 A4(AA4AA4AA43A4c|j}|jrt||j}t|siSt |j }|D]H}t jj|}|s%|j\}}|j|Jt|||j}|s td|j||j|S)N)ignoreaddreplz/recursive tag definitions unable to be resolved)rrr rsetcopyrCONDITIONAL_REmatchgroupsaddrrrtrr)r%r combinedoptsrCcondrs r getCombinedz&DefinitionInitConfigReader.getCombineds, ^^|T^^<< \  9 v;   & a & 5 5 ; ;A >4 kkmGAt JJqM  ! $,, .$ E FFdD,,- +r*ctr,)NotImplementedErrorr2s rrz"DefinitionInitConfigReader.convertsr*Nra)r)rbrcrdrerr)rrrrr9rr_rrrrrr*rrr$sK-B 2<  ,r*r) __author__ __copyright__ __license__ryrq configparserrrconfigparserincrrr helpersr r r rrbr7rrrrr$rrr*rrsw.O n  6HHPP 8     $*v!v!rj7jZr*