
    9me                        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j0                  v r8ej2                  j5                  dd       ej2                  j5                  dd        G d	 d
e      Z G d de      Zy# e$ r dZY w xY w)    )print_functionN)FetchFailedException)BytesIOopenAPT_CLONE_DEBUG_RESOLVERzDebug::pkgProblemResolver1zDebug::pkgDepCache::AutoInstallc                   :    e Zd ZdZdZd Zd Zd
dZd Zd Z	d	 Z
y)LowLevelCommandszN calls to the lowlevel operations to install debs
        or repack a deb
    z/usr/bin/dpkg-repackc                     |syddg}|dk7  r$|j                  dd       |j                  d|       t        j                  ||z         }|dk(  S )NTdpkgz-i/r   chroot   )insert
subprocesscall)selfdebfiles	targetdirinstall_cmdrets        7/usr/lib/python3/dist-packages/DistUpgrade/apt_clone.pyinstall_debszLowLevelCommands.install_debs6   sV    tnq(+q),ookH45q    c                 Z   t         j                  j                  | j                        st	        d| j                  z        | j                  g}t        j
                         dk(  s't         j                  j                  d      syddg|z   }t        j                  ||gz   |      }|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   s        r   
repack_debzLowLevelCommands.repack_deb@   s    ww~~d..//D,<,<<==&&'
yy{a77>>"56$d+j8JoojG94)Dqr   Nc                     |t         rt        j                         d   }|t        j                  d      }t        j                  d||g      }|dk(  S )NCODENAMEzlsb_release --codename --shortdebootstrapr   )lsb_releaseget_distro_informationr   	getoutputr   )r   r   distror   s       r   r)   zLowLevelCommands.debootstrapL   sQ    >k 779*EF>))*JKFoo}fi@Aqr   c                 @    t        j                  dd|d|g      }|dk(  S )Nzapt-keyz	--keyringaddr   r   r   )r   fromkeyfileintokeyfiler   s       r   
merge_keyszLowLevelCommands.merge_keysT   s*    ooy+{$k3 4qr   c                 >    t        j                  dd||g      }|dk(  S )Nmountz--bindr   r0   )r   olddirnewdirr   s       r   
bind_mountzLowLevelCommands.bind_mountY   s#    oow&&ABqr   c                 :    t        j                  d|g      }|dk(  S )Numountr   r0   )r   binddirr   s      r   bind_umountzLowLevelCommands.bind_umount]   s    oox12qr   N)__name__
__module____qualname____doc__r!   r   r&   r)   r3   r8   r<    r   r   r
   r
   0   s,     )K

r   r
   c                   "   e Zd ZdZd ej
                         d   z  ZdZ	 	 d&dZ	 	 d'dZ	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd(dZd Zd Zd Zd Zd Zd Zd Zd Zd)dZ	 	 d*dZd+dZd+dZd Zd,dZ d Z!d  Z"d! Z#d" Z$d-d#Z%d)d$Z&d% Z'y).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                 x   t               | _        t               | _        t               | _        |r|| _        n-t        j                  j                  j                         | _        |r|| _
        n-t        j                  j                  j                         | _
        |r|| _        y t        j                  | _        y r=   )setnot_downloadableversion_mismatchr
   commandsfetch_progressaptprogresstextAcquireProgressinstall_progressbaseInstallProgress
_cache_clsCache)r   rK   rP   	cache_clss       r   __init__zAptClone.__init__m   s     # #(*"0D#&<<#4#4#D#D#FD$4D!$'LL$5$5$E$E$GD! 'DO!iiDOr   c                 r   t         j                  j                  |      r+t         j                  j                  || j                        }n|j                  d      s|dz  }|dk7  rt        j                          t        j                  j                  d|       t        j                  j                  dt         j                  j                  |d             t        j                          t        j                  |d      5 }| j                  |       | j                  ||       | j                  |       | j!                  ||       | j#                  |       | j%                  |       | j'                  ||       |r| j)                  |       |r| j+                  |       d	d	d	       y	# 1 sw Y   y	xY w)
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configrG   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tars           r   
save_statezAptClone.save_state   sQ    77== WW\\&$*=*=>F??9---!NNui0NN3!ww||I7LMO!\\vF3 	'sc",,Y<,,S1**3>--c2))#.))+s;--c2!!#&	' 	' 	's   B!F--F6c                     t        j                         d   t        j                         d   t        j                         d   t        j                  j	                  d      d}|S )Nr         zAPT::Architecture)hostnamekernel
uname_archarch)r   unamer`   rb   find)r   	host_infos     r   _get_host_info_dictzAptClone._get_host_info_dict   sK    %'XXZ]&(hhjm&(hhjm&-nn&9&9:M&N	
 r   c           	      L   | j                         }t        j                  d      }dj                  |j	                         D cg c]  \  }}|d| c}}      }|j                  |dz          |j                          |j                  |j                  d       y c c}}w )Nwr[   
z: z./var/lib/apt-clone/unamearcname)	r   tempfileNamedTemporaryFiler]   itemswriteflushr/   rZ   )r   rt   r   fkeyvalueinfos          r   re   zAptClone._write_uname   s    ,,.	''S1yy.7oo.?A*sE '*51 A B	T			 ;<	As   B 
c                 x    |y |D ]2  }t        j                   |      D ]  }|j                  |d|z           4 y )Nz./extra-filesr   )globr/   )r   rs   rt   pr   s        r   rk   z!AptClone._write_state_extra_files   sF     	6AYYq\ 6?1#456	6r   c           	      >   | j                  |      }d}d}t        rt        j                         d   }nt        j                  d      }|D ]z  }|j
                  s||j                  d|j                  j                  dt        |j                        dz  }|j                  r|j                  j                  s&| j                  j                  |j                         nQ|j                  j                  r|j                  j                  s%| j                  j                  |j                         |j                  j                   D ]y  }|j"                  dk(  r|j$                  dk(  r"|j$                  |k7  rG||j                  d|j                  j                  d|j$                  dk7  r|j$                  nddz  } z } t'        j(                  d	      }	|j+                  d
      }t-        |      |	_        t1        j0                         |	_        |j5                  |	t7        |             t'        j(                  d      }	|j+                  d
      }t-        |      |	_        t1        j0                         |	_        |j5                  |	t7        |             y )Nrootdir IDzlsb_release --id --short r   nowunknownz"./var/lib/apt-clone/installed.pkgsutf-8z ./var/lib/apt-clone/foreign.pkgs)rS   r*   r+   r   r,   is_installedrZ   	installedversionintis_auto_installed	candidatedownloadablerH   r/   rI   originsarchiveoriginrd   TarInfoencodelensizetimemtimeaddfiler   )
r   rn   rt   cachesforeign	distro_idpkgotarinfos
             r   rf   z$AptClone._write_state_installed_pkgs   s   	2#::<TBI",,-GHI 	CHHcmm33S9N9N5OQ Q}}CMM,F,F))--chh7--44--44))--chh7.. AyyE)ahh"n xx9,HHcmm&;&;()BAHHIE$G G 	& //"FGHHW1v		GWQZ(//"DE..)7|		GWW-.r   c                 h    t         j                  j                  d      }|j                  |d       y )Ndir::state::statusz./var/lib/apt-clone/dpkg-statusr   )r`   rb   	find_filer/   )r   rt   dpkg_statuss      r   rl   z!AptClone._write_state_dpkg_status   s*     nn../CD%FGr   c                     t         j                  j                  d      }t        j                  j                  |      r|j                  |d       y y )NzDir::State::extended_statesz#./var/lib/apt-clone/extended_states)r`   rb   r   r   r   r    r/   )r   rt   extended_statess      r   rg   z$AptClone._write_state_auto_installed   s=    !..22)+77>>/*GGO%JK +r   c                 L   t         j                  j                  d      }t        j                  j                  |      r|j                  |d       t         j                  j                  dd      }t        j                  j                  |      r|j                  |d       y y )NzDir::Etc::preferencesz./etc/apt/preferencesr   zDir::Etc::preferencespartsz/etc/apt/preferences.dz./etc/apt/preferences.dr`   rb   r   r   r   r    r/   find_dirr   rt   r   r   s       r   ri   z%AptClone._write_state_apt_preferences   sx    NN$$%<=77>>!GGA6G7NN##$@$<>77>>!GGA8G9 r   c                 L   t         j                  j                  d      }t        j                  j                  |      r|j                  |d       t         j                  j                  dd      }t        j                  j                  |      r|j                  |d       y y )NzDir::Etc::trustedz./etc/apt/trusted.gpgr   zDir::Etc::trustedpartsz/etc/apt/trusted.gpg.dz./etc/apt/trusted.gpg.dr   r   s       r   rj   z!AptClone._write_state_apt_keyring   sx    NN$$%8977>>!GGA6G7NN##$<$<>77>>!GGA8G9 r   c                 *   t         j                  j                  d      }| j                  |||d       t         j                  j	                  d      }t
        j                  j                  |      r|j                  |dd       t        j                  |      D ]u  }|j                  d      r|j                  d      s|j                  d	      s8|d
|}t
        j                  j                  |      r_| j                  |||d|z          w y y )NDir::Etc::sourcelistz./etc/apt/sources.listDir::Etc::sourcepartsz./etc/apt/sources.list.dF)r   	recursive.z.listz.sourcesr   z./etc/apt/sources.list.d/)r`   rb   r   $_add_file_to_tar_with_password_checkr   r   r   r    r/   listdir
startswithr_   r\   )r   rt   scrubsources_listsource_partssourcesources_file_names          r   rh   z"AptClone._write_state_sources_list  s    ~~//0FG11#|U$	&~~../FG77>>,'GGL*D#  %**\2 
8$$S)0FOOJ4O/;V$D!77==!2399#%u/68
8 (r   c                 *   |rt        j                  d      5 }t        |d      5 }|j                         D ]  }t	        |      t
        u r|j                  d      }t        j                  d|      rt        j                  dd|      }|j                  |j                  d             |j                           |j                  |j                  |       d d d        d d d        y |j                  ||       y # 1 sw Y   &xY w# 1 sw Y   y xY w)	Nwbr   rbzUTF-8z/[^/@:]*:[^/@:]*@z/USERNAME:PASSWORD@r   r   )r   r   r   	readlinestypebytesdecoderesearchsubr   r   r   r/   rZ   )r   rt   sourcesr   r   source_copyr   lines           r   r   z-AptClone._add_file_to_tar_with_password_check  s    ,,$7 ;;WVZH[ ;_`KKM (DDzU*#{{73yy!4d;!vv&914 9  %%dkk'&:;%%'( ((':; ; ;  GGGWG-!; ; ; ;s#   D	B2C=D	=D	D		Dc                      y r=   rB   r   rt   s     r   _write_modified_files_from_etcz'AptClone._write_modified_files_from_etc-  s    r   c                     t        j                         }| j                  D ]  }| j                  j	                  ||         |j                  |d       t        j                  |       y )N./var/lib/apt-clone/debsr   )r   mkdtemprH   rJ   r&   r/   shutilrmtree)r   rt   tdirr$   s       r   rm   zAptClone._dpkg_repack1  sV    !,, 	4GMM$$Wd3	489dr   c                 f    |j                         d   j                  d      rd| _        y d| _        y )NrE   r   )getnamesr   	TARPREFIXr   s     r   _detect_tarprefixzAptClone._detect_tarprefix:  s)    <<>"((.!DNDNr   c                    t        j                  |      5 }| j                  |       |j                  | j                  dz         }|j                         D ]{  }|j                  d      }|j                  d      s|j                         dk(  r9|j                         }t        |      dkD  sX|d   j                  d      rm|d   c cd d d        S  	 d d d        y # 1 sw Y   y xY w)Nzetc/apt/sources.listr   #r   rw   r   )rd   r   r   extractfiler   r   r   r   stripsplitr   r_   )r   	statefilert   r   r   ls         r   _get_info_distrozAptClone._get_info_distroB  s    \\)$ 
	 ""3'/E EFA  {{7+??3'4::<2+=JJLq6A:admmC&8Q4K
	  
	  	
	  
	  s   BC.CCCC'c           	         | j                  |      xs d}t        j                  |      5 }|j                  | j                  dz         }dx}}g }|j                         D ]m  }|j                  d      }|j                         j                         \  }	}
}|dz  }t        |      r|dz  }|	j                  d      s]|j                  |	       o |j                  | j                  dz         }|j                  }d}d}| j                  dz   |j                         v re|j                  | j                  dz         j                         }t!        j"                  |      }|j%                  dd      }|j%                  d	d      }||d
j'                  |      ||t)        j*                  |      |dcd d d        S # 1 sw Y   y xY w)Nr    var/lib/apt-clone/installed.pkgsr   r   r   z-desktopzvar/lib/apt-clone/unamery   r|   z, )ry   r-   metar   autoinstalleddater|   )r   rd   r   r   r   r   r   r   r   r   r_   append	getmemberr   r   readr`   
TagSectiongetr]   r   ctime)r   r   r-   rt   r   r   r   r   r   rZ   r   automr   ry   r|   r   sections                     r   _get_clone_info_dictzAptClone._get_clone_info_dictP  s   &&y1>Y\\)$ #	!CCEA())ID 	&{{7+(,

(:(:(<%wQ	t9!Q&M ==,KK%	& !CCEA77D HD~~773<<>INN%>>@@D !,,T2";;z9={{695"* &"iio#,'4"jj."9#	 #	 #	s   BF7=C0F77G c                 *    d| j                  |      z  S )NzHostname: %(hostname)s
Arch: %(arch)s
Distro: %(distro)s
Meta: %(meta)s
Installed: %(installed)s pkgs (%(autoinstalled)s automatic)
Date: %(date)s
)r   )r   r   s     r   r   zAptClone.infox  s#    "
 %)$=$=i$HI 	Ir   c                 H   t        j                  |      5 }| j                  |       |j                  | j                  |dd  z         }g }|j                         D ]"  }|j                  |j                  d             $ 	 d d d        ||z   }t        j                  j                  |      r%t        |      5 }|j                         }	d d d        ng }	t        j                  	d|z  |      }
g }|
D ]  }|j                  |        |S # 1 sw Y   xY w# 1 sw Y   MxY w)Nr   r   zcurrent-system%s)fromfiletofile)rd   r   r   r   r   r   r   r   r   r   r    difflibunified_diff)r   r   system_filer   rt   
clone_fileclone_file_linesr   fpsystem_file_linesgendiffs               r   _get_file_diff_against_clonez%AptClone._get_file_diff_against_clone  s#   \\)$ 	>""3'AB)GHJ! #,,. > ''G(<=>	>  +77>>+&k" 3b$&LLN!3 3 !#""/'+5kK  	DKK	)	> 	>3 3s   A*D8DDD!c                    |dk7  r t         j                  j                  d|       t        d       | j	                         }| j                  |      }|D ]]  }|j                  |d       |j                  |d       k7  s)t        d|d|j                  |d       d|j                  |d       d       _ t        d       d	}| j                  |||      }|rt        dj                  |             | j                  |
      }t        j                  |      5 }	|	j                  | j                  dz         }
i }|
j                         D ]S  }|j                         j!                  d      }|j#                  d      s|dk(  r9|j%                         \  }}}||f||<   U 	 d d d        i }|D ]G  }|j&                  s|j&                  j(                  t+        |j,                        f||j.                  <   I t        |j1                               t        j1                               z
  }|r9t        d       t        dj                  t3        |                   t        d       t        |j1                               t        |j1                               z
  }|r9t        d       t        dj                  t3        |                   t        d       t               }t3        |      D ]1  }||vr||   \  }}||   \  }}||k7  s|j5                  |||f       3 |r7t        d       t        d       |D ]  \  }}}t        d|d|d|d        y y # 1 sw Y   xY w)Nr   DPkg::Chroot-DirectoryzClone info differences: z 'z
': clone='z
' system=''r   z/etc/apt/sources.listr   r   r   r   z2Installed on the system but not in the clone-file:r   r   z2Installed in the clone-file but not in the system:zVersion differences: z-Pkgname <clone-file-version> <system-version>z  <z>   <>)r`   rb   rG   printr   r   r   r  r]   rS   rd   r   r   r   r   r   r   r   r   r   r   strr   rZ   keyssortedr/   )r   r   r   r   
clone_infor   sources_list_systemr
  r   rt   r   installed_in_cloner   rZ   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_vers                               r   	show_diffzAptClone.show_diff  s>   NN7C 	(),,.	..y9
 	3C}}S$':>>#t+DDZ^^C6!c402 3	3
 	b	 600*I7"''$-  	2\\)$ 
	;!CCEA "$ ;zz|**73??3'42:(,

%w,3T?"4(;
	; ! 	CC==%%s3+@+@'A-C)	C 055783?Q?V?V?X;YYFG#((6.123$K/4467#>Q>V>V>X:YYFG#((6-012$K "%01 	IG113Eg3N0!=-@-I*{$(99&**35FGI	I ")*AB2H M.JGY
KLM "Q
	; 
	;s   BMMc                 6   |dk7  rt         j                  j                  d|       | j                  j	                  dt
        j                  j                  |d             | j                  j	                  dt
        j                  j                  |d             t        j                  |      5 }| j                  |       ddd       t
        j                  j                  |      s;t        d|z         | j                  |      }| j                  j                  ||       | j                  |||	       | j!                  ||       |r| j#                  ||       | j%                  ||||       | j'                  ||       | j)                  ||       |dk7  rs| j                  j+                  t
        j                  j                  |d             | j                  j+                  t
        j                  j                  |d             yy# 1 sw Y   OxY w)
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)r`   rb   rG   rJ   r8   r   r   r]   rd   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%  rt   r-   s	            r   restore_statezAptClone.restore_state  s    NN7CMM$$Wbggll9f.MNMM$$VRWW\\)U-KL \\)$ 	(""3'	( ww~~i(DyPQ**95FMM%%i8""9i"G!!)Y7&&y*=''	9>OQ]^ 	++IyA!!)Y7 MM%%bggll9f&EFMM%%bggll9e&DE )	( 	(s   /HHc                    t        j                         }t        j                  j	                  d      }t
        j                  j                  |t
        j                  j                  |      z         s5t        j                  |t
        j                  j                  |      z          t        j                  |||z          | j                  ||       |r| j                  ||       | j                  |      }	 |j                  t         j"                  j$                  j'                                |j+                          | j-                  |||      }t        j.                  |       |S # t(        $ r Y Fw xY w)Nr   r   )r,  )r   r   r`   rb   r   r   r   r    dirnamemakedirsr   copyr&  r(  rS   updaterL   rM   rQ   rO   r   r   #_restore_package_selection_in_cacher   )r   r   r,  r-  ro   r   r   missings           r   simulate_restore_statezAptClone.simulate_restore_state	  s   !!#nn../CDww~~fRWW__[%AABKKrww{;;<K!34""9f5&&vz:/	LL**::<=
 	

::9eZf:gf $ 	 	s   :7E, ,	E87E8c                 X   t        j                  |      5 }t        j                  j	                  |ddd      }t        j                  j                  |      rt        j                  |d|z         |j                  |       t        j                  j	                  |ddd      }t        j                  |t        j                  t        j                  z  t        j                  z  t        j                  z         |rddlm}m} t$        j&                  j)                  d|        |d	      }	|	j*                  d d  D ]G  }
|
j,                  s|
j.                  rt1        |
|      r	|g|
_        1|
j4                  |k7  sA||
_        I |	j7                          d d d        y # 1 sw Y   y xY w)
NetcrL   sources.list%s.apt-cloner   )SourcesListDeb822SourceEntryr   Tdeb822)rd   r   r   r   r]   r    r   r3  
extractallchmodstatS_IRUSRS_IWUSRS_IRGRPS_IROTHaptsources.sourceslistr<  r=  r`   rb   rG   listinvaliddisabled
isinstanceurisurisave)r   r   r   r%  rt   existing
td_sourcesr<  r=  r   entrys              r   r&  zAptClone._restore_sources_list"  s4   \\)$ 	ww||Iue^LHww~~h'Hnx&?@NN9%i~NJHHZ!<t||!K\\"" #Q""#9:F%T2$\\!_ .E}} !%):;&,X
 99.'-59. +	 	 	s   E'F >F  F)c                 l   t         j                  j                  |ddd      }d|z  }t         j                  j                  |      rt	        j
                  ||       t        j                  |      5 }	 |j                  | j                  dz   |       	 |j                  | j                  dz   |       t         j                  j                  |      r1| j                  j                  ||       t        j                  |       d d d        y # t        $ r Y w xY w# t        $ r Y sw xY w# 1 sw Y   y xY w)Nr9  rL   ztrusted.gpgr;  zetc/apt/trusted.gpgzetc/apt/trusted.gpg.d)r   r   r]   r    r   r3  rd   r   extractr   KeyErrorrJ   r3   remove)r   r   r   rO  backuprt   s         r   r'  zAptClone._restore_apt_keyring:  s    77<<	5%G(*77>>(#KK&)\\)$ 	"DNN+@@)LDNN+BBIN ww~~f%((:		&!	" 	"    	" 	"sO   2D*4DD3AD*	DD*DD*	D'$D*&D''D**D3c                 D   |g }t        |      }t               }t               }t        j                  |j                        }|r/|D ]*  }|j                  s|j                  |j                         , t        j                  |      5 }	|	j                  | j                  dz         }
|j                         5  |
j                         D ]  }|j                         j                  d      }|j                  d      s|dk(  r9|j!                         \  }}}d } |||      rZ|j#                  |       t%        |      }| }||v s~	 |rR||   j'                  |d       |j(                  dkD  rB|j+                          ||   j,                  s#t/        d	|z        ||   j'                  |
       ||   j5                  |        	 d d d        d d d        |j(                  dkD  r|j+                          |D ]I  }||vr|j#                  |       ||   j                  r)||   j,                  r9|j#                  |       K |S # t.        $ r7}t1        j2                  d|d|d       |j#                  |       Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr   r   r   r   c                 B    |D ]  }t        j                   | |      s y y )NT)fnmatch)rZ   r,  excls      r   is_excludedzAAptClone._restore_package_selection_in_cache.<locals>.is_excludedf  s"    $0 ,D&tT:'+,r   F)	from_userauto_fixr   zpkg %s not marked upgrade)r\  z
can't add  ())rG   r`   ProblemResolver	_depcacher   protect_pkgrd   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,  r6  pkgsresolverr   rt   r   r   rZ   r   r   r[  auto_installedr\  es                      r   r5  z,AptClone._restore_package_selection_in_cacheL  sw   L<(%u**5??; /##$$SXX./ \\)$ $	>!CCEA ""$  >KKM >D::<..w7Ds+trz ,0JJL)T7D, #46 HHTN%(YN$2 2Iu}.0 %d 8 89W\ 8 ]#(#5#5#9$,$4$4$6+0;+E+E.9:UX\:\.](] !&d 8 89 8 M
 d--n=?> >	$	>L ! 	!C%<C #J++uSz/H/HC 	!   + .#OO4,KL#KK--.9 >  >	$	> $	>sP   	/J8BJ
A)I1J
J	J	-J	=J
J	J

J	JJc                    | j                  |      }t        j                  j                  j	                  dd       t        j                  j                  j	                  dd       	 |j                  | j                         |j                          | j                  ||||       |j                  | j                  | j                         y # t        $ r Y Vw xY w)Nr   zDir::Binr   zDir::Bin::dpkgz/usr/bin/dpkg)rS   rL   r`   rb   rG   r4  rK   r   r   r5  commitrP   )r   r   r   r.  r,  r   s         r   r)  z#AptClone._restore_package_selection  s    	2z3//A	LL,,-
 	

00ECTVbcT(($*?*?@ $ 	 	s   (C 	CCc                 8   t        j                  |      5 }|j                         D ]\  }| j                  dz   }|j                  j                  |      s.|j                  t        |      d  |_        |j                  ||       ^ 	 d d d        y # 1 sw Y   y xY w)Nzextra-files/)rd   r   
getmembersr   rZ   r   r   rS  )r   r   r   rt   r   prefixs         r   r+  zAptClone._restore_extra_files  s    \\)$ 	.^^% .666$$V,VVCKL1AFKK9-.	. 	. 	.s   >B1BBc                    t        j                  |      5 }	 |j                         D cg c]-  }|j                  j	                  | j
                  dz         s,|/ }}|j                  ||       	 d d d        g }t        j                  j                  |d      }t        j                  t        j                  j                  |d            D ]3  }t        j                  j                  ||      }	|j                  |	       5 | j                  j                  ||       y c c}w # t        $ r Y d d d        y w xY w# 1 sw Y   xY w)Nzvar/lib/apt-clone/debs/r   z*.deb)rd   r   rt  rZ   r   r   r@  rT  r   r   r]   r   r   rJ   r   )
r   r   r   rt   r   debsdirdebsr   debdebpaths
             r   r*  z'AptClone._restore_not_downloadable_debs  s    \\)$ 	36>>3C  Jw||G^G^_c_m_m  oH  `H  HIG  J  Jy1	 ww||I'AB99RWW\\$89 	!Cggll4-GKK 	! 	""43 J 	 			 	s?   D=D&-D!D!D&!D&&	D:/D=9D::D==Ec                 b   ddl m}m}m} t        j
                  j                  dt        j                  j                  t        j                  j                  |ddd                   t        j
                  j                  dt        j                  j                  t        j                  j                  |ddd                    |d	
      }|j                  d d  D ]  }|j                  s|j                  rt        ||      rC|j                  D cg c]'  } dj                   |g|j#                  d      dd   ) c}|_        kd}	dD ])  }
|j$                  j'                  d|
z        s"|d|
}	 n |	r|	|_        ||_         t        j                  j                  |ddd      }t        j
                  j)                  d      }t        j                  j+                  |      rst-        |d      5 }|D ]C  } |||      }|j                  s|j                  s||vs)|j                  j/                  |       E 	 d d d        t        j0                  |       |j                  D ]  }t        ||      r5|j2                  D cg c]  }|j5                  d      s| c}s<d	|_        D|j6                  j5                  d      s`|j                  j1                  |       |j                  j9                  d|       d	|_         |j;                          y c c}w # 1 sw Y   xY wc c}w )Nr   )r<  SourceEntryr=  r   r9  rL   r:  r   zsources.list.dTr>  z{}{}{}-r   r   )updatessecurity	backportsz-%szsources.list.apt-clonerzcdrom:)rG  r<  r|  r=  r`   rb   rG   r   r   abspathr]   rH  rI  rJ  rK  suitesformat	partitiondistr_   r   r    r   r   rU  rL  r   rM  r   rN  )r   r   r-  r<  r|  r=  r   rQ  r   replacementpocketrO  
sourcelistr  r   srcus                    r   r(  zAptClone._rewrite_sources_list  s   VV"GGOOBGGLLE5.QR	T 	#GGOOBGGLLE5BRST	V T*\\!_ 	,E}}%!23 #\\  $HOOJFS1A!"1EF 
 !B Fzz**56>:1;V&D !,EJ!+EJ%	,( 77<<	5% 8:^^--.DE
77>>(#h$ 1 1D%dJ7Cs||78J++C011
 IIh\\ 	*E%!23  %zzD!Q\\(-CAD%)EN99''1LL''.LL''51%)EN	* 	O &1 1 Es$   ,L7+L #L L,L, L)c                    |r!t         j                  j                  |d      }nd}t               }t         j                  j	                  t
        j                  j                  d            }t        j                  t         j                  j                  |dd            D ]Q  }t        |d      5 }|D ]3  }|j                  d      s|j                  |j                                5 	 d d d        S t               }t        j                  |      D ]O  \  }	}
}|D ]D  }t         j                  j                  |	t        |      d  |      }||vs4|j                  |       F Q |S # 1 sw Y   xY w)	Nr9  z/etcrY   r   z*.listr   )encodingz/etc/)r   r   r]   rG   r1  r`   rb   r   r   r   r   r/   r   walkr   )r   rn   etcdirowneddpkg_basedirr   r  r   unowneddirpathdirnames	filenamesrZ   fullnames                 r   _find_unowned_in_etczAptClone._find_unowned_in_etc  s3   WW\\)U3FFwww~~'9'9:N'OP277<<fhGH 	0Aa'* 0b 0Dw/		$**,/00 0	0 %,.GGFO 	*(GXy! *77<<I(@$G5(KK)*	*
 0 0s   0E'!E''E0	c                    |t         j                  j                  d      z   }t               }t	        |      5 }t        j
                  |      }|D ]h  }d|v s	|d   j                  d      D ]H  }d }t        |j                               dk(  r|j                         \  }	}
}n|j                         \  }	}
||	z   }|
j                         }
|dk(  ret        j                  j                  |      s*t        j                  d|z         |j                  |       t        j                          }t	        |d      5 }|j#                  |j%                                d d d        |j'                         |
k7  st        j                  d|d	|j'                         d
|
d       |j                  |       K k 	 d d d        |S # 1 sw Y   mxY w# 1 sw Y   |S xY w)NrY   	conffilesr      obsoletezconffile %s removedr   z	conffile r^  z != r_  )r`   rb   r~   rG   r   TagFiler   r   r   r   r   r    rj  debugr/   hashlibmd5r4  r   	hexdigest)r   rn   r   modifiedr  tagrQ  r   r  rZ   md5sumr   r  s                r   _find_modified_conffilesz!AptClone._find_modified_conffiles  s    3 34H II5+ 	/"//"%C /%' %k 2 8 8 > /#'tzz|,159ZZ\2D&(+/::<LD&(~!'#z1$!ww~~d3#MM*?$*FG$LL.$%kkm!$- 2JJrwwy12==?f4#MM$(#--/6+C D$LL.1//	/: 2 2/	/: s1    GC"G; G	G8AGGGGc                     t        d       y )Nznot implemented yet)r  )r   rn   s     r   _dump_debconf_databasezAptClone._dump_debconf_database%  s    #$r   )NNN)FFFN)F)r   )r   NNFNr=   )FN)r   )(r>   r?   r@   rA   r   r}   r^   r   rV   ru   r   re   rk   rf   rl   rg   ri   rj   rh   r   r   rm   r   r   r   r   r  r!  r/  r7  r&  r'  r5  r)  r+  r*  r(  r  r  r  rB   r   r   rD   rD   b   s     18288:a=@NI=A(2 =B48'@=6%/NHL::8(.( &PI.GMV DHGK#FL20"$>@A".46p,!F%r   rD   )
__future__r   rL   	apt.cacher   r`   r  rY  r   r  rj  r*   ImportErrorr   r   r   rB  r   rd   r   r   ior   r   environrb   rG   objectr
   rD   rB   r   r   <module>r     s   & & 
 *       
 	       +NN2C8NN8#>/v /dD%v D%G  Ks   B3 3B=<B=