U
    ×@FV9ƒ  ã                   @   sê   d dl mZ d dlZd dlm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
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d dlZd dlmZmZ dejkrÆej dd¡ ej dd¡ G d	d
„ d
eƒZG dd„ deƒZdS )é    )Úprint_functionN)ÚFetchFailedException)ÚBytesIOÚopenZAPT_CLONE_DEBUG_RESOLVERzDebug::pkgProblemResolverÚ1zDebug::pkgDepCache::AutoInstallc                   @   sF   e Zd ZdZdZdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Z	dd„ Z
dS )ÚLowLevelCommandszN calls to the lowlevel operations to install debs
        or repack a deb
    z/usr/bin/dpkg-repackc                 C   sF   |sdS ddg}|dkr0|  dd¡ |  d|¡ t || ¡}|dkS )NTZdpkgz-iú/r   Úchrooté   )ÚinsertÚ
subprocessÚcall)ÚselfZdebfilesÚ	targetdirZinstall_cmdÚret© r   ú7/usr/lib/python3/dist-packages/DistUpgrade/apt_clone.pyÚinstall_debs2   s    zLowLevelCommands.install_debsc                 C   sh   t j | j¡std| j ƒ‚| jg}t  ¡ dksLt j d¡s@dS ddg| }tj||g |d}|dkS )z$ dpkg-repack pkgname into targetdir zno '%s' foundr   z/usr/bin/fakerootNZfakerootz-u)Úcwd)ÚosÚpathÚexistsÚdpkg_repackÚIOErrorÚgetuidr   r   )r   Úpkgnamer   Z
repack_cmdr   r   r   r   Ú
repack_deb<   s    zLowLevelCommands.repack_debNc                 C   s4   |d krdd l }| ¡ d }t d||g¡}|dkS )Nr   ZCODENAMEÚdebootstrap)Úlsb_releaseÚget_distro_informationr   r   )r   r   Údistror   r   r   r   r   r   H   s
    zLowLevelCommands.debootstrapc                 C   s   t  dd|d|g¡}|dkS )Nzapt-keyz	--keyringÚaddr   ©r   r   )r   ZfromkeyfileZintokeyfiler   r   r   r   Ú
merge_keysO   s
    
 ÿzLowLevelCommands.merge_keysc                 C   s   t  dd||g¡}|dkS )NZmountz--bindr   r"   )r   ZolddirZnewdirr   r   r   r   Ú
bind_mountT   s    zLowLevelCommands.bind_mountc                 C   s   t  d|g¡}|dkS )NZumountr   r"   )r   Zbinddirr   r   r   r   Úbind_umountX   s    zLowLevelCommands.bind_umount)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r#   r$   r%   r   r   r   r   r   ,   s   

r   c                   @   s8  e Zd ZdZde ¡ d  ZdZdIdd„ZdJd	d
„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdKdd„Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ ZdLd.d/„ZdMd0d1„ZdNd2d3„ZdOd4d5„Zd6d7„ ZdPd8d9„Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dQdCdD„Z%dRdEdF„Z&dGdH„ Z'dS )SÚAptClonezÙ clone the package selection/installation of a existing system
        using the information that apt provides

        If dpkg-repack is installed, it will be used to generate debs
        for the obsolete ones.
    zapt-clone-state-%s.tar.gzr
   ú./Nc                 C   sd   t ƒ | _t ƒ | _tƒ | _|r$|| _ntjj 	¡ | _|r>|| _
ntjj ¡ | _
|rX|| _ntj| _d S ©N)ÚsetÚnot_downloadableÚversion_mismatchr   ÚcommandsÚfetch_progressÚaptÚprogressÚtextÚAcquireProgressÚinstall_progressÚbaseZInstallProgressÚ
_cache_clsZCache)r   r1   r6   Z	cache_clsr   r   r   Ú__init__h   s    zAptClone.__init__Fc              	   C   sô   t j |¡rt j || j¡}n| d¡s0|d7 }|dkrnt ¡  tj 	d|¡ tj 	dt j |d¡¡ t 
¡  tj|ddn}|  |¡ |  ||¡ |  |¡ |  ||¡ |  |¡ |  |¡ |  ||¡ |rØ|  |¡ |ræ|  |¡ W 5 Q R X d	S )
zŽ save the current system state (installed pacakges, enabled
            repositories ...) into the apt-state.tar.gz file in targetdir
        z.tar.gzz.apt-clone.tar.gzr   ZDirúDir::State::statuszvar/lib/dpkg/statuszw:gz)ÚnameÚmodeN)r   r   ÚisdirÚjoinÚCLONE_FILENAMEÚendswithÚapt_pkgZinit_configÚconfigr-   Zinit_systemÚtarfiler   Ú_write_unameÚ_write_state_installed_pkgsÚ_write_state_auto_installedÚ_write_state_sources_listÚ_write_state_apt_preferencesÚ_write_state_apt_keyringÚ_write_state_extra_filesÚ_write_state_dpkg_statusÚ_dpkg_repack)r   Ú	sourcedirÚtargetZwith_dpkg_repackZwith_dpkg_statusZscrub_sourcesÚextra_filesÚtarr   r   r   Ú
save_state€   s.    
ÿ




zAptClone.save_statec                 C   s2   t  ¡ d t  ¡ d t  ¡ d tj d¡dœ}|S )Nr
   é   é   zAPT::Architecture)ÚhostnameZkernelZ
uname_archÚarch)r   ÚunamerA   rB   Úfind)r   Ú	host_infor   r   r   Ú_get_host_info_dict    s    



ýzAptClone._get_host_info_dictc                 C   sV   |   ¡ }tjdd}d dd„ | ¡ D ƒ¡}| |d ¡ | ¡  |j|jdd d S )NÚw©r<   Ú
c                 S   s   g | ]\}}d ||f ‘qS )z%s: %sr   )Ú.0ÚkeyÚvaluer   r   r   Ú
<listcomp>­   s   ÿz)AptClone._write_uname.<locals>.<listcomp>z./var/lib/apt-clone/uname©Úarcname)	rY   ÚtempfileÚNamedTemporaryFiler>   ÚitemsÚwriteÚflushr!   r;   )r   rP   rX   ÚfÚinfor   r   r   rD   ©   s    
ÿzAptClone._write_unamec                 C   s<   |d krd S |D ]&}t   |¡D ]}|j|d| d qqd S )Nz./extra-filesra   )Úglobr!   )r   rO   rP   Úprh   r   r   r   rJ   ³   s
    z!AptClone._write_state_extra_filesc                 C   s`  | j |d}d}d}|D ]Ò}|jr|d|j|jjt|jƒf 7 }|jrN|jjs^| j	 
|j¡ n|jjrn|jjs|| j 
|j¡ |jjD ]d}|jdkrž|jdkržq„dd l}| ¡ d }	|j|	krä|d|j|jj|jdkrÚ|jndf 7 } qq„qt d¡}
| d	¡}t|ƒ|
_t ¡ |
_| |
t|ƒ¡ t d
¡}
| d	¡}t|ƒ|
_t ¡ |
_| |
t|ƒ¡ d S )N©ZrootdirÚ z	%s %s %s
Znowr   ZIDÚunknownz"./var/lib/apt-clone/installed.pkgsúutf-8z ./var/lib/apt-clone/foreign.pkgs)r8   Úis_installedr;   Ú	installedÚversionÚintÚis_auto_installedÚ	candidateZdownloadabler.   r!   r/   ZoriginsÚarchiveÚoriginr   r   rC   ZTarInfoÚencodeÚlenÚsizeÚtimeÚmtimeZaddfiler   )r   rM   rP   ÚcacheÚsZforeignÚpkgÚor   Z	distro_idÚtarinfor   r   r   rE   º   sL      ÿÿ
 þ







z$AptClone._write_state_installed_pkgsc                 C   s   t j d¡}|j|dd d S )Núdir::state::statusz./var/lib/apt-clone/dpkg-statusra   )rA   rB   Ú	find_filer!   )r   rP   Údpkg_statusr   r   r   rK   ß   s    z!AptClone._write_state_dpkg_statusc                 C   s(   t j d¡}tj |¡r$| |d¡ d S )NzDir::State::extended_statesz#./var/lib/apt-clone/extended_states)rA   rB   rƒ   r   r   r   r!   )r   rP   Zextended_statesr   r   r   rF   æ   s
    ÿz$AptClone._write_state_auto_installedc                 C   sR   t j d¡}tj |¡r&|j|dd t j dd¡}tj |¡rN|j|dd d S )NzDir::Etc::preferencesz./etc/apt/preferencesra   zDir::Etc::preferencespartsz/etc/apt/preferences.dz./etc/apt/preferences.d©rA   rB   rƒ   r   r   r   r!   Úfind_dir©r   rP   rh   rk   r   r   r   rH   ì   s    ÿz%AptClone._write_state_apt_preferencesc                 C   sR   t j d¡}tj |¡r&|j|dd t j dd¡}tj |¡rN|j|dd d S )NzDir::Etc::trustedz./etc/apt/trusted.gpgra   zDir::Etc::trustedpartsz/etc/apt/trusted.gpg.dz./etc/apt/trusted.gpg.dr…   r‡   r   r   r   rI   õ   s    ÿz!AptClone._write_state_apt_keyringc                 C   sž   t j d¡}|  |||d¡ t j d¡}tj |¡rš|j|ddd t 	|¡D ]J}| 
d¡r^qN| d¡sjqNd	||f }tj |¡r„qN|  |||d
| ¡ qNd S )NúDir::Etc::sourcelistz./etc/apt/sources.listúDir::Etc::sourcepartsz./etc/apt/sources.list.dF)rb   Ú	recursiveÚ.z.listz%s/%sz./etc/apt/sources.list.d/)rA   rB   rƒ   Ú$_add_file_to_tar_with_password_checkr†   r   r   r   r!   ÚlistdirÚ
startswithr@   r=   )r   rP   ÚscrubZsources_listZsource_partsÚsourceZsources_file_namer   r   r   rG   þ   s,    
ÿÿ

 þz"AptClone._write_state_sources_listc              
   C   s¬   |ršt jdd‚}t|dƒl}| ¡ D ]L}t|ƒtkr@| d¡}t d|¡rZt 	dd|¡}| 
| d¡¡ | ¡  q&|j|j|d W 5 Q R X W 5 Q R X n|j||d d S )	NÚwbr[   ÚrbzUTF-8z/[^/@:]*:[^/@:]*@z/USERNAME:PASSWORD@ro   ra   )rc   rd   r   Ú	readlinesÚtypeÚbytesÚdecodeÚreÚsearchÚsubrf   rx   rg   r!   r;   )r   rP   Úsourcesr   rb   Zsource_copyrh   Úliner   r   r   rŒ     s    
 ÿ
&z-AptClone._add_file_to_tar_with_password_checkc                 C   s   d S r,   r   ©r   rP   r   r   r   Ú_write_modified_files_from_etc&  s    z'AptClone._write_modified_files_from_etcc                 C   s>   t  ¡ }| jD ]}| j ||¡ q|j|dd t |¡ d S )Nú./var/lib/apt-clone/debsra   )rc   Úmkdtempr.   r0   r   r!   ÚshutilÚrmtree)r   rP   Ztdirr   r   r   r   rL   *  s
    
zAptClone._dpkg_repackc                 C   s$   |  ¡ d  d¡rd| _nd| _d S )Néÿÿÿÿr+   rm   )ÚgetnamesrŽ   Ú	TARPREFIXrœ   r   r   r   Ú_detect_tarprefix3  s    zAptClone._detect_tarprefixc              
   C   sž   t  |¡Š}|  |¡ | | jd ¡}| ¡ D ]`}| d¡}| d¡s.| ¡ dkrTq.| 	¡ }t
|ƒdkr.|d  d¡s.|d   W  5 Q R £ S q.W 5 Q R X d S )Núetc/apt/sources.listro   ú#rm   rR   r   )rC   r   r¥   Úextractfiler¤   r“   r–   rŽ   ÚstripÚsplitry   r@   )r   Ú	statefilerP   rh   r›   Úlr   r   r   Ú_get_info_distro;  s    

$zAptClone._get_info_distroc              
   C   s*  |   |¡pd}t |¡}| | jd ¡}d }}g }| ¡ D ]L}| d¡}| ¡  ¡ \}	}
}|d7 }t	|ƒrx|d7 }|	 
d¡r@| |	¡ q@| | jd ¡}|j}d}d}| jd | ¡ krô| | jd ¡ ¡ }t |¡}| dd¡}| d	d¡}||d
 |¡||t |¡|dœW  5 Q R £ S Q R X d S )Nrn   ú var/lib/apt-clone/installed.pkgsr   ro   r
   z-desktopzvar/lib/apt-clone/unamerT   rU   z, )rT   r    Úmetarq   ÚautoinstalledÚdaterU   )r­   rC   r   r¨   r¤   r“   r–   r©   rª   rs   r@   ÚappendZ	getmemberr|   r£   ÚreadrA   Z
TagSectionÚgetr>   r{   Úctime)r   r«   r    rP   rh   rq   r°   r¯   r›   r;   rr   ÚautoÚmr±   rT   rU   ri   Zsectionr   r   r   Ú_get_clone_info_dictI  sH    ÿ

ÿÿ
úzAptClone._get_clone_info_dictc                 C   s   d|   |¡ S )Nz“Hostname: %(hostname)s
Arch: %(arch)s
Distro: %(distro)s
Meta: %(meta)s
Installed: %(installed)s pkgs (%(autoinstalled)s automatic)
Date: %(date)s
)r¸   )r   r«   r   r   r   ri   q  s    ûzAptClone.infoc              	   C   sÂ   t  |¡J}|  |¡ | | j|dd …  ¡}g }| ¡ D ]}| | d¡¡ q:W 5 Q R X || }tj	 
|¡rŒt|ƒ}| ¡ }	W 5 Q R X ng }	tj|	|d| |d}
g }|
D ]}| |¡ q®|S )Nr
   ro   zcurrent-system%s)ZfromfileZtofile)rC   r   r¥   r¨   r¤   r“   r²   r–   r   r   r   ÚdifflibZunified_diff)r   r«   Zsystem_filer   rP   Z
clone_fileZclone_file_linesr›   ÚfpZsystem_file_linesÚgenÚdiffr   r   r   Ú_get_file_diff_against_clonez  s*    

  þz%AptClone._get_file_diff_against_cloner   c              	   C   sh  |dkrt j d|¡ tdƒ |  ¡ }|  |¡}|D ]>}| |d ¡| |d ¡kr4td|| |d ¡| |d ¡f ƒ q4tdƒ d}|  |||¡}|r td |¡ƒ | j	|d}t
 |¡d}	|	 | jd ¡}
i }|
 ¡ D ]@}| ¡  d	¡}| d
¡sÔ|dkrúqÔ| ¡ \}}}||f||< qÔW 5 Q R X i }|D ]*}|js8q(|jjt|jƒf||j< q(t| ¡ ƒt| ¡ ƒ }|r”tdƒ td t|ƒ¡ƒ tdƒ t| ¡ ƒt| ¡ ƒ }|rÔtdƒ td t|ƒ¡ƒ tdƒ tƒ }t|ƒD ]F}||krôqâ|| \}}|| \}}||krâ| |||f¡ qâ|rdtdƒ tdƒ |D ]\}}}td|||f ƒ qDd S )Nr   úDPkg::Chroot-DirectoryzClone info differences: z '%s': clone='%s' system='%s'rm   z/etc/apt/sources.listrl   r®   ro   r§   z2Installed on the system but not in the clone-file:ú r\   z2Installed in the clone-file but not in the system:zVersion differences: z-Pkgname <clone-file-version> <system-version>z %s  <%s>   <%s>)rA   rB   r-   ÚprintrY   r¸   r´   r½   r>   r8   rC   r   r¨   r¤   r“   r©   r–   rŽ   rª   rq   rr   Ústrrt   r;   ÚkeysÚsortedr!   )r   r«   r   rX   Z
clone_infor^   Zsources_list_systemr¼   r}   rP   rh   Zinstalled_in_cloner›   r;   rr   r¶   Zinstalled_on_systemr   Zonly_on_systemZonly_in_cloneZpkgversion_differencesr   Zclone_file_pkgversionZclone_is_autoZsystem_pkgversionZsys_is_autoZ	clone_verZ
system_verr   r   r   Ú	show_diff‘  s‚    
 

þ
  ÿÿ ÿ

ÿzAptClone.show_diffc           	   	   C   s$  |dkrFt j d|¡ | j dtj |d¡¡ | j dtj |d¡¡ t 	|¡}|  
|¡ W 5 Q R X tj |¡s–td| ƒ |  |¡}| j ||¡ | j|||d |  ||¡ |rÂ|  ||¡ |  ||||¡ |  ||¡ |  ||¡ |dkr | j tj |d¡¡ | j tj |d¡¡ d	S )
z¯ take a statefile produced via (like apt-state.tar.gz)
            save_state() and restore the packages/repositories
            into targetdir (that is usually "/")
        r   r¾   z/procÚprocz/sysÚsysz0Dir '%s' does not exist, need to bootstrap first)ÚmirrorN)rA   rB   r-   r0   r$   r   r   r>   rC   r   r¥   r   rÀ   r­   r   Ú_restore_sources_listÚ_restore_apt_keyringÚ_rewrite_sources_listÚ_restore_package_selectionÚ_restore_not_downloadable_debsÚ_restore_extra_filesr%   )	r   r«   r   Úexclude_pkgsÚ
new_distroÚprotect_installedrÇ   rP   r    r   r   r   Úrestore_stateÜ  s(    

zAptClone.restore_statec                 C   sÌ   t  ¡ }tj d¡}tj |tj |¡ ¡sBt 	|tj |¡ ¡ t
 ||| ¡ |  ||¡ |rn|  ||¡ | j|d}z| tjj ¡ ¡ W n tk
r¤   Y nX | ¡  | j|||d}t
 |¡ |S )Nr‚   rl   )rÎ   )rc   rŸ   rA   rB   rƒ   r   r   r   ÚdirnameÚmakedirsr    ÚcopyrÈ   rÊ   r8   Úupdater2   r3   r7   r5   r   r   Ú#_restore_package_selection_in_cacher¡   )r   r«   rÎ   rÏ   rN   r„   r}   Úmissingr   r   r   Úsimulate_restore_state  s"    
zAptClone.simulate_restore_statec           
   	   C   s  t  |¡ô}tj |ddd¡}tj |¡r:t |d| ¡ | | j	d |¡ tj |ddd¡}t 
|tjtjB tjB tjB ¡ |rÎddlm} tj d|¡ |ƒ }|jd d … D ]}	|	j|kr°||	_q°| ¡  z| | j	d	 |¡ W n tk
rø   Y nX W 5 Q R X d S )
NÚetcr2   úsources.listú%s.apt-cloner¦   r   )ÚSourcesListrˆ   zetc/apt/sources.list.d)rC   r   r   r   r>   r   r    rÔ   Úextractr¤   ÚchmodÚstatÚS_IRUSRÚS_IWUSRÚS_IRGRPÚS_IROTHÚaptsources.sourceslistrÜ   rA   rB   r-   ÚlistÚuriÚsaveÚKeyError)
r   r«   r   rÇ   rP   ÚexistingZ
td_sourcesrÜ   rš   Úentryr   r   r   rÈ     s*    ÿ
zAptClone._restore_sources_listc              	   C   sÈ   t j |ddd¡}d| }t j |¡r2t ||¡ t |¡‚}z| | j	d |¡ W n t
k
rh   Y nX z| | j	d |¡ W n t
k
r”   Y nX t j |¡rº| j ||¡ t  |¡ W 5 Q R X d S )NrÙ   r2   ztrusted.gpgrÛ   zetc/apt/trusted.gpgzetc/apt/trusted.gpg.d)r   r   r>   r   r    rÔ   rC   r   rÝ   r¤   rè   r0   r#   Úremove)r   r«   r   ré   ZbackuprP   r   r   r   rÉ   1  s     zAptClone._restore_apt_keyringc                 C   s  |d krg }t |ƒ}t ƒ }t ƒ }t |j¡}|rL|D ]}|jr4| |j¡ q4t |¡J}	|	 	| j
d ¡}
| ¡ $ |
 ¡ D ]}| ¡  d¡}| d¡s~|dkr¦q~| ¡ \}}}dd„ }|||ƒrÈq~| |¡ t|ƒ}| }||kr~zZ|r0|| j|dd |jd	kr@| ¡  || js@td
| ƒ‚n|| j|d W n@ tk
r‚ } z t d||f ¡ | |¡ W 5 d }~X Y nX ||  |¡ q~W 5 Q R X W 5 Q R X |jd	kr¼| ¡  |D ]@}||krÜ| |¡ qÀ|| jsÀ|| jsÀ| |¡ qÀ|S )Nr®   ro   r§   rm   c                 S   s    |D ]}t   | |¡r dS qd S )NT)Úfnmatch)r;   rÎ   Zexclr   r   r   Úis_excluded]  s    zAAptClone._restore_package_selection_in_cache.<locals>.is_excludedF)Ú	from_userZauto_fixr   zpkg %s not marked upgrade)rî   zcan't add %s (%s))r-   rA   ZProblemResolverZ	_depcacherp   ZprotectZ_pkgrC   r   r¨   r¤   Zactiongroupr“   r©   r–   rŽ   rª   r!   rs   Zmark_installZbroken_countZresolveZmarked_installÚSystemErrorÚloggingZwarningZ	mark_auto)r   r«   r}   rÐ   rÎ   r×   ZpkgsZresolverr   rP   rh   r›   r;   rr   r¶   rí   Zauto_installedrî   Úer   r   r   rÖ   C  s`    ÿ

$

z,AptClone._restore_package_selection_in_cachec                 C   s~   | j |d}tjj dd¡ tjj dd¡ z| | j¡ W n tk
rP   Y nX | ¡  |  	||||¡ | 
| j| j¡ d S )Nrl   zDir::Binr   zDir::Bin::dpkgz/usr/bin/dpkg)r8   r2   rA   rB   r-   rÕ   r1   r   r   rÖ   Zcommitr6   )r   r«   r   rÐ   rÎ   r}   r   r   r   rË   ƒ  s    z#AptClone._restore_package_selectionc              	   C   s^   t  |¡J}| ¡ D ]:}| jd }|j |¡r|jt|ƒd … |_| ||¡ qW 5 Q R X d S )Nzextra-files/)rC   r   Ú
getmembersr¤   r;   rŽ   ry   rÝ   )r   r«   r   rP   r·   Úprefixr   r   r   rÍ   ”  s    
zAptClone._restore_extra_filesc           	   	      s´   t  |¡N}z&‡ fdd„| ¡ D ƒ}| ||¡ W n  tk
rR   Y W 5 Q R £ d S X W 5 Q R X g }tj |d¡}t tj |d¡¡D ]}tj ||¡}| 	|¡ q„ˆ j
 ||¡ d S )Nc                    s"   g | ]}|j  ˆ jd  ¡r|‘qS )zvar/lib/apt-clone/debs/)r;   rŽ   r¤   )r]   r   ©r   r   r   r`      s      z;AptClone._restore_not_downloadable_debs.<locals>.<listcomp>rž   z*.deb)rC   r   rò   Z
extractallrè   r   r   r>   rj   r²   r0   r   )	r   r«   r   rP   ZdebsdirZdebsr   ZdebZdebpathr   rô   r   rÌ     s    z'AptClone._restore_not_downloadable_debsc                 C   sŒ  ddl m}m} tj dtj tj 	|ddd¡¡¡ tj dtj tj 	|ddd¡¡¡ |ƒ }|j
d d … D ]R}|jsl|jr~qld	}d
D ]$}|j d| ¡r†d||f } q¬q†|r¸||_ql||_qltj 	|ddd¡}	tj d¡}
tj |	¡rDt|	dƒ>}|D ]2}|||
ƒ}|js"|js"||krü|j
 |¡ qüW 5 Q R X t |	¡ |j
D ]4}|j d¡rJ|j
 |¡ |j
 d|¡ d|_qJ| ¡  d S )Nr   )rÜ   ÚSourceEntryrˆ   rÙ   r2   rÚ   r‰   zsources.list.drm   )ZupdatesZsecurityZ	backportsz-%sz%s-%szsources.list.apt-cloneÚrzcdrom:T)rä   rÜ   rõ   rA   rB   r-   r   r   Úabspathr>   rå   ZinvalidZdisabledZdistr@   rƒ   r   r   r²   rë   ræ   rŽ   r   rç   )r   r   rÏ   rÜ   rõ   rš   rê   ZreplacementZpocketré   Z
sourcelistrº   r›   Úsrcr   r   r   rÊ   «  sL    þþÿ



zAptClone._rewrite_sources_listrm   c              
   C   sÞ   |rt j |d¡}nd}tƒ }t j tj d¡¡}t t j |dd¡¡D ]>}t	|dd(}|D ]}| 
d¡r^| | ¡ ¡ q^W 5 Q R X qHtƒ }t  |¡D ]@\}	}
}|D ]0}t j |	t|ƒd … |¡}||kr¦| |¡ q¦q˜|S )	NrÙ   z/etcr:   ri   z*.listro   )Úencodingz/etc/)r   r   r>   r-   rÒ   rA   rB   r´   rj   r   rŽ   r!   r©   Úwalkry   )r   rM   ZetcdirZownedZdpkg_basedirrh   rº   r›   ZunownedÚdirpathZdirnamesÚ	filenamesr;   Úfullnamer   r   r   Ú_find_unowned_in_etcÕ  s"    
zAptClone._find_unowned_in_etcc                 C   s*  |t j d¡ }tƒ }t|ƒ }t  |¡}|D ]ê}d|kr0|d  d¡D ]Î}d }t| ¡ ƒdkrr| ¡ \}	}
}n| ¡ \}	}
||	 }|
 ¡ }
|dkr˜qJt	j
 |¡s¾t d| ¡ | |¡ qJt ¡ }t|dƒ}| | ¡ ¡ W 5 Q R X | ¡ |
krJt d|| ¡ |
f ¡ | |¡ qJq0W 5 Q R X |S )	Nr:   Z	conffilesr\   é   Úobsoletezconffile %s removedr’   zconffile %s (%s != %s))rA   rB   rW   r-   r   ZTagFilerª   ry   r©   r   r   r   rð   Údebugr!   ÚhashlibÚmd5rÕ   r³   Z	hexdigest)r   rM   r„   Zmodifiedrº   Útagrê   r›   r   r;   Zmd5sumr   r  r   r   r   Ú_find_modified_conffilesë  s<    

  ÿz!AptClone._find_modified_conffilesc                 C   s   t dƒ d S )Nznot implemented yet)rÀ   )r   rM   r   r   r   Ú_dump_debconf_database  s    zAptClone._dump_debconf_database)NNN)FFFN)F)r   )r   NNFN)N)N)FN)rm   )r   )(r&   r'   r(   r)   r   rV   r?   r¤   r9   rQ   rY   rD   rJ   rE   rK   rF   rH   rI   rG   rŒ   r   rL   r¥   r­   r¸   ri   r½   rÄ   rÑ   rØ   rÈ   rÉ   rÖ   rË   rÍ   rÌ   rÊ   rþ   r  r  r   r   r   r   r*   ]   sZ     ÿ
      þ
 	
%		
	(	
K      ÿ
&


@	*

#r*   )Z
__future__r   r2   Z	apt.cacher   rA   r¹   rì   rj   r  rð   r   r—   r    rß   r   rC   rc   r{   Úior   r   ÚenvironrB   r-   Úobjectr   r*   r   r   r   r   Ú<module>   s,   
1