3
=\B                 @   s|  d dl mZmZ d dlZd dlZyd dlZW n ek
rH   d dlZY nX yd dlm	Z	 W n  ek
rz   d dl
m	Z	 Y nX 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y0d dlmZ d dlmZmZ d dlmZmZ W n2 ek
r   d dlmZmZmZmZmZ Y nX dd	lmZmZmZm Z m!Z! G d
d de"Z#G dd de$Z%G dd de$Z&e'dkrxe&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   s:   || _ || _|| _|| _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               @   sp   e Zd ZdZdejkZdZdZ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   s  | j d||f  || _|| _tj | _d | _d | _|d krDtj	 }t
|d| _t|d| _t | _t | _d | _d | _d}|d | _|d | _d| _d| _tj }tjj| jrfy|j| j W n: tjk
 r } zt j!j"d| j|f  d S d }~X nX |j#drfd}	xTdD ]L}
|j$|	|
r| j d| j|j%|	|
f  t&| d|	|
f |j%|	|
 qW tj }tjj| j'r0y|j| j' W n: tjk
r } zt j!j"d| j'|f  d S d }~X nX |j$ddr0|j%ddj( }|dks|dkrd| _| jj)  d S |dkr*d| _| j| _nd| _|r>| j| _|rV|  j| j7  _n|rl|  j| j7  _| j d| j  d | _*| j+ s| j d d S tj,| j-d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METARELEASEURIURI_LTSURI_UNSTABLE_POSTFIXURI_PROPOSED_POSTFIXz%s: %s z%s_%sZDEFAULTZPromptZnevernoZltsZnormalzmetarelease-uri: %sz_buildMetaReleaseFile failed)target)r$   r%   r&   r'   )/_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prompt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  W n` tk
r } z@t j	dt jj
d}t jj|d }t jj|syt j| W n0 tk
r } ztjjd|  dS d }~X nX t jj|syt j|d W n2 tk
r } ztjjd|  dS d }~X nX t jj|d	}t jj|sfyt j| W n2 tk
rd } ztjjd|  dS d }~X nX t jj|t jj| j| _W Y d d }~X nX y$t jj| jdkrt j| j W n$ tk
r } zW Y d d }~X nX d
S )Nz/var/lib/update-manager/aZXDG_CACHE_HOMEz~/.cacher   zmkdir() failed: '%s'Fi  zupdate-manager-coreT)r9   r:   joinbasenamer6   METARELEASE_FILEopencloseIOErrorgetenv
expandusersplitr;   makedirsOSErrorr?   r@   rA   mkdirgetsizeunlink	Exception)r    rL   Z	cache_dirZcache_parent_dirr:   r   r   r   rH      sJ    $z%MetaReleaseCore._buildMetaReleaseFilec             C   s
   || _ dS )z\ virtual function that is called when the distro is no longer
            supported
        N)r4   )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)r0   )r    r_   r   r   r   new_dist_available   s    z"MetaReleaseCore.new_dist_availablec             C   s  | j d | j}| j d|  d }g }tj| j}yrxj|j rx"dD ]}||jkrJtd| qJW |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rB|jd |_| j|}|rB| j|7  _d|jkrZ|jd |_d|jkrr|jd |_d|jkr|jd |_|j| ||kr:|}q:W W n& tjk
r   td| j Y nX | jj  d | _|d kr| j d dS d}xH|D ]@}|j|jkr |j r*| j r*q |}| j d|  P q W |dkrh|j rh|| _| 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)r   rb   rc   rd   )"r*   r3   apt_pkgZTagFilerG   stepZsectionr   listemailutilsZ	parsedatetimeZmktimetupleintr   r   r   r   #_get_release_notes_uri_query_stringr   r   r   appendr>   r6   rT   r   r   r,   r/   r`   ra   )r    r3   Zcurrent_distZdistsZ	index_tagZrequired_keyr   ZrawdateZ
parseddater   r   r   r_   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rvytj| jj	}W n" t
k
rt } zW Y d d }~X nX |dkr| j r|jdtjtj| yt|dd	}tjj| jotj| jtj rytj| j W n6 t
k
r } ztd
| j|f  W Y d d }~X nX yNt| jd}x"|j D ]}|j|jd q.W |j  |jdd || _W n$ tk
r } zW Y d d }~X nX |j  W n tk
r } zP|jdkrtjj| jr| j d| j  t| jd| _n| j d|  W Y d d }~X nH tt t!j"fk
rH } z"| j d|  td| j  W Y d d }~X nX | jd k	r| j d y| j#  W n@ t$k
r } z"t%j&d| j  tj'| j W Y d d }~X nX | j(r| j(j)rtj'| j n
| j d | j*j+  d S )NzMetaRelease.download()r   zCache-ControlzNo-CacheZPragmazno-cachezIf-Modified-Since   )timeoutzCan't unlink '%s' (%s)zw+zUTF-8i0  zreading file '%s'rz%result of meta-release download: '%s'zIFailed to connect to %s. Check your Internet connection or proxy settingsz!have self.metarelease_informationzparse failed for '%s'zNO self.metarelease_information),r*   r   r6   Z
add_headerr9   accessrR   W_OKstatst_mtimerZ   r+   rl   ZasctimeZgmtimer   r:   r;   r]   printrS   	readlinesrA   decodeflushseekrG   rU   rT   r   coder	   r   socketrt   rr   r^   loggingZ	exceptionremover0   r   r.   rF   )r    ZlastmodifiedZreqrL   Zurifliner   r   r   rI   C  sj    





zMetaReleaseCore.downloadc             C   s   | j j  S )N)r.   Zis_set)r    r   r   r   downloading  s    zMetaReleaseCore.downloadingc             C   s@   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   r2   r   r   )r    r_   qrq   r   r   r   ro     s    z3MetaReleaseCore._get_release_notes_uri_query_stringc             C   s   | j rtjj|d  d S )N
)DEBUGr?   r@   rA   )r    msgr   r   r   r*     s    zMetaReleaseCore._debug)FFFFN)r   r   r   __doc__r9   environr   rD   r<   r!   rH   r`   ra   rr   rI   propertyr   ro   r*   r   r   r   r   r"   G   s"   
    
Y.XGr"   __main__F))Z
__future__r   r   r1   rg   r7   ImportErrorr8   Zhttp.clientr   Zhttplibr   Zemail.utilsrj   r9   r   r?   rl   r-   Zurllib.parser   Zurllib.requestr   r   Zurllib.errorr   r	   Zurllib2rk   r   r   r   r   r   r^   r   objectr   r"   r   metar   r   r   r   <module>   s>   "  [
