o
    ¦®Øfw  ã                   @   sH   d dl 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 )é    N)ÚStringIO)Ú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 u r|  | j¡| _ d S 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	   Ú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	   Úcurrent_sdsÚflat_sdsÚsdlistÚsdr   r   r   Úsearch_domains.   s   

€þzResolvConf.search_domainsc                 C   s’   |   ¡  tƒ }| jD ]:\}}|dkr| d¡ q
|dkr&| d|d  ¡ q
|dkrD|\}}}d||f }t|ƒr=||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_valueÚ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r#|S |  d¡ |D ]}| j	 dd|dgf¡ q*|S )Nr   r   r   )
r   r   Úlistr   r   r   Ú	uniq_listr(   r   r   )r	   ÚnsÚ
current_nsÚ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-   Ú
_cfg_valuer5   ©r3   r   r   Ú
remove_opt`   s   
z-ResolvConf._remove_option.<locals>.remove_optr2   )r	   r3   r@   Únew_contentsÚcr   r?   r   r   _   s   	

€
zResolvConf._remove_optionc                 C   s˜   | j }t|ƒ}| t|ƒ¡ t |¡}t|ƒt|ƒkr|S t|ƒdkr)td| ƒ‚d |¡}t|ƒdkr:t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#   r6   r   r   r   r7   r(   Ú
ValueErrorÚjoinr   r   )r	   Úsearch_domainr    Únew_sdsÚs_listr   r   r   Úadd_search_domaino   s,   
ÿÿ
ÿÿ
zResolvConf.add_search_domainc                 C   sÜ   g }t | ¡ ƒD ]c\}}| ¡ }|s| d|gf¡ qt|dƒ\}}t| ¡ ƒs1| d|gf¡ q|s5d}z
| d d¡\}}	W n ttfyV }
 z	t	d|d  ƒ|
‚d }
~
ww |dvrat	d| ƒ‚| d	||	|gf¡ q|S )
Nr$   z;#r&   r   é   z)Incorrectly formatted resolv.conf line %s)r   r   r   ÚsortlistÚoptionsz Unexpected resolv.conf option %sr   )
Ú	enumerateÚ
splitlinesÚstripr   r   r(   r   Ú
IndexErrorrF   ÚIOError)r	   r*   ÚentriesÚir0   ÚslineÚheadÚtailr-   Ú
cfg_valuesÚer   r   r   r   ‡   s4   
ÿþ€ÿzResolvConf._parseN)Ú__name__Ú
__module__Ú__qualname__r   r   Úpropertyr   r   Úsetterr#   r1   r   r<   r   rK   r   r   r   r   r   r      s"    




	r   )ÚloggingÚior   Ú	cloudinitr   Úcloudinit.distros.parsersr   Ú	getLoggerr[   ÚLOGr   r   r   r   r   Ú<module>   s   
