
    g&                         d dl mZ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	m
Z
 d dlmZ  G d de      Z G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    )print_functionunicode_literalsN)find_executable)gettextc                       e Zd Zy)AptBtrfsSnapshotErrorN__name__
__module____qualname__     @/usr/lib/python3/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyr   r   !       r   r   c                       e Zd Zy)AptBtrfsNotSupportedErrorNr	   r   r   r   r   r   %   r   r   r   c                       e Zd Zy)AptBtrfsRootWithNoatimeErrorNr	   r   r   r   r   r   )   r   r   r   c                   .    e Zd ZdZed        ZddZd Zy)
FstabEntryz a single fstab entry line c                 \    |j                  d      d   j                         }t        |dd  S )N#r      )	partitionsplitr   )clslineargss      r   	from_linezFstabEntry.from_line/   s3     ~~c"1%++- 4!9%%r   c                 X    || _         || _        || _        || _        || _        || _        y Nfs_spec
mountpointfstypeoptionsdumppassno)selfr#   r$   r%   r&   r'   r(   s          r   __init__zFstabEntry.__init__7   s,    $	r   c                     d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  dS )Nz<FstabEntry 'z' 'z'>r"   r)   s    r   __repr__zFstabEntry.__repr__@   s2    LL$//4;;LL$))T[[2 	2r   N)r   r   )r
   r   r   __doc__classmethodr   r*   r-   r   r   r   r   r   -   s!    %& &2r   r   c                   $     e Zd ZdZd fd	Z xZS )Fstabz a list of FstabEntry items c                 "   t         t        |           t        |      5 }d |D        D ]@  }|dk(  s|j	                  d      r	 t
        j                  |      }| j                  |       B 	 d d d        y # t        $ r Y Xw xY w# 1 sw Y   y xY w)Nc              3   <   K   | ]  }|j                           y wr!   )strip).0r   s     r   	<genexpr>z!Fstab.__init__.<locals>.<genexpr>L   s     !F4$**,!Fs    r   )	superr1   r*   open
startswithr   r   
ValueErrorappend)r)   fstab
fstab_filestripped_lineentry	__class__s        r   r*   zFstab.__init__H   s    eT#%%[ 	#J!F:!F # B&-*B*B3*G&00?E E"#	# 	# " 	# 	#s/   $BA6B6	B?BBBBz
/etc/fstab)r
   r   r   r.   r*   __classcell__)rA   s   @r   r1   r1   F   s    &# #r   r1   c                   (    e Zd ZdZd Zd Zd Zd Zy)LowLevelCommandszi lowlevel commands invoked to perform various tasks like
        interact with mount and btrfs tools
    c                 <    t        j                  d||g      }|dk(  S )Nmountr   
subprocesscall)r)   r#   r$   rets       r   rG   zLowLevelCommands.mountZ   s     oow<=axr   c                 :    t        j                  d|g      }|dk(  S )Numountr   rH   )r)   r$   rK   s      r   rM   zLowLevelCommands.umount^   s    oox45axr   c                 @    t        j                  ddd||g      }|dk(  S )Nbtrfs	subvolumesnapshotr   rH   )r)   sourcedestrK   s       r   btrfs_subvolume_snapshotz)LowLevelCommands.btrfs_subvolume_snapshotb   s)    oowZ%t- .axr   c                 >    t        j                  ddd|g      }|dk(  S )NrO   rP   deleter   rH   )r)   rQ   rK   s      r   btrfs_delete_snapshotz&LowLevelCommands.btrfs_delete_snapshotg   s"    oowXxHIaxr   N)r
   r   r   r.   rG   rM   rT   rW   r   r   r   rE   rE   V   s    
r   rE   c                       e Zd ZdZdZedz   ZddZ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ddZd Zy)AptBtrfsSnapshotz? the high level object that interacts with the snapshot system z@apt-snapshot-z	old-root-c                 P    t        |      | _        t               | _        d | _        y r!   )r1   r=   rE   commands_btrfs_root_mountpoint)r)   r=   s     r   r*   zAptBtrfsSnapshot.__init__t   s    5\
(*&*#r   c                 B    t        d      sy| j                         }|duS )zx verify that the system supports apt btrfs snapshots
            by checking if the right fs layout is used etc
        rO   FN)r   %_get_supported_btrfs_root_fstab_entryr)   r@   s     r   snapshots_supportedz$AptBtrfsSnapshot.snapshots_supportedy   s(      (::<D  r   c                     | j                   D ]4  }|j                  dk(  s|j                  dk(  s#d|j                  v s2|c S  y)z4 return the supported btrfs root FstabEntry or None /rO   zsubvol=@N)r=   r$   r%   r&   r_   s     r   r^   z6AptBtrfsSnapshot._get_supported_btrfs_root_fstab_entry   sE    ZZ 	E$$+LLG+%--/	 r   c                 `    | j                   D ]  }|j                  |k(  s|j                  c S  y)z4 return the device or UUID for the given mountpoint N)r=   r$   r#   )r)   r$   r=   r@   s       r   _uuid_for_mountpointz%AptBtrfsSnapshot._uuid_for_mountpoint   s2    ZZ 	%E:-}}$	% r   c                     | j                  d      }t        j                  d      }| j                  j	                  ||      sy || _        | j
                  S )Nrb   zapt-btrfs-snapshot-mp-)prefix)rd   tempfilemkdtempr[   rG   r\   )r)   uuidr$   s      r   mount_btrfs_root_volumez(AptBtrfsSnapshot.mount_btrfs_root_volume   sN    ((-%%-EF
}}""44&0#***r   c                     | j                   j                  | j                        }t        j                  | j                         d | _        |S r!   )r[   rM   r\   osrmdir)r)   ress     r   umount_btrfs_root_volumez)AptBtrfsSnapshot.umount_btrfs_root_volume   s;    mm""4#>#>?
,,-&*#
r   c                     t         j                   j                         j                  d      j                  t	        d            S )Nr   )microsecond_)datetimenowreplace	isoformatstrr,   s    r   _get_now_strzAptBtrfsSnapshot._get_now_str   s9      $$&..1.=GGH 	r   c                    | j                         }| j                         }t        j                  j	                  |d      }t        j                  j	                  || j
                  |z   |z         }t        j                  j                  |      rt        t        d      |fz         y| j                  j                  ||      }| j                          |S )N@zDINFO: snapshot directory '%s' already exists, not creating duplicateT)rj   rx   rl   pathjoinSNAP_PREFIXexistsprintrr   r[   rT   ro   )r)   additional_prefixmpsnap_idrR   targetrn   s          r   create_btrfs_root_snapshotz+AptBtrfsSnapshot.create_btrfs_root_snapshot   s    ))+##%b#&b$"2"25F"F%#& ' 77>>&!! - .17	: ;--88HC))+Jr   c           	         g }|dk7  r4| j                         }|s
t               d|j                  v r
t               |dk(  rt	        j                         }| j                         }t        j                  |      D ]t  }|j                  | j                        st        j                  j                  t        j                  j                  ||dd            }||k  sd|j                  |       v | j                          |S )z 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)
        r   noatimeetcr=   )r^   r   r&   r   timerj   rl   listdirr:   r}   r{   getatimer|   r<   ro   )r)   
older_thanresultr@   r   eatimes          r   get_btrfs_root_snapshots_listz.AptBtrfsSnapshot.get_btrfs_root_snapshots_list   s    
  ?>>@E/11EMM)244?J))+B 	%A||D,,- ((b!UG)LM:%MM!$	% 	%%'r   c                 j    t        d       t        dj                  | j                                      y)NzAvailable snapshots:  
T)r   r|   r   r,   s    r   print_btrfs_root_snapshotsz+AptBtrfsSnapshot.print_btrfs_root_snapshots   s(    $%fkk$<<>?@r   c                     t        j                          }|j                  d      st        d      t        |d d       }||dz  dz  dz  z
  S )Ndz&Please specify time in days (e.g. 10d)   <   )r   endswith	Exceptionint)r)   timefmtrt   dayss       r   _parse_older_than_to_unixtimez.AptBtrfsSnapshot._parse_older_than_to_unixtime   sO    iik$DEE73B< dRi"nr)**r   c                     | j                  |      }	 t        d|z         t        dj                  | j                  |                   y# t        $ r" t
        j                  j                  d       Y yw xY w)Nz$Available snapshots older than '%s':r   r   6Error: fstab option 'noatime' incompatible with optionFT)r   r   r|   r   r   sysstderrwrite)r)   r   older_than_unixtimes      r   %print_btrfs_root_snapshots_older_thanz6AptBtrfsSnapshot.print_btrfs_root_snapshots_older_than   s    "@@I	87BC&++d@@. A 0 1 2 	 , 	JJ + ,	s   8A (A76A7c                     d}| j                  |      }	 | j                  |      D ]  }|| j                  |      z  } 	 |S # t        $ r" t        j
                  j                  d       Y yw xY w)NTr   r   F)r   r   delete_snapshotr   r   r   r   )r)   r   rn   r   snaps        r   %clean_btrfs_root_snapshots_older_thanz6AptBtrfsSnapshot.clean_btrfs_root_snapshots_older_than   s    "@@I	::2 ; 4 2t++D112 
	 , 	JJ & '	s   +A (A.-A.c                 (    | j                  |      }|S r!   )set_default)r)   snapshot_namern   s      r   command_set_defaultz$AptBtrfsSnapshot.command_set_default   s    }-
r   c                 0   | j                         }t        j                  j                  ||      }t        j                  j	                  |      r|j                  d      r|dk7  rt        j                  j                  |d      }t        j                  j                  || j                  | j                         z         }t        j                  ||       t        j                  ||       t        d|z         nt        d       | j                          y)z set new default rz   z@Default changed to %s, please reboot for changes to take effect.z_You have selected an invalid snapshot. Please make sure that it exists, and that it is not "@".T)rj   rl   r{   r|   isdirr:   BACKUP_PREFIXrx   renamer   ro   )r)   r   backupr   new_rootdefault_roots         r   r   zAptBtrfsSnapshot.set_default   s    ))+77<<M2h'((-$77<<C0LWW\\"d&8&84;L;L;N&NOFIIlF+IIh- +, -  > ?%%'r   c                     | j                         }| j                  j                  t        j                  j                  ||            }| j                          |S r!   )rj   r[   rW   rl   r{   r|   ro   )r)   r   r   rn   s       r   r   z AptBtrfsSnapshot.delete_snapshot  sG    ))+mm11GGLL]+-%%'
r   NrB   )r7   )r   )T)r
   r   r   r.   r}   r   r*   r`   r^   rd   rj   ro   rx   r   r   r   r   r   r   r   r   r   r   r   r   rY   rY   l   sf    I #K+-M+
!+ 8
+
(r   rY   )
__future__r   r   rs   rl   rI   r   r   rg   distutils.spawnr   r   rr   r   r   r   r   objectr   listr1   rE   rY   r   r   r   <module>r      sz   & 8  	  
   +  	I 		 5 		#8 	2 22#D # v ,hv hr   