
[]aA                 @   s  d  d l  m Z m Z d  d l Z d  d l Z y d  d l Z Wn e k
 r^ d  d l Z Yn Xy d  d l m	 Z	 Wn" e k
 r d  d l
 m	 Z	 Yn Xd  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 y@ d  d l m Z d  d l m Z m Z d  d l m Z m Z Wn: e k
 rhd  d l m Z m Z m Z m Z m Z Yn Xd d	 l m Z m Z m Z m  Z  m! Z! Gd
 d   d e"  Z# Gd d   d e$  Z% Gd d   d e$  Z& e' d k re& d d  Z( d S)    )absolute_importprint_functionN)BadStatusLine)quote)Requesturlopen)	HTTPErrorURLError)r   r   r	   r   r      )get_langget_distget_dist_versionget_ubuntu_flavorget_ubuntu_flavor_namec               @   s   e  Z d  Z d S)MetaReleaseParseErrorN)__name__
__module____qualname__ r   r   9/usr/lib/python3/dist-packages/DistUpgrade/MetaRelease.pyr   5   s   r   c               @   s   e  Z d  Z d d   Z d S)Distc             C   sU   | |  _  | |  _ | |  _ | |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  |  _ d  S)N)	nameversiondate	supportedreleaseNotesURIreleaseNotesHtmlUriupgradeToolupgradeToolSigupgrade_broken)selfr   r   r   r   r   r   r   __init__:   s    								zDist.__init__N)r   r   r   r!   r   r   r   r   r   9   s   r   c               @   s   e  Z d  Z d Z d e j k Z d Z d Z d d d d d d d  Z	 d	 d
   Z
 d d   Z d d   Z d d   Z d d   Z e d d    Z d d   Z d d   Z d S)MetaReleaseCorezT
    A MetaReleaseCore object abstracts the list of released
    distributions.
    ZDEBUG_UPDATE_MANAGERz$/etc/update-manager/release-upgradesz /etc/update-manager/meta-releaseFNc             C   sr  |  j  d | | f  | |  _ | |  _ t j   |  _ d  |  _ d  |  _ | d  k rb t j	   } t
 d |  |  _ t d |  |  _ t   |  _ t   |  _ d  |  _ d } | d |  _ | d |  _ d |  _ d |  _ t j   } t j j |  j  ry | j |  j  WnI t j k
 rY} z& t j  j! d |  j | f  d  SWYd  d  } ~ Xn X| j" d  rd }	 xx d	 d
 d d g D]d }
 | j# |	 |
  r|  j  d |  j | j$ |	 |
  f  t% |  d |	 |
 f | j$ |	 |
   qWt j   } t j j |  j&  ry | j |  j&  WnI t j k
 rj} z& t j  j! d |  j& | f  d  SWYd  d  } ~ Xn X| j# d d  r| j$ d d  j'   } | d k s| d k r|  j j(   d  S| d k r|  j |  _ | r|  j |  _ | r|  j |  j 7_ n | r|  j |  j 7_ |  j  d |  j  d  |  _) |  j*   sU|  j  d  d  St j+ d |  j,  j-   d  S)Nz1MetaRelease.__init__() useDevel=%s useProposed=%scachezhttps://changelogs.ubuntu.com/zmeta-releasezmeta-release-ltsz-developmentzERROR: failed to read '%s':
%sZMETARELEASEZURIZURI_LTSZURI_UNSTABLE_POSTFIXZURI_PROPOSED_POSTFIXz%s: %s z%s_%sZDEFAULTZPromptZnevernoZltszmetarelease-uri: %sz_buildMetaReleaseFile failedtarget)._debugforceDownloaduseDevelopmentRelease	threadingZEvent
downloadedupgradable_tonew_distaptZCacher   flavorr   Zflavor_namer   current_dist_namer   Zcurrent_dist_versionno_longer_supportedMETARELEASE_URIZMETARELEASE_URI_LTSZ METARELEASE_URI_UNSTABLE_POSTFIXZ METARELEASE_URI_PROPOSED_POSTFIXconfigparserConfigParserospathexistsCONF_METARELEASEreadErrorsysstderrwriteZhas_sectionZ
has_optiongetsetattrCONFlowersetmetarelease_information_buildMetaReleaseFileZThreaddownloadstart)r    r(   ZuseProposedZforceLTSr'   r#   Zbase_uriparsereZsecktyper   r   r   r!   S   s    								*	zMetaReleaseCore.__init__c          F   C   s`  t  j j d t  j j |  j   |  _ y t |  j d  j   Wnt k
 r} zt  j	 d t  j j
 d   } t  j j |  d } t  j j |  s y t  j |  Wn= t k
 r } z t j j d |  d SWYd  d  } ~ Xn Xt  j j |  sSy t  j | d  Wn= t k
 rR} z t j j d |  d SWYd  d  } ~ Xn Xt  j j | d	  } t  j j |  sy t  j |  Wn= t k
 r} z t j j d |  d SWYd  d  } ~ Xn Xt  j j | t  j j |  j   |  _ WYd  d  } ~ Xn Xy/ t  j j |  j  d k r3t  j |  j  Wn% t k
 r[} z WYd  d  } ~ Xn Xd
 S)Nz/var/lib/update-manager/aZXDG_CACHE_HOMEz~/.cacher   zmkdir() failed: '%s'Fi  zupdate-manager-coreT)r4   r5   joinbasenamer1   METARELEASE_FILEopencloseIOErrorgetenv
expandusersplitr6   makedirsOSErrorr:   r;   r<   mkdirgetsizeunlink	Exception)r    rG   Z	cache_dirZcache_parent_dirr5   r   r   r   rC      sJ    		.z%MetaReleaseCore._buildMetaReleaseFilec             C   s   | |  _  d S)z\ virtual function that is called when the distro is no longer
            supported
        N)r0   )r    distr   r   r   dist_no_longer_supported   s    z(MetaReleaseCore.dist_no_longer_supportedc             C   s   | |  _  d S)z\ virtual function that is called when a new distro release
            is available
        N)r,   )r    rZ   r   r   r   new_dist_available   s    z"MetaReleaseCore.new_dist_availablec             C   s(  |  j  d  |  j } |  j  d |  d  } g  } t j |  j  } yx| j   r!x- d D]% } | | j k r^ t d |   q^ W| j d } |  j  d |  | j d } t t	 j
 j |   } d	 | d
 <t j t |   }	 t | j d  }
 | j d } t | | |	 |
  } d | j k r_| j d | _ t   } | r_| j d | 7_ d | j k r| j d | _ |  j |  } | r| j | 7_ d | j k r| j d | _ d | j k r| j d | _ d | j k r| j d | _ | j |  | | k rK | } qK WWn% t k
 rJt d |  j   Yn X|  j j   d  |  _ | d  k r~|  j  d  d Sd } xO | D]G } | j | j k r| j r|  j rq| } |  j  d |  PqW| d k r| j r| |  _ |  j  |  | d k r$| |  _ |  j! |  d S)NzMetaRelease.parse()zcurrent dist name: '%s'r   Version	SupportedDatezRequired key '%s' missingzfound distro name: '%s'r      ZReleaseNotesz?lang=%sZReleaseNotesHtmlZUpgradeToolZUpgradeToolSignatureZUpgradeBrokenzUnable to parse %sz,current dist not found in meta-release file
F znew dist: %sT)zDistr]   r^   r_   )"r&   r/   apt_pkgZTagFilerB   stepZsectionr   listemailutilsZ	parsedatetimeZmktimetupleintr   r   r   r   #_get_release_notes_uri_query_stringr   r   r   appendSystemErrorr1   rO   r   r   r(   r+   r[   r\   )r    r/   Zcurrent_distZdistsZ	index_tagZrequired_keyr   ZrawdateZ
parseddater   r   r   rZ   langZqueryr+   r   r   r   parse   s    	
	

			zMetaReleaseCore.parsec          @   C   s  |  j  d  d } t |  j  } | j d d  | j d d  t j |  j t j  r y t j |  j  j	 } Wn% t
 k
 r } z WYd  d  } ~ Xn X| d k r |  j r | j d t j t j |    y/t | d d	 } t j j |  j  rit j |  j t j  riy t j |  j  Wn< t
 k
 rh} z t d
 |  j | f  WYd  d  } ~ Xn Xyf t |  j d  } x* | j   D] } | j | j d   qW| j   | j d d  | |  _ Wn% t k
 r} z WYd  d  } ~ Xn X| j   Wn t k
 r} zf | j d k rgt j j |  j  rg|  j  d |  j  t |  j d  |  _ n |  j  d |  WYd  d  } ~ XnB t t  t! j" f k
 r} z |  j  d |  WYd  d  } ~ Xn X|  j d  k	 rj|  j  d  y |  j#   WnI t$ k
 rA} z) t% j& d |  j  t j' |  j  WYd  d  } ~ Xn X|  j( rw|  j( j) rwt j' |  j  n |  j  d  |  j* j+   d  S)NzMetaRelease.download()r   zCache-ControlzNo-CacheZPragmazno-cachezIf-Modified-Sincetimeout   zCan't unlink '%s' (%s)zw+zUTF-8i0  zreading file '%s'rz%result of meta-release download: '%s'z!have self.metarelease_informationzparse failed for '%s'zNO self.metarelease_information),r&   r   r1   Z
add_headerr4   accessrM   W_OKstatst_mtimerU   r'   rg   ZasctimeZgmtimer   r5   r6   rX   printrN   	readlinesr<   decodeflushseekrB   rP   rO   r   coder	   r   socketro   rn   rY   loggingZ	exceptionremover,   r   r*   rA   )r    ZlastmodifiedZreqrG   Zurifliner   r   r   rD   >  sf    	
$#$	#zMetaReleaseCore.downloadc             C   s   |  j  j   S)N)r*   Zis_set)r    r   r   r   downloading  s    zMetaReleaseCore.downloadingc             C   sR   d } t    } | r# | d | 7} | d |  j 7} | d | j 7} t | d  S)N?zlang=%s&zos=%s&zver=%sz/?)r   r.   r   r   )r    rZ   qrm   r   r   r   rj     s    	z3MetaReleaseCore._get_release_notes_uri_query_stringc             C   s!   |  j  r t j j | d  d  S)N
)DEBUGr:   r;   r<   )r    msgr   r   r   r&     s    	zMetaReleaseCore._debug)r   r   r   __doc__r4   environr   r?   r7   r!   rC   r[   r\   rn   rD   propertyr   rj   r&   r   r   r   r   r"   G   s"   T.XEr"   __main__F))Z
__future__r   r   r-   rb   r2   ImportErrorr3   Zhttp.clientr   Zhttplibr}   Zemail.utilsre   r4   r|   r:   rg   r)   Zurllib.parser   Zurllib.requestr   r   Zurllib.errorr   r	   Zurllib2rf   r   r   r   r   r   rY   r   objectr   r"   r   metar   r   r   r   <module>   s<   -( S