o
    \íHaú‚  ã                   @   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Zd dlmZmZ dejv rge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ÚopenÚ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r|  dd¡ |  d|¡ t || ¡}|dkS )NTÚdpkgz-iú/r   Úchrooté   )ÚinsertÚ
subprocessÚcall)ÚselfÚdebfilesÚ	targetdirÚinstall_cmdÚret© r   ú7/usr/lib/python3/dist-packages/DistUpgrade/apt_clone.pyÚinstall_debs3   s   zLowLevelCommands.install_debsc                 C   sh   t j | j¡std| j ƒ‚| jg}t  ¡ dks&t 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/fakerootNÚfakerootz-u)Úcwd)ÚosÚpathÚexistsÚdpkg_repackÚIOErrorÚgetuidr   r   )r   Úpkgnamer   Ú
repack_cmdr   r   r   r   Ú
repack_deb=   s   zLowLevelCommands.repack_debNc                 C   s,   |d u r
t  ¡ d }t d||g¡}|dkS )NÚCODENAMEÚdebootstrapr   )Úlsb_releaseÚget_distro_informationr   r   )r   r   Údistror   r   r   r   r$   I   s   zLowLevelCommands.debootstrapc                 C   s   t  dd|d|g¡}|dkS )Nzapt-keyz	--keyringÚaddr   ©r   r   )r   ÚfromkeyfileÚintokeyfiler   r   r   r   Ú
merge_keysO   s   
ÿzLowLevelCommands.merge_keysc                 C   s   t  dd||g¡}|dkS )NÚmountz--bindr   r)   )r   ÚolddirÚnewdirr   r   r   r   Ú
bind_mountT   s   zLowLevelCommands.bind_mountc                 C   s   t  d|g¡}|dkS )NÚumountr   r)   )r   Úbinddirr   r   r   r   Úbind_umountX   s   zLowLevelCommands.bind_umount©N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r"   r$   r,   r0   r3   r   r   r   r   r   -   s    

r   c                   @   sD  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dNd4d5„Zd6d7„ ZdOd8d9„Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dPdCdD„Z%dLdEdF„Z&dGdH„ Z'dS )QÚ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   sf   t ƒ | _t ƒ | _tƒ | _|r|| _ntjj 	¡ | _|r|| _
ntjj ¡ | _
|r-|| _d S tj| _d S r4   )ÚsetÚnot_downloadableÚversion_mismatchr   ÚcommandsÚfetch_progressÚaptÚprogressÚtextÚAcquireProgressÚinstall_progressÚbaseÚInstallProgressÚ
_cache_clsÚCache)r   r?   rD   Ú	cache_clsr   r   r   Ú__init__h   s   
zAptClone.__init__Fc                 C   s  t j |¡rt j || j¡}n	| d¡s|d7 }|dkr7t ¡  tj 	d|¡ tj 	dt j |d¡¡ t 
¡  tj|ddE}|  |¡ |  ||¡ |  |¡ |  ||¡ |  |¡ |  |¡ |  ||¡ |rl|  |¡ |r{|  |¡ W d	  ƒ d	S W d	  ƒ d	S 1 s†w   Y  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
   ÚDirúDir::State::statuszvar/lib/dpkg/statuszw:gz)ÚnameÚmodeN)r   r   ÚisdirÚjoinÚCLONE_FILENAMEÚendswithÚapt_pkgÚinit_configÚconfigr;   Ú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ÚtargetÚwith_dpkg_repackÚwith_dpkg_statusÚscrub_sourcesÚextra_filesÚtarr   r   r   Ú
save_state€   s4   
ÿ




õ
"özAptClone.save_statec                 C   s2   t  ¡ d t  ¡ d t  ¡ d tj d¡dœ}|S )Nr   é   é   zAPT::Architecture)ÚhostnameÚkernelÚ
uname_archÚarch)r   ÚunamerS   rU   Ú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©rN   Ú
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)	rr   ÚtempfileÚNamedTemporaryFilerP   ÚitemsÚwriteÚflushr(   rM   )r   rg   rq   ÚfÚinfor   r   r   rX   ©   s   
ÿzAptClone._write_unamec                 C   s<   |d u rd S |D ]}t   |¡D ]}|j|d| d qqd S )Nz./extra-filesrz   )Úglobr(   )r   rf   rg   Úpr   r   r   r   r^   ³   s   ÿÿz!AptClone._write_state_extra_filesc           
      C   sT  | j |d}d}d}t ¡ d }|D ]]}|jro|d|j|jjt|jƒf 7 }|j	r-|j	j
s5| j |j¡ n|jj
r=|j	j
sD| j |j¡ |jjD ]&}|jdkrU|jdkrUqH|j|krn|d|j|jj|jdkri|jndf 7 } qt d¡}	| d¡}t|ƒ|	_t ¡ |	_| |	t|ƒ¡ t d	¡}	| d¡}t|ƒ|	_t ¡ |	_| |	t|ƒ¡ d S )
N©ÚrootdirÚ ÚIDz	%s %s %s
ÚnowÚunknownz"./var/lib/apt-clone/installed.pkgsúutf-8z ./var/lib/apt-clone/foreign.pkgs)rG   r%   r&   Úis_installedrM   Ú	installedÚversionÚintÚis_auto_installedÚ	candidateÚdownloadabler<   r(   r=   ÚoriginsÚarchiveÚoriginrW   ÚTarInfoÚencodeÚlenÚsizeÚtimeÚmtimeÚaddfiler   )
r   ra   rg   ÚcacheÚsÚforeignÚ	distro_idÚpkgÚoÚtarinfor   r   r   rY   º   sF   ÿÿ

þ€







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-statusrz   )rS   rU   Ú	find_filer(   )r   rg   Údpkg_statusr   r   r   r_   Þ   s   z!AptClone._write_state_dpkg_statusc                 C   s,   t j d¡}tj |¡r| |d¡ d S d S )NzDir::State::extended_statesz#./var/lib/apt-clone/extended_states)rS   rU   r¥   r   r   r   r(   )r   rg   Úextended_statesr   r   r   rZ   å   s   ÿÿz$AptClone._write_state_auto_installedc                 C   óV   t j d¡}tj |¡r|j|dd t j dd¡}tj |¡r)|j|dd d S d S )NzDir::Etc::preferencesz./etc/apt/preferencesrz   zDir::Etc::preferencespartsz/etc/apt/preferences.dz./etc/apt/preferences.d©rS   rU   r¥   r   r   r   r(   Úfind_dir©r   rg   r   r„   r   r   r   r\   ë   ó   ÿÿz%AptClone._write_state_apt_preferencesc                 C   r¨   )NzDir::Etc::trustedz./etc/apt/trusted.gpgrz   zDir::Etc::trustedpartsz/etc/apt/trusted.gpg.dz./etc/apt/trusted.gpg.dr©   r«   r   r   r   r]   ô   r¬   z!AptClone._write_state_apt_keyringc                 C   s¢   t j d¡}|  |||d¡ t j d¡}tj |¡rM|j|ddd t 	|¡D ]'}| 
d¡r/q'| d¡s5q'd	||f }tj |¡rBq'|  |||d
| ¡ q'd S d S )NúDir::Etc::sourcelistz./etc/apt/sources.listúDir::Etc::sourcepartsz./etc/apt/sources.list.dF)r{   Ú	recursiveÚ.z.listz%s/%sz./etc/apt/sources.list.d/)rS   rU   r¥   Ú$_add_file_to_tar_with_password_checkrª   r   r   r   r(   ÚlistdirÚ
startswithrR   rO   )r   rg   ÚscrubÚsources_listÚsource_partsÚsourceÚsources_file_namer   r   r   r[   ý   s.   
ÿÿ

þõz"AptClone._write_state_sources_listc              	   C   sè   |rkt jddY}t|dƒ;}| ¡ D ]&}t|ƒtu r | d¡}t d|¡r-t 	dd|¡}| 
| d¡¡ | ¡  q|j|j|d W d   ƒ n1 sLw   Y  W d   ƒ d S W d   ƒ d S 1 sdw   Y  d S |j||d d S )	NÚwbrt   ÚrbzUTF-8z/[^/@:]*:[^/@:]*@z/USERNAME:PASSWORD@r‹   rz   )r|   r}   r   Ú	readlinesÚtypeÚbytesÚdecodeÚreÚsearchÚsubr   r—   r€   r(   rM   )r   rg   Úsourcesr´   r{   Úsource_copyr   Úliner   r   r   r±     s   
ÿ
Pòz-AptClone._add_file_to_tar_with_password_checkc                 C   s   d S r4   r   ©r   rg   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/debsrz   )r|   Úmkdtempr<   r>   r"   r(   ÚshutilÚrmtree)r   rg   Útdirr    r   r   r   r`   )  s
   
zAptClone._dpkg_repackc                 C   s&   |  ¡ d  d¡rd| _d S d| _d S )Néÿÿÿÿr:   r‡   )Úgetnamesr³   Ú	TARPREFIXrÅ   r   r   r   Ú_detect_tarprefix2  s   

zAptClone._detect_tarprefixc                 C   s¶   t  |¡L}|  |¡ | | jd ¡}| ¡ D ]1}| d¡}| d¡s)| ¡ dkr*q| 	¡ }t
|ƒdkrH|d  d¡sH|d   W  d   ƒ S qW d   ƒ d S 1 sTw   Y  d S )Núetc/apt/sources.listr‹   ú#r‡   ri   r
   )rW   r   rÏ   ÚextractfilerÎ   r»   r¾   r³   ÚstripÚsplitr˜   rR   )r   Ú	statefilerg   r   rÄ   Úlr   r   r   Ú_get_info_distro:  s"   


ö€
üõzAptClone._get_info_distroc              	   C   s4  |   |¡pd}t |¡„}| | jd ¡}d }}g }| ¡ D ]&}| d¡}| ¡  ¡ \}	}
}|d7 }t	|ƒr;|d7 }|	 
d¡rE| |	¡ q| | jd ¡}|j}d}d}| jd | ¡ v ry| | jd ¡ ¡ }t |¡}| dd¡}| d	d¡}||d
 |¡||t |¡|dœW  d   ƒ S 1 s“w   Y  d S )NrŠ   ú var/lib/apt-clone/installed.pkgsr   r‹   r   z-desktopzvar/lib/apt-clone/unamerk   rn   z, )rk   r'   Úmetar   ÚautoinstalledÚdatern   )r×   rW   r   rÒ   rÎ   r»   r¾   rÓ   rÔ   r   rR   ÚappendÚ	getmemberr›   rÍ   ÚreadrS   Ú
TagSectionÚgetrP   rš   Úctime)r   rÕ   r'   rg   r   r   rÚ   rÙ   rÄ   rM   rŽ   ÚautoÚmrÛ   rk   rn   r‚   Úsectionr   r   r   Ú_get_clone_info_dictH  sP   ÿ


€ÿÿÿ
ú$ä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   r‚   p  s   ûzAptClone.infoc                 C   sê   t  |¡*}|  |¡ | | j|dd …  ¡}g }| ¡ D ]
}| | d¡¡ qW d   ƒ n1 s2w   Y  || }tj	 
|¡rZt|ƒ}| ¡ }	W d   ƒ n1 sTw   Y  ng }	tj|	|d| |d}
g }|
D ]}| |¡ qk|S )Nr   r‹   zcurrent-system%s)ÚfromfileÚtofile)rW   r   rÏ   rÒ   rÎ   r»   rÜ   r¾   r   r   r   ÚdifflibÚunified_diff)r   rÕ   Úsystem_filer   rg   Ú
clone_fileÚclone_file_linesrÄ   ÚfpÚsystem_file_linesÚgenÚdiffr   r   r   Ú_get_file_diff_against_cloney  s.   
ÿú

ÿ€þz%AptClone._get_file_diff_against_cloner
   c              	   C   sp  |dkrt j d|¡ tdƒ |  ¡ }|  |¡}|D ]}| |d ¡| |d ¡kr9td|| |d ¡| |d ¡f ƒ qtdƒ d}|  |||¡}|rPtd |¡ƒ | j	|d}t
 |¡7}	|	 | jd ¡}
i }|
 ¡ D ] }| ¡  d	¡}| d
¡s||dkr}qj| ¡ \}}}||f||< qjW d   ƒ n1 s•w   Y  i }|D ]}|js¤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 ] }||vrýqö|| \}}|| \}}||kr| |||f¡ qö|r4tdƒ tdƒ |D ]\}}}td|||f ƒ q$d S d S )Nr
   úDPkg::Chroot-DirectoryzClone info differences: z '%s': clone='%s' system='%s'r‡   z/etc/apt/sources.listr…   rØ   r‹   rÑ   z2Installed on the system but not in the clone-file:ú ru   z2Installed in the clone-file but not in the system:zVersion differences: z-Pkgname <clone-file-version> <system-version>z %s  <%s>   <%s>)rS   rU   r;   Úprintrr   rå   rà   rñ   rP   rG   rW   r   rÒ   rÎ   r»   rÓ   r¾   r³   rÔ   r   rŽ   Ústrr   rM   ÚkeysÚsortedr(   )r   rÕ   r   rq   Ú
clone_inforw   Úsources_list_systemrð   r   rg   r   Úinstalled_in_clonerÄ   rM   rŽ   râ   Úinstalled_on_systemr¡   Úonly_on_systemÚonly_in_cloneÚpkgversion_differencesr    Úclone_file_pkgversionÚclone_is_autoÚsystem_pkgversionÚsys_is_autoÚ	clone_verÚ
system_verr   r   r   Ú	show_diff  s†   

þ€ÿÿûûÿ
ÿ€üzAptClone.show_diffc           	      C   s:  |dkr#t j d|¡ | j dtj |d¡¡ | j dtj |d¡¡ t 	|¡}|  
|¡ W d  ƒ n1 s8w   Y  tj |¡sUtd| ƒ |  |¡}| j ||¡ | j|||d	 |  ||¡ |rk|  ||¡ |  ||||¡ |  ||¡ |  ||¡ |dkr›| j tj |d¡¡ | j tj |d¡¡ dS 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ÚsysNz0Dir '%s' does not exist, need to bootstrap first)Úmirror)rS   rU   r;   r>   r0   r   r   rP   rW   r   rÏ   r   rô   r×   r$   Ú_restore_sources_listÚ_restore_apt_keyringÚ_rewrite_sources_listÚ_restore_package_selectionÚ_restore_not_downloadable_debsÚ_restore_extra_filesr3   )	r   rÕ   r   Úexclude_pkgsÚ
new_distroÚprotect_installedr  rg   r'   r   r   r   Úrestore_stateÛ  s,   ÿ
þzAptClone.restore_statec                 C   sÊ   t  ¡ }tj d¡}tj |tj |¡ ¡s!t 	|tj |¡ ¡ t
 ||| ¡ |  ||¡ |r7|  ||¡ | j|d}z| tjj ¡ ¡ W n	 tyQ   Y nw | ¡  | j|||d}t
 |¡ |S )Nr¤   r…   )r  )r|   rÈ   rS   rU   r¥   r   r   r   ÚdirnameÚmakedirsrÉ   Úcopyr	  r  rG   Úupdater@   rA   rE   rC   r   r   Ú#_restore_package_selection_in_cacherÊ   )r   rÕ   r  r  rb   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 ¡ |rgddlm} tj d|¡ |ƒ }|jd d … D ]
}	|	j|krb||	_qX| ¡  z| | j	d	 |¡ W n	 ty{   Y n	w W d   ƒ d S W d   ƒ d S 1 sw   Y  d S )
NÚetcr@   úsources.listú%s.apt-clonerÐ   r   )ÚSourcesListr­   zetc/apt/sources.list.d)rW   r   r   r   rP   r   rÉ   r  ÚextractrÎ   ÚchmodÚstatÚS_IRUSRÚS_IWUSRÚS_IRGRPÚS_IROTHÚaptsources.sourceslistr  rS   rU   r;   ÚlistÚuriÚsaveÚKeyError)
r   rÕ   r   r  rg   ÚexistingÚ
td_sourcesr  rÂ   Úentryr   r   r   r	    s6   ÿ
€ÿÿï"ízAptClone._restore_sources_listc              	   C   sê   t j |ddd¡}d| }t j |¡rt ||¡ t |¡M}z| | j	d |¡ W n	 t
y3   Y nw z| | j	d |¡ W n	 t
yH   Y nw t j |¡rc| j ||¡ t  |¡ W d   ƒ d S W d   ƒ d S 1 snw   Y  d S )Nr  r@   ztrusted.gpgr  zetc/apt/trusted.gpgzetc/apt/trusted.gpg.d)r   r   rP   r   rÉ   r  rW   r   r  rÎ   r)  r>   r,   Úremove)r   rÕ   r   r*  Úbackuprg   r   r   r   r
  0  s*   ÿÿõ	"÷zAptClone._restore_apt_keyringc                 C   s  |d u rg }t |ƒ}t ƒ }t ƒ }t |j¡}|r&|D ]}|jr%| |j¡ qt |¡¯}	|	 	| j
d ¡}
| ¡ “ |
 ¡ D ]†}| ¡  d¡}| d¡sO|dkrPq=| ¡ \}}}dd„ }|||ƒraq=| |¡ t|ƒ}| }||v rÃz*|r’|| j|dd |jd	kr‘| ¡  || js‘td
| ƒ‚n|| j|d W n  ty» } zt d||f ¡ | |¡ W Y d }~nd }~ww ||  |¡ q=W d   ƒ n1 sÎw   Y  W d   ƒ n1 sÝw   Y  |jd	krë| ¡  |D ]}||vrù| |¡ qí|| js
|| js
| |¡ qí|S )NrØ   r‹   rÑ   r‡   c                 S   s    |D ]}t   | |¡r dS qd S )NT)Úfnmatch)rM   r  Úexclr   r   r   Úis_excluded\  s
   ÿÿzAAptClone._restore_package_selection_in_cache.<locals>.is_excludedF)Ú	from_userÚauto_fixr   zpkg %s not marked upgrade)r2  zcan't add %s (%s))r;   rS   ÚProblemResolverÚ	_depcacherŒ   ÚprotectÚ_pkgrW   r   rÒ   rÎ   Úactiongroupr»   rÓ   r¾   r³   rÔ   r(   r   Úmark_installÚbroken_countÚresolveÚmarked_installÚSystemErrorÚloggingÚwarningÚ	mark_auto)r   rÕ   r   r  r  r  ÚpkgsÚresolverr¡   rg   r   rÄ   rM   rŽ   râ   r1  Úauto_installedr2  Úer   r   r   r  B  sv   €ÿ




€€€þ€áÿ€ü
&

€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y'   Y nw | ¡  |  	||||¡ | 
| j| j¡ d S )Nr…   zDir::Binr
   zDir::Bin::dpkgz/usr/bin/dpkg)rG   r@   rS   rU   r;   r  r?   r   r   r  ÚcommitrD   )r   rÕ   r   r  r  r   r   r   r   r  ‚  s   ýz#AptClone._restore_package_selectionc                 C   st   t  |¡+}| ¡ D ]}| jd }|j |¡r'|jt|ƒd … |_| ||¡ q
W d   ƒ d S 1 s3w   Y  d S )Nzextra-files/)rW   r   Ú
getmembersrÎ   rM   r³   r˜   r  )r   rÕ   r   rg   rã   Úprefixr   r   r   r  “  s   
€û"ÿzAptClone._restore_extra_filesc           	   	      sÈ   t  |¡,}z‡ fdd„| ¡ D ƒ}| ||¡ W n ty)   Y W d   ƒ d S w W d   ƒ n1 s4w   Y  g }tj |d¡}t tj |d¡¡D ]}tj ||¡}| 	|¡ qLˆ j
 ||¡ d S )Nc                    s"   g | ]}|j  ˆ jd  ¡r|‘qS )zvar/lib/apt-clone/debs/)rM   r³   rÎ   )rv   r£   ©r   r   r   ry   Ÿ  s   " z;AptClone._restore_not_downloadable_debs.<locals>.<listcomp>rÇ   z*.deb)rW   r   rF  Ú
extractallr)  r   r   rP   rƒ   rÜ   r>   r   )	r   rÕ   r   rg   ÚdebsdirÚdebsr   ÚdebÚdebpathr   rH  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 ])}|js>|jr?q6d	}d
D ]}|j d| ¡rUd||f } nqC|r\||_q6||_q6tj 	|ddd¡}	tj d¡}
tj |	¡r©t|	dƒ"}|D ]}|||
ƒ}|jsŽ|jsŽ||vr”|j
 |¡ q}W d   ƒ n1 sŸw   Y  t |	¡ |j
D ]}|j d¡rÄ|j
 |¡ |j
 d|¡ d|_q¬| ¡  d S )Nr   )r  ÚSourceEntryr­   r  r@   r  r®   zsources.list.dr‡   )ÚupdatesÚsecurityÚ	backportsz-%sz%s-%szsources.list.apt-cloneÚrzcdrom:T)r%  r  rN  rS   rU   r;   r   r   ÚabspathrP   r&  ÚinvalidÚdisabledÚdistrR   r¥   r   r   rÜ   r-  r'  r³   r   r(  )r   r   r  r  rN  rÂ   r,  ÚreplacementÚpocketr*  Ú
sourcelistrí   rÄ   Úsrcr   r   r   r  ª  sV   þþþÿ
€ýÿ

€zAptClone._rewrite_sources_listr‡   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 d   ƒ n1 sHw   Y  q$tƒ }t  |¡D ] \}	}
}|D ]}t j |	t|ƒd … |¡}||vru| |¡ q]qV|S )	Nr  z/etcrL   r‚   z*.listr‹   )Úencodingz/etc/)r   r   rP   r;   r  rS   rU   rà   rƒ   r   r³   r(   rÓ   Úwalkr˜   )r   ra   ÚetcdirÚownedÚdpkg_basedirr   rí   rÄ   ÚunownedÚdirpathÚdirnamesÚ	filenamesrM   Úfullnamer   r   r   Ú_find_unowned_in_etcÔ  s.   
€þÿ€
€ýzAptClone._find_unowned_in_etcc                 C   sR  |t j d¡ }tƒ }t|ƒ}t  |¡}|D ]}d|v r–|d  d¡D ]q}d }t| ¡ ƒdkr8| ¡ \}	}
}n| ¡ \}	}
||	 }|
 ¡ }
|dkrKq$t	j
 |¡s^t d| ¡ | |¡ q$t ¡ }t|dƒ}| | ¡ ¡ W d   ƒ n1 syw   Y  | ¡ |
kr•t d|| ¡ |
f ¡ | |¡ q$qW d   ƒ |S 1 s¢w   Y  |S )	NrL   Ú	conffilesru   é   Úobsoletezconffile %s removedrº   zconffile %s (%s != %s))rS   rU   rp   r;   r   ÚTagFilerÔ   r˜   rÓ   r   r   r   r>  Údebugr(   ÚhashlibÚmd5r  rÞ   Ú	hexdigest)r   ra   r¦   Úmodifiedrí   Útagr,  rÄ   rh  rM   Úmd5sumr   rl  r   r   r   Ú_find_modified_conffilesê  sD   


ÿ
ÿ
€æ
þãz!AptClone._find_modified_conffilesc                 C   s   t dƒ d S )Nznot implemented yet)rô   )r   ra   r   r   r   Ú_dump_debconf_database  s   zAptClone._dump_debconf_database)NNN)FFFN)F)r
   )r
   NNFNr4   )FN)r‡   )(r5   r6   r7   r8   r   ro   rQ   rÎ   rJ   rh   rr   rX   r^   rY   r_   rZ   r\   r]   r[   r±   rÆ   r`   rÏ   r×   rå   r‚   rñ   r  r  r  r	  r
  r  r  r  r  r  re  rq  rr  r   r   r   r   r9   ]   sT    
ÿ
þ 	
$	
		(	
K
ÿ
&

@	
*
#r9   )Ú
__future__r   r@   Ú	apt.cacher   rS   rè   r/  rƒ   rk  r>  r%   r   r¿   rÉ   r   r   rW   r|   rš   Úior   r   ÚenvironrU   r;   Úobjectr   r9   r   r   r   r   Ú<module>   s0   
0