
    x[hyI              
          % S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
Jr  SSKJr  SSKJr  SSKJrJr  SSKJrJrJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJ r J!r!  SSK"J#r#  \#r$S\ /\$/ S.r%\\&S'   SS/SS.r'\" S5      r( " S S5      r)\RT                  " \+5      r, " S S\-5      r. " S S\
5      r/ " S S\/5      r0 " S S\/5      r1 " S S \/5      r2S!\3S"\!S#\4S$\/4S% jr5S$\\6   4S& jr7S$\\6   4S' jr8S( r9S$\:4S) jr;S* r<S$\\3\34   4S+ jr=S, r>S-\/S"\!4S. jr?S/\3S0\S1\S2\4S$S4
S3 jr@S4\04S5\14S6\244rAg)7zGrowpart: Grow partitions    N)ABCabstractmethod)suppress)Path)OptionalTuple)	lifecycleperformancesubp
temp_utilsutil)Cloud)Config)
MetaSchema)ALL_DISTROSDistro)
PER_ALWAYScc_growpart)iddistros	frequencyactivate_by_schema_keysmetaauto/F)modedevicesignore_growroot_disabledz/cc_growpart_keydatac                   $    \ rS rSrSrSrSrSrSrg)RESIZE/   SKIPPEDCHANGEDNOCHANGEFAILED N)	__name__
__module____qualname____firstlineno__r"   r#   r$   r%   __static_attributes__r&       >/usr/lib/python3/dist-packages/cloudinit/config/cc_growpart.pyr    r    /   s    GGHFr,   r    c                       \ rS rSrSrg)ResizeFailedException9   r&   N)r'   r(   r)   r*   r+   r&   r,   r-   r/   r/   9   s    r,   r/   c                   N    \ rS rSrS\4S jr\S\S\4S j5       r	\S 5       r
Srg	)
Resizer=   distroc                     Xl         g N_distro)selfr4   s     r-   __init__Resizer.__init__>   s    r,   r   returnc                     g r6   r&   r9   r   s     r-   	availableResizer.availableA   s    03r,   c                     g r6   r&   )r9   diskdevpartnumpartdevfss        r-   resizeResizer.resizeD   s    58r,   r7   N)r'   r(   r)   r*   r   r:   r   listboolr?   rF   r+   r&   r,   r-   r2   r2   =   s6    v  33$3 38 8r,   r2   c                   (    \ rS rSrS\4S jrS rSrg)ResizeGrowPartH   r   c                      [         R                   " SS/SS0S9R                  n[        R                  " SU5      (       a  g g! [         R                   a     gf = f)	Ngrowpartz--helpLANGC
update_envz--update\s+TF)r   stdoutresearchProcessExecutionError)r9   r   outs      r-   r?   ResizeGrowPart.availableI   sh    	))X&FC=f  yy-- .
  )) 		s   ?A AAc                 <   [        X45      nU R                  R                  5       n[        R                  " USS9 n[
        R                  R                  US5      nSUS.n	[
        R                  R                  U5      (       d  [
        R                  " US5         [        R                  " SSX/U	S9   [        R                  " SX/U	S9   S S S 5        U[        X45      4$ ! [        R                   aO  n
U
R                  S	:w  a)  [        R                  " [        S
UU5        [!        U
5      U
eXU4s S n
A
sS S S 5        $ S n
A
ff = f! [        R                   a-  n
[        R                  " [        SX5        [!        U
5      U
eS n
A
ff = f! , (       d  f       N= f)NT)dir	needs_exerN   rP   )rO   TMPDIRi  z	--dry-runrQ      z&Failed growpart --dry-run for (%s, %s)zFailed: growpart %s %s)get_sizer8   get_tmp_exec_pathr   tempdirospathjoinexistsmkdirr   rV   	exit_coder   logexcLOGr/   )r9   rB   rC   rD   rE   beforetmp_dirtmpdgrowpart_tmpmy_enves              r-   rF   ResizeGrowPart.resizeU   sX   '& ,,002Gt<77<<j9L!\:F77>>,//u-(		g?%6		:w8VL- =6 -..# -- 	(;;!#KK@	 029''' =<	( -- 6C!97L+A.A56/ =<sT   A!FC#6E	#E7;E2E3FEF	F
(FF

F
Fr&   Nr'   r(   r)   r*   rH   r?   rF   r+   r&   r,   r-   rK   rK   H   s    
 
!/r,   rK   c                   ,    \ rS rSrSrS\4S jrS rSrg)ResizeGrowFSy   a  
Use FreeBSD ``growfs`` service to grow root partition to fill available
space, optionally adding a swap partition at the end.

Note that the service file warns us that it uses ``awk(1)``, and as
such requires ``/usr`` to be present. However, cloud-init is installed
into ``/usr/local``, so we should be fine.

We invoke the ``growfs`` with ``service growfs onestart``, so it
doesn't need to be enabled in ``rc.conf``.
r   c                 Z    [         R                  R                  S5      =(       a    US/:H  $ )z'growfs only works on the root partitionz/etc/rc.d/growfsr   )ra   rb   isfiler>   s     r-   r?   ResizeGrowFS.available   s"    ww~~01Fg#6FFr,   c                     [        X45      n U R                  R                  SSS9  U[        X45      4$ ! [        R                   a,  n[
        R                  " [        S5        [        U5      UeS nAff = f)Nonestartgrowfs)actionservicezFailed: service growfs onestart)	r^   r8   manage_servicer   rV   r   rg   rh   r/   )r9   rB   rC   rD   rE   ri   rn   s          r-   rF   ResizeGrowFS.resize   sn    '&	2LL''z8'L
 -..	 )) 	2KK>?'*1	2s   4 A4'A//A4r&   N)	r'   r(   r)   r*   __doc__rH   r?   rF   r+   r&   r,   r-   rr   rr   y   s    
G G/r,   rr   c                   (    \ rS rSrS\4S jrS rSrg)ResizeGpart   r   c                      [         R                   " SS/SS0SS/S9R                  n[        R                  " SU5      (       a  g	 g
! [         R                   a     g
f = f)NgparthelprO   rP   r   r]   )rR   rcszgpart recover TF)r   stderrrT   rU   rV   )r9   r   errs      r-   r?   ResizeGpart.available   so    	))&!vsm!Qf  yy*C00 1
  )) 		s   AA AAc                     [         R                   " SSU/5        [        X45      n [         R                   " SSSX!/5        U[        X45      4$ ! [         R                   aB  nUR                  S:w  a(  [        R                  " [
        SU5        [        U5      Ue SnANSnAff = f! [         R                   a-  n[        R                  " [
        SX!5        [        U5      UeSnAff = f)	a	  
GPT disks store metadata at the beginning (primary) and at the
end (secondary) of the disk. When launching an image with a
larger disk compared to the original image, the secondary copy
is lost. Thus, the metadata will be marked CORRUPT, and need to
be recovered.
r   recoverr   zFailed: gpart recover %sNrF   z-izFailed: gpart resize -i %s %s)r   rV   rf   r   rg   rh   r/   r^   )r9   rB   rC   rD   rE   rn   ri   s          r-   rF   ResizeGpart.resize   s    	6IIw	734 '&	2IIw$AB
 -.. )) 	6{{aC!;WE+A.A5  	6 )) 	2KK<gO'*1	2s.   A B' B$"8BB$'C(;(C##C(r&   Nrp   r&   r,   r-   r   r      s    
 
/r,   r   r   r4   r   r<   c                 X   S nU S:X  aD  [          H%  u  pEU" U5      nUR                  US9(       d  M#  Un  O   U(       d  [        S5      e U$ 0 n[          H	  u  pXU'   M     X;  a  [        SU -  5      eXp   " U5      n
U
R                  US9(       a  U
nU(       d  [        SU -  5      eU$ )Nr   )r   zNo resizers availablezunknown resize mode %szmode %s not available)RESIZERSr?   
ValueError	TypeError)r   r4   r   resize_class_nameresizercurmmapkvmclasss              r-   resizer_factoryr      s    Lv~&NE&/C}}W}--"	 ' 455 $  DAG  4t;<<F#G,!L4t;<<r,   c                    S n [         R                  " U [         R                  5      n[         R                  " US[         R                  5      U(       a  [         R
                  " U5        $ $ ! [         aR    US:X  a+  [        U 5      s U(       a  [         R
                  " U5        $ $  U(       a  [         R
                  " U5        g g f = f! U(       a  [         R
                  " U5        f f = f)Nr   zfs)ra   openO_RDONLYlseekSEEK_ENDcloseFileNotFoundErrorget_zfs_size)filenamerE   fds      r-   r^   r^      s    	B	WWXr{{+xxAr{{+ HHRL   ;)) HHRL  HHRL 
 HHRL s*   A
A- -C	C (C C		C  C,c                    U R                  S5      S   n [        R                  " SSSSU/5      u  p#[        UR                  5       5      $ ! [        R                   a   n[        R	                  SX5         S nAg S nAff = f)Nr   r   zpoolgetz	-HpovaluesizezFailed: zpool get size %s: %s)splitr   rV   rh   debugintstrip)datasetr   r   _rn   s        r-   r   r      sr    MM#q!E))We[&%HI tzz| %% 		15<s   A B  A;;B c                    U R                  S5      (       a  U S 4$ [        R                  " U 5      nU(       d  [        S5      eUS   nUS   n[        R                  " 5       nUS:X  af  U(       d_  [        R
                  " [        R                  " 5       5      nUc3  [        R                  R                  U5      (       a  US 4$ [        S5      eX#4$ )N/dev/z,Could not determine device of '%s' % dev_entr   r]   z	/dev/rootz!Unable to find device '/dev/root')

startswithr   get_mount_infor   is_containerrootdev_from_cmdlineget_cmdlinera   rb   rd   )deventresultdevrE   	containers        r-   
devent2devr      s    !!t|  (FGHH
)C	B!!#I k)''(8(8(:;;ww~~c"" Dy @AA7Nr,   c                 0   [         R                  " S5      (       d  [        R                  S5        g [         R                   " SSU /5        [        [         R                  5         [         R                   " SS	U/5        [        R                  S
U 5         SSS5        g! [         R                   aQ  nUR
                  S:X  a  [        R                  SU 5        O [        R                  SUR
                  5         SnAgSnAff = f! , (       d  f       g= f)z
Check if a device is an encrypted device. blockdev should have
a /dev/dm-* path whereas partition is something like /dev/sda1.

cryptsetupz6cryptsetup not found. Assuming no encrypted partitionsFstatus   z#Determined that %s is not encryptedzZReceived unexpected exit code %s from cryptsetup status. Assuming no encrypted partitions.NisLukszDetermined that %s is encryptedT)r   whichrh   r   rV   rf   warningr   )blockdev	partitionrn   s      r-   is_encryptedr   	  s    
 ::l##		JK		<845 
$,,	-		<956		3X> 
.	- %% 	;;!II;XFKKG
 	 
.	- s$   B %1DD3AC??D
Dc                 &   SSSU /n[         R                   " U5      S   nUR                  S5      (       d  [        SU 35      e SUR                  S5      S	   R                  S
5      S    3$ ! [         a  n[        SU SU S35      UeS nAff = f)Ndmsetupdepsz--options=devnamer   z1 dependz5Expecting '1 dependencies' from 'dmsetup'. Received: r   z: (r]   )zRan `z$`, but received unexpected stdout: ``)r   r   RuntimeErrorr   
IndexError)r   commanddeprn   s       r-   get_underlying_partitionr   $  s    &"5x@Gyy!!$C >>*%%CC5I
 	
syy'*005a89:: G9@QG
	s   (A. .
B8BBc                    [         R                  5       (       d  [        R                  S4$  [        R
                  " S[          35         [         R                  5        n[        R                  " U5      nSSS5        SSS5        WS   n[        R                  " U5      nUS   n [        R                  " SSS	S
U /US9   [        R                  " SSSU[        U5      /5         [         R%                  5         [        R*                  SU  S34$ ! , (       d  f       N= f! , (       d  f       N= f! [         a  n[        S5      UeSnAff = f! [        R                   a   n[         R#                  SU5         SnANSnAff = f! [         a    [&        R(                  " [         S5         Nf = f!  [        R                  " SSSU[        U5      /5        O7! [        R                   a   n[         R#                  SU5         SnAOSnAff = f [         R%                  5         f ! [         a    [&        R(                  " [         S5         f f = f= f)zUse 'cryptsetup resize' to resize LUKS volume.

The loaded keyfile is json formatted with 'key' and 'slot' keys.
key is base64 encoded. Example:
{"key":"XFmCwX2FHIQp0LBWaLEMiHIyfxt1SGm16VvUAVledlY=","slot":5}
zNo encryption keyfile foundzReading NkeyslotzZCould not load encryption key. This is expected if the volume has been previously resized.r   z
--key-file-rF   )dataluksKillSlotz--batch-modez<Failed to kill luks slot after resizing encrypted volume: %sz8Failed to remove keyfile after resizing encrypted volumez'Successfully resized encrypted volume '')KEYDATA_PATHrd   r    r"   r
   Timedr   jsonloadbase64	b64decode	Exceptionr   r   strrV   rh   r   unlinkr   rg   r#   )r   r   fkeydatar   decoded_keyr   rn   s           r-   resize_encryptedr   5  s       =>>|n%
!iilG 
 en&&s+v		<hA	

	II ""I	! 	
1(1= O 
 
  6
 	, )) 	KKN 	  	KKO	#	II ""I )) 	KKN 	
	! 	KKO	s   D3 
D"D6D">(D3 'F3 $E 'F 
D	D""
D0,D3 3
E=E		EF%F  F%F0/F03I5$GIH.H	I	HIH'&I'%IIIIc                 B   / n U R                  X#XE5      u  pxXx:X  a-  UR                  U[        R                  SU< SU< S345        U$ Ub  Uc=  Sn	Ub  Uc  SU< SU< S3n	OSU-  n	UR                  U[        R                  U	45        U$ Sn	Ub  Uc  SU< SU< SU< S	U< 3n	OSU< SU< S	U< 3n	UR                  U[        R                  U	45         U$ ! [
         a9  n
UR                  U[        R                  S
U< SU< SU
< 345         S n
A
U$ S n
A
ff = f)Nzno change necessary (z, r    z	changed (z) size, new size is unknownz&changed (%s) size, new size is unknownz) from z to zfailed to resize: disk=z, ptnum=z: )rF   appendr    r$   r#   r/   r%   )r   r   diskptnumr   rE   infooldnewmsgrn   s              r-   _call_resizerr   n  s3   D(
>>$x<:KKOO6:EBL K? [CKCEM
 ?IKK56, K) CEM	 7?SIKK56 K ! 
=A5!L	
 	
 K
s&   AC 
AC AC 
D%.DDr   c           	         [         R                   " U5      n/ nU(       Ga  UR                  S5      nS nS n [        U5      u  px[        R                  SU5        US:X  a'  [        U [        5      (       a  U[        XXVXx5      -  nMn   [        R                  " U5      n
[        R                  " U
R                   5      (       dL  [        R"                  " U
R                   5      (       d'  UR	                  U[
        R                  SU-  45        M  UR%                  U5      nU(       a   ['        U5      n[)        X5      (       aa  X Vs/ s H  oS   PM	     sn;  a'  UR+                  SU5        UR+                  SU5        GMi  [-        X|5      u  pUR	                  UUU45        O'UR	                  U[
        R                  SU S	345         GM   UR3                  U5      u  pVU[        XXVXx5      -  nU(       a  GM  U$ ! [         a1  n	UR	                  U[
        R                  SU	-  45         S n	A	GM  S n	A	ff = f! [         a6  n	UR	                  U[
        R                  SU< SU	< 345         S n	A	GM^  S n	A	ff = fs  snf ! [.         a2  n	UR	                  U[
        R0                  S
U SU	 345         S n	A	NS n	A	ff = f! [4        [        4 a6  n	UR	                  U[
        R                  SU< SU	< 345         S n	A	GM  S n	A	ff = f)Nr   zunable to convert to device: %szgrowpart found fs=%sr   z	stat of 'z
' failed: zdevice '%s' not a block devicezResizing mapped device (z!) skipped as it is not encrypted.zResizing encrypted device (z
) failed: zdevice_part_info()copypopr   r   r   r    r"   rh   r   
isinstancerr   r   ra   statOSErrorS_ISBLKst_modeS_ISCHRget_mapped_devicer   r   insertr   r   r%   device_part_infor   )r   r   r4   r   r   r   r   r   rE   rn   statretunderlying_blockdevr   xr   messages                   r-   resize_devicesr     s   ii GD
Q
	%f-LH 			("- ;:g|<<M'4MMD
	ggh'G ||GOO,,T\\OO6
 6
 KKNN4x? $66x@%4X>	 3?? t(<t!1t(<<  q&1q)4 &6x&KOFKK""# KK""NN6xj A6 6$ 
	 11(;KD 	gtHIIU 'X KK  	KKNN59 	,  	KKNN191= 	8 )=4  5hZz!M  :& 	KKNN9A1E 	s}   G> H< (J I?*J !J $&J K >
H9%H44H9<
I<*I77I<?J 
K (J;;K L	*LL	namecfgcloudargsc                    SU;  a#  [         R                  S[        5        [        US'   UR                  S5      n[	        U[
        5      (       d  [         R                  S5        g UR                  SS5      n[        R                  " U5      (       a7  US:w  a  [        R                  " SU S3S	S
S9  [         R                  SU5        g [        R                  " UR                  SS5      5      (       aO  [        R                  R                  S5      (       a+  [         R                  S5        [         R                  S5        g [        R                  " USS/5      n[        U5      (       d  [         R                  S5        g  [!        XRR"                  US9n[(        R*                  " S5         [-        XvUR"                  5      n	S S S 5        W	 HI  u  pnU[.        R0                  :X  a  [         R3                  SX5        M2  [         R                  SXU5        MK     g ! [$        [&        4 a(  n[         R                  SXX5        US:w  a  Ue S nAg S nAff = f! , (       d  f       N= f)NrN   z.No 'growpart' entry in cfg.  Using default: %sz#'growpart' in config was not a dictr   r   offz"Growpart's 'mode' key with value 'r   z22.2zUse 'off' instead.)
deprecateddeprecated_versionextra_messagezgrowpart disabled: mode=%sr   Fz/etc/growroot-disabledz0growpart disabled: /etc/growroot-disabled existsz&use ignore_growroot_disabled to ignorer   r   zgrowpart: empty device list)r4   r   z,growpart unable to find resizer for '%s': %szResizing devicesz'%s' resized: %sz'%s' %s: %s)rh   r   DEFAULT_CONFIGr   r   dictr   r   is_falser	   	deprecatera   rb   ru   get_cfg_option_listlenr   r4   r   r   r
   r   r   r    r#   r   )r   r   r   r   mycfgr   r   r   rn   resizedentryrz   r   s                r-   handler    s   		<n	
 )JGGJEeT""9:99VV$D}}T5=?vQG#)2
 			.5}}UYY95ABB77>>233IIHIII>?&&ui#?Gw<<		/0!$||WM 
		-	. 5<<@ 
/%sV^^#HH'4IImUC8	 & 	" 		@$J6>G	 
/	.s$   H .II-II
I&rN   ry   r   )Br~   r   r   r   loggingra   os.pathrT   r   abcr   r   
contextlibr   pathlibr   typingr   r   	cloudinitr	   r
   r   r   r   cloudinit.cloudr   cloudinit.configr   cloudinit.config.schemar   cloudinit.distrosr   r   cloudinit.settingsr   r   r   __annotations__r  r   r    	getLoggerr'   rh   r   r/   r2   rK   rr   r   r   rH   r   r   r^   r   r   rI   r   r   r   r   r   r  r   r&   r,   r-   <module>r     s         	  	  #   " D D ! # . 1 )	
}!	j  u % *+  !	I 	9c 9./W ./b/7 /8#/' #/L# v   <hsm Xc] 0 6"6U38_ 6r+\qG qf qh09 096 09% 09t 09 09h  |kr,   