o
    xb]5:                     @   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ze W n eyJ   d dlZejZY nw 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re  dS dS )-    )print_functionNDebianc                 C   s   zt }W n ty   t}Y nw z
td|   }W n |y'   td}Y nw t|}dd |D att	 a
t
jdd d tttt
 d a
|  d	kr[d
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>.   s   " z#get_distro_info.<locals>.<dictcomp>c                 S   s   t | d S Nr   )float)nr   r   r   <lambda>0   s    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 rd|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   r0   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   sJ  | dkrddgS | dkr|dv rdgS |dkrddgS g dS | dkrE|dkr+ddgS |d	kr2dgS |d
v r9dgS |dkrAg dS g dS | dkrs|dkrQg dS |d	krXdgS |d
v r`ddgS |dkrgdgS |dkrog dS g dS | dkr|dkrg dS |d	krdgS |d
v rg dS |dkrddgS |dkrg dS g dS | gS )N3.02.03.1)desktopqt4Zcxx)r2   r1   r3   3.2r4   r5   )Zprinting	languagesZ
multimedia)r1   r3   r6   )r2   r1   r3   r6   4.0)r3   r6   r8   Zsecurity)r1   r3   r6   r8   )r2   r1   r3   r6   r8   4.1)r3   r6   r8   r9   )r6   r8   r9   )r1   r3   r6   r8   r9   )r2   r1   r3   r6   r8   r9   r   )r   moduler   r   r   valid_lsb_versionsL   sV   r;   c                  C   s  t j } d| d< tjg dt  | tjtjdd d 	d}|s&g S t
 }|t jD ]S}|s5 nN|dd	\}}td
|d	d }|dD ]6}t|}|sUqK| }|drhd| }	||	 qK|d }	t||	D ]}
|
|d< d| }	||	 qqqKq/t|}|  |S )NCLC_ALL)z
dpkg-queryz-fz${Version} ${Provides}
z-WTenvstdoutstderrZ	close_fdsr   utf-8 r   z[-+~],r   z%(module)s-%(version)s-%(arch)sr:   )osenvironcopy
subprocessPopenPACKAGESsplitPIPEcommunicatedecodesetlinesepr(   	modnameresearch	groupdictr,   addr;   r   r   )C_envoutputmodulesliner   ZprovidesZpkgZmobZmgroupsr:   vr   r   r   check_modules_installed   sJ   

rZ   r   r#   suite	componentlabel)rY   oaclc                 C   sX   i }|  d}|D ] }| dd}t|dkr)|d d \}}|tv r)||t| < q	|S )NrD   =r   r'   )rK   len	longnames)dataZretvalbitsbitZkvkrY   r   r   r   parse_policy_line   s   
ri   c                 C   sT   | d  d}|r(|tv rtttt| S zt|W S  ty'   Y dS w dS )Nr   r[   r   )r,   r   r*   rc   indexr   
ValueError)xr[   r   r   r   release_index   s   
rm   c                 C   sN   t jdtdd t| }t|}z|| W S  ty&   ||k||k   Y S w )Nz^compare_release(x,y) is deprecated; please use the release_index(x) as key for sort() instead.r'   )
stacklevel)warningswarnDeprecationWarningrm   	TypeError)rl   yZ	suite_x_iZ	suite_y_ir   r   r   compare_release   s   
rt   c                  C   s   g } t j }d|d< tjddg|tjtjdd d d}|d	D ]1}|	 }t
d
|}|r:t|d}|drV|dd}t|dkrV| |t|d f q%| S )NzC.UTF-8r=   z	apt-cachepolicyTr>   r   rB   
z(-?\d+)r   r-   rC   )rE   rF   rG   rH   rI   rL   rM   rN   rK   stripr(   r)   r*   r+   
startswithrc   appendri   )re   rU   ru   rX   r/   priorityrf   r   r   r   parse_apt_policy   s.   

r{   mainZexperimentalDebian Portszftp.ports.debian.orgzftp.debian-ports.orgc                    sx   t  }|sd S  fdd|D }|sd S |jdd dd |d d fdd|D }|jtd	 |d d
 S )Nc              	      s   g | ]I}|d   ddkr,|d   ddvr,|d   ddkr,|d   ddksI|d   dd v r|d   dd  |d   ddv r|qS )r   r#    r[   r\   r]   )r,   r   rl   )alternate_olabelsr\   ignoresuitesr]   r#   r   r   
<listcomp>   s    $
z*guess_release_from_apt.<locals>.<listcomp>c                 S   s   | d S r
   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   )max_priorityr   r   r     s    r   r   )r{   r   rm   )r#   r\   r   r]   r   Zreleasesr   )r   r\   r   r]   r   r#   r   guess_release_from_apt   s   	r   c               
   C   s6  i } d| d< t jdd}t j|rrz>t|0}|D ]%}z|dd\}}| }| }|dkr6|| d< W q t	y@   Y qw W d    n1 sKw   Y  W n  t
yq } ztd| d	 t|tjd
 W Y d }~nd }~ww t| d  t  d }|dv rd| | d< n|dkrd| | d< n|dv r|| d< nd| d< d|  | d< t jdd}t j|r)zt|}	|	  }
W d    n1 sw   Y  W n" t
y } ztd| d	 t|tjd
 d}
W Y d }~nd }~ww |
dd  st|
d}| |
|d n|
dr%|
d dkr |
dad| d< n|
| d< | dsyt }|ry|d}
|
d krX|d!d"krX|d#d$v rXd }
|d%d&i |
rat|
d}n|d%d&}
|
dkrot}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#   r}   r]   r~   r[   r   r   z %(RELEASE)sz (%(CODENAME)s))rE   rF   r,   pathexistsr   rK   r   rw   rk   r   printstrsysrA   r%   unamereadisalphar0   updateendswithrstripr    r   )distinfoZetc_dpkg_origins_defaultZdpkg_origins_filerX   headerZcontentmsgZkernZetc_debian_versionZdebian_versionr-   codenameZrinfor   r   r   guess_debian_release
  s   

(






*
r   c               
   C   sH  i } t jdd}t j|rzqt|b}|D ]U}| }|s qd|vr%q|dd\}}|dr=|	dr=|dd }|rl|dkrJ| | d< q|d	krU| | d
< q|dkrb| 
 | d< q|dkrl| | d< qW d    W | S 1 syw   Y  W | S  ty } ztd| d t|tjd W Y d }~| S d }~ww | S )NZLSB_OS_RELEASEz/usr/lib/os-releaserb   r   "Z
VERSION_IDr   ZVERSION_CODENAMEr   r   ZPRETTY_NAMEr   r   r   r   )rE   rF   r,   r   r   r   rw   rK   rx   r   titler   r   r   r   rA   )r   Z
os_releaseZos_release_filerX   varargr   r   r   r   get_os_releaseh  sF   
&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 N)r   r   rZ   r   r   r   r   test  s   
r   __main__)r   r   )Z
__future__r   r   rH   rE   r(   ro   r   r%   r0   rJ   compilerQ   r;   rO   r   ZsetsSetrZ   rd   ri   rm   rt   r{   r   r   r   r   r   __name__r   r   r   r   <module>   sN   


5
(

!^!
