ó
Qº’Nc        	   @   sý   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 d d d d d d	 d
 g	 Z d „  Z e d „ Z	 d d „ Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e d k rù e j d e j ƒ e d d ƒ GHn  d S(   iÿÿÿÿNs   /bins   /boots   /etcs   /initrds   /libs   /lib32s   /sbins   /usrs   /varc         C   s²  t  j d ƒ |  rR |  j rR t  j d ƒ | j d d d ƒ | j d d d ƒ n  t j d d ƒ } | j d d	 | ƒ } t  j d
 | ƒ | t j d <| j d d	 | ƒ t j d d ƒ } t j	 | d ƒ | j d d | ƒ } t  j d | ƒ | j d d t
 ƒ r7t  j d ƒ | j d d d ƒ d t j d <n  | j d d t
 ƒ r|t  j d ƒ | j d d d ƒ | t j d <n  | j d d t
 ƒ r®t  j d ƒ d t j d <n  d S(   sÃ    setup the environment based on the config and options
    It will use
    config("Aufs","Enabled") - to show if its enabled
    and
    config("Aufs","RWDir") - for the writable overlay dir
    s    aufsOptionsAndEnvironmentSetup()s&   enabling full overlay from commandlinet   Aufst   Enabledt   Truet   EnableFullOverlayt   prefixs   upgrade-rw-t   RWDirs   using '%s' as aufs_rw_dirt   RELEASE_UPGRADE_AUFS_RWDIRs   upgrade-chroot-ií  t	   ChrootDirs   using '%s' as aufs chroot dirs(   enabling aufs full overlay (from config)t   1t%   RELEASE_UPGRADE_USE_AUFS_FULL_OVERLAYt   EnableChrootOverlays   enabling aufs chroot overlayt   RELEASE_UPGRADE_USE_AUFS_CHROOTt   EnableChrootRsyncs,   enable aufs chroot rsync back to real systemt!   RELEASE_UPGRADE_RSYNC_AUFS_CHROOTN(   t   loggingt   debugt   useAufst   sett   tempfilet   mkdtempt   getWithDefaultt   ost   environt   chmodt   False(   t   optionst   configt   tmprwt   aufs_rw_dirt	   tmpchroott   aufs_chroot_dir(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   aufsOptionsAndEnvironmentSetup   s2    c         C   s”   t  j j | ƒ s" t  j | ƒ n  | r1 d } n d } d | |  | g } t j d | ƒ t j | ƒ } | d k r t j d |  | f ƒ t	 St
 S(   s4    helper that bind mounts a given dir to a new place s   --rbinds   --bindt   mounts   cmd: %si    s&   Failed to bind mount from '%s' to '%s'(   R   t   patht   existst   makedirsR   R   t
   subprocesst   callt   errorR   R   (   t   from_dirt   to_dirt   rbindt   bindt   cmdt   res(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt
   _bindMount;   s    	t   /c         C   sÌ   t  j j | |  ƒ s* t  j | |  ƒ n  t  j j | |  ƒ sT t  j | |  ƒ n  d d d d d | |  |  f d | |  g } t j | ƒ } | d k r± t j d |  ƒ t St j	 d	 | | f ƒ t
 S(
   sf    
    helper that takes a target dir and mounts a rw dir over it, e.g.
    /var , /tmp/upgrade-rw
    R    s   -tt   aufss   -os   br:%s:%s=rot   nonei    s(   Failed to mount rw aufs overlay for '%s's   cmd '%s' return '%s' (   R   R!   R"   R#   R$   R%   R   R&   R   R   R   (   t   targett   rw_dirt
   chroot_dirR+   R,   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   _aufsOverlayMountL   s    c         C   sa   xZ t  d ƒ D]L } | j ƒ  \ } } } } } } | d k r | d k r | |  k r t Sq Wt S(   s<    test if the given dir is already mounted with aufs overlay s   /proc/mountsR0   R/   (   t   opent   splitR   R   (   t   dirt   linet   devicet
   mountpointt   fstypeR   t   at   b(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   is_aufs_mountb   s
    $c         C   s[   t  j d |  | f ƒ x= | D]5 } | j d ƒ s@ | d 7} n  |  j | ƒ r t Sq Wt S(   sD    helper: check if the given mountpoint is a submount of a systemdir s   is_submount: %s %sR.   (   R   R   t   endswitht
   startswithR   R   (   R:   t
   systemdirst   d(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   is_submountj   s    c      	   C   s'   |  j  d ƒ r t S|  d
 k r# t St S(   Nt   fuset   rootfst   tmpfst   proct   fusectrlR/   t   devptst   binfmt_misct   sysfs(   RE   RF   RG   RH   s   aufsRI   RJ   RK   (   R@   R   R   (   t   fs(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt
   is_real_fst   s    	c      	   C   s   x† t  D]~ } t j j | ƒ s% q n  d d d d d d |  | f d | g } t j d | ƒ t j | ƒ } t j d	 | | f ƒ q Wt S(
   sW   
    helper that rsyncs the changes in the aufs chroot back to the
    real system
    t   rsyncs   -aHAXs   --dels   -vs
   --progresss   /%s/%s/s   /%s/s   running: '%s's   rsync back result for %s: %i(	   RA   R   R!   R"   R   R   R$   R%   R   (   R   RB   R+   t   ret(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   doAufsChrootRsync|   s    c         C   s1   t  |  | ƒ s t St j | ƒ t j d ƒ t S(   s:    helper that sets the chroot up and does chroot() into it R.   (   t   setupAufsChrootR   R   t   chroott   chdirR   (   R   R   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   doAufsChrootŽ   s
    c         C   s`  t  d ƒ j ƒ  } x¥ t j d ƒ D]” } t j j d | ƒ } t j j | ƒ r" | t k r… t j	 d | ƒ t
 | |  | ƒ s³ t Sq¶ t j	 d | ƒ t | | | d t ƒs¶ t Sq" q" WxŸ t t j | j d ƒ ƒ D]‚ } | sè qÖ n  | j ƒ  \ } } } } }	 }
 | d k rÖ t | ƒ rÖ t | t ƒ rÖ t j	 d | ƒ t | | | ƒ sXt SqÖ qÖ Wt S(	   sB    setup aufs chroot that is based on / but with a writable overlay s   /proc/mountsR.   s   bind mounting %ss   overlay mounting %sR)   s   
R/   s   found %s that needs bind mount(   R5   t   readR   t   listdirR!   t   joint   isdirRA   R   R   R4   R   R-   R   t   mapt   stringt   stripR6   RM   RC   (   R2   R3   t   mountsRB   R8   R9   R:   R;   R   R<   R=   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyRQ   —   s,    	" c   
      C   s‚  t  j d ƒ t j j d ƒ s0 t  j d ƒ t St ƒ  } | j d ƒ xª t d ƒ D]œ } | j	 ƒ  \ } } } } } } t
 | ƒ r§ t | t ƒ r§ t  j d | ƒ t S| d k rS t
 | ƒ rS t | t ƒ rS t  j d | ƒ | j | ƒ qS qS Wx) | D]! }	 t |	 |  d |	 ƒ sú t Sqú Wx0 t D]( }	 t |	 ƒ s&t |	 |  ƒ sNt Sq&q&Wx) | D]! }	 t |  d |	 |	 ƒ sYt SqYWt S(	   s$    setup aufs overlay over the rootfs t	   setupAufss   /proc/mountss(   no /proc/mounts, can not do aufs overlays   /var/cache/apt/archivess#   mountpoint %s submount of systemdirR/   s   found %s that needs bind mounts   /needs_bind_mount/(   R   R   R   R!   R"   R   R   t   addR5   R6   RM   RC   RA   t   warningR-   R>   R4   R   (
   R2   t   needs_bind_mountR8   R9   R:   R;   R   R<   R=   RB   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyR]   ¼   s2    	(t   __main__t   levels   /tmp/upgrade-chroot-rws   /tmp/upgrade-chroot(   RZ   R   R   t   os.pathR$   R   RA   R   R   R-   R4   R>   RC   RM   RP   RT   RQ   R]   t   __name__t   basicConfigt   DEBUG(    (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   <module>   s8   		'		
					%	: