
Pc           @   s  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 m Z d e j k r e j j d d  e j j d d  n  d e f d	     YZ d
 e f d     YZ d S(   iN(   t   FetchFailedException(   t   StringIOt   APT_CLONE_DEBUG_RESOLVERs   Debug::pkgProblemResolvert   1s   Debug::pkgDepCache::AutoInstallt   LowLevelCommandsc           B   s;   e  Z d  Z d Z d   Z d   Z d d  Z d   Z RS(   sN    calls to the lowlevel operations to install debs
        or repack a deb
    s   /usr/bin/dpkg-repackc         C   sb   | s
 t  Sd d g } | d k rE | j d d  | j d |  n  t j | |  } | d k S(   Nt   dpkgs   -it   /i    t   chrooti   (   t   Truet   insertt
   subprocesst   call(   t   selft   debfilest	   targetdirt   install_cmdt   ret(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   install_debs-   s    c         C   s   t  j j |  j  s+ t d |  j   n  |  j g } t  j   d k sr t  j j d  s_ d Sd d g | } n  t j | | g d | } | d k S(   s$    dpkg-repack pkgname into targetdir s   no '%s' foundi    s   /usr/bin/fakerootNt   fakeroots   -ut   cwd(   t   ost   patht   existst   dpkg_repackt   IOErrort   getuidR
   R   (   R   t   pkgnameR   t
   repack_cmdR   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt
   repack_deb7   s    c         C   sM   | d  k r+ d d  l } | j   d } n  t j d | | g  } | d k S(   Nit   CODENAMEt   debootstrapi    (   t   Nonet   lsb_releaset   get_distro_informationR
   R   (   R   R   t   distroR    R   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   C   s
    c         C   s(   t  j d d | d | g  } | d k S(   Ns   apt-keys	   --keyringt   addi    (   R
   R   (   R   t   fromkeyfilet   intokeyfileR   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt
   merge_keysJ   s    N(	   t   __name__t
   __module__t   __doc__R   R   R   R   R   R&   (    (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   '   s   	
	t   AptClonec           B   s<  e  Z d  Z d e j   d Z d Z d  d  d  d  Z e	 e	 e	 d  Z
 d   Z d   Z d   Z d	   Z d
   Z d   Z e	 d  Z d   Z d   Z d   Z d   Z d   Z d   Z d d  e	 d  Z d  d  Z d   Z d   Z e	 d  Z d   Z d   Z d   Z d d  Z  d d  Z! d   Z" RS(!   s    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.
    s   apt-clone-state-%s.tar.gzi   s   ./c         C   s   t    |  _ t    |  _ t   |  _ | r6 | |  _ n t j j j	   |  _ | r] | |  _
 n t j j j   |  _
 | r | |  _ n t j |  _ d  S(   N(   t   sett   not_downloadablet   version_mismatchR   t   commandst   fetch_progresst   aptt   progresst   textt   AcquireProgresst   install_progresst   baset   InstallProgresst
   _cache_clst   Cache(   R   R/   R4   t	   cache_cls(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   __init__Z   s    c         C   sG  t  j j |  r- t  j j | |  j  } n | j d  sI | d 7} n  | d k r t j   t j j	 d |  t j j	 d t  j j | d   t j
   n  t j d | d d	  } |  j |  |  j | |  |  j |  |  j | |  |  j |  |  j |  | r#|  j |  n  | r9|  j |  n  | j   d
 S(   s    save the current system state (installed pacakges, enabled
            repositories ...) into the apt-state.tar.gz file in targetdir
        s   .tar.gzs   .apt-clone.tar.gzR   t   Dirs   Dir::State::statuss   var/lib/dpkg/statust   namet   modes   w:gzN(   R   R   t   isdirt   joint   CLONE_FILENAMEt   endswitht   apt_pkgt   init_configt   configR+   t   init_systemt   tarfilet   opent   _write_unamet   _write_state_installed_pkgst   _write_state_auto_installedt   _write_state_sources_listt   _write_state_apt_preferencest   _write_state_apt_keyringt   _write_state_dpkg_statust   _dpkg_repackt   close(   R   t	   sourcedirt   targett   with_dpkg_repackt   with_dpkg_statust   scrub_sourcest   tar(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt
   save_statep   s,    
c         C   s   i t  j   d d 6t  j   d d 6t  j   d d 6t j j d  d 6} t j   } d	 j g  | j   D] \ } } d
 | | f ^ qk  } | j	 | d	  | j
   | j | j d d d  S(   Ni   t   hostnamei   t   kerneli   t
   uname_archs   APT::Architecturet   archs   
s   %s: %st   arcnames   ./var/lib/apt-clone/uname(   R   t   unameRB   RD   t   findt   tempfilet   NamedTemporaryFileR?   t	   iteritemst   writet   flushR#   R<   (   R   RV   t	   host_infot   ft   keyt   valuet   info(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRH      s    	/
c         C   s   |  j  d |  } d } x | D] } | j r | d | j | j j t | j  f 7} | j sn | j j r |  j	 j
 | j  q | j j o | j j s |  j j
 | j  q q q Wt j d  } t |  | _ t j   | _ | j | t |   d  S(   Nt   rootdirt    s	   %s %s %s
s"   ./var/lib/apt-clone/installed.pkgs(   R7   t   is_installedR<   t	   installedt   versiont   intt   is_auto_installedt	   candidatet   downloadableR,   R#   R-   RF   t   TarInfot   lent   sizet   timet   mtimet   addfileR   (   R   RQ   RV   t   cachet   st   pkgt   tarinfo(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRI      s    	#c         C   s)   t  j j d  } | j | d d d  S(   Ns   dir::state::statusR\   s   ./var/lib/apt-clone/dpkg-status(   RB   RD   t	   find_fileR#   (   R   RV   t   dpkg_status(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRN      s    c         C   s;   t  j j d  } t j j |  r7 | j | d  n  d  S(   Ns   Dir::State::extended_statess#   ./var/lib/apt-clone/extended_states(   RB   RD   R|   R   R   R   R#   (   R   RV   t   extended_states(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRJ      s    		c         C   s{   t  j j d  } t j j |  r: | j | d d n  t  j j d d  } t j j |  rw | j | d d n  d  S(   Ns   Dir::Etc::preferencesR\   s   ./etc/apt/preferencess   Dir::Etc::preferencespartss   /etc/apt/preferences.ds   ./etc/apt/preferences.d(   RB   RD   R|   R   R   R   R#   t   find_dir(   R   RV   Re   t   p(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRL      s    	c         C   s{   t  j j d  } t j j |  r: | j | d d n  t  j j d d  } t j j |  rw | j | d d n  d  S(   Ns   Dir::Etc::trustedR\   s   ./etc/apt/trusted.gpgs   Dir::Etc::trustedpartss   /etc/apt/trusted.gpg.ds   ./etc/apt/trusted.gpg.d(   RB   RD   R|   R   R   R   R#   R   (   R   RV   Re   R   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRM      s    	c         C   s   t  j j d  } |  j | | | d  t  j j d  } t j j |  r | j | d d d t	 xD t j
 |  D]0 } d | | f } |  j | | | d |  qu Wn  d  S(	   Ns   Dir::Etc::sourcelists   ./etc/apt/sources.lists   Dir::Etc::sourcepartsR\   s   ./etc/apt/sources.list.dt	   recursives   %s/%ss   ./etc/apt/sources.list.d/(   RB   RD   R|   t$   _add_file_to_tar_with_password_checkR   R   R   R   R#   t   Falset   listdir(   R   RV   t   scrubt   sources_listt   source_partst   sourcet   sources_file_name(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRK      s    	c   	      C   s   | r t  j d d   } t | d   } xb | j   D]T } t j d |  rw t j d d |  } | j |  n | j |  | j   q: W| j	 | j
 d | Wd  QXWd  QXn | j	 | d | d  S(   NR=   t   wt   rs   /[^/@:]*:[^/@:]*@s   /USERNAME:PASSWORD@R\   (   R_   R`   RG   t	   readlinest   ret   searcht   subRb   Rc   R#   R<   (	   R   RV   t   sourcesR   R\   t   source_copyRe   t   linet   scrubbed_line(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR      s    	%c         C   s   d  S(   N(    (   R   RV   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   _write_modified_files_from_etc   s    c         C   sW   t  j   } x$ |  j D] } |  j j | |  q W| j | d d t j |  d  S(   NR\   s   ./var/lib/apt-clone/debs(   R_   t   mkdtempR,   R.   R   R#   t   shutilt   rmtree(   R   RV   t   tdirR   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRO      s
    c         C   s=   | j    GH| j    d j d  r0 d |  _ n	 d |  _ d  S(   Nis   ./Rj   (   t   getnamest
   startswitht	   TARPREFIX(   R   RV   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   _detect_tarprefix   s    c         C   s   t  j |  } |  j |  | j |  j d  } d  } x{ | j   D]m } | j d  sE | j   d k rr qE n  | j	   } t
 |  d k rE | d j d  rE | d } PqE qE W| S(   Ns   etc/apt/sources.listt   #Rj   i   R   (   RF   RG   R   t   extractfileR   R   R   R   t   stript   splitRs   RA   (   R   t	   statefileRV   Re   R"   R   t   l(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   _get_info_distro  s    !&
c         C   s  |  j  |  p d } t j |  } | j |  j d  } d } } g  } xq | j   D]c } | j   j   \ }	 }
 } | d 7} t |  r | d 7} n  |	 j	 d  rW | j
 |	  qW qW W| j |  j d  } | j } d } d } |  j d | j   k rT| j |  j d  j   } t j |  } | j d d  } | j d d  } n  d	 i | d 6| d
 6d j |  d 6| d 6| d 6t j |  d 6| d 6S(   Nt   unknowns    var/lib/apt-clone/installed.pkgsi    i   s   -desktops   var/lib/apt-clone/unameRX   R[   s   Hostname: %(hostname)s
Arch: %(arch)s
Distro: %(distro)s
Meta: %(meta)s
Installed: %(installed)s pkgs (%(autoinstalled)s automatic)
Date: %(date)s
R"   s   , t   metaRl   t   autoinstalledt   date(   R   RF   RG   R   R   R   R   R   Rn   RA   t   appendt	   getmemberRv   R   t   readRB   t
   TagSectiont   getR?   Ru   t   ctime(   R   R   R"   RV   Re   Rl   R   R   R   R<   Rm   t   autot   mR   RX   R[   Rh   t   section(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRh     s:    

	
R   c         C   s   | d k r" t  j j d |  n  t j |  } |  j |  t j j |  s~ d | GH|  j	 |  } |  j
 j | |  n  |  j | |  |  j | |  | r |  j | |  n  |  j | | |  |  j | |  d S(   s    take a statefile produced via (like apt-state.tar.gz)
            save_state() and restore the packages/repositories
            into targetdir (that is usually "/")
        R   s   DPkg::Chroot-Directorys0   Dir '%s' does not exist, need to bootstrap firstN(   RB   RD   R+   RF   RG   R   R   R   R   R   R.   R   t   _restore_sources_listt   _restore_apt_keyringt   _rewrite_sources_listt   _restore_package_selectiont   _restore_not_downloadable_debs(   R   R   R   t
   new_distrot   protect_installedRV   R"   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   restore_state:  s    	c         C   s   t  j   } t j j d  } t j j | t j j |   s` t j	 | t j j |   n  t
 j | | |  |  j | |  | r |  j | |  n  |  j d |  } y | j t j j j    Wn t k
 r n X| j   |  j | |  } | S(   Ns   dir::state::statusRi   (   R_   R   RB   RD   R|   R   R   R   t   dirnamet   makedirsR   t   copyR   R   R7   t   updateR0   R1   R5   R3   R    RG   t#   _restore_package_selection_in_cache(   R   R   R   RR   R}   Rx   t   missing(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   simulate_restore_stateU  s     " 
c         C   s   t  j |  } t j j | d d d  } t j j |  rS t j | d |  n  | j |  j	 d |  y | j |  j	 d |  Wn t
 k
 r n Xd  S(   Nt   etcR0   s   sources.lists   %s.apt-clones   etc/apt/sources.lists   etc/apt/sources.list.d(   RF   RG   R   R   R?   R   R   R   t   extractR   t   KeyError(   R   R   R   RV   t   existing(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   m  s    c         C   s   t  j j | d d d  } d | } t  j j |  rJ t j | |  n  t j |  } y | j |  j	 d |  Wn t
 k
 r n Xy | j |  j	 d |  Wn t
 k
 r n Xt  j j |  r |  j j | |  t  j |  n  d  S(   NR   R0   s   trusted.gpgs   %s.apt-clones   etc/apt/trusted.gpgs   etc/apt/trusted.gpg.d(   R   R   R?   R   R   R   RF   RG   R   R   R   R.   R&   t   remove(   R   R   R   R   t   backupRV   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   x  s     
c         C   sS  t    } t    } t j | j  } | rZ x- | D]" } | j r1 | j | j  q1 q1 Wn  t j |  } | j	 |  j
 d  }	 | j   LxD|	 j   D]6}
 |
 j   }
 |
 j d  s |
 d k r q n  |
 j   \ } } } | j |  t |  } | } | | k r yt | rl| | j d | d t  | j d k r| j   | | j sit d |  qiqn | | j d |  Wn7 t k
 r} t j d | | f  | j |  n X| | j |  q q WWd  QX| j d k r| j   n  xW | D]O } | | k r!| j |  qn  | | j p8| | j s| j |  qqW| S(	   Ns    var/lib/apt-clone/installed.pkgsR   Rj   t	   from_usert   auto_fixi    s   pkg %s not marked upgrades   can't add %s (%s)(   R+   RB   t   ProblemResolvert	   _depcacheRk   t   protectt   _pkgRF   RG   R   R   t   actiongroupR   R   R   R   R#   Rn   t   mark_installR   t   broken_countt   resolvet   marked_installt   SystemErrort   loggingt   warnt	   mark_auto(   R   R   Rx   R   R   t   pkgst   resolverRz   RV   Re   R   R<   Rm   R   t   auto_installedR   t   e(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     sP    			
c         C   sq   |  j  d |  } y | j |  j  Wn t k
 r9 n X| j   |  j | | |  | j |  j |  j  d  S(   NRi   (   R7   R   R/   R    RG   R   t   commitR4   (   R   R   R   R   Rx   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     s    
c   
      C   s   t  j |  } yL g  | j   D]% } | j j |  j d  r | ^ q } | j | |  Wn t k
 ro d  SXg  } t j	 j
 | d  } xH t j t j	 j
 | d   D]( } t j	 j
 | |  }	 | j |	  q W|  j j | |  d  S(   Ns   var/lib/apt-clone/debs/s   ./var/lib/apt-clone/debss   *.deb(   RF   RG   t
   getmembersR<   R   R   t
   extractallR   R   R   R?   t   globR   R.   R   (
   R   R   R   RV   R{   t   debsdirt   debsR   t   debt   debpath(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     s    8%c      	   C   s+  d d l  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    |   } x | j
 D]z } | j s | j r q n  d	 } x8 d D]0 } | j j d |  r d | | f } Pq q W| r| | _ q | | _ q Wt j j	 | d d d  }	 t j j d  }
 t j j |	  rt |	 d  X } xN | D]F } | | |
  } | j s| j s| | k rh| j
 j |  qhqhWWd  QXt j |	  n  xR | j
 D]G } | j j d  r| j
 j |  | j
 j d |  t | _ qqW| j   d  S(   Ni(   t   SourcesListt   SourceEntrys   Dir::Etc::sourcelistR   R0   s   sources.lists   Dir::Etc::sourcepartss   sources.list.dRj   t   updatest   securityt	   backportss   -%ss   %s-%ss   sources.list.apt-cloneR   s   cdrom:i    (   R   R   R   (   t   aptsources.sourceslistR   R   RB   RD   R+   R   R   t   abspathR?   t   listt   invalidt   disabledt   distRA   R|   R   RG   R   R   t   uriR   R	   R   t   save(   R   R   R   R   R   R   t   entryt   replacementt   pocketR   t
   sourcelistt   fpR   t   src(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     sF    	(	(		Rj   c         C   s/  | r t  j j | d  } n d } t   } t  j j t j j d   } xe t j t  j j | d d   D]B } x9 t	 |  D]+ } | j
 d  r | j | j    q q Wqm Wt   } xl t  j |  D][ \ } }	 }
 xI |
 D]A } t  j j | t |  |  } | | k r | j |  q q Wq W| S(   NR   s   /etcs   Dir::State::statusRh   s   *.lists   /etc/(   R   R   R?   R+   R   RB   RD   R   R   RG   R   R#   R   t   walkRs   (   R   RQ   t   etcdirt   ownedt   dpkg_basedirRe   R   t   unownedt   dirpatht   dirnamest	   filenamesR<   t   fullname(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   _find_unowned_in_etc  s     	(	c         C   s  | t  j j d  } t   } t  j t |   } xH| D]@} d | k r; x+| d j d  D]} d  } t | j    d k r | j   \ } }	 } n | j   \ } }	 | | }
 |	 j	   }	 | d k r qa n  t
 j j |
  st j d |
  | j |
  qa n  t j   } | j t |
  j    | j   |	 k ra t j d |
 | j   |	 f  | j |
  qa qa Wq; q; W| S(   Ns   Dir::State::statust	   conffiless   
i   t   obsoletes   conffile %s removeds   conffile %s (%s != %s)(   RB   RD   R^   R+   t   TagFileRG   R   R   Rs   R   R   R   R   R   t   debugR#   t   hashlibt   md5R   R   t	   hexdigest(   R   RQ   R}   t   modifiedt   tagR   R   R   R<   t   md5sumR   R  (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   _find_modified_conffiles  s2    	
	c         C   s	   d GHd  S(   Ns   not implemented yet(    (   R   RQ   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   _dump_debconf_database:  s    N(#   R'   R(   R)   R   R]   R@   R   R   R:   R   RW   RH   RI   RN   RJ   RL   RM   RK   R   R   RO   R   R   Rh   R   R   R   R   R   R   R   R   R   R  R	  (    (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR*   O   s>   															(		4			*!(   R0   t	   apt.cacheR    RB   R   R   R  R   R   R   R
   RF   R_   Ru   R   t   environRD   R+   t   objectR   R*   (    (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   <module>   s$   (