B
    u&ù`È  ã               @   s†   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ e ¡  ddl	T ddl
Z
ddlZe
 d	¡Zd
d„ ZG dd„ deƒZdS )z9
Module to validate the configuration file alt_phpXX.cfg
é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literals)Ústandard_library)Ú*Nzalt_php(\d)(\d)\.cfgc             C   s,   t  tj | ¡¡}|r(d | dd¡¡S dS )zr
    function to get the version of the php file name alt_phpXX.cfg
    for example: 'alt_php55.cfg' => '5.5'
    Ú.é   é   N)ÚALTPHPVER_PATTERNÚsearchÚosÚpathÚbasenameÚjoinÚgroup)Zinput_phpini_pathZphp_ver_searched© r   ú$/usr/share/cagefs/phpinivalidator.pyÚget_php_ver   s    r   c               @   sF   e Zd Ze d¡Ze d¡ZdZddd„Zdd„ Z	d	d
„ Z
dd„ ZdS )ÚPHPINIvalidatorz/(^Directive|Type|Range|Remark)\s*=\s*(.*\S)\s*$z@^([a-zA-Z0-9_.]+)\s*=\s*([^;="]+[^;=" \t]|".+"|[^;="])\s*(;.*)?$)ZOnZOffÚ0Ú1ÚTrueÚFalseú/etc/cl.selector/php.confc             C   s*   || _ |  | j ¡| _g | _g | _g | _d S )N)Úphpconf_pathÚ_load_phpconfÚ_phpconf_dataÚunknown_optionsÚinvalid_values_optionsÚinvalid_options)Úselfr   r   r   r   Ú__init__)   s
    zPHPINIvalidator.__init__c       	      C   s€   i }d}t |ƒ}xb|D ]Z}| d¡r&q| j | ¡ ¡}|s<q| dd¡\}}|dkrd|}tƒ ||< q||| |< qW | ¡  |S )zÉ
        Load reference data.
        Gets a dictionary of the form; example:
        {'upload_max_filesize': {'Default':'2M', 'Type':'list', 'Range'; '2M,4M,8M,16M,32M,64M,128M,256M,512M,1G'}
        Nú#r	   r
   Z	Directive)ÚopenÚ
startswithÚDIRECTIVE_PATTERNr   Úrstripr   ÚdictÚclose)	r!   r   Zphpconf_dictZdirective_titleZphpconfZphpconf_lineZsearchedÚdirective_nameÚdirective_valr   r   r   r   3   s     

zPHPINIvalidator._load_phpconfc          	   C   sþ   g }g | _ g | _g | _xâ|D ]Ú}|}| d¡r:| |¡ qyt| ¡ }| d¡rV|d7 }| j |¡ 	dd¡\}}| j
|||d\}	}
|	s˜| j  | ¡ ¡ n|
s¬| j | ¡ ¡ W n, tk
rÚ   d}	d}
| j | ¡ ¡ Y nX |	rä|
sìd| }| |¡ qW |S )Nú;ú=r   r	   r
   )r*   r+   Úphp_verF)r   r   r    r%   ÚappendÚstripÚendswithÚ CUSTOM_OPTIONS_DIRECTIVE_PATTERNr   r   Ú_validate_directive_valÚAttributeError)r!   Zinput_phpini_linesr.   Zoutput_phpini_linesZinput_phpini_lineZoutput_phpini_lineZinput_phpini_line1r*   r+   Zis_valid_directiveZis_valid_valuer   r   r   ÚvalidateL   s6    



zPHPINIvalidator.validatec             C   s.  | j  |¡}|sdS |d }| d¡}|rÞ| d¡s>| d¡r–|d }|dd… }|dkrt| d	¡| d	¡kr”dS qÞ|dkrÞ| d	¡| d	¡k rÞdS nH| d	¡}	d
|	d |	d f }
| d	¡}d
|d |d f }|
|krÞdS || j krìdS |dkr|| jkr*dS n"|dkr*||d  d¡kr*dS dS )aG  
        Validates directive for supplied PHP version
        :param directive_name: Directive name
        :param directive_val: Directive name
        :param php_ver: PHP version (3 digits) to check directive
        :return: Tuple (is_valid_directive, is_valid_value) - boolean flags validity of directive and value
        )FFZTypeZRemarkú>ú<r   r	   Nr   z%s.%sÚbool)TFÚlistZRangeú,)TT)r   Úgetr%   ÚsplitÚBOOLEAN_VARIANTS)r!   r*   r+   r.   Zdirective_data_dictZdirective_data_typeZremarkZremark_znakZ
remark_verZremark_ver_partsZremark_ver_2digitZphp_ver_partsZphp_ver_2digitr   r   r   r3   m   s<    





z'PHPINIvalidator._validate_directive_valN)r   )Ú__name__Ú
__module__Ú__qualname__ÚreÚcompiler&   r2   r=   r"   r   r5   r3   r   r   r   r   r   #   s   



!r   )Ú__doc__Z
__future__r   r   r   r   Zfuturer   Zinstall_aliasesÚbuiltinsrA   r   rB   r   r   Úobjectr   r   r   r   r   Ú<module>   s   

