o
    Z;f&                     @   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                   @      e Zd ZdS )AptBtrfsSnapshotErrorN__name__
__module____qualname__ r   r   @/usr/lib/python3/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyr   !       r   c                   @   r   )AptBtrfsNotSupportedErrorNr   r   r   r   r   r   %   r   r   c                   @   r   )AptBtrfsRootWithNoatimeErrorNr   r   r   r   r   r   )   r   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|3}dd |D D ]"}|dks|drqzt|}W n	 ty/   Y qw | | qW d    d S 1 sAw   Y  d S )Nc                 s   s    | ]}|  V  qd S r   )strip).0r   r   r   r   	<genexpr>L   s    z!Fstab.__init__.<locals>.<genexpr> r   )	superr(   r#   open
startswithr   r   
ValueErrorappend)r"   fstab
fstab_filestripped_lineentry	__class__r   r   r#   H   s   
"zFstab.__init__r)   )r	   r
   r   r&   r#   __classcell__r   r   r7   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   r<   Z   s   zLowLevelCommands.mountc                 C   s   t d|g}|dkS )Numountr   r=   )r"   r   r@   r   r   r   rA   ^   s   zLowLevelCommands.umountc                 C   s   t ddd||g}|dkS )Nbtrfs	subvolumesnapshotr   r=   )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 )NrB   rC   deleter   r=   )r"   rD   r@   r   r   r   btrfs_delete_snapshotg   s   z&LowLevelCommands.btrfs_delete_snapshotN)r	   r
   r   r&   r<   rA   rG   rI   r   r   r   r   r;   V   s    r;   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(   r3   r;   commands_btrfs_root_mountpoint)r"   r3   r   r   r   r#   t   s   

zAptBtrfsSnapshot.__init__c                 C   s   t dsdS |  }|duS )zx verify that the system supports apt btrfs snapshots
            by checking if the right fs layout is used etc
        rB   FN)r   %_get_supported_btrfs_root_fstab_entryr"   r6   r   r   r   snapshots_supportedy   s   z$AptBtrfsSnapshot.snapshots_supportedc                 C   s6   | j D ]}|jdkr|jdkrd|jv r|  S qdS )z4 return the supported btrfs root FstabEntry or None /rB   zsubvol=@N)r3   r   r   r   rN   r   r   r   rM      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)r3   r   r   )r"   r   r3   r6   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 )NrP   zapt-btrfs-snapshot-mp-)prefix)rQ   tempfilemkdtemprK   r<   rL   )r"   uuidr   r   r   r   mount_btrfs_root_volume   s   
z(AptBtrfsSnapshot.mount_btrfs_root_volumec                 C   s$   | j | j}t| j d | _|S r   )rK   rA   rL   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   )microsecond_)datetimenowreplace	isoformatstrr$   r   r   r   _get_now_str   s   zAptBtrfsSnapshot._get_now_strr-   c                 C   sr   |   }|  }tj|d}tj|| j| | }tj|r,ttd|f  dS | j	
||}|   |S )N@zDINFO: snapshot directory '%s' already exists, not creating duplicateT)rV   rb   rW   pathjoinSNAP_PREFIXexistsprintr\   rK   rG   rZ   )r"   additional_prefixmpsnap_idrE   targetrY   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v rt |dkrt }|  }t|D ]}|| j	rFtj
tj
||dd}||k rF|| q(|   |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etcr3   )rM   r   r   r   timerV   rW   listdirr0   rf   rd   getatimere   r2   rZ   )r"   
older_thanresultr6   rj   e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)rh   re   rw   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)   <   )rp   endswith	Exceptionint)r"   timefmtr^   daysr   r   r   _parse_older_than_to_unixtime   s
   
z.AptBtrfsSnapshot._parse_older_than_to_unixtimec                 C   sT   |  |}ztd|  td| j|d W dS  ty)   tjd Y dS w )Nz$Available snapshots older than '%s':rx   rs   6Error: fstab option 'noatime' incompatible with optionFT)r   rh   re   rw   r   sysstderrwrite)r"   r   older_than_unixtimer   r   r   %print_btrfs_root_snapshots_older_than   s   

z6AptBtrfsSnapshot.print_btrfs_root_snapshots_older_thanc                 C   sV   d}|  |}z| j|dD ]	}|| |M }qW |S  ty*   tjd Y dS w )NTr   r   F)r   rw   delete_snapshotr   r   r   r   )r"   r   rY   r   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_namerY   r   r   r   command_set_default   s   
z$AptBtrfsSnapshot.command_set_defaultTc                 C   s   |   }tj||}tj|r@|dr@|dkr@tj|d}tj|| j|   }t|| t|| t	d|  nt	d | 
  dS )z set new default rc   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)rV   rW   rd   re   isdirr0   BACKUP_PREFIXrb   renamerh   rZ   )r"   r   backuprj   new_rootdefault_rootr   r   r   r      s"   
zAptBtrfsSnapshot.set_defaultc                 C   s*   |   }| jtj||}|   |S r   )rV   rK   rI   rW   rd   re   rZ   )r"   r   rj   rY   r   r   r   r     s   z AptBtrfsSnapshot.delete_snapshotNr9   )r-   )r   )T)r	   r
   r   r&   rf   r   r#   rO   rM   rQ   rV   rZ   rb   rm   rw   ry   r   r   r   r   r   r   r   r   r   r   rJ   l   s(    






rJ   )
__future__r   r   r]   rW   r>   r   rp   rS   distutils.spawnr   r   r\   r   r   r   r   objectr   listr(   r;   rJ   r   r   r   r   <module>   s    