3
YY8                 @   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lZd,ddZe  d-ddZ	dZ
ejd	Zd
d Zye W n" ek
r   d dlZejZY nX dd ZddddddZdd Zdd Zdd Zdd Zdddddd.ifd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zed+kre  dS )/    )print_functionNDebianc             C   s   yt }W n tk
r    t}Y nX ytd| j  }W n |k
rR   td}Y nX tj|}dd |D attj	 a
t
jdd d tttt
 d a
| j d	krd
at
jddddddg |j  d S )Nz/usr/share/distro-info/%s.csvz!/usr/share/distro-info/debian.csvc             S   s"   i | ]}|d  r|d |d  qS )versionZseries ).0rr   r   -/usr/lib/python3/dist-packages/lsb_release.py
<dictcomp>-   s    z#get_distro_info.<locals>.<dictcomp>c             S   s   t | d S )Nr   )float)nr   r   r   <lambda>/   s    z!get_distro_info.<locals>.<lambda>)key   Zdebianzunknown.new.testingZstablezproposed-updatestestingztesting-proposed-updatesunstablesid)FileNotFoundError	NameErrorIOErroropenlowercsvZ
DictReaderRELEASE_CODENAME_LOOKUPlistitemsRELEASES_ORDERsortzipTESTING_CODENAMEextendclose)originZFileNotFoundExceptionZcsvfilereaderr   r   r   get_distro_info   s"    

r#   c             C   sR   t jd| }|s|S t|jddk r8d|jdd }nd|jd }tj||S )Nz(\d+)\.(\d+)(r(\d+))?r      z%s.%s   z%s)rematchintgroupr   get)releaseunknownmZshortreleaser   r   r   lookup_codename;   s    r.   z`lsb-core lsb-cxx lsb-graphics lsb-desktop lsb-languages lsb-multimedia lsb-printing lsb-securityzIlsb-(?P<module>[a-z0-9]+)-(?P<arch>[^ ]+)(?: \(= (?P<version>[0-9.]+)\))?c             C   s  | dkrddgS | dkrD|dkr&dgS |dkr6ddgS dddgS nD| dkr|dkr\ddgS |dkrjdgS |dkrxdgS |dkrdddgS ddddgS  n| dkr
|dkrdddgS |dkrdgS |dkrddgS |dk rdgS |dk rddddgS dddddgS n~| dkr|dkr*ddddgS |dkr:dgS |dkrNdddgS |dkr`ddgS |dkrxdddddgS ddddddgS | gS )Nz3.0z2.0z3.1desktopqt4Zcxxz3.2printing	languages
multimediaz4.0Zsecurityz4.1)r/   r0   )r1   r2   r3   )r1   r2   r3   )r1   r2   r3   r   )r   moduler   r   r   valid_lsb_versionsK   sV    











r5   c              C   s(  t jj } d| d< tjddddgtj  | tjtjddj d	 j	d
}|sPg S t
 }x|jt jD ]}|snP |jdd\}}tjd|dd	 }x~|jdD ]p}tj|}|sq|j }|jdrd| }	|j|	 q|d }	x,t||	D ]}
|
|d< d| }	|j|	 qW qW qdW t|}|j  |S )NCLC_ALLz
dpkg-queryz-fz${Version} ${Provides}
z-WT)envstdoutstderr	close_fdsr   zutf-8 r   z[-+~],r   z%(module)s-%(version)s-%(arch)sr4   )osenvironcopy
subprocessPopenPACKAGESsplitPIPEcommunicatedecodesetlinesepr&   	modnameresearch	groupdictr*   addr5   r   r   )C_envoutputmodulesliner   ZprovidesZpkgZmobZmgroupsr4   vr   r   r   check_modules_installed   s>    
 

rS   r   r!   suite	componentlabel)rR   oaclc             C   s\   i }| j d}xH|D ]@}|j dd}t|dkr|d d \}}|tkr||t| < qW |S )Nr=   =r   r%   )rD   len	longnames)dataZretvalbitsbitZkvkrR   r   r   r   parse_policy_line   s    

rb   c             C   sR   | d j d}|rN|tkr0ttttj| S yt|S  tk
rL   dS X dS )Nr   rT   r   )r*   r   r(   r\   indexr
   
ValueError)xrT   r   r   r   release_index   s    rf   c             C   sN   t jdtdd t| }t|}y|| S  tk
rH   ||k||k  S X d S )Nz^compare_release(x,y) is deprecated; please use the release_index(x) as key for sort() instead.r%   )
stacklevel)warningswarnDeprecationWarningrf   	TypeError)re   yZ	suite_x_iZ	suite_y_ir   r   r   compare_release   s    rm   c              C   s   g } t jj }d|d< tjddg|tjtjddj d jd}xp|jd	D ]b}|j	 }t
jd
|}|rvt|jd}|jdrL|jdd}t|dkrL| j|t|d f qLW | S )NzC.UTF-8r7   z	apt-cachepolicyT)r8   r9   r:   r;   r   zutf-8
z(-?\d+)r   r+   r<   )r>   r?   r@   rA   rB   rE   rF   rG   rD   stripr&   r'   r(   r)   
startswithr\   appendrb   )r^   rN   rn   rQ   r-   priorityr_   r   r   r   parse_apt_policy   s$    
 

rt   mainZexperimentalzDebian Portsftp.ports.debian.orgftp.debian-ports.orgc                sx   t  }|sd S  fdd|D }|s0d S |jdd dd |d d fdd|D }|jtd	 |d d
 S )Nc                s   g | ]}|d  j ddkrX|d  j ddkrX|d  j ddkrX|d  j ddks|d  j dd kr|d  j dd j |d  j ddkr|qS )r   r!    rT   rU   rV   )r*   )r   re   )alternate_olabelsrU   ignoresuitesrV   r!   r   r   
<listcomp>   s    z*guess_release_from_apt.<locals>.<listcomp>c             S   s   | d S )Nr   r   )tupler   r   r   r      s    z(guess_release_from_apt.<locals>.<lambda>T)r   reverser   c                s   g | ]}|d   kr|qS )r   r   )r   re   )max_priorityr   r   r{     s    )r   r   )rt   r   rf   )r!   rU   rz   rV   ry   Zreleasesr   )ry   rU   rz   rV   r~   r!   r   guess_release_from_apt   s    	r   c           !   C   s  i } d| d< t jjdd}t jj|rypt|^}xV|D ]N}y4|jdd\}}|j }|j }|dkrn|| d< W q8 t	k
r   Y q8X q8W W d Q R X W n> t
k
r } z"td| d	 t|tjd
 W Y d d }~X nX t| d  t j d }|d.krd| | d< n4|dkrd| | d< n|d/kr2|| d< nd| d< d|  | d< t jjdd}t jj|r6y$t|}	|	j j }
W d Q R X W nD t
k
r } z&td| d	 t|tjd
 d}
W Y d d }~X nX |
dd j st|
d}| j|
|d n<|
jdr.|
jdj dkr$|
jdad| d < n|
| d < | jd!st }|r|jd"}
|
d#kr|jd$d%kr|jd&d0krd }
|jd)d*i |
rt|
d}n |jd)d*}
|
dkrt}nd+}| j|
|d | jd r| d  d,|  7  < | jd!r| d  d-|  7  < | S )1Nr   IDZLSB_ETC_DPKG_ORIGINS_DEFAULTz/etc/dpkg/origins/defaultz: r   ZvendorzUnable to open :)filer   LinuxHurdNetBSDzGNU/ZOSZFreeBSDzGNU/k	GNU/LinuxGNU/kFreeBSDZGNUz%(ID)s %(OS)sDESCRIPTIONZLSB_ETC_DEBIAN_VERSIONz/etc/debian_versionr,   zn/a)RELEASECODENAMEz/sidr   ztesting/unstabler   r   r   z1.0r!   zDebian PortsrV   ftp.ports.debian.orgftp.debian-ports.orgrT   r   r   z %(RELEASE)sz (%(CODENAME)s))r   r   r   )r   r   )r   r   )r>   r?   r*   pathexistsr   rD   r   rp   rd   r   printstrsysr:   r#   unamereadisalphar.   updateendswithrstripr   r   )distinfoZetc_dpkg_origins_defaultZdpkg_origins_filerQ   headerZcontentmsgZkernZetc_debian_versionZdebian_versionr+   codenameZrinfor   r   r   guess_debian_release	  s|    

.









*
r   c              C   s   i } t jjdd}t jj|ryt|}xz|D ]r}|j }|sBq0d|krLq0|jdd\}}|jdr0|dd  }|jdr|j	dr|dd }|r0|j | |< q0W W d Q R X W n> t
k
r } z"td| d	 t|tjd
 W Y d d }~X nX | S )NZLSB_ETC_LSB_RELEASEz/etc/lsb-releaser[   r   ZDISTRIB_   "zUnable to open r   )r   )r>   r?   r*   r   r   r   rp   rD   rq   r   r   r   r   r   r:   )r   Zetc_lsb_releaseZlsb_release_filerQ   varargr   r   r   r   get_lsb_informationg  s*    


.r   c              C   s8   t  } x,dD ] }|| krt }|j|  |S qW | S d S )Nr   r   r   r   )r   r   r   r   )r   r   r   )Zlsbinfor   r   r   r   r   get_distro_information  s    

r   c               C   s   t t  t t  d S )N)r   r   rS   r   r   r   r   test  s    
r   __main__)r   )N)rv   rw   )Z
__future__r   r   rA   r>   r&   rh   r   r#   r.   rC   compilerJ   r5   rH   r   ZsetsSetrS   r]   rb   rf   rm   rt   r   r   r   r   r   __name__r   r   r   r   <module>   sD   


5(

^
