+
    j2                        ^ RI HtHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHt ^ RIHt  ! R R]4      t ! R R]4      t ! R	 R
]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      tR# )    )print_functionunicode_literalsN)find_executable)gettextc                       ] tR t^#tRtR# )AptBtrfsSnapshotError N__name__
__module____qualname____firstlineno____static_attributes__r	       @/usr/lib/python3/dist-packages/DistUpgrade/apt_btrfs_snapshot.pyr   r   #       r   r   c                       ] tR t^'tRtR# )AptBtrfsNotSupportedErrorr	   Nr
   r	   r   r   r   r   '   r   r   r   c                       ] tR t^+tRtR# )AptBtrfsRootWithNoatimeErrorr	   Nr
   r	   r   r   r   r   +   r   r   r   c                   D   a  ] tR t^/t o Rt]R 4       tRR ltR tRt	V t
R# )
FstabEntryza single fstab entry line c                n    VP                  R 4      ^ ,          P                  4       p\        VR,          !  # )#:r      N)	partitionsplitr   )clslineargss   && r   	from_lineFstabEntry.from_line1   s1     ~~c"1%++- 49%%r   c                N    Wn         W n        W0n        W@n        WPn        W`n        R # Nfs_spec
mountpointfstypeoptionsdumppassno)selfr&   r'   r(   r)   r*   r+   s   &&&&&&&r   __init__FstabEntry.__init__9   s     $	r   c                    R V P                   : RV P                  : RV P                  : RV P                  : RV P                  : RV P
                  : R2# )z<FstabEntry 'z' 'z'>r%   r,   s   &r   __repr__FstabEntry.__repr__B   s2    LL$//4;;LL$))T[[2 	2r   )r*   r&   r(   r'   r)   r+   N)r   r   )r   r   r   r   __doc__classmethodr!   r-   r1   r   __classdictcell____classdict__s   @r   r   r   /   s)     %& &2 2r   r   c                   :   a a ] tR t^Ht oRtRV 3R lltRtVtV ;t# )Fstabza list of FstabEntry items c                ^  < \         \        V `  4        \        V4      ;_uu_ 4       pR  V 4        FJ  pVR8X  g   VP	                  R4      '       d   K#   \
        P                  V4      pT P                  T4       KL  	  RRR4       R#   \         d     Kf  i ; i  + '       g   i     R# ; i)c              3   @   "   T F  qP                  4       x  K  	  R # 5ir$   )strip).0r   s   & r   	<genexpr>!Fstab.__init__.<locals>.<genexpr>N   s     !F:4**,,:s    r   N)	superr9   r-   open
startswithr   r!   
ValueErrorappend)r,   fstab
fstab_filestripped_lineentry	__class__s   &&   r   r-   Fstab.__init__J   s    eT#%%[[J!F:!F B&-*B*B3*G*G&00?E E" "G [ "  [[s5   *BBB	*B	B	BB	BB,	r	   z
/etc/fstab)	r   r   r   r   r3   r-   r   r5   __classcell__)rJ   r7   s   @@r   r9   r9   H   s     &# #r   r9   c                   <   a  ] tR t^Xt o RtR tR tR tR tRt	V t
R# )LowLevelCommandsz\lowlevel commands invoked to perform various tasks like
interact with mount and btrfs tools
c                <    \         P                  ! R W.4      pV^ 8H  # )mount
subprocesscall)r,   r&   r'   rets   &&& r   rQ   LowLevelCommands.mount\   s    oow<=axr   c                <    \         P                  ! R V.4      pV^ 8H  # )umountrR   )r,   r'   rU   s   && r   rX   LowLevelCommands.umount`   s    oox45axr   c                @    \         P                  ! R RRW.4      pV^ 8H  # )btrfs	subvolumesnapshotrR   )r,   sourcedestrU   s   &&& r   btrfs_subvolume_snapshot)LowLevelCommands.btrfs_subvolume_snapshotd   s'    oowZ%- .axr   c                @    \         P                  ! R RRV.4      pV^ 8H  # )r[   r\   deleterR   )r,   r]   rU   s   && r   btrfs_delete_snapshot&LowLevelCommands.btrfs_delete_snapshoti   s"    oowXxHIaxr   r	   N)r   r   r   r   r3   rQ   rX   r`   rd   r   r5   r6   s   @r   rO   rO   X   s#     
 r   rO   c                      a  ] tR t^nt o RtRt]R,           tRtRR ltR t	R t
RR ltR	 tR
 tR tRR ltRR ltR tR tR tRR ltR tR tRR ltR tRtV tR# )AptBtrfsSnapshotz>the high level object that interacts with the snapshot system z@apt-snapshot-z	old-root-z/run/apt-btrfs-snapshot/rootc                `    \        V4      V n        \        4       V n        R V n        R V n        R # r$   )r9   rF   rO   commands_btrfs_root_mountpointmounted)r,   rF   s   &&r   r-   AptBtrfsSnapshot.__init__x   s&    5\
(*&*#r   c                P    \        R4      '       g   R# V P                  4       pVRJ# )zcverify 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,   rI   s   & r   snapshots_supported$AptBtrfsSnapshot.snapshots_supported~   s+      ((::<D  r   c                    V P                    F>  pVP                  R8X  g   K  VP                  R8X  g   K)  RVP                  9   g   K<  Vu # 	  R# )z3return the supported btrfs root FstabEntry or None /r[   zsubvol=@N)rF   r'   r(   r)   ro   s   & r   rn   6AptBtrfsSnapshot._get_supported_btrfs_root_fstab_entry   s@    ZZE$$+LLG+%--/   r   c                j    V P                    F"  pVP                  V8X  g   K  VP                  u # 	  R# )z3return the device or UUID for the given mountpoint N)rF   r'   r&   )r,   r'   rF   rI   s   &&& r   _uuid_for_mountpoint%AptBtrfsSnapshot._uuid_for_mountpoint   s-    ZZE:-}}$   r   c                   V P                   '       d&   V ;P                   ^,          un         V P                  # V P                  R4      p\        P                  ! V P
                  RR7       \        P                  P                  V P
                  4      '       g.   V P                  P                  WP
                  4      '       g   R# ^V n         V P
                  V n        V P                  # )z-mount the mount point and return it (or None)rs   T)exist_okN)
rk   rj   rv   osmakedirs
MOUNTPOINTpathismountri   rQ   )r,   uuids   & r   	__enter__AptBtrfsSnapshot.__enter__   s    <<<LLAL...((-
DOOd3wwt//==&&t__==&*oo#***r   c                    V P                   '       g   R # V ;P                   ^,          un         V P                   '       d   R # V P                  P                  V P                  4       \        P
                  ! V P                  4       R V n        R # r$   )rk   ri   rX   rj   rz   rmdir)r,   r    s   &*r   __exit__AptBtrfsSnapshot.__exit__   sZ    |||<<<T889
,,-&*#r   c                    \         P                   P                  4       P                  ^ R7      P                  \	        R4      4      # )r   )microsecond_)datetimenowreplace	isoformatstrr0   s   &r   _get_now_strAptBtrfsSnapshot._get_now_str   s9      $$&..1.=GGH 	r   c                   T ;_uu_ 4       pV P                  4       p\        P                  P                  VR 4      p\        P                  P                  W0P                  V,           V,           4      p\        P                  P                  V4      '       d(   \        \        R4      V3,          4        RRR4       R# V P                  P                  WV4      pV'       dK   \        P                  P                  R4      '       d   \        \        R4      4       MV P                  4        VuuRRR4       #   + '       g   i     R# ; i)@zDINFO: snapshot directory '%s' already exists, not creating duplicateNTzAPT::Snapshots::MaxAgezoINFO: Not pruning automatically as APT::Snapshots::MaxAge is set, consider using APT::Snapshots::Retain instead)r   rz   r}   joinSNAP_PREFIXexistsprintr   ri   r`   apt_pkgconfigfind_i$clean_btrfs_root_snapshots_by_policy)r,   additional_prefixprunempsnap_idr^   targetress   &&&     r   create_btrfs_root_snapshot+AptBtrfsSnapshot.create_btrfs_root_snapshot   s    TR'')GWW\\"c*FWW\\"&6&69J&J")'* +F ww~~f%%a 1 25;I> ? T mm<<VL~~,,-EFFa !G H I AAC) TTTs   B*D8?AD8&D88E		c                F   . pV^ 8w  d>   V P                  4       pV'       g   \        4       hRVP                  9   d   \        4       hV^ 8X  d   \        P                  ! 4       pT ;_uu_ 4       p\
        P                  ! V4       F}  pVP                  V P                  4      '       g   K&  \
        P                  P                  \
        P                  P                  WERR4      4      pWa8  g   Kl  VP                  V4       K  	  RRR4       V#   + '       g   i     T# ; i)zget 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)
noatimeetcrF   N)rn   r   r)   r   timerz   listdirrC   r   r}   getatimer   rE   )r,   
older_thanresultrI   r   eatimes   &&     r   get_btrfs_root_snapshots_list.AptBtrfsSnapshot.get_btrfs_root_snapshots_list   s    
  ?>>@E/11EMM)244?JTRZZ^<< 0 011 GG,,RWW\\":?.J KE)a( $   T s   -8D*AD0DD 	c                l    \        R 4       \        RP                  V P                  4       4      4       R# )zAvailable snapshots:  
T)r   r   r   r0   s   &r   print_btrfs_root_snapshots+AptBtrfsSnapshot.print_btrfs_root_snapshots   s(    $%fkk$<<>?@r   c                    \         P                   ! 4       pVP                  R 4      '       g   \        R4      h\        VRR 4      pW#^,          ^<,          ^<,          ,
          # )dz&Please specify time in days (e.g. 10d)N)r   endswith	Exceptionint)r,   timefmtr   dayss   &&  r   _parse_older_than_to_unixtime.AptBtrfsSnapshot._parse_older_than_to_unixtime   sP    iik$$DEE73B< Ri"nr)**r   c                   V P                  V4      p \        R V,          4       \        RP                  V P                  VR7      4      4       R#   \         d$    \
        P                  P                  R4        R# i ; i)z$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_than6AptBtrfsSnapshot.print_btrfs_root_snapshots_older_than   s    "@@I	87BC&++d@@. A 0 1 2 	 , 	JJ + ,	s   <A *A?>A?c                x  a R RRRRRRRRRRRRR/p. pV P                  4        F6  p \        P                  P                  VR4      pTP	                  YE34       K8  	  VP                  R R	R
7       \        P                  ! \        4      pVP                  4        F  w  pw  op\        P                  P                  RV 2V4      p\        P                  ! VV3R l4      p	\        V	4       F4  w  p
w  rW8  d    Kc   \!        V4      pWm,          P	                  V4       K6  	  K  	  R	pV Fc  w  rW3V9   d3   V'       d)   \%        RRVRRP'                  WgV3,          4      4       K=  K?  \%        RRV4       WP)                  V4      ,          pKe  	  V#   \         d     EK  i ; i  \"         d     K  i ; i)latestminutelyhourlydailyweeklymonthlyyearlyz@apt-snapshot-%Y-%m-%d_%H:%M:%Sc                     V ^,          #    r	   )ks   &r   <lambda>GAptBtrfsSnapshot.clean_btrfs_root_snapshots_by_policy.<locals>.<lambda>  s    1r   T)keyreversezAPT::Snapshot::Retain::c                 4   < V ^,          P                  S4      # r   )strftime)r   fmts   &r   r   r     s    !A$--:Lr   Keepingr]   zdue toz, Deletingzexpired snapshot)z%Y-%m-%d %H:%M:%Sr   )z%Y-%m-%d %H   )z%Y-%m-%d   )z	%Y-week%V   )z%Y-%mr   )z%Yr   )r   r   strptimer   rE   sortcollectionsdefaultdictlistitemsr   r   r   	itertoolsgroupby	enumeratenextStopIterationr   r   delete_snapshot)r,   verbosekeepsnapssnapdtto_keepnamecountgroup_by_periodindex_groupr   ir   _dtr   s   &&              @r   r   5AptBtrfsSnapshot.clean_btrfs_root_snapshots_by_policy   s   24,*<)
 668D&&//1DE
 LL$$ 9 	

~t
4))$/"&**,D,3NN)),CD6*J*/1E (//0LNO +4O*D&>UAJ%%d+ +E #/( ID{g%)Z"DIIgSk.B$CE  j"4d;++D11  
I  . % s#    F "F*F'&F'*F98F9c                    R pV P                  V4      p V P                  VR7       F  pW P                  V4      ,          pK  	  V#   \         d$    \        P
                  P                  R4        R# i ; i)Tr   r   F)r   r   r   r   r   r   r   )r,   r   r   r   r   s   &&   r   %clean_btrfs_root_snapshots_older_than6AptBtrfsSnapshot.clean_btrfs_root_snapshots_older_than7  s    "@@I	::2 ; 4++D114 
	 , 	JJ & '	s   0A *A54A5c                (    V P                  V4      pV# r$   )set_default)r,   snapshot_namer   s   && r   command_set_default$AptBtrfsSnapshot.command_set_defaultD  s    }-
r   c                h   T ;_uu_ 4       p\         P                  P                  W14      p\         P                  P                  V4      '       d   VP	                  R4      '       d   VR8w  d   \         P                  P                  VR4      p\         P                  P                  W0P
                  V P                  4       ,           4      p\         P                  ! WR4       \         P                  ! WE4       \        RV,          4       M\        R4       RRR4       R#   + '       g   i     R# ; i)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 "@".NT)	rz   r}   r   isdirrC   BACKUP_PREFIXr   renamer   )r,   r   backupr   new_rootdefault_roots   &&&   r   r   AptBtrfsSnapshot.set_defaultH  s    TRww||B6HGGMM(++!,,S11!S(!ww||B4b*<*<(,(9(9(;+< =		,/		(1 02?@ A  2 3 " # T" s   AD 'B/D  D1	c                    V ;_uu_ 4       pV P                   P                  \        P                  P	                  W!4      4      pR R R 4       V#   + '       g   i     X# ; ir$   )ri   rd   rz   r}   r   )r,   r   r   r   s   &&  r   r    AptBtrfsSnapshot.delete_snapshot]  sH    TR--55R/1C  
 T 
s   9AA	)rj   ri   rF   rk   NrL   )r@   F)r   )F)T)r   r   r   r   r3   r   r  r|   r-   rp   rn   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r5   r6   s   @r   rg   rg   n   sy     I #K+-M/J!++.8
+
5n* r   rg   )
__future__r   r   r   r   r   r   rz   rS   r   r   distutils.spawnr   r   r   r   r   r   r   objectr   r   r9   rO   rg   r	   r   r   <module>r     s   & 8     	  
  +  	I 		 5 		#8 	2 22#D # v ,sv sr   