U
    ÔZj¶#  ã                   @   sÊ   d Z ddlZddlZddlmZmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlZe e¡ZG dd„ deƒZG dd	„ d	eƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdS )z6Very low-level nginx config parser based on pyparsing.é    N)
ÚLiteralÚWhiteÚForwardÚGroupÚOptionalÚ	OneOrMoreÚQuotedStringÚRegexÚ
ZeroOrMoreÚCombine)Ú	stringEnd)Ú
restOfLinec                   @   sn  e Zd ZdZeeƒ ƒ ¡ Zeƒ  ¡ Ze	dƒ 
¡ Zee	dƒ 
¡  Ze	dƒ 
¡ Zeddddd	�Zed
dddd	�ZeeB ZedƒZedƒZeeeeƒ ƒZeee	dƒ eeƒ ƒZeeB eB Zee eee ƒ e Zee Zee	dƒ e Zeƒ Ze eƒe eƒB e eƒB Z!e eƒZ"e ee!ƒe ƒ ¡ Z#ee"e e# e >  e$e!ƒe e% Z&e& '¡  ¡  dd„ Z(dd„ Z)dd„ Z*dS )ÚRawNginxParserz7A class that parses nginx configuration with pyparsing.Ú{Ú}ú;ú"TFú\)Ú	multilineZunquoteResultsZescCharú'z(\$\{)|[^{};\s'\"]z(\$\{)|[^{;\s]ú)ú#c                 C   s
   || _ d S ©N©Úsource)Úselfr   © r   ú\/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/certbot_nginx/nginxparser.pyÚ__init__6   s    zRawNginxParser.__init__c                 C   s   | j  | j¡S )zReturns the parsed tree.)ÚscriptZparseStringr   ©r   r   r   r   Úparse9   s    zRawNginxParser.parsec                 C   s   |   ¡  ¡ S )z"Returns the parsed tree as a list.)r!   ZasListr    r   r   r   Úas_list=   s    zRawNginxParser.as_listN)+Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   ZleaveWhitespaceÚspaceZrequired_spacer   ÚsuppressZleft_bracketZright_bracketÚ	semicolonr   ZdquotedZsquotedÚquotedr	   Zhead_tokencharsZtail_tokencharsr   r
   Z
tokencharsZparen_quote_extendÚtokenZwhitespace_token_groupZ
assignmentr   Úcommentr   Úblockr   ÚcontentsZblock_beginZblock_innardsr   r   r   ZparseWithTabsr   r!   r"   r   r   r   r   r      s6   
r   c                   @   s*   e Zd ZdZdd„ Zd	dd„Zdd„ ZdS )
ÚRawNginxDumperz>A class that dumps nginx configuration from the provided tree.c                 C   s
   || _ d S r   ©Úblocks)r   r1   r   r   r   r   D   s    zRawNginxDumper.__init__Nc                 c   sà   |p| j }|D ]Ì}t|tjƒr&|V  qt |¡}t|d ƒrN| d¡V  |sNqt|d tƒr¢d 	| d¡¡d V  | d¡D ]}|  
|g¡D ]
}|V  qŒq|dV  qd}t|d tjƒrÊ|d  ¡ dkrÊd}d 	|¡| V  qdS )z"Iterates the dumped nginx content.r   Ú r   r   r   r   N)r1   Ú
isinstanceÚsixÚstring_typesÚcopyÚdeepcopyÚspaceyÚpopÚlistÚjoinÚ__iter__Ústrip)r   r1   Zb0ÚitemZ	parameterÚliner)   r   r   r   r<   G   s(    


 zRawNginxDumper.__iter__c                 C   s
   d  | ¡S )z$Return the parsed block as a string.r2   )r;   r    r   r   r   Ú__str__`   s    zRawNginxDumper.__str__)N)r#   r$   r%   r&   r   r<   r@   r   r   r   r   r/   A   s   
r/   c                 C   s   t t| ƒ ¡ ƒS )zvParses from a string.

    :param str source: The string to parse
    :returns: The parsed tree
    :rtype: list

    )ÚUnspacedListr   r"   r   r   r   r   Úloadsh   s    rB   c                 C   s   t |  ¡ ƒS )zrParses from a file.

    :param file _file: The file to parse
    :returns: The parsed tree
    :rtype: list

    )rB   Úread)Ú_filer   r   r   Úloads   s    rE   c                 C   s   t t| jƒƒS )z’Dump to a string.

    :param UnspacedList block: The parsed tree
    :param int indentation: The number of spaces to indent
    :rtype: str

    )Ústrr/   Úspacedr0   r   r   r   Údumps~   s    rH   c                 C   s   |  t| ƒ¡S )zÀDump to a file.

    :param UnspacedList block: The parsed tree
    :param file _file: The file to dump to
    :param int indentation: The number of spaces to indent
    :rtype: NoneType

    )ÚwriterH   )r1   rD   r   r   r   Údump‰   s    	rJ   c                 C   s   t | tjƒr|  ¡ p| dkS )Nr2   )r3   r4   r5   Úisspace)Úxr   r   r   Ú<lambda>•   ó    rM   c                   @   s”   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	d#dd„Z
dd„ Z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 )%rA   zIWrap a list [of lists], making any whitespace entries magically invisiblec                 C   s’   t  t|ƒ¡| _d| _t | |¡ ttt| ƒƒƒD ]Z\}}t|tƒrht	|ƒ}t 
| ||¡ |j| j|< q2t|ƒr2d| d |… kr2t | |¡ q2d S )NFr   )r6   r7   r:   rG   Údirtyr   ÚreversedÚ	enumerater3   rA   Ú__setitem__r8   Ú__delitem__)r   Zlist_sourceÚiÚentryZsublistr   r   r   r   š   s    
zUnspacedList.__init__c                 C   s2   t |tƒs||fS t|dƒs$t|ƒ}||jfS dS )zû
        Coerce some inbound object to be appropriately usable in this object

        :param inbound: string or None or list or UnspacedList
        :returns: (coerced UnspacedList or string or None, spaced equivalent)
        :rtype: tuple

        rG   N)r3   r:   ÚhasattrrA   rG   )r   Zinboundr   r   r   Ú_coerce¬   s
    	

zUnspacedList._coercec                 C   s\   |   |¡\}}|t| ƒk r$|  |¡nt| jƒ}| j ||¡ t|ƒsRt | ||¡ d| _d S ©NT)rW   ÚlenÚ_spaced_positionrG   Úinsertr8   r:   rO   )r   rT   rL   r>   Úspaced_itemZsliceposr   r   r   r[   ½   s     zUnspacedList.insertc                 C   s8   |   |¡\}}| j |¡ t|ƒs.t | |¡ d| _d S rX   )rW   rG   Úappendr8   r:   rO   ©r   rL   r>   r\   r   r   r   r]   Å   s
    zUnspacedList.appendc                 C   s0   |   |¡\}}| j |¡ t | |¡ d| _d S rX   )rW   rG   Úextendr:   rO   r^   r   r   r   r_   Ì   s    zUnspacedList.extendc                 C   s   t  | ¡}| |¡ d|_|S rX   )r6   r7   r_   rO   )r   ÚotherÚlr   r   r   Ú__add__Ò   s    

zUnspacedList.__add__Nc                 C   s   t dƒ‚d S )Nz&UnspacedList.pop() not yet implemented©ÚNotImplementedError)r   Ú_ir   r   r   r9   Ø   s    zUnspacedList.popc                 C   s   t dƒ‚d S )Nz)UnspacedList.remove() not yet implementedrc   )r   Ú_r   r   r   ÚremoveÚ   s    zUnspacedList.removec                 C   s   t dƒ‚d S )Nz*UnspacedList.reverse() not yet implementedrc   r    r   r   r   ÚreverseÜ   s    zUnspacedList.reversec                 C   s   t dƒ‚d S )Nz'UnspacedList.sort() not yet implementedrc   )r   Z_cmpÚ_keyZ_Revr   r   r   ÚsortÞ   s    zUnspacedList.sortc                 C   s   t dƒ‚d S )Nú5Slice operations on UnspacedLists not yet implementedrc   )r   re   Z_jZ	_newslicer   r   r   Ú__setslice__à   s    zUnspacedList.__setslice__c                 C   sT   t |tƒrtdƒ‚|  |¡\}}| j |  |¡|¡ t|ƒsJt | ||¡ d| _	d S )Nrk   T)
r3   Úslicerd   rW   rG   rR   rZ   r8   r:   rO   )r   rT   Úvaluer>   r\   r   r   r   rR   ã   s    
zUnspacedList.__setitem__c                 C   s(   | j  |  |¡¡ t | |¡ d| _d S rX   )rG   rS   rZ   r:   rO   )r   rT   r   r   r   rS   ì   s    zUnspacedList.__delitem__c                 C   s$   t j| j|d�}t|ƒ}| j|_|S )N)Úmemo)r6   r7   rG   rA   rO   )r   ro   Z
new_spacedra   r   r   r   Ú__deepcopy__ñ   s    zUnspacedList.__deepcopy__c                 C   s   | j r
dS tdd„ | D ƒƒS )zFRecurse through the parse tree to figure out if any sublists are dirtyTc                 s   s    | ]}t |tƒo| ¡ V  qd S r   )r3   rA   Úis_dirty)Ú.0rL   r   r   r   Ú	<genexpr>û   s     z(UnspacedList.is_dirty.<locals>.<genexpr>)rO   Úanyr    r   r   r   rq   ÷   s    zUnspacedList.is_dirtyc                 C   s|   d }}|dk rt | ƒ| }d|  kr4t | ƒk s>n tdƒ‚|}|dkrtt| j| ƒrb|d7 }n|d8 }|d7 }qB|| S )zHConvert from indexes in the unspaced list to positions in the spaced oner   zlist index out of rangeéÿÿÿÿé   )rY   Ú
IndexErrorr8   rG   )r   ÚidxÚposÚspacesZidx0r   r   r   rZ   ý   s    

zUnspacedList._spaced_position)N)NNN)r#   r$   r%   r&   r   rW   r[   r]   r_   rb   r9   rg   rh   rj   rl   rR   rS   rp   rq   rZ   r   r   r   r   rA   —   s"   

	rA   )r&   r6   ÚloggingZ	pyparsingr   r   r   r   r   r   r   r	   r
   r   r   r   r4   Ú	getLoggerr#   ÚloggerÚobjectr   r/   rB   rE   rH   rJ   r8   r:   rA   r   r   r   r   Ú<module>   s   0
3'