U
    ÑfÜc<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k
rP   d dlZY nX zd dl	m
Z
 W n  ek
r‚   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z0d 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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   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                   @   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Þ  |   d||f ¡ || _|| _t ¡ | _d | _d | _|d krDt 	¡ }t
|d| _t|d| _tƒ | _tƒ | _d | _d | _d}|d | _|d | _d| _d| _t ¡ }tj | j¡rjz| | j¡ W nB tjk
r } z t j! "d| j|f ¡ W Y ¢d S d }~X Y nX | #d¡rjd}	d	D ]L}
| $|	|
¡r|   d
| j| %|	|
¡f ¡ t&| d|	|
f | %|	|
¡ƒ qt ¡ }tj | j'¡r^z| | j'¡ W nB tjk
rÔ } z t j! "d| j'|f ¡ W Y ¢d S d }~X Y nX | $dd¡r^| %dd¡ (¡ }|dks|dkrd| _| j )¡  d S |dkrXd| _t* +¡ }| ,| j¡rL| j| _n
|   d¡ nd| _|rl| j| _|r„|  j| j7  _n|rš|  j| j7  _|   d| j ¡ d | _-|  .¡ sÈ|   d¡ d S tj/| j0d 1¡  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)ZURIZURI_LTSZURI_UNSTABLE_POSTFIXZURI_PROPOSED_POSTFIXz%s: %s z%s_%sZDEFAULTZPromptÚneverZnoZltsz Prompt=lts for non-LTS, ignoringZnormalzmetarelease-uri: %sz_buildMetaReleaseFile failed)Útarget)2Ú_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Údistro_infoZUbuntuDistroInfoZis_ltsÚmetarelease_informationÚ_buildMetaReleaseFileZThreadÚdownloadÚstart)r!   r)   ZuseProposedZforceLTSr(   r$   Zbase_uriÚparserÚeZsecÚkr2   Zdir   r   r   r"   T   s”    ÿ


 ÿ

ÿ  ÿ




zMetaReleaseCore.__init__c                 C   sà  t j dt j | j¡¡| _zt| jdƒ ¡  W nn tk
rž   t  	dt j 
d¡¡}t j |¡d }t j |¡s¼zt  |¡ W n: tk
rº } ztj d| ¡ W Y ¢Y dS d }~X Y nX t j |¡szt  |d¡ W n< tk
r } ztj d| ¡ W Y ¢Y dS d }~X Y nX t j |d	¡}t j |¡s€zt  |¡ W n< tk
r~ } ztj d| ¡ W Y ¢Y dS d }~X Y nX t j |t j | j¡¡| _Y nX z$t j | j¡dkrÂt  | j¡ W n tk
rÚ   Y nX d
S )Nz/var/lib/update-manager/ÚaZXDG_CACHE_HOMEz~/.cacher   zmkdir() failed: '%s'FiÀ  zupdate-manager-coreT)r6   r7   ÚjoinÚbasenamer3   ÚMETARELEASE_FILEÚopenÚcloseÚIOErrorÚgetenvÚ
expanduserÚsplitr8   ÚmakedirsÚOSErrorr<   r=   r>   ÚmkdirÚgetsizeÚunlinkÚ	Exception)r!   Z	cache_dirZcache_parent_dirrJ   r7   r   r   r   rF   ¹   sR    þ 
ÿþz%MetaReleaseCore._buildMetaReleaseFilec                 C   s
   || _ dS )z\ virtual function that is called when the distro is no longer
            supported
        N)r1   ©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\   r   r   r   Únew_dist_availableí   s    z"MetaReleaseCore.new_dist_availablec                 C   sv  |   d¡ | j}|   d| ¡ d }g }t | j¡}zh| ¡ ršdD ]}||jkrDtd| ƒ‚qD|jd }|   d| ¡ |jd }tt	j
 |¡ƒ}d|d	< t t|ƒ¡}	t|jd
 ƒ}
|jd }t|||	|
ƒ}d|jkr|jd |_tƒ }|r| jd| 7  _d|jkr:|jd |_|  |¡}|r:| j|7  _d|jkrR|jd |_d|jkrj|jd |_d|jkr‚|jd |_| |¡ ||kr6|}q6W n& tjk
rÂ   td| j ƒ‚Y nX | j ¡  d | _|d krì|   d¡ dS d}|D ]@}|j|jkrô|js| jsqô|}|   d| ¡  q6qô|dkrX|jsX|| _|   |¡ |dkrr|| _|  !|¡ dS )NzMetaRelease.parse()zcurrent dist name: '%s')r   ÚVersionÚ	SupportedÚDatezRequired key '%s' missingr   zfound distro name: '%s'rb   r   é   ra   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'   r0   Úapt_pkgZTagFilerE   ÚstepZsectionr   ÚlistÚemailÚutilsZ	parsedateÚtimeÚmktimeÚtupleÚintr   r   r   r   Ú#_get_release_notes_uri_query_stringr   r   r    Úappendr;   r3   rQ   r   r   r)   r,   r^   r_   )r!   r0   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¶  |   d¡ d}t| jƒ}| dd¡ | dd¡ t | jtj¡rhzt | j¡j	}W n t
k
rf   Y nX |dkrŽ| jsŽ| dt t |¡¡¡ zät|dd	}tj | j¡rt | jtj¡szt | j¡ W n6 t
k
r } ztd
| j|f ƒ W 5 d }~X Y nX zJt| jdƒ}| ¡ D ]}| | d¡¡ q| ¡  | dd¡ || _W n tk
rf   Y nX | ¡  W n´ tk
rà } zN|jdkrÂtj | j¡rÂ|   d| j ¡ t| jdƒ| _n|   d| ¡ W 5 d }~X Y nH tt t!j"fk
r& } z |   d| ¡ td| j ƒ W 5 d }~X Y nX | jd k	rž|   d¡ z|  #¡  W n2 t$k
r|   t% &d| j ¡ t '| j¡ Y nX | j(r¨| j(j)r¨t '| j¡ n
|   d¡ | 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   r3   Z
add_headerr6   ÚaccessrO   ÚW_OKÚstatÚst_mtimerW   r(   rj   ÚasctimeÚgmtimer   r7   r8   rZ   ÚprintrP   Ú	readlinesr>   ÚdecodeÚflushÚseekrE   rR   rQ   r   Úcoder	   r   Úsocketrs   rq   r[   ÚloggingZ	exceptionÚremover-   r    r+   rC   )r!   ZlastmodifiedZreqZurirJ   ÚfÚliner   r   r   rG   K  st    

ÿÿÿ
ÿ
ÿ
zMetaReleaseCore.downloadc                 C   s   | j  ¡  S r   )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   r/   r   r   )r!   r]   Úqrp   r   r   r   rn   –  s    z3MetaReleaseCore._get_release_notes_uri_query_stringc                 C   s   | j rtj |d ¡ d S )NÚ
)ÚDEBUGr<   r=   r>   )r!   Úmsgr   r   r   r'   £  s    zMetaReleaseCore._debug)FFFFN)r   r   r   Ú__doc__r6   ÚenvironrŠ   rA   r9   r"   rF   r^   r_   rq   rG   Úpropertyr†   rn   r'   r   r   r   r   r#   H   s&   
     û
e.XG
r#   Ú__main__F)*Z
__future__r   r   r.   re   rD   r4   ÚImportErrorr5   Zhttp.clientr   Zhttplibr‚   Zemail.utilsrh   r6   r   r<   rj   r*   Zurllib.parser   Zurllib.requestr   r   Zurllib.errorr   r	   Zurllib2ri   r   r   r   r   r   r[   r   Úobjectr   r#   r   Úmetar   r   r   r   Ú<module>   s@   "  b
