U
    T{)_<"  ã                   @   s  d dl mZ d dlZd dlZd dlZd dlZd dlZddddddd	d
dddddddddddddddgZddddddgZd d!d"d#d$d%d&d'gZ	d(Z
d)d*„ Zejd+k rªd,d-„ Znd.d-„ Zed/fd0d1„Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdS )Dé    )ÚdeepcopyNZaddressZnetmaskZ	broadcastZnetworkZmetricZgatewayZpointtopointZmediaZmtuZhostnameZ
leasehoursZ	leasetimeZvendorZclientZbootfileÚserverZhwaddrZproviderÚframeZnetnumZendpointZlocalZttlzpre-upZupzpost-upZdownzpre-downz	post-downZbridge_ageingZbridge_bridgeprioZ	bridge_fdZbridge_gcinitZbridge_helloZbridge_maxageZbridge_maxwaitZ
bridge_stpi   c                 C   s®   t | ƒ}t| tƒr*t|tƒr*| |¡ |S | ¡ D ]v\}}||kr t|| tƒrnt|tƒrnt|| |ƒ||< q¨t|| tƒr¨t|tƒr¨tt|| | ƒƒ||< q2|||< q2|S ©N)r   Ú
isinstanceÚlistÚextendÚitemsÚdictÚ
dict_mergeÚset)ZontoÚsourceÚtargetÚkeyÚvalue© r   ú//usr/lib/python3/dist-packages/probert/utils.pyr      s    

r   )r   é   c                 C   s>   i }| j D ].}| j  |¡}t|tƒr0| dd¡}|||< q
|S ©Nzutf-8Úreplace)Ú
attributesÚgetr   ÚbytesÚdecode©ÚdeviceÚrr   Úvalr   r   r   Úudev_get_attributes1   s    


r   c                 C   s@   i }| j jD ].}| j  |¡}t|tƒr2| dd¡}|||< q|S r   )r   Zavailable_attributesr   r   r   r   r   r   r   r   r   :   s    

é   c                    s(   dd„ t t ‡ fdd„| D ƒ|¡ƒD ƒS )Nc                 s   s    | ]\}}d d„ ||ƒV  qdS )c                    s   ‡ fdd„|D ƒS )Nc                 3   s   | ]\}}|ˆ kr|V  qd S r   r   )Ú.0ZpredÚitem©Úir   r   Ú	<genexpr>F   s      z:partitionn2.<locals>.<genexpr>.<lambda>.<locals>.<genexpr>r   )r#   Úteer   r"   r   Ú<lambda>F   ó    z'partitionn2.<locals>.<genexpr>.<lambda>Nr   )r    ÚxÚtr   r   r   r$   F   s   ÿzpartitionn2.<locals>.<genexpr>c                 3   s   | ]}ˆ |ƒ|fV  qd S r   r   )r    r!   ©Ú	predicater   r   r$   G   s   ÿ)Ú	enumerateÚ	itertoolsr%   ©r	   r+   Únr   r*   r   Úpartitionn2E   s    ÿÿÿr0   c                    s>   |   ¡ ‰ tˆ ‡ fdd„dd�}dd„ |D ƒ}|\\}}||fS )z{Unpack a partition into a tuple of (first partition, second partition)

    param: partition iterator from partitionn2
    c                    s   ˆ   | ¡dkS )Nr   )Úindex)r(   ©r	   r   r   r&   U   r'   z#partition_to_pair.<locals>.<lambda>r   r.   c                 S   s   g | ]}t |ƒ‘qS r   )r   )r    Úpr   r   r   Ú
<listcomp>W   s     z%partition_to_pair.<locals>.<listcomp>)Úsplitr0   )ÚinputZ
partitionsÚdatar   r   r   r2   r   Úpartition_to_pairN   s    
þ
r8   c                 C   s   dd„ |   d¡D ƒS )Nc                 S   s&   g | ]}t |ƒr| d ¡d  ¡ ‘qS )ú;r   )Úlenr5   Ústrip)r    r(   r   r   r   r4   ^   s    ÿz3disentagle_data_from_whitespace.<locals>.<listcomp>Ú
)r5   )r7   r   r   r   Údisentagle_data_from_whitespace\   s    r=   c                 C   sz   i }i }t | ƒD ]V}t|ƒdkr"qt|ƒ\}}|dkrN| |d |d i¡ qd |¡}| ||i¡ q| d|i¡ |S )zuTransform lease string into dictionary of attributes

    params: lease: string if a dhcp lease structure { to }
    r   Úoptioné   ú Úoptions)r=   r:   r8   ÚupdateÚjoin)ÚleaseZ
lease_dictrA   Úliner   r   r   r   r   Údictify_leaseb   s    
rF   c                 C   s   dd„ t  d|  dd¡¡D ƒS )zˆParses dhclient leases file data, returning dictionary of leases

    :param leasesdata: string of lease data read from leases file
    c                 S   s   g | ]}t |ƒ‘qS r   )rF   )r    rD   r   r   r   r4   }   s     z.parse_dhclient_leases_file.<locals>.<listcomp>z
{([^{}]*)}ú"Ú )ÚreÚfindallr   )Ú	leasedatar   r   r   Úparse_dhclient_leases_filex   s    ÿrL   c                 C   sN   i }|   d¡D ]:}| d¡st|ƒdk r*q|  d¡}|d ||d  ¡ < q|S )z6Parses systemd/networkd/netif lease data, returns dictr<   ú#r?   ú=r   )r5   Ú
startswithr:   Úlower)rK   rD   rE   Zkeyvaluer   r   r   Úparse_networkd_lease_file�   s    
rQ   c                  C   s*   ddg} | D ]}t j |¡r|  S qd S )Nz/var/lib/dhcpz/var/lib/dhclient)ÚosÚpathÚexists)Zsupported_dirsÚdr   r   r   Úget_dhclient_dŒ   s
    
rV   c                 C   s  d}|}|  ¡ D �]Ö}| ¡ }| d¡r*q| d¡}|d }|dkrXtj ||d ¡}q|dkrÂtj ||d ¡}t |¡D ]B}	t|	dƒ�}
|
 	¡  ¡ }W 5 Q R X t
| |tj tj |	¡¡ƒ q|q|d	k� rü|dd… D ] }|| krìi | |< d
| | d	< qØq|dk�r`|dd… \}}}|| k�r,i | |< nd| | k�rBtdƒ‚|| | d< || | d< |}q|dk�r||d | | d< q|tk�r˜|d | | |< q|tk�rÞ|| | k�r¼g | | |< | | |  d |dd… ¡¡ q| d¡�r�d| | k�ri | | d< |dk�rJg | | d d< |dd… D ]}| | d d  |¡ �q*nD|dk�règ | | d d< |dd… D ]}| | d d  |¡ �qpq| d¡rd| | k�r´i | | d< |tk�rà| dd¡}|d | | d |< q|dk�r&g | | d d< |dd… D ]}| | d d  |¡ �qq|dk�rX|d  ¡ dk�rX|d | | d d< q|dk�r¢d | | d k�r„i | | d d < |d | | d d  |d < q|d!krd"| | d k�rÌi | | d d"< |d | | d d" |d < q|  ¡ D ] }d	| | k�ròd#| | d	< �qòdS )$zËParses the file contents, placing result into ifaces.

    :param ifaces: interface dictionary
    :param contents: contents of interfaces file
    :param path: directory interfaces file was located
    NrM   r@   r   zsource-directoryr?   r   r   ÚautoTÚifaceé   Úfamilyz!Cannot define %s interface again.ÚmethodZ	hwaddresszdns-Zdnsz
dns-searchÚsearchzdns-nameserversZnameserversZbridge_ZbridgerH   Zbridge_portsZportsZ	bridge_hwZmacr   Zbridge_pathcostZpathcostZbridge_portprioZportprioF)Ú
splitlinesr;   rO   r5   rR   rS   rC   ÚglobÚopenÚreadÚparse_etc_network_interfacesÚdirnameÚabspathÚ	ExceptionÚNET_CONFIG_OPTIONSÚNET_CONFIG_COMMANDSÚappendÚNET_CONFIG_BRIDGE_OPTIONSr   rP   Úkeys)ZifacesÚcontentsrS   ZcurrifZsrc_dirrE   r5   r>   Zsrc_pathZsrc_fileÚfpZsrc_datarX   rZ   r[   Zdomainr   Zbridge_optionr   r   r   ra   •   s˜    

 þ






"





ra   c              	   C   sP   t j dt j | ¡¡}t j |d¡}t|ƒ�}t| ¡  ¡ ƒt }W 5 Q R X |S )zA /sys/class/block/<device>/size and return integer value in bytesú/sys/class/blockÚsize)	rR   rS   rC   Úbasenamer_   Úintr`   r;   ÚSECTOR_SIZE_BYTES)r   Ú
device_dirZblockdev_sizerU   rm   r   r   r   Úread_sys_block_size_bytesè   s
    
rr   c                 C   s*   t j dt j | ¡¡}t  t j |d¡¡S )Nrl   Zslaves)rR   rS   rC   rn   Úlistdir)r   rq   r   r   r   Úread_sys_block_slavesò   s    rt   )Úcopyr   r^   r-   rR   rI   Zpyudevre   rf   rh   rp   r   Z__version_info__r   ro   r0   r8   r=   rF   rL   rQ   rV   ra   rr   rt   r   r   r   r   Ú<module>   sx                      ü     ÿ      þ

				S
