U
    L¬÷dª  ã                   @   sL   d dl mZ d dlmZ d dlmZ d dlmZ e e	¡Z
G dd„ dƒZdS )é    )ÚStringIO)Úlog)Úutil)Úchop_commentc                   @   s~   e Zd Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZejd	d„ ƒZed
d„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú
ResolvConfc                 C   s   || _ d | _d S ©N)Ú_textÚ	_contents)ÚselfÚtext© r   úG/usr/lib/python3/dist-packages/cloudinit/distros/parsers/resolv_conf.pyÚ__init__   s    zResolvConf.__init__c                 C   s   | j d kr|  | j¡| _ d S r   )r	   Ú_parser   ©r
   r   r   r   Úparse   s    
zResolvConf.parsec                 C   s   |   ¡  |  d¡S )NÚ
nameserver©r   Ú_retr_optionr   r   r   r   Únameservers   s    zResolvConf.nameserversc                 C   s"   |   ¡  |  d¡}|r|d S d S )NÚdomainr   r   )r
   Zdmr   r   r   Úlocal_domain   s
    
zResolvConf.local_domainc                 C   s0   |   ¡  |  d¡ | j ddt|ƒdgf¡ |S )Nr   ÚoptionÚ )r   Ú_remove_optionr	   ÚappendÚstr)r
   r   r   r   r   r   '   s    
c                 C   sB   |   ¡  |  d¡}g }|D ]"}| d ¡D ]}|r(| |¡ q(q|S )NÚsearch)r   r   Úsplitr   )r
   Zcurrent_sdsÚflat_sdsZsdlistZsdr   r   r   Úsearch_domains.   s    
zResolvConf.search_domainsc                 C   s’   |   ¡  tƒ }| jD ]t\}}|dkr0| d¡ q|dkrL| d|d  ¡ q|dkr|\}}}d||f }t|ƒrz||7 }| d| ¡ q| ¡ S )NÚblankÚ
Úall_commentz%s
r   r   z%s %s)r   r   r	   ÚwriteÚlenÚgetvalue)r
   ÚcontentsÚ	line_typeÚ
componentsÚcfg_optÚ	cfg_valueZcomment_tailÚliner   r   r   Ú__str__9   s    
zResolvConf.__str__c                 C   s<   g }| j D ],\}}|dkr
|\}}}||kr
| |¡ q
|S )Nr   ©r	   r   )r
   Úopt_nameÚfoundr(   r)   r*   r+   Ú_comment_tailr   r   r   r   I   s    
zResolvConf._retr_optionc                 C   st   |   ¡  |  d¡}t|ƒ}| t|ƒ¡ t |¡}t|ƒt|ƒkrF|S |  d¡ |D ]}| j	 dd|dgf¡ qT|S )Nr   r   r   )
r   r   Úlistr   r   r   Ú	uniq_listr%   r   r	   )r
   ÚnsZ
current_nsZnew_nsÚnr   r   r   Úadd_nameserverR   s    


zResolvConf.add_nameserverc                    s8   ‡ fdd„}g }| j D ]}||ƒs| |¡ q|| _ d S )Nc                    s.   | \}}|dkrdS |\}}}|ˆ kr*dS dS )Nr   FTr   )Úitemr(   r)   r*   Z
_cfg_valuer1   ©r/   r   r   Ú
remove_opt`   s    
z-ResolvConf._remove_option.<locals>.remove_optr.   )r
   r/   r9   Znew_contentsÚcr   r8   r   r   _   s    	
zResolvConf._remove_optionc                 C   s˜   | j }t|ƒ}| t|ƒ¡ t |¡}t|ƒt|ƒkr:|S t|ƒdkrRtd| ƒ‚d |¡}t|ƒdkrttd| ƒ‚|  	d¡ | j
 dd|dgf¡ |S )	Né   z8Adding %r would go beyond the '6' maximum search domainsú é   zEAdding %r would go beyond the 256 maximum search list character limitr   r   r   )r    r2   r   r   r   r3   r%   Ú
ValueErrorÚjoinr   r	   )r
   Zsearch_domainr   Znew_sdsZs_listr   r   r   Úadd_search_domaino   s,    
ÿÿ
ÿÿ
zResolvConf.add_search_domainc                 C   sæ   g }t | ¡ ƒD ]Ð\}}| ¡ }|s6| d|gf¡ qt|dƒ\}}t| ¡ ƒsb| d|gf¡ q|sjd}z| d d¡\}}	W n8 ttfk
r¶ }
 zt	d|d  ƒ|
‚W 5 d }
~
X Y nX |dkrÌt	d| ƒ‚| d	||	|gf¡ q|S )
Nr!   z;#r#   r   é   z)Incorrectly formatted resolv.conf line %s)r   r   r   ZsortlistZoptionsz Unexpected resolv.conf option %sr   )
Ú	enumerateÚ
splitlinesÚstripr   r   r%   r   Ú
IndexErrorr>   ÚIOError)r
   r'   ÚentriesÚir,   ZslineÚheadÚtailr*   Z
cfg_valuesÚer   r   r   r   ‡   s0    
ÿþzResolvConf._parseN)Ú__name__Ú
__module__Ú__qualname__r   r   Úpropertyr   r   Úsetterr    r-   r   r6   r   r@   r   r   r   r   r   r      s    




	r   N)Úior   Z	cloudinitr   Zloggingr   Zcloudinit.distros.parsersr   Z	getLoggerrL   ZLOGr   r   r   r   r   Ú<module>   s
   
