ó
N_c           @   s.  d  Z  d d l Z d d l m Z m Z m Z m Z d d l m Z d d l	 m
 Z
 d d l m Z m Z m Z d d l m Z d d l Z d d l Z d d l Z d d l m Z e d	  Z d
 e f d     YZ d e f d     YZ d   Z d e f d     YZ d   Z e  d k r*e   n  d S(   s+   
Update metadata (updateinfo.xml) parsing.
i’’’’N(   t   utf8_text_wrapt   to_utf8t
   to_unicodet   _(   t   YumRepository(   t   FakeRepository(   t   to_xmlt
   decompresst   repo_gen_decompress(   t   cElementTree_iterparse(   t   ArchStoragec         c   sv   y, x% t  |   D] \ } } | | f Vq WWnC t k
 rq | r[ | j t d  |   qr t j d I|  IJn Xd S(   s@    Works like iterparse, but hides XML errors (prints a warning). s$   Updateinfo file is not valid XML: %ss!   Updateinfo file is not valid XML:N(   t	   iterparset   SyntaxErrort   criticalR   t   syst   stderr(   t   filenamet   loggert   eventt   elem(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   safe_iterparse'   s    t   UpdateNoticeExceptionc           B   s   e  Z d  Z RS(   s0    An exception thrown for bad UpdateNotice data. (   t   __name__t
   __module__t   __doc__(    (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR   2   s   t   UpdateNoticec           B   s”   e  Z d  Z d d d d  Z d   Z d   Z d   Z d   Z d   Z	 d d  Z
 d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   s@   
    A single update notice (for instance, a security fix).
    c         C   s³   i d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d	 6d d
 6d d 6d d 6d d 6d d 6d d 6d d 6g  d 6g  d 6t  d 6|  _ | r |  j |  n  | |  _ | |  _ d  S(   Nt    t   fromt   typet   titlet   releaset   statust   versiont	   pushcountt	   update_idt   issuedt   updatedt   descriptiont   rightst   severityt   summaryt   solutiont
   referencest   pkglistt   reboot_suggested(   t   Falset   _mdt   _parset   _repoidt   _vlogger(   t   selfR   t   repoidt   vlogger(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __init__=   s.    	c         C   sN   t  |  t k r# t |  j  | S|  j j |  } | d k rJ d } n  | S(   s:    Allows scriptable metadata access (ie: un['update_id']). R   N(   R   t   intt   sortedR.   t   gett   None(   R2   t   itemt   ret(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __getitem__Y   s    	c         C   s   | |  j  k S(   s%    Allows quick tests for foo in blah. (   R.   (   R2   R:   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __contains__b   s    c         C   s   | |  j  | <d  S(   N(   R.   (   R2   R:   t   val(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __setitem__f   s    c            s  d         f d   }  s5 t   d  r9 t SxH d D]@ } | d k rX q@ n   j |  j | k r@ | |  t Sq@ Wd }  j |  j | k r j | d k rÅ | |  t S j | d k rę | |  t Sd  j | <d  j | <n  t S(   Nc         S   s-   t  |  d  r% |  j d  k	 r% |  j Sd Sd  S(   NR0   s	   <unknown>(   t   hasattrR0   R9   (   t   un(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   _ridm   s    c            s     j  d k r d St d  } |  j d ;} | d     |  f 7} | d  j |   j |  f 7} | d     |  f 7}  j  j t j |  d S(   s=   Log the mismatched data similarly to conflict markers in git.Ns(   Duplicate of %s differs in some fields:
R"   s   <<<<<<< %s:%s
s   %r
=======
%r
s   >>>>>>> %s:%s(   R1   R9   R   R.   t   logt   logginglevelst   DEBUG_3(   t   datat   msg(   RB   t   otherR2   (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   _log_failures   s    "R.   R   R"   R   R&   R'   R   R#   R$   R    R!   R   R   R(   R%   R)   t   stablet   testing(   s   types	   update_ids   statuss   rightss   severitys   releases   issueds   updateds   versions	   pushcounts   froms   titles   summarys   descriptions   solution(   RJ   RK   (   RJ   RK   (   R@   R-   R.   t   True(   R2   RH   RI   RF   (    (   RB   RH   R2   s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __eq__i   s0    	  



c         C   s   |  | k S(   N(    (   R2   RH   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __ne__   s    t   filesR(   R&   R)   c         C   s  d |  j  } |  j  d rL |  j  d |  j  d k rL | d |  j  d 7} n  t d   |  j  d  } t |  rį d | k rį d } x@ | D]8 } | d	 | d
 d | k r· d | d pŗ d f 7} q W| | d  j   d 7} n  t d   |  j  d  } t |  rVd | k rVd } x  | D] } | d | d
 7} qW| | d  j   d 7} n  |  j  d rØd | k rØt |  j  d d d d d+ }	 | d d j |	  7} n  |  j  d rśd | k rśt |  j  d d d d d- }
 | d d j |
  7} n  |  j  d rLd | k rLt |  j  d d d d d/ }	 | d d j |	  7} n  |  j  d  rd  | k rt |  j  d  d d d d1 }	 | d! d j |	  7} n  |  j  d" ršd" | k ršt |  j  d" d d d d3 }	 | d# d j |	  7} n  d$ | k r| d  St t j j	    } d% } xR |  j  d& D]C } x: | d' D]. } | d( | k rZq>n  | d | d) 7} q>Wq-W| | d  j   7} | S(4   Ns,  
===============================================================================
  %(title)s
===============================================================================
  Update ID : %(update_id)s
    Release : %(release)s
       Type : %(type)s
     Status : %(status)s
     Issued : %(issued)s
R$   R#   s       Updated : %sc         S   s   |  d d k S(   NR   t   bugzilla(    (   t   r(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   <lambda>Æ   s    R*   t   bugss          Bugs :s    %s%s
	    :t   idR   s    - %sR   i’’’’s   
c         S   s   |  d d k S(   NR   t   cve(    (   RQ   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRR   ø   s    t   cvess          CVEs :s
    %s
	    :R(   t   widthi@   t   subsequent_indentt    i   s   : s       Summary : %s
R%   s   Description : %s
R)   s      Solution : %s
R&   s        Rights : %s
R'   s      Severity : %s
RO   s         Files :R+   t   packagest   archR   s               s               : s               s               : s               s               : s               s               : s               s               : (
   R.   t   filtert   lent   rstripR    t   joint   sett   rpmUtilsR[   t   getArchList(   R2   t	   skip_datat   headt   bzst   buglistt   bzRV   t   cvelistRU   RF   t   desct   archest   filelistt   pkgt   file(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   text   s^    
'					c         C   s   t  |  j    S(   N(   R   Rn   (   R2   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __str__ź   s    c         C   s   t  |  j    S(   N(   R   Rn   (   R2   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   __unicode__ģ   s    c         C   s   |  j  S(   s    Return the metadata dict. (   R.   (   R2   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   get_metadataļ   s    c         C   s>  | j  d k r.x' d D] } | j j |  |  j | <q Wxž| D]ē} | j  d k r | j sm t d   n  | j |  j d <q@ | j  d	 k r¢ | j |  j d	 <q@ | j  d
 k rĶ | j j d  |  j d
 <q@ | j  d k rų | j j d  |  j d <q@ | j  d k r|  j |  q@ | j  d k r9| j |  j d <q@ | j  d k r[| j |  j d <q@ | j  d k r| j |  j | j  <q@ | j  d k r¢| j |  j d <q@ | j  d k rÄ| j |  j d <q@ | j  d k rć|  j |  q@ | j  d k r| j |  j d <q@ | j  d k r@ | j |  j d <q@ q@ Wn t d   d S(   sę  
        Parse an update element::

            <!ELEMENT update (id, synopsis?, issued, updated,
                              references, description, rights?,
                              severity?, summary?, solution?, pkglist)>
                <!ATTLIST update type (errata|security) "errata">
                <!ATTLIST update status (final|testing) "final">
                <!ATTLIST update version CDATA #REQUIRED>
                <!ATTLIST update from CDATA #REQUIRED>
        t   updateR   R   R   R    RT   s   No id element foundR"   R!   R#   t   dateR$   R*   R%   R&   R'   R(   R)   R+   R   R   s   No update element foundN(   s   froms   types   statuss   version(   t   tagt   attribR8   R.   Rn   R   t   _parse_referencest   _parse_pkglist(   R2   R   Ru   t   child(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR/   ó   sB    	c         C   st   xm | D]e } | j  d k r` i  } x$ d	 D] } | j j |  | | <q) W|  j d j |  q t d   q Wd S(
   sv  
        Parse the update references::

            <!ELEMENT references (reference*)>
            <!ELEMENT reference>
                <!ATTLIST reference href CDATA #REQUIRED>
                <!ATTLIST reference type (self|other|cve|bugzilla) "self">
                <!ATTLIST reference id CDATA #IMPLIED>
                <!ATTLIST reference title CDATA #IMPLIED>
        t	   referenceRT   t   hrefR   R   R*   s   No reference element foundN(   s   idRz   s   types   title(   Rt   Ru   R8   R.   t   appendR   (   R2   R   Ry   RF   t	   refattrib(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRv   "  s    c         C   sŗ   x³ | D]« } i g  d 6} d | j  k rB | j  j d  | d <n  xY | D]Q } | j d k rn | j | d <qI | j d k rI | d j |  j |   qI qI W|  j d j |  q Wd S(   s'  
        Parse the package list::

            <!ELEMENT pkglist (collection+)>
            <!ELEMENT collection (name?, package+)>
                <!ATTLIST collection short CDATA #IMPLIED>
                <!ATTLIST collection name CDATA #IMPLIED>
            <!ELEMENT name (#PCDATA)>
        RZ   t   shortt   namet   packageR+   N(   Ru   R8   Rt   Rn   R{   t   _parse_packageR.   (   R2   R   t
   collectionRF   R:   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRw   6  s    
!c         C   sŻ   i  } x$ d D] } | j  j |  | | <q W| d sL | d d d k rY d | d <n  x} | D]u } | j d	 k r | j | d	 <q` | j d
 k r¶ | j  j d  | j f | d
 <q` | j d k r` t |  j d <q` q` W| S(   s~  
        Parse an individual package::

            <!ELEMENT package (filename, sum, reboot_suggested)>
                <!ATTLIST package name CDATA #REQUIRED>
                <!ATTLIST package version CDATA #REQUIRED>
                <!ATTLIST package release CDATA #REQUIRED>
                <!ATTLIST package arch CDATA #REQUIRED>
                <!ATTLIST package epoch CDATA #REQUIRED>
                <!ATTLIST package src CDATA #REQUIRED>
            <!ELEMENT reboot_suggested (#PCDATA)>
            <!ELEMENT filename (#PCDATA)>
            <!ELEMENT sum (#PCDATA)>
                <!ATTLIST sum type (md5|sha1) "sha1">
        R[   t   epochR~   R    R   t   srci    t
   0123456789R   t   sumR   R,   (   s   archR   s   names   versions   releaseR   N(   Ru   R8   R9   Rt   Rn   RL   R.   (   R2   R   R   t   pkgfieldRx   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR   K  s    "c         C   s  d t  |  j d  t  |  j d  t  |  j d  t  |  j d  t  |  j d  t  |  j d  t  |  j d  t  |  j d	 d
 t t  |  j d  f	 } |  j d rŃ | d t  |  j d d
 t 7} n  |  j d rü | d t  |  j d  7} n  |  j d r'| d t  |  j d  7} n  |  j d rR| d t  |  j d  7} n  |  j d r}| d t  |  j d  7} n  |  j d rg| d 7} xĆ |  j d D]“ } | d r| d t  | d d
 t t  | d d
 t t  | d d
 t t  | d d
 t f 7} q¢| d t  | d d
 t t  | d d
 t t  | d d
 t f 7} q¢W| d 7} n  |  j d r| d 7} xõ |  j d D]ę } | d t  | d  d
 t t  | d!  f 7} x„ | d" D] } | d# t  | d$ d
 t t  | d! d
 t t  | d d
 t t  | d% d
 t t  | d d
 t t  | d& pFd' d
 t t  | d(  f 7} qĖW| d) 7} qW| d* 7} n  | d+ 7} | S(,   s.   Generate the xml for this update notice objects§   
<update from="%s" status="%s" type="%s" version="%s">
  <id>%s</id>
  <title>%s</title>
  <release>%s</release>
  <issued date="%s"/>
  <description>%s</description>
R   R   R   R    R"   R   R   R#   Ru   R%   R$   s    <updated date="%s"/>
R(   s     <summary>%s</summary>
R)   s     <solution>%s</solution>
R&   s     <rights>%s</rights>
R'   s     <severity>%s</severity>
R*   s     <references>
s8       <reference href="%s" id="%s" title="%s" type="%s"/>
Rz   RT   s.       <reference href="%s" id="%s"  type="%s"/>
s     </references>
R+   s     <pkglist>
s2       <collection short="%s">
      <name>%s</name>
R}   R~   RZ   s         <package arch="%s" name="%s" release="%s" src="%s" version="%s" epoch="%s">
        <filename>%s</filename>
      </package>
R[   R   R   t   0R   s       </collection>
s     </pkglist>
s
   </update>
(   R   R.   RL   (   R2   RG   t   reft   collRl   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   xmlm  s\       $

&1&

N(   s   filess   summarys   rightss   solution(   R   R   R   R9   R5   R<   R=   R?   RM   RN   Rn   Ro   Rp   Rq   R/   Rv   Rw   R   R   (    (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR   7   s    					3	K				/			"c         C   s=   t  j j |  d |  d |  d f | d | d | d f  S(   s-    Compare two "std." tuples, (n, a, e, v, r). i   i   i   (   Ra   t	   miscutilst
   compareEVR(   t   tup1t   tup2(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   _rpm_tup_vercmp«  s    !t   UpdateMetadatac           B   s}   e  Z d  Z g  d d d  Z d d  Z e e  Z d   Z d   Z	 d   Z
 d d  Z d   Z d	   Z d d
  Z RS(   s*   
    The root update metadata object.
    c         C   s   i  |  _  i  |  _ i  |  _ g  |  _ | |  _ | |  _ x9 | D]1 } y |  j |  Wq= t j k
 rm q= q= Xq= Wt	   |  _
 |  j
 j |  _ d  S(   N(   t   _noticest   _cachet	   _no_cachet   _repost   _loggerR1   t   addt   Errorst   RepoMDErrorR
   t   arch_storaget   archlist(   R2   t   reposR   R4   t   repo(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR5   ¶  s    						c         C   s9   | d k r |  j j   S| |  j k r5 |  j | p8 g  S(   s    Return all notices. N(   R9   R   t   valuesR   (   R2   R~   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   get_noticesČ  s    c         C   sL   t  |  t  g   t  d  f k r6 d j |  } n  |  j j |  pK d S(   si   
        Retrieve an update notice for a given (name, version, release) string
        or tuple.
        t   -(    N(   R   R_   R   R8   R9   (   R2   t   nvr(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt
   get_noticeŠ  s    $c         C   s¹  | } | d } | d } g  } g  } t    } x+|  j |  D]} x| d D]}	 xü |	 d D]š }
 t } |
 d | k s |
 d | k rĖ | | k ra |
 d | k ra |
 d |  j k ra t } qĖ qa n  |
 d |
 d |
 d pę d |
 d	 |
 d
 f } t | |  d k rqa n  | r1| j | | f  qa | j | | f  | j |  qa WqP Wq? Wx6 | D]. \ } } | | k rd| j | | f  qdqdW| j d t d d   d t  | S(   s  
        Retrieve any update notices which are newer than a
        given std. pkgtup (name, arch, epoch, version, release) tuple.
        Returns: list of (pkgtup, notice) that are newer than the given pkgtup,
                 in the order of newest pkgtups first.
        i    i   R+   RZ   R~   R[   R   R   R    R   t   cmpt   keyc         S   s   |  d S(   Ni    (    (   t   x(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRR     s    t   reverse(	   R`   R   R-   R   RL   R   R{   R   t   sort(   R2   t   pkgtupt	   oldpkgtupR~   R[   R;   t   other_arch_listt   noticest   noticet   upkgRl   t
   other_arch(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   get_applicable_noticesį  s6    

	 /	c      
   C   sŁ  | s | d r t  S| d |  j k rK|  j | d } | | k rJ t  St   } x# | d D] } | j | d  q^ WxJ | d D]> } | d | k r  q n  | j | d  | d j |  q Wt   } x# | d D] } | j | d  qŚ WxJ | d D]> } | d | k rq n  | j | d  | d j |  q W| } n  | |  j | d <xv | d D]j } xa | d D]U } | |  j d | d | d | d	 f <|  j j | d t    } | j |  qxWqgWt S(
   sx    Add an UpdateNotice object. This should be fully populated with
            data, esp. update_id and pkglist/packages. R"   R*   RT   R+   R~   RZ   s   %s-%s-%sR    R   (	   R-   R   R`   R   R{   R   R   t
   setdefaultRL   (   R2   RA   t   ount   seenR   Rl   t   filedatat   no(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt
   add_notice  s<    			&t
   updateinfoc         C   se  t  d  d  } | s! t  n  d } t |  t d  t d  f k ri t |  } t | d  } n¦ t | t  rė | j |  j	 k r| j } |  j	 j
 | j  | j |  } | sĒ t    n  t | d  } t | d  } qn$ t | t  r	t j d  n | } t } xIt | d |  j D]2\ }	 }
 |
 j d	 k r+y t |
 | |  j  } Wn^ t k
 ræ} t  d
  | |  } |  j r¬|  j j t j d |  q+t j | IJq+n X|  j |  s]t  d  | d | |  f } | s%| t  d  | | d  7} | t  d  7} n  t } |  j rJ|  j j d |  qZt j | IJq]q+q+Wd S(   sA    Parse a metadata from a given YumRepository, file, or filename. s
    (from %s)c         S   s   |  s
 d S| |  S(   NR   (    (   R3   t   fmt(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRB   ;  s    R   u    t   rts   updateinfo.xmls   No updateinfo for local pkgR   Rr   s'   An update notice%s is broken, skipping.s   %ss;   Update notice %s%s is broken, or a bad duplicate, skipping.R"   sA   
You should report this problem to the owner of the %srepository.s   %s sb   
To help pinpoint the issue, please attach the output of "yum updateinfo --verbose" to the report.N(   R   R   R9   R   R   t   opent
   isinstanceR   RT   R   R{   t
   retrieveMDR   R   R   R   R-   R   R   Rt   R   R1   RC   RD   t   DEBUG_1R   R   R“   RL   t   warn(   R2   t   objt   mdtypeRB   R3   t   unfilet   infilet   mdt   have_dupR   R   RA   t   eRG   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR   8  sN    	$	"	 	c         C   s.   d } x! |  j  D] } | t |  7} q W| S(   Nu    (   RŖ   t   unicode(   R2   R;   R«   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRp   m  s    c         C   s   t  |  j    S(   N(   R   Rp   (   R2   (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyRo   r  s    c         C   s   d } | r | j  |  n  xC |  j j   D]2 } | rN | j  | j    q, | | j   7} q, Wd } | r~ | j  |  n
 | | 7} | r d  S| S(   Ns   <?xml version="1.0"?>
<updates>s   </updates>
(   t   writeR   R   R   (   R2   t   fileobjRG   R«   t   end(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR   u  s    
N(   R   R   R   R9   R5   R   t   propertyRŖ   R”   R®   R“   R   Rp   Ro   R   (    (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyR   °  s   		%	25		c          C   sĪ   d d l  }  |  j j   d   } t t j  d k  rA |   n  yI t j d GHt   } x" t j d D] } | j |  qg Wt |  GHWn= t	 k
 rÉ t j
 d t j d t j d f IJ|   n Xd S(   s    update_md test function. i’’’’Nc           S   s)   t  j d t  j d IJt  j d  d  S(   Ns   Usage: %s <update metadata> ...i    i   (   R   R   t   argvt   exit(    (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   usage  s    i   i   s   %s: No such file:'%s'i    (   t   yum.misct   misct   setup_localeR]   R   RÉ   R   R   RÄ   t   IOErrorR   (   t   yumRĖ   t   umt   srcfile(    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   main  s    	
	t   __main__(!   R   R   t   yum.i18nR    R   R   R   t   yum.yumRepoR   t   yum.packagesR   RĢ   R   R   R   R	   R   R   RD   t   rpmUtils.miscutilsRa   t   rpmUtils.archR
   R9   R   t	   ExceptionR   t   objectR   R   R   RÓ   R   (    (    (    s1   /usr/lib/python2.7/site-packages/yum/update_md.pyt   <module>   s&   "’ u	Ü	