
@FV9                 @   sO  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 m Z m Z d e j k re j j d d  e j j d d  Gd	 d
   d
 e  Z Gd d   d e  Z d S)    )print_functionN)FetchFailedException)BytesIOopenZAPT_CLONE_DEBUG_RESOLVERzDebug::pkgProblemResolver1zDebug::pkgDepCache::AutoInstallc               @   sg   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   s_   | s
 d Sd d g } | d k rB | j  d d  | j  d |  t j | |  } | d k S)NTZdpkgz-i/r   chroot   )insert
subprocesscall)selfZdebfiles	targetdirZinstall_cmdret r   7/usr/lib/python3/dist-packages/DistUpgrade/apt_clone.pyinstall_debs2   s    zLowLevelCommands.install_debsc             C   s   t  j j |  j  s( t d |  j   |  j g } t  j   d k sl t  j j d  s\ d Sd d g | } t j | | g d | } | d k S)z$ dpkg-repack pkgname into targetdir zno '%s' foundr   z/usr/bin/fakerootNZfakerootz-ucwd)ospathexistsdpkg_repackIOErrorgetuidr   r   )r   pkgnamer   Z
repack_cmdr   r   r   r   
repack_deb<   s    zLowLevelCommands.repack_debNc             C   sJ   | d  k r( d d  l  } | j   d } t j d | | g  } | d k S)Nr   ZCODENAMEdebootstrap)lsb_releaseget_distro_informationr   r   )r   r   distror   r   r   r   r   r   H   s
    zLowLevelCommands.debootstrapc             C   s(   t  j d d | d | g  } | d k S)Nzapt-keyz	--keyringaddr   )r   r   )r   ZfromkeyfileZintokeyfiler   r   r   r   
merge_keysO   s    zLowLevelCommands.merge_keysc             C   s%   t  j d d | | g  } | d k S)NZmountz--bindr   )r   r   )r   ZolddirZnewdirr   r   r   r   
bind_mountT   s    zLowLevelCommands.bind_mountc             C   s   t  j d | g  } | d k S)NZumountr   )r   r   )r   Zbinddirr   r   r   r   bind_umountX   s    zLowLevelCommands.bind_umount)__name__
__module____qualname____doc__r   r   r   r   r"   r#   r$   r   r   r   r   r   ,   s   
r   c               @   s  e  Z d  Z d Z d e j   d Z d Z d d d d d  Z d d d d d	 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 d d 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 d- d. d/  Z d- d d d d d0 d1  Z d d2 d3  Z d d4 d5  Z d6 d7   Z d d d8 d9  Z  d: d;   Z! d< d=   Z" d> d?   Z# d@ dA   Z$ dB dC dD  Z% d- dE dF  Z& dG dH   Z' d S)I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
   z./Nc             C   s   t    |  _ t    |  _ t   |  _ | r6 | |  _ n t j j j	   |  _ | r] | |  _
 n t j j j   |  _
 | r | |  _ n t j |  _ d  S)N)setnot_downloadableversion_mismatchr   commandsfetch_progressaptprogresstextAcquireProgressinstall_progressbaseZInstallProgress
_cache_clsZCache)r   r.   r3   Z	cache_clsr   r   r   __init__h   s    zAptClone.__init__Fc          
   C   sK  t  j j |  r- t  j j | |  j  } n | j d  sF | d 7} | d k r t j   t j j	 d |  t j j	 d t  j j | d   t j
   t j d | d d	   } |  j |  |  j | |  |  j |  |  j | |  |  j |  |  j |  |  j | |  | r-|  j |  | r@|  j |  Wd
 QRXd
 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   ZDirzDir::State::statuszvar/lib/dpkg/statusnamemodezw:gzN)r   r   isdirjoinCLONE_FILENAMEendswithapt_pkgZinit_configconfigr*   Z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targetZwith_dpkg_repackZwith_dpkg_statusZscrub_sourcesextra_filestarr   r   r   
save_state   s,    


zAptClone.save_statec          	   C   sL   d t  j   d d t  j   d d t  j   d d t j j d  i } | S)	Nhostnamer
   Zkernel   Z
uname_arch   archzAPT::Architecture)r   unamer=   r>   find)r   	host_infor   r   r   _get_host_info_dict   s
    zAptClone._get_host_info_dictc             C   su   |  j    } t j d d  } d j d d   | j   D  } | j | d  | j   | j | j d d d  S)Nr8   w
c             S   s&   g  |  ] \ } } d  | | f  q S)z%s: %sr   ).0keyvaluer   r   r   
<listcomp>   s   	z)AptClone._write_uname.<locals>.<listcomp>arcnamez./var/lib/apt-clone/uname)	rU   tempfileNamedTemporaryFiler:   itemswriteflushr!   r7   )r   rL   rT   finfor   r   r   r@      s    
zAptClone._write_unamec             C   sV   | d  k r d  Sx? | D]7 } x. t  j  |  D] } | j | d d | q- Wq Wd  S)Nr\   z./extra-files)globr!   )r   rK   rL   prb   r   r   r   rF      s
    z!AptClone._write_state_extra_filesc             C   s  |  j  d |  } d } d } x4| D],} | j r% | d | j | j j t | j  f 7} | j st | j j r |  j	 j
 | j  n+ | j j o | j j s |  j j
 | j  x | j j D] } | j d k r | j d k r q d d  l } | j   d }	 | j |	 k rL| d | j | j j | j d k rA| j n d f 7} Pq Wq% Wt j d  }
 | j d	  } t |  |
 _ t j   |
 _ | j |
 t |   t j d
  }
 | j d	  } t |  |
 _ t j   |
 _ | j |
 t |   d  S)Nrootdir z	%s %s %s
Znowr   ZIDunknownz"./var/lib/apt-clone/installed.pkgszutf-8z ./var/lib/apt-clone/foreign.pkgs)r5   is_installedr7   	installedversionintis_auto_installed	candidateZdownloadabler+   r!   r,   Zoriginsarchiveoriginr   r   r?   ZTarInfoencodelensizetimemtimeZaddfiler   )r   rI   rL   cachesZforeignpkgor   Z	distro_idtarinfor   r   r   rA      s@    	##	z$AptClone._write_state_installed_pkgsc             C   s)   t  j j d  } | j | d d d  S)Nzdir::state::statusr\   z./var/lib/apt-clone/dpkg-status)r=   r>   	find_filer!   )r   rL   dpkg_statusr   r   r   rG      s    z!AptClone._write_state_dpkg_statusc             C   s8   t  j j d  } t j j |  r4 | j | d  d  S)NzDir::State::extended_statesz#./var/lib/apt-clone/extended_states)r=   r>   r{   r   r   r   r!   )r   rL   Zextended_statesr   r   r   rB      s    		z$AptClone._write_state_auto_installedc             C   su   t  j j d  } t j j |  r7 | j | d d t  j j d d  } t j j |  rq | j | d d d  S)NzDir::Etc::preferencesr\   z./etc/apt/preferenceszDir::Etc::preferencespartsz/etc/apt/preferences.dz./etc/apt/preferences.d)r=   r>   r{   r   r   r   r!   find_dir)r   rL   rb   re   r   r   r   rD      s    	z%AptClone._write_state_apt_preferencesc             C   su   t  j j d  } t j j |  r7 | j | d d t  j j d d  } t j j |  rq | j | d d d  S)NzDir::Etc::trustedr\   z./etc/apt/trusted.gpgzDir::Etc::trustedpartsz/etc/apt/trusted.gpg.dz./etc/apt/trusted.gpg.d)r=   r>   r{   r   r   r   r!   r}   )r   rL   rb   re   r   r   r   rE      s    	z!AptClone._write_state_apt_keyringc             C   s   t  j j d  } |  j | | | d  t  j j d  } t j j |  r | j | d d d d xz t j	 |  D]i } | j
 d  r qu | j d	  s qu d
 | | f } t j j |  r qu |  j | | | d |  qu Wd  S)NzDir::Etc::sourcelistz./etc/apt/sources.listzDir::Etc::sourcepartsr\   z./etc/apt/sources.list.dZ	recursiveF.z.listz%s/%sz./etc/apt/sources.list.d/)r=   r>   r{   $_add_file_to_tar_with_password_checkr}   r   r   r   r!   listdir
startswithr<   r9   )r   rL   scrubZsources_listZsource_partssourceZsources_file_namer   r   r   rC      s$    	z"AptClone._write_state_sources_listc             C   s   | r t  j d d   } t | d   } x| | j   D]n } t |  t k ra | j d  } t j d |  r t j	 d d |  } | j
 | j d   | j   q: W| j | j d | Wd  QRXWd  QRXn | j | d | d  S)	Nr8   wbrbzUTF-8z/[^/@:]*:[^/@:]*@z/USERNAME:PASSWORD@zutf-8r\   )r]   r^   r   	readlinestypebytesdecoderesearchsubr`   rq   ra   r!   r7   )r   rL   sourcesr   r\   Zsource_copyrb   liner   r   r   r     s    '	'z-AptClone._add_file_to_tar_with_password_checkc             C   s   d  S)Nr   )r   rL   r   r   r   _write_modified_files_from_etc&  s    z'AptClone._write_modified_files_from_etcc             C   sW   t  j   } x$ |  j D] } |  j j | |  q W| j | d d t j |  d  S)Nr\   z./var/lib/apt-clone/debs)r]   mkdtempr+   r-   r   r!   shutilrmtree)r   rL   Ztdirr   r   r   r   rH   *  s
    zAptClone._dpkg_repackc             C   s2   | j    d j d  r% d |  _ n	 d |  _ d  S)Nr
   z./rg   )getnamesr   	TARPREFIX)r   rL   r   r   r   _detect_tarprefix3  s    zAptClone._detect_tarprefixc          
   C   s   t  j |   } |  j |  | j |  j d  } x | j   D]s } | j d  } | j d  sB | j   d k r{ qB | j	   } t
 |  d k rB | d j d  rB | d SqB WWd  QRXd  S)Nzetc/apt/sources.listzutf-8#rg   rO   r   )r?   r   r   extractfiler   r   r   r   stripsplitrr   r<   )r   	statefilerL   rb   r   lr   r   r   _get_info_distro;  s    !&zAptClone._get_info_distroc             C   s  |  j  |  p d } t j |  }} | j |  j d  } d } } g  } xz | j   D]l } | j d  } | j   j   \ }	 }
 } | d 7} t	 |  r | d 7} |	 j
 d  rZ | j |	  qZ W| j |  j d  } | j } d } d } |  j d | j   k r]| j |  j d  j   } t j |  } | j d d  } | j d	 d  } d | d
 | d d j |  d | d | d t j |  d	 | i SWd  QRXd  S)Nrh   z var/lib/apt-clone/installed.pkgsr   zutf-8r
   z-desktopzvar/lib/apt-clone/unamerN   rQ   r    metaz, rj   autoinstalleddate)r   r?   r   r   r   r   r   r   r   rl   r<   appendZ	getmemberru   r   readr=   Z
TagSectiongetr:   rt   Zctime)r   r   r    rL   rb   rj   r   r   r   r7   rk   automr   rN   rQ   rc   Zsectionr   r   r   _get_clone_info_dictI  s@    


	zAptClone._get_clone_info_dictc             C   s   d |  j  |  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   r   r   r   rc   q  s    zAptClone.infoc             C   s
  t  j |  g } |  j |  | j |  j | d d    } g  } x* | j   D] } | j | j d   qR WWd  QRX| | } t j	 j
 |  r t |   } | j   }	 Wd  QRXn g  }	 t j |	 | d d | d | }
 g  } x |
 D] } | j |  q W| S)Nr
   zutf-8Zfromfilezcurrent-system%sZtofile)r?   r   r   r   r   r   r   r   r   r   r   difflibZunified_diff)r   r   Zsystem_filer   rL   Z
clone_fileZclone_file_linesr   fpZsystem_file_linesgendiffr   r   r   _get_file_diff_against_clonez  s$     !
	z%AptClone._get_file_diff_against_cloner   c             C   sK  | d k r t  j j d |  t d  |  j   } |  j |  } xa | D]Y } | j | d   | j | d   k rK t d | | j | d   | j | d   f  qK Wt d  d } |  j | | |  } | r t d j |   |  j	 d |  } t
 j |   }	 |	 j |  j d  }
 i  } xl |
 j   D]^ } | j   j d	  } | j d
  s3| d k rlq3| j   \ } } } | | f | | <q3WWd  QRXi  } x< | D]4 } | j sq| j j t | j  f | | j <qWt | j    t | j    } | r6t d  t d j t |    t d  t | j    t | j    } | rt d  t d j t |    t d  t   } xe t |  D]W } | | k rq| | \ } } | | \ } } | | k r| j | | | f  qW| rGt d  t d  x. | D]& \ } } } t d | | | f  qWd  S)Nr   zDPkg::Chroot-DirectoryzClone info differences: z '%s': clone='%s' system='%s'rg   z/etc/apt/sources.listrf   z var/lib/apt-clone/installed.pkgszutf-8r   z2Installed on the system but not in the clone-file: rW   z2Installed in the clone-file but not in the system:zVersion differences: z-Pkgname <clone-file-version> <system-version>z %s  <%s>   <%s>)r=   r>   r*   printrU   r   r   r   r:   r5   r?   r   r   r   r   r   r   r   r   rj   rk   strrm   r7   keyssortedr!   )r   r   r   rT   Z
clone_inforY   Zsources_list_systemr   rv   rL   rb   Zinstalled_in_cloner   r7   rk   r   Zinstalled_on_systemrx   Zonly_on_systemZonly_in_cloneZpkgversion_differencesr   Zclone_file_pkgversionZclone_is_autoZsystem_pkgversionZsys_is_autoZ	clone_verZ
system_verr   r   r   	show_diff  sp    
$
	&"

"

	

zAptClone.show_diffc       	      C   s  | d k rc t  j j d |  |  j j d t j j | d   |  j j d t j j | d   t j	 |   } |  j
 |  Wd QRXt j j |  s t d |  |  j |  } |  j j | |  |  j | | d	 | |  j | |  | r|  j | |  |  j | | | |  |  j | |  |  j | |  | d k r|  j j t j j | d   |  j j t j j | d   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   zDPkg::Chroot-Directoryz/procprocz/syssysNz0Dir '%s' does not exist, need to bootstrap firstmirror)r=   r>   r*   r-   r#   r   r   r:   r?   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   rL   r    r   r   r   restore_state  s(    ""zAptClone.restore_statec             C   s  t  j   } t j j d  } t j j | t j j |   s] t j	 | t j j |   t
 j | | |  |  j | |  | r |  j | |  |  j d |  } y | j t j j j    Wn t k
 r Yn X| j   |  j | | d | } t
 j |  | S)Nzdir::state::statusrf   r   )r]   r   r=   r>   r{   r   r   r   dirnamemakedirsr   copyr   r   r5   updater/   r0   r4   r2   r   r   #_restore_package_selection_in_cacher   )r   r   r   r   rJ   r|   rv   missingr   r   r   simulate_restore_state  s"    "
zAptClone.simulate_restore_statec       
      C   sZ  t  j |  D} t j j | d d d  } t j j |  rS t j | d |  | j |  j	 d |  t j j | d d d  } t j
 | t j t j Bt j Bt j B | rd d l m } t j j d |  |   } x3 | j d  d   D] }	 |	 j | k r | |	 _ q W| j   y | j |  j	 d	 |  Wn t k
 rNYn XWd  QRXd  S)
Netcr/   zsources.listz%s.apt-clonezetc/apt/sources.listr   )SourcesListzDir::Etc::sourcelistzetc/apt/sources.list.d)r?   r   r   r   r:   r   r   r   extractr   chmodstatS_IRUSRS_IWUSRS_IRGRPS_IROTHaptsources.sourceslistr   r=   r>   r*   listurisaveKeyError)
r   r   r   r   rL   existingZ
td_sourcesr   r   entryr   r   r   r     s(    	
zAptClone._restore_sources_listc             C   s   t  j j | d d d  } d | } t  j j |  rG t j | |  t j |   } y | j |  j	 d |  Wn t
 k
 r Yn Xy | j |  j	 d |  Wn t
 k
 r Yn Xt  j j |  r |  j j | |  t  j |  Wd  QRXd  S)Nr   r/   ztrusted.gpgz%s.apt-clonezetc/apt/trusted.gpgzetc/apt/trusted.gpg.d)r   r   r:   r   r   r   r?   r   r   r   r   r-   r"   remove)r   r   r   r   ZbackuprL   r   r   r   r   1  s     
zAptClone._restore_apt_keyringc             C   s  | d  k r g  } t  |  } t    } t    } t j | j  } | rr x' | D] } | j rO | j | j  qO Wt j |  }	 |	 j	 |  j
 d  }
 | j   |xt|
 j   D]f} | j   j d  } | j d  s | d k r q | j   \ } } } d d   } | | |  r q | j |  t |  } | } | | k r yq | r| | j d | d d	  | j d
 k r| j   | | j st d |   n | | j d |  WnI t k
 r} z) t j d | | f  | j |  WYd  d  } ~ Xn X| | j |  q WWd  QRXWd  QRX| j d
 k rE| j   xQ | D]I } | | k rn| j |  qL| | j p| | j sL| j |  qLW| S)Nz var/lib/apt-clone/installed.pkgszutf-8r   rg   c             S   s+   x$ | D] } t  j  |  |  r d Sq Wd  S)NT)fnmatch)r7   r   Zexclr   r   r   is_excluded]  s    zAAptClone._restore_package_selection_in_cache.<locals>.is_excluded	from_userZauto_fixFr   zpkg %s not marked upgradezcan't add %s (%s))r*   r=   ZProblemResolverZ	_depcacheri   ZprotectZ_pkgr?   r   r   r   Zactiongroupr   r   r   r   r   r!   rl   Zmark_installZbroken_countZresolveZmarked_installSystemErrorloggingZwarningZ	mark_auto)r   r   rv   r   r   r   ZpkgsZresolverrx   rL   rb   r   r7   rk   r   r   Zauto_installedr   er   r   r   r   C  s^    			
 #
z,AptClone._restore_package_selection_in_cachec             C   s   |  j  d |  } t j j j d d  t j j j d d  y | j |  j  Wn t k
 rf Yn X| j   |  j	 | | | |  | j
 |  j |  j  d  S)Nrf   zDir::Binr   zDir::Bin::dpkgz/usr/bin/dpkg)r5   r/   r=   r>   r*   r   r.   r   r   r   Zcommitr3   )r   r   r   r   r   rv   r   r   r   r     s    
z#AptClone._restore_package_selectionc             C   s   t  j |  i } x_ | j   D]Q } |  j d } | j j |  r | j t |  d   | _ | j | |  q WWd  QRXd  S)Nzextra-files/)r?   r   
getmembersr   r7   r   rr   r   )r   r   r   rL   r   prefixr   r   r   r     s    zAptClone._restore_extra_filesc       	         s   t  j |  S } y3   f d d   | j   D } | j | |  Wn t k
 r] d  SYn XWd  QRXg  } t j j | d  } xH t j t j j | d   D]( } t j j | |  } | j	 |  q W  j
 j | |  d  S)Nc                s/   g  |  ]% } | j  j   j d   r |  q S)zvar/lib/apt-clone/debs/)r7   r   r   )rX   rz   )r   r   r   r[     s   	 z;AptClone._restore_not_downloadable_debs.<locals>.<listcomp>z./var/lib/apt-clone/debsz*.deb)r?   r   r   Z
extractallr   r   r   r:   rd   r   r-   r   )	r   r   r   rL   ZdebsdirZdebsr   ZdebZdebpathr   )r   r   r     s    %z'AptClone._restore_not_downloadable_debsc             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  d   D]t } | j s | j r q d	 } x5 d D]- } | j j d |  r d | | f } Pq W| r| | _ q | | _ q Wt j j	 | d d d  }	 t j j d  }
 t j j |	  rt |	 d  U } xK | D]C } | | |
  } | j s| j s| | k rk| j
 j |  qkWWd  QRXt j |	  xO | j
 D]D } | j j d  r| j
 j |  | j
 j d |  d | _ qW| j   d  S)Nr   )r   SourceEntryzDir::Etc::sourcelistr   r/   zsources.listzDir::Etc::sourcepartszsources.list.drg   updatessecurity	backportsz-%sz%s-%szsources.list.apt-clonerzcdrom:T)r   r   r   )r   r   r   r=   r>   r*   r   r   abspathr:   r   ZinvalidZdisabledZdistr<   r{   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   ZreplacementZpocketr   Z
sourcelistr   r   srcr   r   r   r     sF    	(	(		zAptClone._rewrite_sources_listrg   c             C   sE  | r t  j j | d  } n d } t   } t  j j t j j d   } xx t j t  j j | d d   D]U } t	 | d d : } x0 | D]( } | j
 d  r | j | j    q WWd  QRXqm Wt   } xo t  j |  D]^ \ }	 }
 } xL | D]D } t  j j |	 t |  d   |  } | | k r | j |  q Wq W| S)	Nr   z/etczDir::State::statusrc   z*.listencodingzutf-8z/etc/)r   r   r:   r*   r   r=   r>   r   rd   r   r   r!   r   walkrr   )r   rI   ZetcdirZownedZdpkg_basedirrb   r   r   ZunowneddirpathZdirnames	filenamesr7   fullnamer   r   r   _find_unowned_in_etc  s"    	("	%zAptClone._find_unowned_in_etcc             C   s  | t  j j d  } t   } t |  h} t  j |  } xO| D]G} d | k rD x2| d j d  D]} d  } t | j    d k r | j   \ }	 }
 } n | j   \ }	 }
 | |	 } |
 j   }
 | d k r qj t	 j
 j |  st j d |  | j |  qj t j   } t | d   } | j | j    Wd  QRX| j   |
 k rj t j d | | j   |
 f  | j |  qj WqD WWd  QRX| S)	NzDir::State::statusZ	conffilesrW      obsoletezconffile %s removedr   zconffile %s (%s != %s))r=   r>   rS   r*   r   ZTagFiler   rr   r   r   r   r   r   debugr!   hashlibmd5r   r   Z	hexdigest)r   rI   r|   Zmodifiedr   tagr   r   r   r7   Zmd5sumr   r   r   r   r   _find_modified_conffiles  s6    	
	z!AptClone._find_modified_conffilesc             C   s   t  d  d  S)Nznot implemented yet)r   )r   rI   r   r   r   _dump_debconf_database  s    zAptClone._dump_debconf_database)(r%   r&   r'   r(   r   rR   r;   r   r6   rM   rU   r@   rF   rA   rG   rB   rD   rE   rC   r   r   rH   r   r   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   ]   sL   	
%			(	K%@	*#r)   )Z
__future__r   r/   Z	apt.cacher   r=   r   r   rd   r   r   r   r   r   r   r   r?   r]   rt   ior   r   environr>   r*   objectr   r)   r   r   r   r   <module>   s,   1