U
    cG                     @   sb  d dl mZmZ d dlZedde 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 d dlmZ W n0 ek
r   d dlmZmZ d dlm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mZ zd dlmZ W n ek
r(   dZY nX dZdZ e d Z!G dd de"Z#G dd dej$j%Z%dS )    )absolute_importprint_functionNignorezapt API not stable yet)	HTTPError)urlopen)urlsplit)r   r   )BadStatusLine)gettext)	Launchpadz/var/lib/synaptic/preferencesz.https://changelogs.ubuntu.com/changelogs/pool/z%s/%s/%s/%s_%s/%sc                   @   s   e Zd ZdZdS )HttpsChangelogsUnsupportedErrorz https changelogs with credentials are unsupported because of the
        lack of certitifcation validation in urllib2 which allows MITM
        attacks to steal the credentials
    N)__name__
__module____qualname____doc__ r   r   </usr/lib/python3/dist-packages/UpdateManager/Core/MyCache.pyr   9   s   r   c                   @   s   e Zd ZdZd,ddZdd Zdd Zd	d
 Zedd Z	edd Z
dd Zedd Zdd Zdd Zdd Zdd Zd-ddZdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ ZdS ).MyCacheZUbuntuNc                    s  t j| || || _t| jdks(t|  r4t|   i | _	i | _
| jjdkr\|   | jjdkrt| jjdksxtd | _tjd}|rtdddd |D  d | _tjdd	gd
d  tdd fdd|D  d | _nd | _d | _d S )Nr   zAPT::VersionedKernelPackages(|c                 S   s   g | ]}d | qS )^r   .0pr   r   r   
<listcomp>_   s     z$MyCache.__init__.<locals>.<listcomp>)unamez-rT)Zuniversal_newlinesc                    s.   g | ]&}| d s"d| d    n | qS )z.*r   )
startswithr   Zrunning_kernel_versionr   r   r   c   s   )aptZCache__init__rootdirlenZreq_reinstall_pkgsAssertionError_dpkgJournalDirty_initDepCacheall_changesall_news	_depcachebroken_countsaveDistUpgrade	del_count	launchpadapt_pkgconfigZ
value_listrecompilejoinZversioned_kernel_pkgs_regexp
subprocessZcheck_outputrstripZrunning_kernel_pkgs_regexp)selfZprogressr    Zapt_versioned_kernel_pkgsr   r   r   r   E   sF    

 



zMyCache.__init__c                 C   s>   t jtjdd }t |D ]}td|r" dS q"dS )z`
        test if the dpkg journal is dirty
        (similar to debSystem::CheckUpdates)
        zDir::State::statusz/updatesz[0-9]+TF)	ospathdirnamer,   r-   Z	find_filelistdirr.   match)r3   dfr   r   r   r#   j   s    
zMyCache._dpkgJournalDirtyc                 C   s0   | j   tjtr"| j t | j   d S N)r'   Zread_pinfiler4   r5   existsSYNAPTIC_PINFILEZinitr3   r   r   r   r$   v   s    
zMyCache._initDepCachec                 C   s   |    d S r;   )r$   r>   r   r   r   clear   s    zMyCache.clearc                 C   s,   t | j}t  }||| j| j |jS )z< get the size of the packages that are required to download )r,   ZPackageManagerr'   ZAcquireZget_archivesZ_listZ_recordsZfetch_needed)r3   ZpmZfetcherr   r   r   required_download   s    zMyCache.required_downloadc                 C   s   | j jS r;   )r'   Z
inst_countr>   r   r   r   install_count   s    zMyCache.install_countc                 C   s   | j jS r;   )r'   
keep_countr>   r   r   r   rB      s    zMyCache.keep_countc                 C   s   | j jS r;   )r'   r*   r>   r   r   r   r*      s    zMyCache.del_countc                 C   sR   |D ]H}|sqd}|D ]*}|j |jjks<t|j|j|jsd}q|r dS qdS )z<Return True if any of the dependencies in deps match target.TF)namepackage	shortnamer,   Z	check_depversionZrelation)r3   targetZdepsZdep_orr8   Zbase_depr   r   r   _check_dependencies   s       zMyCache._check_dependenciesc                 C   sl   |j }|sdS | D ]T}|j}|d k	r| ||dr| ||drtd|jj|jf   dS qdS )NFZ	ConflictsZReplacesz*%s Conflicts/Replaces %s; allowing removalT)	installed	candidaterH   Zget_dependencieslogginginforD   rE   )r3   pkgrG   ZcpkgrJ   r   r   r   find_removal_justification   s.       z"MyCache.find_removal_justificationc                 C   s   | j d | j j}|dkrVdd | D }|t|ks:t|D ]}| |r>|d8 }q>|dkr|   | j jdkr~| j jdkstn| j jdkst| j   |S )z@ this functions mimics a upgrade but will never remove anything Tr   c                 S   s   g | ]}|j r|qS r   )Zmarked_delete)r   rM   r   r   r   r      s      z+MyCache.saveDistUpgrade.<locals>.<listcomp>   )r'   Zupgrader*   r!   r"   rN   r?   r(   )r3   ZwouldDeleteZdeleted_pkgsrM   r   r   r   r)      s     



zMyCache.saveDistUpgradec                 C   s,   | d}t|dkr(d|dd }|S )z strip of the epoch :rO    N)splitr!   r0   )r3   ZverstrZvers_no_epochr   r   r   _strip_epoch   s    
zMyCache._strip_epochFc                 C   s  | | }|j j}d}|jj|jj}|j j}	| |	}
|	d}t
|dkrV|d }|d }|drtd|d  }|r~|}nt|||||
|f }t|}|jdkr|jrtdt|}d	}d
t| }| dd}|d	krqt||}|rt|jdd}|r(d|kr(|	ddd }|d}|rRd|krR|	ddd }|rv|rt||dk rqn|rt||dkrq|| }q|S )z* helper that fetches the file in question main/rO   r   lib   ZhttpszKhttps locations with username/password are notsupported to fetch changelogsrQ   z^%s \((.*)\)(.*)$zUTF-8replacerF   NrP   )rJ   source_nameZ_pcacher'   Zget_candidate_verZ_pkgsectionsource_versionrS   rR   r!   r   CHANGELOGS_URIr   ZschemeZusernamer   r   r.   escapereadlinedecoder8   getattrrI   groupr,   Zversion_compare)r3   rC   fnameZstrict_versioningchangelogs_urirM   srcpkgZsrc_sectionrZ   srcver_epochsrcverZsplit_sectionprefixurires	changelogZalllinesZregexpliner8   rI   Zchangelogverr   r   r   _get_changelog_or_news   sp    



 

zMyCache._get_changelog_or_newsc           	      C   s   t std dS | | j}|jD ]B}t|jdkr6q"td|}|dk	r"|	d|	d }} qtq"t
d dS | jdkrt jdd	d
d| _| jjjd||f d}|dkrt
d dS |j|jd|jd}|st
d dS |d  S )zbReturn the changelog URI from the Launchpad API

        Return None in case of an error.
        z9Launchpadlib not available, cannot retrieve PPA changelogNzppa.launchpad.netzhttp.*/(.*)/(.*)/ubuntu/.*rO      z)Unable to find a valid PPA candidate URL.zupdate-managerZ
productionZdevel)rF   z~%s/ubuntu/%s)Z	referencez6Unable to retrieve the archive from the Launchpad API.T)rY   Zexact_matchrF   z;No published sources were retrieved from the Launchpad API.r   )r
   rK   ZwarningrJ   Zurisr   Zhostnamer.   searchra   errorr+   Zlogin_anonymouslyZarchivesZgetByReferenceZgetPublishedSourcesrY   r[   ZchangelogUrl)	r3   rC   Zcdtrh   r8   userZppaarchiveZspphsr   r   r   _extract_ppa_changelog_uri)  s@    







z"MyCache._extract_ppa_changelog_uric                 C   s   | | }|j j}|d krd S |j jd}|s2d S |dd  }d|krb|dd d}n|j j}|dd }|d||f  S )NZSourcer   r   rO   r   rU   z/%s_%s.changelog)	rJ   rh   recordgetrR   stripr2   r[   
rpartition)r3   rC   rM   deb_uriZsrcrecrd   rf   Zbase_urir   r   r   +_guess_third_party_changelogs_uri_by_sourceW  s    z3MyCache._guess_third_party_changelogs_uri_by_sourcec                 C   s,   | | }|j j}|r(d|ddd  S dS )z` guess changelogs uri based on ArchiveURI by replacing .deb
            with .changelog
        z%s.changelog.rO   r   N)rJ   rh   rsplit)r3   rC   rM   rw   r   r   r   +_guess_third_party_changelogs_uri_by_binaryh  s
    z3MyCache._guess_third_party_changelogs_uri_by_binaryc                 C   s:   |  | | | z|  W n tk
r4   Y nX d S r;   )get_newsget_changelogrelease	Exception)r3   rC   lockr   r   r   get_news_and_changelogt  s    

zMyCache.get_news_and_changelogc                 C   s<   z|  |dd}W n tk
r(   Y dS X |r8|| j|< dS )z7 get the NEWS.Debian file from the changelogs location zNEWS.DebianTN)rl   r   r&   )r3   rC   Znewsr   r   r   r|   |  s    zMyCache.get_newsc           
      C   s  d }|D ]D}|j drz| |}W  qNW q tk
rJ   td Y qX q| |}| |}d}|||fD ]|}|rpz&| |dd|}	| j	|  |	7  < W qp t
tfk
r   td}Y qp tttjfk
r   td td}Y qpX qp| j	|  |7  < d S )	NzLP-PPA-z'Unable to connect to the Launchpad API.rQ   rj   FzAThis update does not come from a source that supports changelogs.zerror on changelog fetchingOFailed to download the list of changes. 
Please check your Internet connection.)originr   rr   r   rK   Z	exceptionr{   rx   rl   r%   r   r   _IOErrorr   socketro   )
r3   rC   originsZchangelogs_uri_ppar   Zchangelogs_uri_binaryZchangelogs_uri_sourceZerror_messagerc   rj   r   r   r   (_fetch_changelog_for_third_party_package  sH    

   
z0MyCache._fetch_changelog_for_third_party_packagec              
   C   s"  | | j j}td|t| | jdd| | j jf | j|< | jdd |D kr^| || dS | | j j	}| | j j
dd}z,| |d}t|d	krtd
||f }W n` tk
r   td||f }Y n> tttjfk
r
 } ztd| td}W 5 d}~X Y nX | j|  |7  < dS )z4 get the changelog file from the changelog location zFChanges for %s versions:
Installed version: %s
Available version: %s

rF   Nc                 S   s   g | ]
}|j qS r   )r   )r   or   r   r   r     s     z)MyCache.get_changelog.<locals>.<listcomp>rP   z%3Arj   r   zThe changelog does not contain any relevant changes.

Please use http://launchpad.net/ubuntu/+source/%s/%s/+changelog
until the changes become available or try again later.zThe list of changes is not available yet.

Please use http://launchpad.net/ubuntu/+source/%s/%s/+changelog
until the changes become available or try again later.zcaught exception: r   )rJ   r   r   r`   rI   rF   r%   CHANGELOG_ORIGINr   rY   r[   rX   rl   r!   r   r   r   r   ro   print)r3   rC   r   rd   re   rj   er   r   r   r}     s2    


zMyCache.get_changelog)N)FN)r   r   r   r   r   r#   r$   r?   propertyr@   rA   rB   r*   rH   rN   r)   rS   rl   rr   rx   r{   r   r|   r   r}   r   r   r   r   r   A   s4   
%	


  
W.	&r   )&Z
__future__r   r   warningsfilterwarningsFutureWarningr   r,   rK   r4   Zurllib.errorr   Zurllib.requestr   Zurllib.parser   ImportErrorZurllib2ZurlparseZhttp.clientr   Zhttplibr   r1   r.   ZDistUpgrade.DistUpgradeCacheZDistUpgrader	   r   Zlaunchpadlib.launchpadr
   r=   ZCHANGELOGS_POOLr\   r   r   ZDistUpgradeCacher   r   r   r   r   <module>   s>   
