o
    ïØ{f‡D  ã                   @   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r½e'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   ú@/usr/lib/python3/dist-packages/UpdateManager/Core/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¡r´z| | j¡ W n tj y… }	 zt!j" #d	| j|	f ¡ W Y d }	~	d S d }	~	ww | $d
¡r´d
}
dD ]$}| %|
|¡r³|  d| j| &|
|¡f ¡ t'| d|
|f | &|
|¡ƒ q�t ¡ }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 |¡s…zt  |d¡ W n ty„ } ztj d| ¡ W Y d }~Y dS d }~ww t j |d	¡}t j |¡s¶z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rÙt  | 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¯| ¡ rÇd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sÿqï|}|   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¡r€t | jtj¡s€z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r×t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ÿ