
N_c           @   s   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 l Z d  d l Z d   Z	 d   Z
 d   Z e d  Z d   Z d   Z d   Z d	   Z d
   Z d   Z e j d d  Z d   Z d   Z d   Z d   Z d   Z d S(   iNc         C   s(   t  |   t j k r$ t |   }  n  |  S(   N(   t   typet   typest
   StringTypet   str(   t   arg(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   rpmOutToStr   s    c   	      C   s   |  \ } } } | \ } } } | d  k r3 d } n t |  } t |  } t |  } | d  k rl d } n t |  } t |  } t |  } t j | | | f | | | f  } | S(   Nt   0(   t   NoneR   t   rpmt   labelCompare(	   t   .0t   .1t   e1t   v1t   r1t   e2t   v2t   r2t   rc(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt
   compareEVR$   s    		$c         C   s   t  d |  d f d | d f  S(   s-   compare version strings only using rpm vercmpt    (   R   (   R   R   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   compareVerOnly9   s    c         C   s  d } |  j  d  } t j | t j  } y |  j |  } Wn t j k
 r } t |  d k rm d } n  t |  d k r d } n  t |  d k r d } n  t |  d k r d } q n; Xt |  \ } }	 | d	 k r t j	 |  ~ d
 } n ~ | r| d k rt j
 | d d  t j t j  |  j | |  }
 |
 sd } t j
 | d d  t j t j  |  j | |  n  t j t j  n  y t j	 |  Wn t k
 r} n X|  j  |  | S(   s  Takes a transaction set and a package, check it's sigs.

    By default, only v4 sigs (header-only) will be verified (faster).  By
    setting payload to True, v3 sigs (header+payload) will also be verified
    (slower).

    return 0 if they are all fine
    return 1 if the gpg key can't be found
    return 2 if the header or payload is in someway damaged
    return 3 if the key is not trusted 
    return 4 if the pkg is not gpg or pgp signedi    s   public key not availaiablei   s   public key not availables   public key not trustedi   s   error reading package headeri   ie   i   (   t
   setVSFlagst   ost   opent   O_RDONLYt   hdrFromFdnoR   t   errorR   t
   getSigInfot   closet   lseekt   setVerbosityt   RPMLOG_WARNINGt   _verifySigst   RPMLOG_INFOt   RPMLOG_NOTICEt   OSError(   t   tst   packaget   payloadt   valuet   currentflagst   fdnot   hdrt   eR   t   siginfot   valid(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   checkSig=   sH    				c         C   s   t  j t  j d  d } |  j |  } | d k rU d } | j d  \ } } } n d } d } d } d } | | | f } | | f S(	   sX   checks signature from an hdr hand back signature information and/or
       an error codet   Cs   %|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|s   (none)i    t   ,ie   t   MD5R   (   t   localet	   setlocalet   LC_ALLt   sprintft   split(   R+   t   stringR-   R   t   sigtypet   sigdatet   sigidt	   infotuple(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyR   {   s    c         C   s   |  d } |  t  j s* |  t  j d k r7 |  d } n d } |  d } |  d } |  d } | d	 k rp d } n  | | | | | f } | S(
   s^   return a pkgtuple (n, a, e, v, r) from a hdr object, converts
       None epoch to 0, as well.t   namei   t   archt   srct   versiont   releaset   epochR   N(   R   t   RPMTAG_SOURCERPMt   RPMTAG_SOURCEPACKAGER   (   R+   R=   R>   t   vert   relRB   t   pkgtuple(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   pkgTupleFromHeader   s    
 


	c         C   s4   | \ } } } } } t  |  | d | | | f f  S(   su   returns true if the package epoch-ver-rel satisfy the range
       requested in the reqtuple:
       ex: foo >= 2.1-1t   EQ(   t   rangeCompare(   t   reqtupleRG   t   nt   aR,   t   vt   r(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt
   rangeCheck   s    c         C   s  |  \ } } \ } } } | \ } } \ }	 }
 } | | k r@ d S| sN | rR d S| d k rg d } n  | d k r| d }	 n  | d k r d }
 n  | d k r d } n  t |	 |
 | f | | | f  } | d k r$| d k r d S| d k r| d k rd Sn  | d k r$| d k r!d Sq$n  | d k r| d k rO| d k rOd Sn  | d k rn| d k rnd Sn  | d k r| d k rd Sn  | d k r| d  k rd Sn  | d! k r| d" k rd Sqn  | d k r| d# k r| d$ k rd Sn  | d% k rd Sn  d S(&   s,   returns true if provtuple satisfies reqtuplei    i   t   GTt   GEi   i   t   >s   >=RI   i   t   =t   LEi
   t   LTi   s   <=t   <iN(   RQ   RR   i   i   RS   s   >=(   s   EQi   RT   (   RU   i
   RV   i   s   <=RW   (	   RU   RV   s   EQi
   i   i   s   <=RW   RT   (   RU   RV   i
   i   s   <=RW   (   RQ   i   RS   (   RQ   RR   i   i   RS   s   >=(   RR   i   s   >=(   RQ   RR   s   EQRU   i   i   i   i
   RS   s   >=RT   s   <=(   s   EQi   RT   (	   s   EQRR   RU   i   i   i
   RT   s   >=s   <=(   RU   i
   s   <=(   s   EQRU   RV   RR   i   i
   i   i   RT   s   <=RW   s   >=(   RV   i   RW   (   RU   RV   i
   i   s   <=RW   (	   RQ   RR   s   EQi   i   i   RS   s   >=RT   (   RQ   RR   i   i   RS   s   >=(   RU   RV   i
   i   s   <=RW   (   R   R   (   RK   t	   provtuplet   reqnt   reqft   reqet   reqvt   reqrRL   t   fR,   RN   RO   R   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyRJ      s^    				!

c         C   sD  t  |   } | d k r g  Si  } y x |  D] } d | | <q, WWn t k
 rW ~ n X| j   Sy t |   } | j   Wn t k
 r ~ n{ X| d k s t  | d } d } } xI | | k  r| | | k r | | | | <} | d 7} n  | d 7} q W| |  Sg  } x* |  D]" } | | k r| j |  qqW| S(   s  Return a list of the elements in s, but without duplicates.

    For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3],
    unique("abcabc") some permutation of ["a", "b", "c"], and
    unique(([1, 2], [2, 3], [1, 2])) some permutation of
    [[2, 3], [1, 2]].

    For best speed, all sequence elements should be hashable.  Then
    unique() will usually work in linear time.

    If not possible, the sequence elements should enjoy a total
    ordering, and if list(s).sort() doesn't raise TypeError it's
    assumed that they do enjoy a total ordering.  Then unique() will
    usually work in O(N*log2(N)) time.

    If that's not possible either, the sequence elements must support
    equality-testing.  Then unique() will usually work in quadratic
    time.
    i    i   (   t   lent	   TypeErrort   keyst   listt   sortt   AssertionErrort   append(   t   sRL   t   ut   xt   tt   lastt   lastit   i(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   unique   s:    
	

c   
      C   s   |  d d k r |  d  }  n  |  j  d  } |  | d } |  |  j  d  } |  | d | !} |  |  j  d  } |  | d | !} |  j d  } | d k r d } n
 |  |  } |  | d | !}	 |	 | | | | f S(	   s   
    Pass in a standard style rpm fullname 
    
    Return a name, version, release, epoch, arch, e.g.::
        foo-1.0-1.i386.rpm returns foo, 1.0, 1, i386
        1:bar-9-123a.ia64.rpm returns bar, 9, 123a, 1, ia64
    is   .rpmt   .i   t   -t   :iR   (   t   rfindt   find(
   t   filenamet	   archIndexR>   t   relIndexRF   t   verIndexRE   t
   epochIndexRB   R=   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   splitFilenameD  s    		
i   c      	   C   s   t  j j   } | j |   } ~ | t j p1 d } | d k rS t  j d |  n  t j d d d t
 j |  d |   } x/ | j |  } | d k r Pn  | j |  q} | j   d S(   s   Performs roughly the equivalent of rpm2cpio(8).
       Reads the package from fdno, and dumps the cpio payload to out,
       using bufsize as the buffer size.t   gzips$   Unsupported payload compressor: "%s"t   rbR   N(   t   rpmUtilst   transactiont   initReadOnlyTransactionR   R   t   RPMTAG_PAYLOADCOMPRESSORt   RpmUtilsErrorRy   t   GzipFileR   R   t   fdopent   readt   writeR   (   R*   t   outt   bufsizeR%   R+   t   comprR^   t   tmp(    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   rpm2cpioc  s    ' c         C   s   |  } | r t  |  t  d  k s< t  |  t  d  k r | t j t j Bt j B@r | d } | t j @r{ | d } n  | t j @r | d } n  | t j @r | d } n  | r d | | f } q q n  | S(   s   
    Return a human readable requirement string (ex.  foobar >= 2.0)
    @param name: requirement name (ex. foobar)
    @param version: requirent version (ex. 2.0)
    @param flags: binary flags ( 0010 = equal, 0100 = greater than, 1000 = less than )
    i    l    t    RW   RS   RT   s   %s %s(   R    R   t   RPMSENSE_LESSt   RPMSENSE_GREATERt   RPMSENSE_EQUAL(   R=   R@   t   flagsRf   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   formatRequirez  s    6
c         C   sn   |  d @}  |  d k r d  S|  d k r* d S|  d k r: d S|  d k rJ d S|  d	 k rZ d
 S|  d k rj d S|  S(   Ni   i    i   RV   i   RQ   i   RI   i
   RU   i   RR   (   R   (   R   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   flagToString  s    
      c         C   s  |  d k r d S|  j d  } | d k rb y t t |  |    } Wqh t k
 r^ d } qh Xn d } |  j d  } | d k r |  | d | !d k r d  } n |  | d | !} |  | d } n1 |  | d d k r d  } n |  | d } d  } | | | f S(	   NR   Rp   iR   Ro   i   (   NR   (   NNN(   R   Rr   R   t   longt
   ValueError(   t	   verstringRl   RB   t   jR@   RA   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   stringToVersion  s(    		c         C   s   y t  j | t  j  } Wn t k
 r: } t j d  n Xy |  j |  } Wn/ t j k
 r } t  j	 |  t j d  n Xt
 |  t j k r t  j	 |  t j d  n  t  j	 |  | S(   s>   hand back the rpm header or raise an Error if the pkg is fubars   Unable to open files   RPM Error opening Packages    RPM Error opening Package (type)(   R   R   R   R$   R{   R   R   R   R   R   R    R+   (   R%   R&   R*   R,   R+   (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   hdrFromPackage  s    c           C   sb   t  t d  r^ t  t d  r^ t j t j t j t j t j t j g  r^ t	 j
 d  q^ n  d  S(   Nt   checkSignalst   signalsCaughti   (   t   hasattrR   R   t   signalt   SIGINTt   SIGTERMt   SIGPIPEt   SIGQUITt   SIGHUPt   syst   exit(    (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyR     s    (   R   R   Ry   R   R   R3   R   t   rpmUtils.transactionR{   R   R   R   t   FalseR/   R   RH   RP   RJ   Rm   Rx   t   stdoutR   R   R   R   R   R   (    (    (    s6   /usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt   <module>   s.   			>			
	P	E					