ó
­„ž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 l Z d e f d „  ƒ  YZ d e	 f d „  ƒ  YZ
 d e f d „  ƒ  YZ d e f d	 „  ƒ  YZ d S(
   iÿÿÿÿNt
   FstabEntryc           B   s5   e  Z d  Z e d „  ƒ Z d d d „ Z d „  Z RS(   s    a single fstab entry line c         C   s   t  | j d ƒ d j ƒ  Œ  S(   Nt   #i    (   R    t	   partitiont   split(   t   clst   line(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt	   from_line   s    i    c         C   s:   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   t   fs_spect
   mountpointt   fstypet   optionst   dumpt   passno(   t   selfR   R   R	   R
   R   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   __init__    s    					c         C   s,   d |  j  |  j |  j |  j |  j |  j f S(   Ns*   <FstabEntry '%s' '%s' '%s' '%s' '%s' '%s'>(   R   R   R	   R
   R   R   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   __repr__(   s    (   t   __name__t
   __module__t   __doc__t   classmethodR   R   R   (    (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR       s   t   Fstabc           B   s   e  Z d  Z d d „ Z RS(   s    a list of FstabEntry items s
   /etc/fstabc         C   s’   t  t |  ƒ j ƒ  xx t t j t | ƒ ƒ D]^ } | d k s, | j d ƒ rS q, n  y t j	 | ƒ } Wn t
 k
 r| q, n X|  j | ƒ q, Wd  S(   Nt    R   (   t   superR   R   t   mapt   stringt   stript   opent
   startswithR    R   t
   ValueErrort   append(   R   t   fstabR   t   entry(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR   /   s    (   R   R   R   R   (    (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR   -   s   t   LowLevelCommandsc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   sh    lowlevel commands invoked to perform various tasks like
        inteact with mount and btrfs tools
    c         C   s"   t  j d | | g ƒ } | d k S(   Nt   mounti    (   t
   subprocesst   call(   R   R   R   t   ret(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR!   >   s    c         C   s   t  j d | g ƒ } | d k S(   Nt   umounti    (   R"   R#   (   R   R   R$   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR%   A   s    c         C   s(   t  j d d d | | g ƒ } | d k S(   Nt   btrfst	   subvolumet   snapshoti    (   R"   R#   (   R   t   sourcet   destR$   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   btrfs_subvolume_snapshotD   s    c         C   s%   t  j d d d | g ƒ } | d k S(   NR&   R'   t   deletei    (   R"   R#   (   R   R(   R$   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   btrfs_delete_snapshotH   s    (   R   R   R   R!   R%   R+   R-   (    (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR    :   s
   			t   AptBtrfsSnapshotc           B   s´   e  Z d  Z d Z e d Z d d „ Z d „  Z d d „ Z d „  Z d „  Z	 d	 „  Z
 d
 d „ Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z e d „ Z d „  Z RS(   s?    the high level object that interacts with the snapshot system s   @apt-snapshot-s	   old-root-s
   /etc/fstabc         C   s(   t  | ƒ |  _ t ƒ  |  _ d  |  _ d  S(   N(   R   R   R    t   commandst   Nonet   _btrfs_root_mountpoint(   R   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR   T   s    c         C   s_   t  j j d ƒ s t SxB |  j D]7 } | j d k r  | j d k r  d | j k r  t Sq  Wt S(   sx    verify that the system supports apt btrfs snapshots
            by checking if the right fs layout is used etc
        s   /sbin/btrfst   /R&   s   subvol=@(	   t   ost   patht   existst   FalseR   R   R	   R
   t   True(   R   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   snapshots_supportedX   s    c         C   s.   x' |  j  D] } | j | k r
 | j Sq
 Wd S(   s4    return the device or UUID for the given mountpoint N(   R   R   R   R0   (   R   R   R   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   _uuid_for_mountpointf   s    c         C   sJ   |  j  d ƒ } t j d d ƒ } |  j j | | ƒ s: d  S| |  _ |  j S(   NR2   t   prefixs   apt-btrfs-snapshot-mp-(   R9   t   tempfilet   mkdtempR/   R!   R0   R1   (   R   t   uuidR   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   mount_btrfs_root_volumel   s    	c         C   s2   |  j  j |  j ƒ } t j |  j ƒ d  |  _ | S(   N(   R/   R%   R1   R3   t   rmdirR0   (   R   t   res(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   umount_btrfs_root_volumes   s    	c         C   s"   t  j  j ƒ  j d d ƒ j d ƒ S(   Nt   microsecondi    t   _(   t   datetimet   nowt   replacet	   isoformat(   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   _get_now_strx   s    R   c         C   sd   |  j  ƒ  } |  j ƒ  } |  j j t j j | d ƒ t j j | |  j | | ƒ ƒ } |  j ƒ  | S(   Nt   @(	   R>   RH   R/   R+   R3   R4   t   joint   SNAP_PREFIXRA   (   R   t   additional_prefixt   mpt   snap_idR@   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   create_btrfs_root_snapshotz   s    	#
i    c         C   s­   g  } | d k r! t  j  ƒ  } n  |  j ƒ  } xo t j | ƒ D]^ } | j |  j ƒ r= t j j t j j | | d d ƒ ƒ } | | k  r› | j	 | ƒ q› q= q= W|  j
 ƒ  | S(   s¶    get the list of available snapshot
            If "older_then" is given (in unixtime format) it will only include 
            snapshots that are older then the given date)
        i    t   etcR   (   t   timeR>   R3   t   listdirR   RK   R4   t   getatimeRJ   R   RA   (   R   t
   older_thant   lRM   t   et   atime(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   get_btrfs_root_snapshots_list‚   s    '
c         C   s   d GHd j  |  j ƒ  ƒ GHt S(   Ns   Available snapshots:s     
(   RJ   RX   R7   (   R   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   print_btrfs_root_snapshots”   s    c         C   sN   t  j  ƒ  } | j d ƒ s* t d ƒ ‚ n  t | d  ƒ } | | d d d S(   Nt   ds&   Please specify time in days (e.g. 10d)iÿÿÿÿi   i<   (   RQ   t   endswitht	   Exceptiont   int(   R   t   timefmtRE   t   days(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   _parse_older_than_to_unixtime˜   s
    c         C   s6   |  j  | ƒ } d | GHd j |  j d | ƒ ƒ GHt S(   Ns$   Available snapshots older than '%s':s     
RT   (   R`   RJ   RX   R7   (   R   R^   t   older_than_unixtime(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt%   print_btrfs_root_snapshots_older_thanž   s
    	c         C   s=   |  j  | ƒ } x' |  j d | ƒ D] } |  j | ƒ q" Wd  S(   NRT   (   R`   RX   t   delete_snapshot(   R   R^   Ra   t   snap(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt%   clean_btrfs_root_snapshots_older_than¤   s    c         C   s   |  j  | ƒ } d GH| S(   Ns   Please reboot(   t   set_default(   R   t   snapshot_nameR@   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   command_set_default©   s    c         C   s†   |  j  ƒ  } t j j | | ƒ } t j j | d ƒ } t j j | |  j |  j ƒ  ƒ } t j | | ƒ t j | | ƒ |  j ƒ  t S(   s    set new default RI   (	   R>   R3   R4   RJ   t   BACKUP_PREFIXRH   t   renameRA   R7   (   R   Rg   t   backupRM   t   new_roott   default_root(    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyRf   ­   s    "
c         C   s;   |  j  ƒ  } |  j j t j j | | ƒ ƒ } |  j ƒ  | S(   N(   R>   R/   R-   R3   R4   RJ   RA   (   R   Rg   RM   R@   (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyRc   ·   s
    	
(   R   R   R   RK   Ri   R   R8   R9   R>   RA   RH   RO   RX   RY   R`   Rb   Re   Rh   R7   Rf   Rc   (    (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyR.   L   s$   
									
(   RD   R3   R   R"   t   sysRQ   R;   t   objectR    t   listR   R    R.   (    (    (    sB   /usr/lib/python2.7/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyt   <module>   s   