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 )version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   debianzunknown.new.testing)stablezproposed-updatestestingztesting-proposed-updatesunstablesid)FileNotFoundError	NameErrorIOErroropenlowercsv
DictReaderRELEASE_CODENAME_LOOKUPlistitemsRELEASES_ORDERsortzipTESTING_CODENAMEextendclose)originFileNotFoundException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mshortreleaser   r   r	   lookup_codename<   s   r7   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qt4cxx)r9   r8   r:   3.2r;   r<   )printing	languages
multimedia)r8   r:   r>   )r9   r8   r:   r>   4.0)r:   r>   rB   security)r8   r:   r>   rB   )r9   r8   r:   r>   rB   4.1)r:   r>   rB   rD   )r>   rB   rD   )r8   r:   r>   rB   rD   )r9   r8   r:   r>   rB   rD   r   )r   moduler   r   r	   valid_lsb_versionsL   sV   rF   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stderr	close_fdsr   utf-8 r   z[-+~],r   z%(module)s-%(version)s-%(arch)srE   )osenvironcopy
subprocessPopenPACKAGESsplitPIPEcommunicatedecodesetlinesepr.   	modnameresearch	groupdictr2   addrF   r   r"   )C_envoutputmodulesliner   providespkgmobmgroupsrE   vr   r   r	   check_modules_installed   sJ   

rj   r   r'   suite	componentlabel)ri   oaclc                 C   sX   i }|  d}|D ] }| dd}t|dkr)|d d \}}|tv r)||t| < q	|S )NrP   =r   r-   )rW   len	longnames)dataretvalbitsbitkvkri   r   r   r	   parse_policy_line   s   
r{   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   rk   r   )r2   r!   r0   rs   indexr   
ValueError)xrk   r   r   r	   release_index   s   
r   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DeprecationWarningr   	TypeError)r~   y	suite_x_i	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 ]1}|	 }t
d
|}|r:t|d}|drV|dd}t|dkrV| |t|d f q%| S )NzC.UTF-8rH   z	apt-cachepolicyTrI   r   rN   
z(-?\d+)r   r3   rO   )rQ   rR   rS   rT   rU   rX   rY   rZ   rW   stripr.   r/   r0   r1   
startswithrs   appendr{   )ru   ra   r   rd   r5   priorityrw   r   r   r	   parse_apt_policy   s.   

r   main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'    rk   rl   rm   )r2   r   r~   )alternate_olabelsrl   ignoresuitesrm   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"   r   )r'   rl   r   rm   r   releasesr   )r   rl   r   rm   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   IDLSB_ETC_DPKG_ORIGINS_DEFAULTz/etc/dpkg/origins/defaultz: r   vendorUnable to open :filer   )LinuxHurdNetBSDzGNU/OSFreeBSDzGNU/k)z	GNU/LinuxzGNU/kFreeBSDGNUz%(ID)s %(OS)sDESCRIPTIONLSB_ETC_DEBIAN_VERSIONz/etc/debian_versionr4   zn/a)RELEASECODENAMEz/sidr   ztesting/unstabler   r   r   z1.0r'   r   rm   r   rk   r   r   z %(RELEASE)sz (%(CODENAME)s))rQ   rR   r2   pathexistsr   rW   r   r   r}   r   printstrsysrL   r+   unamereadisalphar7   updateendswithrstripr$   r   )distinfoetc_dpkg_origins_defaultdpkg_origins_filerd   headercontentmsgkernetc_debian_versiondebian_versionr3   codename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 )NLSB_OS_RELEASEz/usr/lib/os-releaserr   r   "
VERSION_IDr   VERSION_CODENAMEr   r   PRETTY_NAMEr   r   r   r   )rQ   rR   r2   r   r   r   r   rW   r   r   titler   r   r   r   rL   )r   
os_releaseos_release_filerd   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   )lsbinfor   r   r   r   r	   get_distro_information  s   
r   c                   C   s   t t  t t  d S N)r   r   rj   r   r   r   r	   test  s   
r   __main__)r   r   )
__future__r   r   rT   rQ   r.   r   r   r+   r7   rV   compiler]   rF   r[   r   setsSetrj   rt   r{   r   r   r   r   r   r   r   r   __name__r   r   r   r	   <module>   sN   


5
(

!^!
