a
    \\3                     @   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d	 Z
ze W n  ey   d dlZejZY n0 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   zt }W n ty   t}Y n0 ztd|   }W n |yN   td}Y n0 t|}dd |D att	 a
t
jdd d tttt
 d a
|  d	krd
at
g d |  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>.       z#get_distro_info.<locals>.<dictcomp>c                 S   s   t | d S Nr   )float)nr   r   r   <lambda>0   r
   z!get_distro_info.<locals>.<lambda>key   Zdebianzunknown.new.testing)Z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    r1   c                 C   sb  | dkrddgS | dkrB|dv r&dgS |dkr6ddgS g dS n| dkr|dkrZddgS |d	krhdgS |d
v rvdgS |dkrg dS g dS n| dk r|dkrg dS |d	krdgS |d
v rddgS |dkrdgS |dk rg dS g dS nj| dkr\|dkrg dS |d	krdgS |d
v r0g dS |dkrBddgS |dkrTg dS g dS | gS )N3.02.03.1)desktopqt4Zcxx)r3   r2   r4   3.2r5   r6   )Zprinting	languagesZ
multimedia)r2   r4   r7   )r3   r2   r4   r7   4.0)r4   r7   r9   Zsecurity)r2   r4   r7   r9   )r3   r2   r4   r7   r9   4.1)r4   r7   r9   r:   )r7   r9   r:   )r2   r4   r7   r9   r:   )r3   r2   r4   r7   r9   r:   r   )r   moduler   r   r   valid_lsb_versionsG   sV    









r<   c                   C   s   g S Nr   r   r   r   r   check_modules_installed   s    r>   r   r$   suite	componentlabel)voaclc                 C   sX   i }|  d}|D ]@}| dd}t|dkr|d d \}}|tv r||t| < q|S )N,=r   r(   )splitlen	longnames)dataZretvalbitsbitZkvkrB   r   r   r   parse_policy_line   s    
rP   c                 C   sT   | d  d}|rP|tv r0tttt| S z
t|W S  tyN   Y dS 0 dS )Nr   r?   r   )r-   r   r+   rJ   indexr   
ValueError)xr?   r   r   r   release_index   s    
rT   c                 C   sR   t jdtdd t| }t|}z
|| W S  tyL   ||k||k   Y S 0 d S )Nz^compare_release(x,y) is deprecated; please use the release_index(x) as key for sort() instead.r(   )
stacklevel)warningswarnDeprecationWarningrT   	TypeError)rS   yZ	suite_x_iZ	suite_y_ir   r   r   compare_release   s    
r[   c                  C   s   g } t j }d|d< tjddg|tjtjdd d d}|d	D ]b}|	 }t
d
|}|rtt|d}|drJ|dd}t|dkrJ| |t|d f qJ| S )NzC.UTF-8LC_ALLz	apt-cachepolicyT)envstdoutstderrZ	close_fdsr   zutf-8
z(-?\d+)r   r.    )osenvironcopy
subprocessPopenPIPEZcommunicatedecoderI   stripr)   r*   r+   r,   
startswithrJ   appendrP   )rL   ZC_envr]   liner0   priorityrM   r   r   r   parse_apt_policy   s,    

ro   mainZexperimental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vrX|d   ddkrX|d   ddks|d   dd v r|d   dd  |d   ddv r|qS )r   r$    r?   r@   rA   )r-   r   rS   )alternate_olabelsr@   ignoresuitesrA   r$   r   r   
<listcomp>   s   &z*guess_release_from_apt.<locals>.<listcomp>c                 S   s   | d S r   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   rt   )max_priorityr   r   rw      r
   r   r   )ro   r   rT   )r$   r@   rv   rA   ru   Zreleasesr   )ru   r@   rv   rA   rz   r$   r   guess_release_from_apt   s    	r{   c               
   C   sB  i } d| d< t jdd}t j|rz~t|b}|D ]L}z4|dd\}}| }| }|dkrl|| d< W q6 t	y   Y q60 q6W d    n1 s0    Y  W n@ t
y } z(td| d	 t|tjd
 W Y d }~n
d }~0 0 t| d  t  d }|dv rd| | d< n4|dkr.d| | d< n|dv rB|| d< nd| d< d|  | d< t jdd}t j|r^z:t|}	|	  }
W d    n1 s0    Y  W nF t
y } z,td| d	 t|tjd
 d}
W Y d }~n
d }~0 0 |
dd  s"t|
d}| |
|d n<|
drV|
d dkrL|
dad| d< n|
| d< | dst }|r|d}
|
d kr|d!d"kr|d#d$v 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vendor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$   rq   rA   rr   r?   r   r   z %(RELEASE)sz (%(CODENAME)s))rc   rd   r-   pathexistsr   rI   r   rj   rR   r   printstrsysr`   r&   unamereadisalphar1   updateendswithrstripr!   r{   )distinfoZetc_dpkg_origins_defaultZdpkg_origins_filerm   headerZcontentmsgZkernZetc_debian_versionZdebian_versionr.   codenameZrinfor   r   r   guess_debian_release   s|    
*2




0




*
r   c               
   C   sD  i } t jdd}t j|r@zt|}|D ]}| }|sBq0d|vrLq0|dd\}}|dr||	dr||dd }|r0|dkr| | d< q0|d	kr| | d
< q0|dkr| 
 | d< q0|dkr0| | d< q0W d    n1 s0    Y  W nB ty> } z(td| d t|tjd W Y d }~n
d }~0 0 | S )NZLSB_OS_RELEASEz/usr/lib/os-releaserH   r   "Z
VERSION_IDr   ZVERSION_CODENAMEr   r|   ZPRETTY_NAMEr   r}   r~   r   )rc   rd   r-   r   r   r   rj   rI   rk   r   titler   r   r   r   r`   )r   Z
os_releaseZos_release_filerm   varargr   r   r   r   get_os_release>  s4    
02r   c                  C   s4   t  } dD ]$}|| vr
t }||  |  S q
| 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 r=   )r   r   r>   r   r   r   r   testj  s    
r   __main__)r   )N)Z
__future__r   r   rf   rc   r)   rV   r   r&   r1   r<   setr   ZsetsSetr>   rK   rP   rT   r[   ro   r{   r   r   r   r   __name__r   r   r   r   <module>   sD   

5

!^!
