
U"                 @   s   d  Z  d Z d Z d d l Z d d l Z d d l m Z m Z d d l m	 Z	 m
 Z
 d d	 l m Z e e  Z Gd
 d   d  Z Gd d   d e	  Z Gd d   d e  Z d S)zCyril Jaquierz Copyright (c) 2004 Cyril JaquierZGPL    N)NoOptionErrorNoSectionError   )SafeConfigParserWithIncludeslogLevel   )	getLoggerc               @   s   e  Z d  Z d Z d d d d  Z d d   Z d d   Z e d	 d
    Z d d d  Z	 d d d  Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d S)ConfigReaderzkGeneric config reader class.

	A caching adapter which automatically reuses already shared configuration.
	Nc             K   ss   d  |  _  d  |  _ | d  k	 r' | |  _ | d  k	 rQ | |  _  | |  _ d  |  _ n |  j d  k ro t |   |  _ d  S)N)
_cfg_share_cfg_cfg_share_kwargs_cfg_share_basedirConfigReaderUnshared)selfZ
use_configshare_configkwargs r   >/usr/lib/python3/dist-packages/fail2ban/client/configreader.py__init__,   s    					zConfigReader.__init__c             C   s)   |  j  r |  j  j |  n	 | |  _ d  S)N)r   
setBaseDirr   )r   basedirr   r   r   r   :   s    	zConfigReader.setBaseDirc             C   s!   |  j  r |  j  j   S|  j Sd  S)N)r   
getBaseDirr   )r   r   r   r   r   @   s    	zConfigReader.getBaseDirc             C   s   |  j  S)N)r
   )r   r   r   r   r   F   s    zConfigReader.share_configTc             C   sv   |  j  s |  j |  | r8 |  j  j d k	 r8 |  j  j St j d | |  j  j    |  j  j |  } | |  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'.
	  Nz Loading configs for %s under %s )r   _create_unsharedread_cfg_fileslogSysinfor   read)r   nameonceZretr   r   r   r   J   s    	
zConfigReader.read c             C   s   |  j  r |  j d k	 r |  j j |  |  _  |  j  s t d |  j |  j  |  _  |  j d k	 rt |  j  j |  j  |  j  |  j | <n t |  j   |  _  d S)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
   getr   r   r   r   )r   r   r   r   r   r   _   s    	zConfigReader._create_unsharedc             C   s    |  j  d  k	 r |  j  j   Sg  S)N)r   sections)r   r   r   r   r!   o   s    zConfigReader.sectionsc             C   s#   |  j  d  k	 r |  j  j |  Sd S)NF)r   has_section)r   secr   r   r   r"   t   s    zConfigReader.has_sectionc             O   s&   |  j  d  k	 r" |  j  j | |   Sd  S)N)r   merge_section)r   argsr   r   r   r   r$   y   s    zConfigReader.merge_sectionc             G   s#   |  j  d  k	 r |  j  j |   Si  S)N)r   options)r   r%   r   r   r   r&   }   s    zConfigReader.optionsc             C   s&   |  j  d  k	 r" |  j  j | |  Sd  S)N)r   r    )r   r#   optr   r   r   r       s    zConfigReader.getc             O   s&   |  j  d  k	 r" |  j  j | |   Si  S)N)r   
getOptions)r   r%   r   r   r   r   r(      s    zConfigReader.getOptions)__name__
__module____qualname____doc__r   r   r   propertyr   r   r   r!   r"   r$   r&   r    r(   r   r   r   r   r	   &   s   r	   c               @   s^   e  Z d  Z d Z d Z d d d  Z d d   Z d d	   Z d
 d   Z d d d  Z	 d S)r   zUnshared config reader (previously ConfigReader).

	Do not use this class (internal not shared/cached represenation).
	Use ConfigReader instead.
	z/etc/fail2banNc             O   s-   t  j |  | |  d  |  _ |  j |  d  S)N)r   r   r   r   )r   r   r%   r   r   r   r   r      s    	zConfigReaderUnshared.__init__c             C   s+   | d  k r t  j } | j d  |  _ d  S)N/)r   DEFAULT_BASEDIRrstrip_basedir)r   r   r   r   r   r      s    	zConfigReaderUnshared.setBaseDirc             C   s   |  j  S)N)r1   )r   r   r   r   r      s    zConfigReaderUnshared.getBaseDirc                s  t  j j |  j  s( t d |  j   t  j j |  j |  } t j d | |  j  | d g } | d } | t t	 j	 d |   7} | j
 | d  | t t	 j	 d |   7} t t t  j j |   } t |  rit j d d	 j |   t j |  |      f d
 d   | D } | rBt j d d	 j |     rLd St j d | |  j    d St j d | d |  j   d d	 j |  g t t |    d Sd  S)Nz/Base configuration directory %s does not exist z Reading configs for %s under %s z.confz.dz	%s/*.confz.localz
%s/*.localzReading config files: %sz, c                s"   g  |  ] } |   k r |  q Sr   r   ).0Zcf)config_files_readr   r   
<listcomp>   s   	 z-ConfigReaderUnshared.read.<locals>.<listcomp>zCould not read config files: %sTz0Found no accessible config files for %r under %sFz(Found no accessible config files for %r zunder %szamong existing ones: )ospathexistsr1   
ValueErrorjoinr   debugsortedglobappendlistfilterlenr   r   errorr   bool)r   filenamebasenameZconfig_filesZ
config_dirZmissedr   )r3   r   r      s4    
	(zConfigReaderUnshared.readc             C   s  t    } x| D]} y | d d k rB |  j | | d  } n? | d d k rk |  j | | d  } n |  j | | d  } | d  k	 r | d | k r w | | | d <Wq t k
 r } z$ t j |  | d | | d <WYd  d  } ~ Xq t k
 ry| d d  k	 rIt j d | d | | d f  | d | | d <n, t j	   t
 k rut j t
 d | d |  Yq t k
 rt j d | d d	 | d
 t | d  d  | d | | d <Yq Xq W| S)Nr   rB   r   intr   z/'%s' not defined in '%s'. Using default one: %rz.Non essential option '%s' not defined in '%s'.zWrong value for 'z' in 'z'. Using default one: '')dictZ
getbooleanZgetintr    r   r   rA   r   ZwarningZgetEffectiveLevelr   logr8   repr)r   r#   r&   ZpOptionsvaluesZoptionver   r   r   r(      s4    	$	-zConfigReaderUnshared.getOptions)
r)   r*   r+   r,   r/   r   r   r   r   r(   r   r   r   r   r      s   0r   c               @   s   e  Z d  Z d Z g  Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)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             K   s7   t  j |  |  |  j |  |  j |  | |  _ d  S)N)r	   r   setFilesetJailName	_initOpts)r   Zfile_jailNameZinitOptsr   r   r   r   r      s    z#DefinitionInitConfigReader.__init__c             C   s   | |  _  i  |  _ d  S)N)_filerP   )r   ZfileNamer   r   r   rN     s    	z"DefinitionInitConfigReader.setFilec             C   s   |  j  S)N)rR   )r   r   r   r   getFile  s    z"DefinitionInitConfigReader.getFilec             C   s   | |  _  d  S)N)	_jailName)r   rQ   r   r   r   rO     s    z&DefinitionInitConfigReader.setJailNamec             C   s   |  j  S)N)rT   )r   r   r   r   getJailName  s    z&DefinitionInitConfigReader.getJailNamec             C   s   t  j |  |  j  S)N)r	   r   rR   )r   r   r   r   r     s    zDefinitionInitConfigReader.readc             C   s/   |  j  s |  j |  j  t j |  j  |  j  S)N)r   r   rR   r   r   )r   r   r   r   readexplicit  s    	z'DefinitionInitConfigReader.readexplicitc             C   ss   t  j |  d |  j |  |  _ |  j d  ro x? |  j d  D]. } | |  j k r= |  j d |  |  j | <q= Wd  S)NZ
DefinitionZInit)r	   r(   _configOptsZ_optsr"   r&   rP   r    )r   ZpOptsr'   r   r   r   r(     s    z%DefinitionInitConfigReader.getOptionsc             C   s
   t   d  S)N)NotImplementedError)r   r   r   r   convert#  s    z"DefinitionInitConfigReader.convertN)r)   r*   r+   r,   rW   r   rN   rS   rO   rU   r   rV   r(   rY   r   r   r   r   rM      s   	rM   )
__author__Z__copyright__Z__license__r<   r5   configparserr   r   Zconfigparserincr   r   Zhelpersr   r)   r   r	   r   rM   r   r   r   r   <module>   s   gf