9meddlmZddlZddlmZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlmZmZde j0vr8ej2j5ddej2j5ddGd d eZGd d eZy#e $rdZ YwxYw) )print_functionN)FetchFailedException)BytesIOopenAPT_CLONE_DEBUG_RESOLVERzDebug::pkgProblemResolver1zDebug::pkgDepCache::AutoInstallc:eZdZdZdZdZdZd dZdZdZ d Z y) LowLevelCommandszN calls to the lowlevel operations to install debs or repack a deb z/usr/bin/dpkg-repackc|syddg}|dk7r$|jdd|jd|tj||z}|dk(S)NTdpkgz-i/rchroot)insert subprocesscall)selfdebfiles targetdir install_cmdrets 7/usr/lib/python3/dist-packages/DistUpgrade/apt_clone.py install_debszLowLevelCommands.install_debs6sVtn     q( +   q) ,ookH45qcZtjj|jst d|jz|jg}tj dk(s'tjjdsyddg|z}t j||gz|}|dk(S)z$ dpkg-repack pkgname into targetdir z no '%s' foundrz/usr/bin/fakerootNfakerootz-u)cwd)ospathexists dpkg_repackIOErrorgetuidrr)rpkgnamer repack_cmdrs r repack_debzLowLevelCommands.repack_deb@sww~~d..//D,<,<<= =&&' yy{a77>>"56$d+j8JoojG94)DqrNc|trtjd}|tjd}tjd||g}|dk(S)NCODENAMEzlsb_release --codename --short debootstrapr) lsb_releaseget_distro_informationr getoutputr)rrdistrors rr)zLowLevelCommands.debootstrapLsQ >k 779*EF >))*JKFoo}fi@Aqrc@tjdd|d|g}|dk(S)Nzapt-keyz --keyringaddrrr)r fromkeyfile intokeyfilers r merge_keyszLowLevelCommands.merge_keysTs*ooy+{$k34qrc>tjdd||g}|dk(S)Nmountz--bindrr0)rolddirnewdirrs r bind_mountzLowLevelCommands.bind_mountYs#oow&&ABqrc:tjd|g}|dk(S)Numountrr0)rbinddirrs r bind_umountzLowLevelCommands.bind_umount]soox12qrN) __name__ __module__ __qualname____doc__r!rr&r)r3r8r<rrr r 0s,)K  rr c"eZdZdZdej dzZdZ d&dZ d'dZ dZ d Z d Z d Z d Zd ZdZdZd(dZdZdZdZdZdZdZdZdZd)dZ d*dZd+dZd+dZdZd,dZ dZ!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. zapt-clone-state-%s.tar.gzr./Ncxt|_t|_t|_|r||_n-t jjj|_|r||_ n-t jjj|_ |r||_ yt j|_ yr=)setnot_downloadableversion_mismatchr commandsfetch_progressaptprogresstextAcquireProgressinstall_progressbaseInstallProgress _cache_clsCache)rrKrP cache_clss r__init__zAptClone.__init__ms # #(* "0D #&<<#4#4#D#D#FD  $4D !$'LL$5$5$E$E$GD ! 'DO!iiDOrcrtjj|r+tjj||j}n|j ds|dz }|dk7rt jt jjd|t jjdtjj|dt jtj|d5}|j||j|||j||j!|||j#||j%||j'|||r|j)||r|j+|d d d y #1swYy xYw) 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 DirDir::State::statuszvar/lib/dpkg/statuszw:gz)namemodeN)rrisdirjoinCLONE_FILENAMEendswithapt_pkg init_configconfigrG init_systemtarfiler _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 sourcedirtargetwith_dpkg_repackwith_dpkg_status scrub_sources extra_filestars r save_statezAptClone.save_statesQ 77== WW\\&$*=*=>F??9---      ! NN  ui 0 NN  3!ww||I7LM O    ! \\vF 3 's   c "  , ,Y <  , ,S 1  * *3 >  - -c 2  ) )# .  ) )+s ;--c2!!#& ' ' 's B!F--F6ctjdtjdtjdtjj dd}|S)NrzAPT::Architecture)hostnamekernel uname_archarch)runamer`rbfind)r host_infos r_get_host_info_dictzAptClone._get_host_info_dictsK%'XXZ]&(hhjm&(hhjm&-nn&9&9:M&N rc L|j}tjd}dj|j Dcgc] \}}|d|c}}}|j |dz|j |j|jdycc}}w)Nwr[ z: z./var/lib/apt-clone/unamearcname) rtempfileNamedTemporaryFiler]itemswriteflushr/rZ)rrtrfkeyvalueinfos rrezAptClone._write_unames,,.  ' 'S 1yy.7oo.?A*sE'*51AB T     ;< AsB cx|y|D]2}tj|D]}|j|d|z4y)Nz ./extra-filesr)globr/)rrsrtprs rrkz!AptClone._write_state_extra_filessF    6AYYq\ 6?1#45 6 6rc >|j|}d}d}trtjd}ntjd}|D]z}|j s||j d|jjdt|jdz }|jr|jjs&|jj|j nQ|jjr|jjs%|jj|j |jj D]y}|j"dk(r|j$dk(r"|j$|k7rG||j d|jjd|j$dk7r |j$nddz }z}t'j(d } |j+d }t-|| _t1j0| _|j5| t7|t'j(d } |j+d }t-|| _t1j0| _|j5| t7|y) NrootdirIDzlsb_release --id --short rnowunknownz"./var/lib/apt-clone/installed.pkgsutf-8z ./var/lib/apt-clone/foreign.pkgs)rSr*r+rr, is_installedrZ installedversionintis_auto_installed candidate downloadablerHr/rIoriginsarchiveoriginrdTarInfoencodelensizetimemtimeaddfiler) rrnrtcachesforeign distro_idpkgotarinfos rrfz$AptClone._write_state_installed_pkgss 2  #::>/ * GGO%J K +rcLtjjd}tjj |r|j |dtjjdd}tjj |r|j |dyy)NzDir::Etc::preferencesz./etc/apt/preferencesrzDir::Etc::preferencespartsz/etc/apt/preferences.dz./etc/apt/preferences.dr`rbrrrr r/find_dirrrtrrs rriz%AptClone._write_state_apt_preferencessx NN $ $%< = 77>>!  GGA6G 7 NN # #$@$< > 77>>!  GGA8G 9 rcLtjjd}tjj |r|j |dtjjdd}tjj |r|j |dyy)NzDir::Etc::trustedz./etc/apt/trusted.gpgrzDir::Etc::trustedpartsz/etc/apt/trusted.gpg.dz./etc/apt/trusted.gpg.drrs rrjz!AptClone._write_state_apt_keyringsx NN $ $%8 9 77>>!  GGA6G 7 NN # #$<$< > 77>>!  GGA8G 9 rc*tjjd}|j|||dtjj d}t j j|r|j|ddt j|D]u}|jdr|jds|jd s8|d |}t j j|r_|j|||d |zwyy) NDir::Etc::sourcelistz./etc/apt/sources.listDir::Etc::sourcepartsz./etc/apt/sources.list.dF)r recursive.z.listz.sourcesr z./etc/apt/sources.list.d/) r`rbr$_add_file_to_tar_with_password_checkrrrr r/listdir startswithr_r\)rrtscrub sources_list source_partssourcesources_file_names rrhz"AptClone._write_state_sources_lists~~//0FG  11#|U $ &~~../FG 77>>, ' GGL*D#  %**\2 8$$S)0FOOJ4O/;V$D!77==!2399#%u/68 8 (rc*|rtjd5}t|d5}|jD]}t |t ur|j d}tjd|rtjdd|}|j|jd|j|j|j|ddddddy|j||y#1swY&xYw#1swYyxYw) NwbrrbzUTF-8z/[^/@:]*:[^/@:]*@z/USERNAME:PASSWORD@rr)rrr readlinestypebytesdecoderesearchsubrrrr/rZ)rrtsourcesrr source_copyrlines rrz-AptClone._add_file_to_tar_with_password_checks ,,$7 ;;WVZH[ ;_`KKM (DDzU*#{{73yy!4d;!vv&914 9  %%dkk'&:;%%' ( ((': ; ; ; GGGWG -! ; ; ; ;s# D B2C=D =D D  Dcyr=rBrrts r_write_modified_files_from_etcz'AptClone._write_modified_files_from_etc-s rctj}|jD]}|jj || |j |dt j|y)N./var/lib/apt-clone/debsr)rmkdtemprHrJr&r/shutilrmtree)rrttdirr$s rrmzAptClone._dpkg_repack1sV!,, 4G MM $ $Wd 3 4 89 drcf|jdjdrd|_yd|_y)NrEr)getnamesr TARPREFIXrs r_detect_tarprefixzAptClone._detect_tarprefix:s) <<>"  ( ( .!DNDNrctj|5}|j||j|jdz}|j D]{}|j d}|jds|jdk(r9|j}t|dkDsX|djdrm|dccdddS dddy#1swYyxYw)Nzetc/apt/sources.listr#rrwr ) rdrr extractfilerrrrstripsplitrr_)r statefilertrrls r_get_info_distrozAptClone._get_info_distroBs \\) $   " "3 '/E EFA  {{7+??3'4::<2+=JJLq6A:admmC&8Q4K   sBC.CCCC'c |j|xsd}tj|5}|j|jdz}dx}}g}|j D]m}|j d}|jj\} } } |dz }t| r|dz }| jds]|j| o|j|jdz} | j} d}d}|jdz|jvre|j|jdzj}t!j"|}|j%dd}|j%d d}||d j'|||t)j*| |d cdddS#1swYyxYw) Nr var/lib/apt-clone/installed.pkgsrrrz-desktopzvar/lib/apt-clone/unameryr|z, )ryr-metar autoinstalleddater|)rrdrrrrrrrrr_append getmemberrrreadr` TagSectiongetr]rctime)rrr-rtrrrrrrZrautomrryr|rsections r_get_clone_info_dictzAptClone._get_clone_info_dictPs&&y1>Y \\) $# !CCEA() )I D &{{7+(, (:(:(<%wQ t9!Q&M==,KK% & !CCEA77D HD~~773<<>INN%>>@@D!,,T2";;z9={{695"* &"iio#,'4"jj." 9# # # sBF7=C0F77Gc*d|j|zS)NzHostname: %(hostname)s Arch: %(arch)s Distro: %(distro)s Meta: %(meta)s Installed: %(installed)s pkgs (%(autoinstalled)s automatic) Date: %(date)s )r)rrs rrz AptClone.infoxs#" %)$=$=i$H I IrcHtj|5}|j||j|j|ddz}g}|j D]"}|j |jd$ ddd||z}tjj|r%t|5}|j } dddng} tj d|z|} g} | D]}| j || S#1swYxYw#1swYMxYw)Nrrzcurrent-system%s)fromfiletofile) rdrrrrrrrrrr difflib unified_diff) rr system_filerrt clone_fileclone_file_linesrfpsystem_file_linesgendiffs r_get_file_diff_against_clonez%AptClone._get_file_diff_against_clones# \\) $ >  " "3 ' AB)GHJ! #,,. > '' G(<= >  > + 77>>+ &k" 3b$&LLN! 3 3!# "" /'+5kK D KK   ) > > 3 3sA*D 8D DD!c |dk7r tjjd|td|j }|j |}|D]]}|j |d|j |dk7s)td|d|j |dd|j |dd_tdd }|j|||}|rtdj||j| }tj|5} | j|jd z} i} | jD]S} | jj!d } | j#d s| dk(r9| j%\} }}||f| | <U dddi}|D]G}|j&s|j&j(t+|j,f||j.<It|j1t j1z }|r9tdtdjt3|tdt| j1t|j1z }|r9tdtdjt3|tdt}t3| D]1}||vr| |\}}||\}}||k7s|j5|||f3|r7tdtd|D]\}}}td|d|d|dyy#1swYxYw)Nr DPkg::Chroot-DirectoryzClone info differences: z 'z ': clone='z ' system=''rz/etc/apt/sources.listrrrrz2Installed on the system but not in the clone-file:rrz2Installed in the clone-file but not in the system:zVersion differences: z-Pkgname z <>)r`rbrGprintrrrr r]rSrdrrrrrrrrrrstrrrZkeyssortedr/)rrrr clone_inforsources_list_systemr rrtrinstalled_in_clonerrZrrinstalled_on_systemronly_on_system only_in_clonepkgversion_differencesr$clone_file_pkgversion clone_is_autosystem_pkgversion sys_is_auto clone_ver system_vers r show_diffzAptClone.show_diffs>   NN  7 C (),,. ..y9  3C}}S$':>>#t+DDZ^^C6! c4023 3 b 600 *I7  "''$-  2 \\) $ ;!CCEA"$   ;zz|**73??3'42:(, %w,3T?"4(  ; ;! CC== %%s3+@+@'A-C  ) C 055783?Q?V?V?X;YY  F G #((6.12 3 $K/4467#>Q>V>V>X:YY  F G #((6-01 2 $K"%01 IG113Eg3N 0 !=-@-I * {$(99&**35FGI  I " ) * A B2H M.JGY KL M "Q ; ;s BMMc6|dk7rtjjd||jj dt j j|d|jj dt j j|dtj|5}|j|dddt j j|s;td|z|j|}|jj|||j||| |j!|||r|j#|||j%|||||j'|||j)|||dk7rs|jj+t j j|d|jj+t j j|dyy#1swYOxYw) 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/procprocz/syssysNz0Dir '%s' does not exist, need to bootstrap first)mirror)r`rbrGrJr8rrr]rdrrr rrr)_restore_sources_list_restore_apt_keyring_rewrite_sources_list_restore_package_selection_restore_not_downloadable_debs_restore_extra_filesr<) rrr exclude_pkgs new_distroprotect_installedr%rtr-s r restore_statezAptClone.restore_states   NN  7 C MM $ $Wbggll9f.M N MM $ $VRWW\\)U-K L\\) $ (  " "3 ' (ww~~i( DyP Q**95F MM % %i 8 ""9i"G !!)Y7   & &y* = '' 9>OQ]^ ++IyA !!)Y7   MM % %bggll9f&E F MM % %bggll9e&D E ) ( (s /HHctj}tjj d}t j j|t j j|zs5t j|t j j|ztj|||z|j|||r|j|||j|} |jt j"j$j'|j+|j-|||}tj.||S#t($rYFwxYw)Nrr)r,)rrr`rbrrrr dirnamemakedirsrcopyr&r(rSupdaterLrMrQrOrr#_restore_package_selection_in_cacher)rrr,r-rorrmissings rsimulate_restore_statezAptClone.simulate_restore_state s!!#nn../CD ww~~fRWW__[%AAB KKrww{;; < K !34 ""9f5   & &vz :/  LL**::< =  ::9eZf:g f$   s:7E,, E87E8cXtj|5}tjj |ddd}tjj |rt j|d|z|j|tjj |ddd}tj|tjtjztjztjz|rddlm}m}t$j&j)d||d } | j*ddD]G} | j,s | j.rt1| |r |g| _1| j4|k7sA|| _I| j7dddy#1swYyxYw) NetcrL sources.list %s.apt-cloner) SourcesListDeb822SourceEntryrTdeb822)rdrrrr]r rr3 extractallchmodstatS_IRUSRS_IWUSRS_IRGRPS_IROTHaptsources.sourceslistr<r=r`rbrGlistinvaliddisabled isinstanceurisurisave) rrrr%rtexisting td_sourcesr<r=rentrys rr&zAptClone._restore_sources_list"s4 \\) $ ww||Iue^LHww~~h' Hnx&?@ NN9 %i~NJ HHZ !F  F)cltjj|ddd}d|z}tjj|rt j ||t j|5} |j|jdz| |j|jdz|tjj|r1|jj||tj|dddy#t$rYwxYw#t$rYswxYw#1swYyxYw)Nr9rLz trusted.gpgr;zetc/apt/trusted.gpgzetc/apt/trusted.gpg.d)rrr]r rr3rdrextractrKeyErrorrJr3remove)rrrrObackuprts rr'zAptClone._restore_apt_keyring:s77<< 5%G(* 77>>( # KK& ) \\) $ "  DNN+@@)L  DNN+BBINww~~f% ((: &! " "     " "sO2D*4D D3AD* DD*DD* D'$D*&D''D**D3c D|g}t|}t}t}tj|j}|r/|D]*}|js|j |j ,tj|5} | j|jdz} |j5| jD]} | jjd} | jds| dk(r9| j!\} } }d}|| |rZ|j#| t%|}| }| |vs~ |rR|| j'|d|j(dkDrB|j+|| j,s#t/d | z|| j'| || j5| dddddd|j(dkDr|j+|D]I}||vr|j#|||jr)||j,r9|j#|K|S#t.$r7}t1j2d | d |d |j#| Yd}~d}~wwxYw#1swYxYw#1swYxYw)NrrrrcB|D]}tj||syy)NT)fnmatch)rZr,excls r is_excludedzAAptClone._restore_package_selection_in_cache..is_excludedfs"$0,D&tT:'+,rF) from_userauto_fixrzpkg %s not marked upgrade)r\z can't add  ())rGr`ProblemResolver _depcacherprotect_pkgrdrrr actiongrouprrrrrr/r mark_install broken_countresolvemarked_install SystemErrorloggingwarning mark_auto)rrrr.r,r6pkgsresolverrrtrrrZrrr[auto_installedr\es rr5z,AptClone._restore_package_selection_in_cacheLsw  L<( %u**5??;  /##$$SXX. /\\) $$ >!CCEA""$ >KKM>D::<..w7Ds+trz ,0JJL)T7D,#46 HHTN%(YN$2 2Iu} .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,KL#KK--.9 > > $ >$ >sP /J8BJ A)I1J J J -J =J J J  J JJc|j|}tjjj ddtjjj dd |j |j |j|j|||||j|j |jy#t$rYVwxYw)NrzDir::Binr zDir::Bin::dpkgz /usr/bin/dpkg) rSrLr`rbrGr4rKrrr5commitrP)rrrr.r,rs rr)z#AptClone._restore_package_selections 2 z3/ /A  LL,, -   00ECTVbc T(($*?*?@$   s(C CCc8tj|5}|jD]\}|jdz}|jj |s.|jt |d|_|j||^ dddy#1swYyxYw)Nz extra-files/)rdr getmembersrrZrrrS)rrrrtrprefixs rr+zAptClone._restore_extra_filess \\) $ .^^% .666$$V,VVCKL1AFKK9-  . . . .s>B1BBctj|5} |jDcgc]-}|jj |j dzs,|/}}|j || dddg}tjj|d}tjtjj|dD]3}tjj||} |j| 5|jj||ycc}w#t$r YdddywxYw#1swYxYw)Nzvar/lib/apt-clone/debs/rz*.deb)rdrrtrZrrr@rTrrr]rrrJr) rrrrtrdebsdirdebsrdebdebpaths rr*z'AptClone._restore_not_downloadable_debss  \\) $  36>>3CJw||G^G^_c_m_moH`HHIGJJy1  ww||I'AB99RWW\\$89 !Cggll4-G KK  ! ""43J        s?D=D&-D!D!D&!D&& D:/D=9D::D==Ec bddlm}m}m}tj j dtjjtjj|dddtj j dtjjtjj|ddd|d }|jddD]}|js |jrt||rC|jDcgc]'}d j |g|j#d d d)c}|_kd} dD])} |j$j'd| zs"|d | } n| r| |_||_tjj|ddd} tj j)d} tjj+| rst-| d5} | D]C}||| }|js|js||vs)|jj/|E dddtj0| |jD]}t||r5|j2Dcgc]}|j5ds|c}sz{}{}{}-rr)updatessecurity backportsz-%szsources.list.apt-clonerzcdrom:)rGr<r|r=r`rbrGrrabspathr]rHrIrJrKsuitesformat partitiondistr_rr rrrUrLrrMrrN)rrr-r<r|r=rrQr replacementpocketrO sourcelistrrsrcus rr(zAptClone._rewrite_sources_listsVV " GGOOBGGLLE5.Q R T  # GGOOBGGLLE5BRS T VT*\\!_ ,E}}%!23#\\ $HOOJFS1A!"1EF  ! BFzz**56>:1;V&D !,EJ!+EJ% ,(77<< 5% 8:^^--.DE 77>>( #h$ 11D%dJ7C s||78J ++C01 1 IIh \\ *E%!23 %zzD!Q\\(-CAD%)EN99''1LL''.LL''51%)EN *  O & 1 1Es$,L7+L #L L,L, L)c|r!tjj|d}nd}t}tjj t j jd}tjtjj|ddD]Q}t|d5}|D]3}|jds|j|j5 dddSt}tj|D]O\} } } | D]D} tjj| t|d| } | |vs4|j| FQ|S#1swYxYw) Nr9z/etcrYrz*.listr)encodingz/etc/)rrr]rGr1r`rbrrrrr/rwalkr)rrnetcdirowned dpkg_basedirrrrunowneddirpathdirnames filenamesrZfullnames r_find_unowned_in_etczAptClone._find_unowned_in_etcs3 WW\\)U3FFwww~~'9'9:N'OP 277<< fhGH 0Aa'* 0b0Dw/ $**,/0 0 0 0 %,.GGFO * (GXy! *77<<I(@$G5(KK) * *  0 0s0E'!E''E0 c |tjjdz}t}t |5}tj |}|D]h}d|vs |dj dD]H}d}t|j dk(r|j \} } }n|j \} } || z} | j} |dk(retjj| s*tjd| z|j| tj } t | d5}| j#|j%ddd| j'| k7s tjd| d | j'd | d |j| Kk ddd|S#1swYmxYw#1swY|SxYw) NrY conffilesrobsoletezconffile %s removedrz conffile r^z != r_)r`rbr~rGrTagFilerrrrrr rjdebugr/hashlibmd5r4r hexdigest) rrnrmodifiedrtagrQrrrZmd5sumrrs r_find_modified_conffilesz!AptClone._find_modified_conffiless 3 34H II 5 +  /"//"%C /%' %k 2 8 8 >/#'tzz|,159ZZ\2D&(+/::r?r@rArr}r^rrVrurrerkrfrlrgrirjrhrrrmrrrrr r!r/r7r&r'r5r)r+r*r(rrrrBrrrDrDbs 18288:a=@NI=A(2=B48'@=6%/NHL ::8(.(   &PI.GMVDHGK#FL20"$>@A". 46p,!F%rrD) __future__rrL apt.cacherr`rrYrrrjr* ImportErrorrrrrBrrdrriorrenvironrbrGobjectr rDrBrrrs&& *   + NN2C8 NN8#>/v/dD %vD %GKsB33B=<B=