B
    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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|   }W n |k
rR   td}Y nX t|}dd |D att	 a
t
jdd d tttt
 d a
|  d	krd
at
ddddddg |  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>/       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 d| }|s|S t|ddk r8d|dd }nd|d }t||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 nB| 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r8dgS |d	krLdd
dgS |dkr^d
dgS |dkrvd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.2r0   r1   )Zprinting	languagesZ
multimediaz4.0Zsecurityz4.1r   )r   moduler   r   r   valid_lsb_versionsK   sV    










r4   c              C   s(  t j } d| d< tjddddgt  | tjtjdd d	 	d
}|sPg S t
 }x|t jD ]}|snP |dd\}}td|dd	 }x~|dD ]p}t|}|sq| }|drd| }	||	 q|d }	x,t||	D ]}
|
|d< d| }	||	 qW qW qdW t|}|  |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)sr3   )osenvironcopy
subprocessPopenPACKAGESsplitPIPEcommunicatedecodesetlinesepr'   	modnameresearch	groupdictr+   addr4   r   r   )C_envoutputmodulesliner   ZprovidesZpkgZmobZmgroupsr3   vr   r   r   check_modules_installed   s>    
 

rR   r   r"   suite	componentlabel)rQ   oaclc             C   s\   i }|  d}xH|D ]@}| dd}t|dkr|d d \}}|tkr||t| < qW |S )Nr<   =r   r&   )rC   len	longnames)dataZretvalbitsbitZkvkrQ   r   r   r   parse_policy_line   s    

ra   c             C   sR   | d  d}|rN|tkr0tttt| S yt|S  tk
rL   dS X dS )Nr   rS   r   )r+   r   r)   r[   indexr
   
ValueError)xrS   r   r   r   release_index   s    re   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DeprecationWarningre   	TypeError)rd   yZ	suite_x_iZ	suite_y_ir   r   r   compare_release   s    rl   c              C   s   g } t j }d|d< tjddg|tjtjdd d d}xp|d	D ]b}|	 }t
d
|}|rvt|d}|drL|dd}t|dkrL| |t|d f qLW | S )NzC.UTF-8r6   z	apt-cachepolicyT)r7   r8   r9   r:   r   zutf-8
z(-?\d+)r   r,   r;   )r=   r>   r?   r@   rA   rD   rE   rF   rC   stripr'   r(   r)   r*   
startswithr[   appendra   )r]   rM   rm   rP   r.   priorityr^   r   r   r   parse_apt_policy   s$    
 

rs   mainZexperimentalzDebian Ports)zftp.ports.debian.orgz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   ddkrX|d   ddkrX|d   ddkrX|d   ddks|d   dd kr|d   dd  |d   ddkr|qS )r   r"    rS   rT   rU   )r+   )r   rd   )alternate_olabelsrT   ignoresuitesrU   r"   r   r   
<listcomp>   s    z*guess_release_from_apt.<locals>.<listcomp>c             S   s   | d S )Nr   r   )tupler   r   r   r      r   z(guess_release_from_apt.<locals>.<lambda>T)r   reverser   c                s   g | ]}|d   kr|qS )r   r   )r   rd   )max_priorityr   r   rx     s    )r   r   )rs   r   re   )r"   rT   rw   rU   rv   Zreleasesr   )rv   rT   rw   rU   r{   r"   r   guess_release_from_apt   s    	r|   c           
   C   s  i } d| d< t jdd}t j|rypt|^}xV|D ]N}y4|dd\}}| }| }|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 d d }~X Y nX t| d  t  d }|dkrd| | d< n4|dkrd| | d< n|dkr2|| d< nd| d< d|  | d< t jdd}t j|r6y$t|}	|	  }
W d Q R X W nD t
k
r } z$td| d	 t|tjd
 d}
W d d }~X Y nX |
dd  st|
d}| |
|d n<|
dr.|
d dkr$|
dad| d< n|
| d< | dst }|r|d}
|
d kr|d!d"kr|d#d$krd }
|d%d&i |
rt|
d}n |d%d&}
|
dkrt}nd'}| |
|d | dr| d  d(|  7  < | dr| d  d)|  7  < | S )*Nr   IDZLSB_ETC_DPKG_ORIGINS_DEFAULTz/etc/dpkg/origins/defaultz: r   ZvendorzUnable to open :)filer   )ZLinuxZHurdZNetBSDzGNU/ZOSZFreeBSDzGNU/k)z	GNU/Linuxz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 PortsrU   )zftp.ports.debian.orgzftp.debian-ports.orgrS   r   r   z %(RELEASE)sz (%(CODENAME)s))r=   r>   r+   pathexistsr   rC   r   ro   rc   r   printstrsysr9   r$   unamereadisalphar/   updateendswithrstripr   r|   )distinfoZetc_dpkg_origins_defaultZdpkg_origins_filerP   headerZcontentmsgZkernZetc_debian_versionZdebian_versionr,   codenameZrinfor   r   r   guess_debian_release	  s|    

.









*
r   c           
   C   s   i } t jdd}t j|ryt|}xz|D ]r}| }|sBq0d|krLq0|dd\}}|dr0|dd  }|dr|	dr|dd }|r0| | |< q0W W d Q R X W n> t
k
r } z td	| d
 t|tjd W d d }~X Y nX | S )NZLSB_ETC_LSB_RELEASEz/etc/lsb-releaserZ   r   ZDISTRIB_   "zUnable to open r~   )r   )r=   r>   r+   r   r   r   ro   rC   rp   r   r   r   r   r   r9   )r   Zetc_lsb_releaseZlsb_release_filerP   varargr   r   r   r   get_lsb_informationg  s*    


.r   c              C   s8   t  } x,dD ] }|| krt }||  |S qW | S d S )N)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   rR   r   r   r   r   test  s    
r   __main__)r   )N)Z
__future__r   r   r@   r=   r'   rg   r   r$   r/   rB   compilerI   r4   rG   r   ZsetsSetrR   r\   ra   re   rl   rs   r|   r   r   r   r   __name__r   r   r   r   <module>   sD   


5(

^
