Ë
    9_f»&  ã                   óö   — 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   � à�L‹L˜$Ÿ/›/¨4¯;«;Ø�L‹L˜$Ÿ)›) 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   è ø€ Ò!F°4 $§*¡*§,Ñ!Fùs   ‚Ú r   )	Úsuperr1   r*   ÚopenÚ
startswithr   r   Ú
ValueErrorÚappend)r)   ÚfstabÚ
fstab_fileÚstripped_lineÚentryÚ	__class__s        €r   r*   zFstab.__init__H   s–   ø€ ÜŒe�TÑ#Ô%ä�%‹[ð 	#˜JÙ!F¸:Ô!Fò #�Ø  BÒ&¨-×*BÑ*BÀ3Ô*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    € Ü�o‰o˜w¨°Ð<Ó=ˆØ�a‰xˆr   c                 ó:   — t        j                  d|g«      }|dk(  S )NÚumountr   rH   )r)   r$   rK   s      r   rM   zLowLevelCommands.umount^   s   € Ü�o‰o˜x¨Ð4Ó5ˆØ�a‰xˆ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)   € Ü�o‰o˜w¨°ZØ% tð-ó .ˆà�a‰xˆ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"   € Ü�o‰o˜w¨°X¸xÐHÓIˆØ�a‰xˆ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   € à—Z‘Zò 	ˆEà×$Ñ$¨Ó+Ø—L‘L GÓ+Ø %§-¡-Ò/Ø’ð	ð 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   € à—Z‘Zò 	%ˆ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;   € Ø�m‰m×"Ñ" 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Ñ"2Ð5FÑ"FØ%ñ#&ó 'ˆô �7‰7�>‰>˜&Ô!Ü”!ð -ó .Ø17°	ñ:ô ;àà—-‘-×8Ñ8¸ÀÓHˆCØ×)Ñ)Ô+Øˆ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Ø˜EŸM™MÑ)Ü2Ó4Ð4à˜Š?ÜŸ™›ˆJØ×)Ñ)Ó+ˆÜ—‘˜B“ò 	%ˆAØ�|‰|˜D×,Ñ,Õ-ô Ÿ™×(Ñ(¬¯©¯©°b¸!¸UÀGÓ)LÓM�Ø˜:Ó%Ø—M‘M !Õ$ð	%ð 	×%Ñ%Ô'Øˆ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(   € ÜÐ$Ô%Üˆf�k‰k˜$×<Ñ<Ó>Ó?Ô@Ø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   € Ü�i‰i‹kˆØ×Ñ Ô$ÜÐDÓEÐEÜ�7˜3˜B�<Ó ˆØ�d˜R‘i "‘n rÑ)Ñ*Ð*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Ðð	ÜÐ8¸7ÑBÔCÜ�&—+‘+˜d×@Ñ@Ø.ð Aó 0ó 1ô 2ð øô	 ,ò 	Ü�J‰J×Ñð +ô ,áð	ú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ð ˆ
øô	 ,ò 	Ü�J‰J×Ñð &ô 'áð	ú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  r–t        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Õ   € à×)Ñ)Ó+ˆÜ—7‘7—<‘<  MÓ2ˆä—‘—‘˜hÔ'Ø×(Ñ(¨Ô-Ø Ò$ÜŸ7™7Ÿ<™<¨¨CÓ0ˆLÜ—W‘W—\‘\ " d×&8Ñ&8¸4×;LÑ;LÓ;NÑ&NÓOˆFÜ�I‰I�l FÔ+Ü�I‰I�h Ô-Üð Ø+ñ,õ -ô ð >ô ?à×%Ñ%Ô'Ø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   € Ø×)Ñ)Ó+ˆØ�m‰m×1Ñ1Ü�G‰G�L‰L˜˜]Ó+ó-ˆà×%Ñ%Ô'Øˆ
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�ô 2ô2#ˆDô #ô �vô ô,h�võ hr   