U
    ٪zc&                     @   s   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 deZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZdS )    )print_functionunicode_literalsN)find_executable)gettextc                   @   s   e Zd ZdS )AptBtrfsSnapshotErrorN__name__
__module____qualname__ r   r   @/usr/lib/python3/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyr   !   s   r   c                   @   s   e Zd ZdS )AptBtrfsNotSupportedErrorNr   r   r   r   r   r   %   s   r   c                   @   s   e Zd ZdS )AptBtrfsRootWithNoatimeErrorNr   r   r   r   r   r   )   s   r   c                   @   s.   e Zd ZdZedd Zd
ddZdd Zd	S )
FstabEntryz a single fstab entry line c                 C   s"   | dd  }t|dd  S )N#r      )	partitionsplitr   )clslineargsr   r   r   	from_line/   s    zFstabEntry.from_liner   c                 C   s(   || _ || _|| _|| _|| _|| _d S Nfs_spec
mountpointfstypeoptionsdumppassno)selfr   r   r   r   r   r   r   r   r   __init__7   s    zFstabEntry.__init__c                 C   s    d| j | j| j| j| j| jf S )Nz*<FstabEntry '%s' '%s' '%s' '%s' '%s' '%s'>r   r    r   r   r   __repr__@   s        zFstabEntry.__repr__N)r   r   )r   r	   r
   __doc__classmethodr   r!   r#   r   r   r   r   r   -   s
   

	r   c                       s"   e Zd ZdZd fdd	Z  ZS )Fstabz a list of FstabEntry items 
/etc/fstabc              
      s   t t|   t|`}dd |D D ]J}|dks&|dr>q&zt|}W n tk
rd   Y q&Y nX | | q&W 5 Q R X d S )Nc                 s   s   | ]}|  V  qd S r   )strip).0lr   r   r   	<genexpr>L   s     z!Fstab.__init__.<locals>.<genexpr> r   )	superr&   r!   open
startswithr   r   
ValueErrorappend)r    fstabZ
fstab_filer   entry	__class__r   r   r!   H   s    

zFstab.__init__)r'   )r   r	   r
   r$   r!   __classcell__r   r   r4   r   r&   F   s   r&   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )LowLevelCommandszi lowlevel commands invoked to perform various tasks like
        interact with mount and btrfs tools
    c                 C   s   t d||g}|dkS )Nmountr   
subprocesscall)r    r   r   retr   r   r   r8   Z   s    zLowLevelCommands.mountc                 C   s   t d|g}|dkS )Numountr   r9   )r    r   r<   r   r   r   r=   ^   s    zLowLevelCommands.umountc                 C   s   t ddd||g}|dkS )Nbtrfs	subvolumesnapshotr   r9   )r    sourcedestr<   r   r   r   btrfs_subvolume_snapshotb   s
    
 z)LowLevelCommands.btrfs_subvolume_snapshotc                 C   s   t ddd|g}|dkS )Nr>   r?   deleter   r9   )r    r@   r<   r   r   r   btrfs_delete_snapshotg   s    z&LowLevelCommands.btrfs_delete_snapshotN)r   r	   r
   r$   r8   r=   rC   rE   r   r   r   r   r7   V   s
   r7   c                   @   s   e Zd ZdZdZed Zd)ddZdd Zd	d
 Zd*ddZ	dd Z
dd Zdd Zd+ddZd,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(S ).AptBtrfsSnapshotz? the high level object that interacts with the snapshot system z@apt-snapshot-z	old-root-r'   c                 C   s   t || _t | _d | _d S r   )r&   r2   r7   commands_btrfs_root_mountpoint)r    r2   r   r   r   r!   t   s    
zAptBtrfsSnapshot.__init__c                 C   s   t dsdS |  }|dk	S )zx verify that the system supports apt btrfs snapshots
            by checking if the right fs layout is used etc
        r>   FN)r   %_get_supported_btrfs_root_fstab_entryr    r3   r   r   r   snapshots_supportedy   s    z$AptBtrfsSnapshot.snapshots_supportedc                 C   s6   | j D ]*}|jdkr|jdkrd|jkr|  S qdS )z4 return the supported btrfs root FstabEntry or None /r>   zsubvol=@N)r2   r   r   r   rJ   r   r   r   rI      s    

z6AptBtrfsSnapshot._get_supported_btrfs_root_fstab_entryc                 C   s$   | j D ]}|j|kr|j  S qdS )z4 return the device or UUID for the given mountpoint N)r2   r   r   )r    r   r2   r3   r   r   r   _uuid_for_mountpoint   s    

z%AptBtrfsSnapshot._uuid_for_mountpointc                 C   s4   |  d}tjdd}| j||s(d S || _| jS )NrL   zapt-btrfs-snapshot-mp-)prefix)rM   tempfileZmkdtemprG   r8   rH   )r    Zuuidr   r   r   r   mount_btrfs_root_volume   s    
z(AptBtrfsSnapshot.mount_btrfs_root_volumec                 C   s$   | j | j}t| j d | _|S r   )rG   r=   rH   osrmdir)r    resr   r   r   umount_btrfs_root_volume   s    z)AptBtrfsSnapshot.umount_btrfs_root_volumec                 C   s   t j  jddtdS )Nr   )Zmicrosecond_)datetimenowreplaceZ	isoformatstrr"   r   r   r   _get_now_str   s    zAptBtrfsSnapshot._get_now_strr,   c                 C   sv   |   }|  }tj|d}tj|| j| | }tj|rXttd|f  dS | j	
||}|   |S d S )N@zDINFO: snapshot directory '%s' already exists, not creating duplicateT)rP   rZ   rQ   pathjoinSNAP_PREFIXexistsprintrU   rG   rC   rT   )r    Zadditional_prefixmpZsnap_idrA   targetrS   r   r   r   create_btrfs_root_snapshot   s    z+AptBtrfsSnapshot.create_btrfs_root_snapshotr   c              	   C   s   g }|dkr.|   }|st d|jkr.t |dkr>t }|  }t|D ]<}|| j	rPtj
tj
||dd}||k rP|| qP|   |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   Znoatimeetcr2   )rI   r   r   r   timerP   rQ   listdirr/   r^   r\   getatimer]   r1   rT   )r    
older_thanresultr3   ra   eZatimer   r   r   get_btrfs_root_snapshots_list   s"    
z.AptBtrfsSnapshot.get_btrfs_root_snapshots_listc                 C   s   t d t d|   dS )NzAvailable snapshots:  
T)r`   r]   rk   r"   r   r   r   print_btrfs_root_snapshots   s    z+AptBtrfsSnapshot.print_btrfs_root_snapshotsc                 C   s>   t   }|dstdt|d d }||d d d  S )Ndz&Please specify time in days (e.g. 10d)   <   )re   endswith	Exceptionint)r    timefmtrW   Zdaysr   r   r   _parse_older_than_to_unixtime   s
    
z.AptBtrfsSnapshot._parse_older_than_to_unixtimec                 C   sX   |  |}z&td|  td| j|d W n" tk
rR   tjd Y dS X dS )Nz$Available snapshots older than '%s':rl   rh   6Error: fstab option 'noatime' incompatible with optionFT)rv   r`   r]   rk   r   sysstderrwrite)r    ru   older_than_unixtimer   r   r   %print_btrfs_root_snapshots_older_than   s    

z6AptBtrfsSnapshot.print_btrfs_root_snapshots_older_thanc                 C   sZ   d}|  |}z$| j|dD ]}|| |M }qW n" tk
rT   tjd Y dS X |S )NTrw   rx   F)rv   rk   delete_snapshotr   ry   rz   r{   )r    ru   rS   r|   Zsnapr   r   r   %clean_btrfs_root_snapshots_older_than   s    

z6AptBtrfsSnapshot.clean_btrfs_root_snapshots_older_thanc                 C   s   |  |}|S r   )set_default)r    snapshot_namerS   r   r   r   command_set_default   s    
z$AptBtrfsSnapshot.command_set_defaultTc                 C   s   |   }tj||}tj|r|dr|dkrtj|d}tj|| j|   }t|| t|| t	d|  nt	d | 
  dS )z set new default r[   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)rP   rQ   r\   r]   isdirr/   BACKUP_PREFIXrZ   renamer`   rT   )r    r   Zbackupra   Znew_rootZdefault_rootr   r   r   r      s$    
zAptBtrfsSnapshot.set_defaultc                 C   s*   |   }| jtj||}|   |S r   )rP   rG   rE   rQ   r\   r]   rT   )r    r   ra   rS   r   r   r   r~     s    z AptBtrfsSnapshot.delete_snapshotN)r'   )r'   )r,   )r   )T)r   r	   r
   r$   r^   r   r!   rK   rI   rM   rP   rT   rZ   rc   rk   rm   rv   r}   r   r   r   r~   r   r   r   r   rF   l   s&   






rF   )Z
__future__r   r   rV   rQ   r:   ry   re   rO   Zdistutils.spawnr   r   rU   rs   r   r   r   objectr   listr&   r7   rF   r   r   r   r   <module>   s   