ó
¤Oc           @   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 „  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ÿÿÿÿNc         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  t } | r d d d d d | |  |  f d | |  g } 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	   overlayfss   -os   upperdir=%s,lowerdir=%st   nonet   aufss   br:%s:%s=roi    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_dirt   use_overlayfsR+   R,   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   _aufsOverlayMount@   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   R1   (   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_mount_   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_submountg   s    c      	   C   s'   |  j  d ƒ r t S|  d
 k r# t St S(   Nt   fuset   rootfst   tmpfst   proct   fusectrlR1   t   devptst   binfmt_misct   sysfs(   RG   RH   RI   RJ   s   aufsRK   RL   RM   (   RB   R   R   (   t   fs(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt
   is_real_fsq   s    	c      	   C   s   d d l  m } x† | D]~ } t j j | ƒ s5 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
    iÿÿÿÿ(   t   SYSTEM_DIRSt   rsyncs   -aHAXs   --dels   -vs
   --progresss   /%s/%s/s   /%s/s   running: '%s's   rsync back result for %s: %i(
   t   DistUpgradeMainRP   R   R!   R"   R   R   R$   R%   R   (   R   RP   RD   R+   t   ret(    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   doAufsChrootRsyncy   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   sv  t  d ƒ j ƒ  } d d l m } | } x¥ t j d ƒ D]” } t j j d | ƒ } t j j | ƒ r8 | | k r› t	 j
 d | ƒ t | |  | ƒ sÉ t SqÌ t	 j
 d | ƒ t | | | d t ƒsÌ t Sq8 q8 WxŸ t t j | j d ƒ ƒ D]‚ } | sþ qì n  | j ƒ  \ } } }	 }
 } } |	 d	 k rì t |	 ƒ rì t | | ƒ rì t	 j
 d
 | ƒ t | | | ƒ snt Sqì qì Wt S(   sB    setup aufs chroot that is based on / but with a writable overlay s   /proc/mountsiÿÿÿÿ(   RP   R.   s   bind mounting %ss   overlay mounting %sR)   s   
R1   s   found %s that needs bind mount(   R7   t   readRR   RP   R   t   listdirR!   t   joint   isdirR   R   R6   R   R-   R   t   mapt   stringt   stripR8   RO   RE   (   R3   R4   t   mountsRP   RC   RD   R:   R;   R<   R=   R   R>   R?   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyRU   •   s0    	" c         C   s˜  t  j d ƒ t j j d ƒ s0 t  j d ƒ t Sd d l m } | } t ƒ  } | j	 d ƒ xª t
 d ƒ D]œ } | j ƒ  \ } } } } }	 }
 t | ƒ r½ t | | ƒ r½ t  j d | ƒ t S| d k ri t | ƒ ri t | | ƒ ri t  j d	 | ƒ | j	 | ƒ qi qi Wx) | D]! } t | |  d
 | ƒ st SqWx0 | D]( } t | ƒ s<t | |  ƒ sdt Sq<q<Wx) | D]! } t |  d
 | | ƒ sot SqoWt S(   s$    setup aufs overlay over the rootfs t	   setupAufss   /proc/mountss(   no /proc/mounts, can not do aufs overlayiÿÿÿÿ(   RP   s   /var/cache/apt/archivess#   mountpoint %s submount of systemdirR1   s   found %s that needs bind mounts   /needs_bind_mount/(   R   R   R   R!   R"   R   RR   RP   R   t   addR7   R8   RO   RE   t   warningR-   R@   R6   R   (   R3   RP   RC   t   needs_bind_mountR:   R;   R<   R=   R   R>   R?   RD   (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyRa   ¼   s6    	(t   __main__t   levels   /tmp/upgrade-chroot-rws   /tmp/upgrade-chroot(   R^   R   R   t   os.pathR$   R   R   R   R-   R6   R@   RE   RO   RT   RX   RU   Ra   t   __name__t   basicConfigt   DEBUG(    (    (    s?   /usr/lib/python2.7/dist-packages/DistUpgrade/DistUpgradeAufs.pyt   <module>   s&   	'		
					'	<