o
    {fD                     @   s~  d dl mZmZ d dlZd dlZd dlZzd dlZW n ey'   d dlZY nw zd dl	m
Z
 W n ey?   d dlm
Z
 Y nw 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zd dlmZ d dlmZmZ d dlmZmZ W n ey   d dlmZmZmZmZmZ Y nw 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re'ddZ)dS 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   6   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   :   s    r   c                   @   s|   e Zd ZdZdejv 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.
    DEBUG_UPDATE_MANAGERz$/etc/update-manager/release-upgradesz /etc/update-manager/meta-releaseFNc              
   C   s  |rd| _ | d||f  || _|| _t | _d | _d | _|d u r't	
 }t|d| _t|d| _t | _t | _d | _d | _d}|d | _|d | _d| _d| _t }tj| jrz|| j W n tj y }	 zt!j"#d	| j|	f  W Y d }	~	d S d }	~	ww |$d
rd
}
dD ]$}|%|
|r| d| j|&|
|f  t'| d|
|f |&|
| qt }tj| j(r,z|| j( W n tj y }	 zt!j"#d	| j(|	f  W Y d }	~	d S d }	~	ww |%ddr,|&dd) }|dks|dkrd| _| j*  d S |dkr)d| _t+, }|-| jr#| j| _n	| d nd| _|r3| j| _|r?|  j| j7  _n|rJ|  j| j7  _| d| j  d | _.| / sa| d d S tj0| j1d2  d S )NTz1MetaRelease.__init__() useDevel=%s useProposed=%s)cachezhttps://changelogs.ubuntu.com/zmeta-releasezmeta-release-ltsz-developmentz	-proposedzERROR: failed to read '%s':
%sMETARELEASE)URIURI_LTSURI_UNSTABLE_POSTFIXURI_PROPOSED_POSTFIXz%s: %s z%s_%sDEFAULTPromptnevernoltsz Prompt=lts for non-LTS, ignoringnormalzmetarelease-uri: %sz_buildMetaReleaseFile failed)target)3DEBUG_debugforceDownloaduseDevelopmentRelease	threadingEvent
downloadedupgradable_tonew_distaptCacher   flavorr   flavor_namer   current_dist_namer   current_dist_versionno_longer_supportedpromptMETARELEASE_URIMETARELEASE_URI_LTS METARELEASE_URI_UNSTABLE_POSTFIX METARELEASE_URI_PROPOSED_POSTFIXconfigparserConfigParserospathexistsCONF_METARELEASEreadErrorsysstderrwritehas_section
has_optiongetsetattrCONFlowersetdistro_infoUbuntuDistroInfois_ltsmetarelease_information_buildMetaReleaseFileThreaddownloadstart)r!   r5   useProposeddebugforceLTSr4   r%   base_uriparsereseckrB   dir   r   r   r"   T   s   










zMetaReleaseCore.__init__c                 C   s  t jdt j| j| _z
t| jd  W n ty   t 	dt j
d}t j|d }t j|sZzt | W n tyY } ztjd|  W Y d }~Y dS d }~ww t j|szt |d W n ty } ztjd|  W Y d }~Y dS d }~ww t j|d	}t j|szt | W n ty } ztjd|  W Y d }~Y dS d }~ww t j|t j| j| _Y nw zt j| jdkrt | j W d
S W d
S  ty   Y d
S w )Nz/var/lib/update-manager/aXDG_CACHE_HOMEz~/.cacher   zmkdir() failed: '%s'Fi  zupdate-manager-coreT)rI   rJ   joinbasenamerC   METARELEASE_FILEopencloseIOErrorgetenv
expandusersplitrK   makedirsOSErrorrO   rP   rQ   mkdirgetsizeunlink	Exception)r!   	cache_dircache_parent_dirrf   rJ   r   r   r   r]      sf   
z%MetaReleaseCore._buildMetaReleaseFilec                 C   
   || _ dS )z\ virtual function that is called when the distro is no longer
            supported
        N)rA   r!   distr   r   r   dist_no_longer_supported      
z(MetaReleaseCore.dist_no_longer_supportedc                 C   r}   )z\ virtual function that is called when a new distro release
            is available
        N)r:   r~   r   r   r   new_dist_available   r   z"MetaReleaseCore.new_dist_availablec                 C   sV  |  d | j}|  d|  d }g }t| j}z| rdD ]}||jvr-td| q |jd }|  d|  |jd }tt	j
|}d|d	< tt|}	t|jd
 }
|jd }t|||	|
}d|jv r~|jd |_t }|r~| jd| 7  _d|jv r|jd |_| |}|r| j|7  _d|jv r|jd |_d|jv r|jd |_d|jv r|jd |_|| ||kr|}| sW n tjy   td| j w | j  d | _|d u r|  d dS d}|D ]}|j|jkr
|js| jsq|}|  d|   nq|dkr|js|| _|  | |dkr)|| _| !| dS )NzMetaRelease.parse()zcurrent dist name: '%s')r   Version	SupportedDatezRequired key '%s' missingr   zfound distro name: '%s'r   r      r   r   ReleaseNotesz?lang=%sReleaseNotesHtmlUpgradeToolUpgradeToolSignatureUpgradeBrokenzUnable to parse %sz,current dist not found in meta-release file
F znew dist: %sT)"r3   r?   apt_pkgTagFiler\   stepsectionr   listemailutils	parsedatetimemktimetupleintr   r   r   r   #_get_release_notes_uri_query_stringr   r   r    appendrN   rC   rp   r   r   r5   r9   r   r   )r!   r?   current_distdists	index_tagrequired_keyr   rawdate
parseddater   r   r   r   langqueryr9   r   r   r   parse   s   











$




zMetaReleaseCore.parsec              
   C   s  |  d d}t| j}|dd |dd t| jtjr3z	t| jj	}W n	 t
y2   Y nw |dkrF| jsF|dtt| zmt|dd	}tj| jrt| jtjszt| j W n t
y } ztd
| j|f  W Y d }~nd }~ww z$t| jd}| D ]
}||d q|  |dd || _W n	 ty   Y nw |  W nY ty } z)|jdkrtj| jr|  d| j  t| jd| _n|  d|  W Y d }~n)d }~w tt t!j"fy } z|  d|  td| j  W Y d }~nd }~ww | jd urG|  d z| #  W n t$y6   t%&d| j  t'| j Y nw | j(rF| j(j)rFt'| j n|  d | j*+  d S )NzMetaRelease.download()r   zCache-ControlzNo-Cache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),r3   r   rC   
add_headerrI   accessrn   W_OKstatst_mtimerv   r4   r   asctimegmtimer   rJ   rK   ry   printro   	readlinesrQ   decodeflushseekr\   rq   rp   r   coder	   r   socketr   r   rz   logging	exceptionremover:   r    r8   rX   )r!   lastmodifiedrequrirf   fliner   r   r   r_   N  s   




zMetaReleaseCore.downloadc                 C   s   | j   S r   )r8   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   r=   r   r   )r!   r   qr   r   r   r   r     s   
z3MetaReleaseCore._get_release_notes_uri_query_stringc                 C   s   | j rtj|d  d S d S )N
)r2   rO   rP   rQ   )r!   msgr   r   r   r3     s   zMetaReleaseCore._debug)FFFFFN)r   r   r   __doc__rI   environr2   rV   rL   r"   r]   r   r   r   r_   propertyr   r   r3   r   r   r   r   r#   H   s*    

h.XG
r#   __main__F)*
__future__r   r   r;   r   rY   rG   ImportErrorrH   http.clientr   httplibr   email.utilsr   rI   r   rO   r   r6   urllib.parser   urllib.requestr   r   urllib.errorr   r	   urllib2r   r   r   r   r   r   rz   r   objectr   r#   r   metar   r   r   r   <module>   sJ      e