
kMc           @   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 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_deb6   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   B   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_keysI   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	 d  Z
 d   Z d   Z d   Z d	   Z 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   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__Y   s    c         C   sD  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  | r6|  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   tar(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt
   save_stateo   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   RU   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   RU   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   RU   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   RU   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   RU   Rd   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   RU   Rd   R   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRM      s    	c         C   s]   | j  t j j d  d d t j j d  } t j j |  rY | j  | d d n  d  S(   Ns   Dir::Etc::sourcelistR[   s   ./etc/apt/sources.lists   Dir::Etc::sourcepartss   ./etc/apt/sources.list.d(   R#   RB   RD   R{   R~   R   R   R   (   R   RU   t   source_parts(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRK      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   RU   t   tdirR   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRO      s
    c         C   s2   | j    d j d  r% d |  _ n	 d |  _ d  S(   Ni    s   ./Ri   (   t   getnamest
   startswitht	   TARPREFIX(   R   RU   (    (    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   #Ri   i   R   (   RF   RG   R   t   extractfileR   R   t	   readlinesR   t   stript   splitRr   RA   (   R   t	   statefileRU   Rd   R"   t   linet   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/unameRW   RZ   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   metaRk   t   autoinstalledt   date(   R   RF   RG   R   R   R   R   R   Rm   RA   t   appendt	   getmemberRu   R   t   readRB   t
   TagSectiont   getR?   Rt   t   ctime(   R   R   R"   RU   Rd   Rk   R   R   R   R<   Rl   t   autot   mR   RW   RZ   Rg   t   section(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyRg      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_installedRU   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::statusRh   (   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|   Rw   t   missing(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   simulate_restore_state7  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   RU   t   existing(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   O  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   backupRU   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   Z  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   Ri   t	   from_usert   auto_fixi    s   pkg %s not marked upgrades   can't add %s (%s)(   R+   RB   t   ProblemResolvert	   _depcacheRj   t   protectt   _pkgRF   RG   R   R   t   actiongroupR   R   R   R   R#   Rm   t   mark_installt   Falset   broken_countt   resolvet   marked_installt   SystemErrort   loggingt   warnt	   mark_auto(   R   R   Rw   R   R   t   pkgst   resolverRy   RU   Rd   R   R<   Rl   R   t   auto_installedR   t   e(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR   l  sP    			
c         C   sq   |  j  d |  } y | j |  j  Wn t k
 r9 n X| j   |  j | | |  | j |  j |  j  d  S(   NRh   (   R7   R   R/   R    RG   R   t   commitR4   (   R   R   R   R   Rw   (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     s    
c         C   s   t  j |  } y | j |  j d |  Wn t k
 r> d  SXg  } t j j | d  } xH t j t j j | d   D]( } t j j | |  } | j	 |  qy W|  j
 j | |  d  S(   Ns   var/lib/apt-clone/debss   ./var/lib/apt-clone/debss   *.deb(   RF   RG   R   R   R   R   R   R?   t   globR   R.   R   (   R   R   R   RU   t   debsR   t   debt   debpath(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     s    %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.dRi   t   updatest   securityt	   backportss   -%ss   %s-%ss   sources.list.apt-clonet   rs   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   t   sourcest   entryt   replacementt   pocketR   t
   sourcelistt   fpR   t   src(    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR     sF    	(	(		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   Rr   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   RV   RH   RI   RN   RJ   RL   RM   RK   RO   R   R   Rg   R   R   R   R   R   R   R   R   R   R   (    (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyR*   N   s6   														(		4			+!(   R0   t	   apt.cacheR    RB   R   R   R   R   R   R
   RF   R^   Rt   R   t   environRD   R+   t   objectR   R*   (    (    (    s9   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_clone.pyt   <module>   s"   (