
 iWs7                 @   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 Wn' e k
 r d  d l Z e j Z Yn Xd d   Z d d d d d d d d d d i Z d d   Z d d   Z d d   Z d d   Z d d  d! d d" d# i 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  d |  j    } Wn t k
 r: t  d  } Yn Xt j |  } d d   | D a t t j    a t j	 d d d    t t t
 t    d  a |  j   d	 k r d
 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>keyc             S   s   t  |  d  S)Nr   )float)nr   r   r   <lambda>)   s    z!get_distro_info.<locals>.<lambda>   Zdebianzunknown.new.testingZstablezproposed-updatestestingztesting-proposed-updatesunstablesid)openlowerFileNotFoundErrorcsvZ
DictReaderRELEASE_CODENAME_LOOKUPlistitemsRELEASES_ORDERsortzipTESTING_CODENAMEextendclose)originZcsvfilereaderr   r   r   get_distro_info   s    r!   c             C   ss   t  j d |   } | s | St | j d   d k  rP d | 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_codename5   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 r[ | d k r5 d g S| d k rK d d g Sd d d g Sn|  d k r | d k r} d d g S| d k r d g S| d k r d g S| d k r d d d g Sd d d d g Sn2|  d k rb| d k r d d d g S| d k rd g S| d k rd d g S| d k r0d g S| d k rLd d d d g Sd d d d d g Sn |  d k r| d k rd d d d g S| d k rd g S| d k rd d d g S| d k rd d g S| d k rd d d d d g Sd 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-   r.   )r/   	languagesr1   )r/   r2   r1   )r/   r2   r1   r   )r   moduler   r   r   valid_lsb_versionsE   sV    




r4   c           
   C   s  t  j j   }  d |  d <t j d d d d g t j   d |  d t j d	 t j d
 d j   d j	 d  } | sy g  St
   } x | j t  j  D] } | s P| j d d  \ } } t j d | d  d } x | j d  D] } t j |  } | sq | j   } | j d  r6d | }	 | j |	  q | d }	 x8 t | |	  D]' }
 |
 | d <d | }	 | j |	  qPWq Wq Wt |  } | j   | S)NCLC_ALLz
dpkg-queryz-fz${Version} ${Provides}
z-Wenvstdoutstderr	close_fdsTr   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   rQ   r   or   asuitec	componentllabelc             C   s~   i  } |  j  d  } xb | D]Z } | j  d d  } t |  d k r | d  d  \ } } | t k r | | t | <q W| S)Nr<   =r   r#   )rC   len	longnames)dataZretvalbitsZbitZkvkrQ   r   r   r   parse_policy_line   s    r`   c             C   sm   |  d j  d  } | ri | t k rB t t t  t j |   Sy t |  SWn t k
 rh d SYn Xd S)Nr   rU   r   )r(   r   r&   r[   indexr   
ValueError)xrU   r   r   r   release_index   s    	rd   c             C   sg   t  j d t d d t |   } t |  } y | | SWn& t k
 rb | | k | | k  SYn Xd  S)Nz^compare_release(x,y) is deprecated; please use the release_index(x) as key for sort() instead.
stacklevelr#   )warningswarnDeprecationWarningrd   	TypeError)rc   yZ	suite_x_iZ	suite_y_ir   r   r   compare_release   s    rk   c           
   C   s  g  }  t  j j   } d | d <t j d d g d | d t j d t j d d	 j   d
 j d  } x | j d  D] } | j	   } t
 j d |  } | r t | j d   } | j d  ru | j d d  } t |  d k ru |  j | t | d  f  qu W|  S)NzC.UTF-8r6   z	apt-cachepolicyr7   r8   r9   r:   Tr   zutf-8
z(-?\d+)r   r)   r;   )r=   r>   r?   r@   rA   rD   rE   rF   rC   stripr$   r%   r&   r'   
startswithr[   appendr`   )r]   rM   rl   rP   r+   Zpriorityr^   r   r   r   parse_apt_policy   s$     
		!rq   mainZexperimentalzDebian Portszftp.debian-ports.orgc                s   t    } | s d  S      f d d   | D } | sB d  S| j d d d   d d  | d d   f d	 d   | D } | j d t  | d d
 S)Nc                s   g  |  ] } | d  j  d d   k r| | d  j  d d   k r| | d  j  d d   k r| | 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    rU   rW   rY   )r(   )r   rc   )alternate_olabelsrW   ignoresuitesrY   r   r   r   
<listcomp>   s   	 z*guess_release_from_apt.<locals>.<listcomp>r
   c             S   s   |  d S)Nr   r   )tupler   r   r   r      s    z(guess_release_from_apt.<locals>.<lambda>reverseTr   c                s&   g  |  ] } | d    k r |  q S)r   r   )r   rc   )max_priorityr   r   rv      s   	 r   )rq   r   rd   )r   rW   ru   rY   rt   Zreleasesr   )rt   rW   ru   rY   ry   r   r   guess_release_from_apt   s    	%	rz   c           !   C   s  i  }  d |  d <t  j j d d  } t  j j |  ry t |  w } xm | D]e } yJ | j d d  \ } } | j   } | j   } | d k r | |  d <WqP t	 k
 r YqP XqP WWd  QRXWnI t
 k
 r} z) t d | d	 t |  d
 t j WYd  d  } ~ Xn Xt |  d  t  j   d } | d, k rHd | |  d <n@ | d k red | |  d <n# | d- k r~| |  d <n
 d |  d <d |  |  d <t  j j d d  } t  j j |  ry, t |   }	 |	 j   j   }
 Wd  QRXWnO t
 k
 r:} z/ t d | d	 t |  d
 t j d }
 WYd  d  } ~ Xn X|
 d d  j   s|t |
 d  } |  j d |
 d | i  nP |
 j d  r|
 j d  j   d k r|
 j d  a d  |  d <n
 |
 |  d <|  j d  st   } | r| j d!  }
 |
 d" k rH| j d#  d$ k rH| j d%  d& k rHd  }
 | j d' d( i  |
 r`t |
 d  } n- | j d' d(  }
 |
 d k rt } n d) } |  j d |
 d | i  |  j d  r|  d d* |  7<|  j d  r|  d d+ |  7<|  S).Nr   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   z1.0r   zDebian PortsrY   zftp.debian-ports.orgrU   r   r   z %(RELEASE)sz (%(CODENAME)s))r~   r   r   )r   r   )r=   r>   r(   pathexistsr   rC   r   rn   rb   IOErrorprintstrsysr9   r!   unamereadisalphar,   updateendswithrstripr   rz   )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|    
7
$

	6	r   c              C   sG  i  }  t  j j d d  } t  j j |  rCy t |   } x | D] } | j   } | sa qF d | k rp qF | j d d  \ } } | j d  rF | d d   } | j d  r | j	 d  r | d d  } | rF | j   |  | <qF WWd  QRXWnI t
 k
 rB} z) t d | d	 t |  d
 t j WYd  d  } ~ Xn 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   rn   rC   ro   r   r   r   r   r   r9   )r   Zetc_lsb_releaseZlsb_release_filerP   varargr   r   r   r   get_lsb_informationa  s*    7r   c              C   sH   t    }  x8 d D], } | |  k r t   } | j |   | Sq W|  Sd  S)Nr{   r   r   r   )zIDzRELEASEzCODENAMEzDESCRIPTION)r   r   r   )Zlsbinfor
   r   r   r   r   get_distro_informationz  s    		r   c               C   s   t  t    t  t    d  S)N)r   r   rR   r   r   r   r   test  s    r   __main__)Z
__future__r   r   r@   r=   r$   rf   r   r!   r,   rB   compilerI   r4   rG   	NameErrorZsetsSetrR   r\   r`   rd   rk   rq   rz   r   r   r   r   __name__r   r   r   r   <module>   sD   5(
^