x[hyI rUdZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z ddl m Z ddlmZddlmZmZddlmZmZmZmZmZddlmZdd lmZdd lmZdd lm Z m!Z!dd l"m#Z#e#Z$d e ge$gdZ%ee&d<ddgddZ'edZ(GddZ)ejTe+Z,Gdde-Z.Gdde Z/Gdde/Z0Gdde/Z1Gdd e/Z2d!e3d"e!d#e4d$e/fd%Z5d$ee6fd&Z7d$ee6fd'Z8d(Z9d$e:fd)Z;d*Zd-e/d"e!fd.Z?d/e3d0ed1ed2e4d$df d3Z@d4e0fd5e1fd6e2ffZAy)7zGrowpart: Grow partitionsN)ABCabstractmethod)suppress)Path)OptionalTuple) lifecycle performancesubp temp_utilsutil)Cloud)Config) MetaSchema) ALL_DISTROSDistro) PER_ALWAYS cc_growpart)iddistros frequencyactivate_by_schema_keysmetaauto/F)modedevicesignore_growroot_disabledz/cc_growpart_keydataceZdZdZdZdZdZy)RESIZESKIPPEDCHANGEDNOCHANGEFAILEDN)__name__ __module__ __qualname__r!r"r#r$>/usr/lib/python3/dist-packages/cloudinit/config/cc_growpart.pyr r /sGGH Fr)r c eZdZy)ResizeFailedExceptionN)r%r&r'r(r)r*r,r,9sr)r,cBeZdZdefdZededefdZedZ y)Resizerdistroc||_yN)_distro)selfr/s r*__init__zResizer.__init__>s  r)rreturncyr1r(r3rs r* availablezResizer.availableAs03r)cyr1r()r3diskdevpartnumpartdevfss r*resizezResizer.resizeDs58r)N) r%r&r'rr4rlistboolr8r>r(r)r*r.r.=s6v33$3388r)r.ceZdZdefdZdZy)ResizeGrowPartrc tjddgddij}tjd|ry y#tj$rYywxYw) Ngrowpartz--helpLANGC update_envz --update\s+TF)r stdoutresearchProcessExecutionError)r3routs r*r8zResizeGrowPart.availableIse ))X&FC=f yy-. ))   s;AAAc4t||}|jj}tj|d5}t j j|d}d|d} t j j|st j|d tjdd||g|  tjd||g|  ddd|t||fS#tj$rN} | jd k7r(tjtd ||t!| | ||fcYd} ~ cdddSd} ~ wwxYw#tj$r-} tjtd ||t!| | d} ~ wwxYw#1swYxYw) NT)dir needs_exerDrF)rETMPDIRiz --dry-runrGz&Failed growpart --dry-run for (%s, %s)zFailed: growpart %s %s)get_sizer2get_tmp_exec_pathr tempdirospathjoinexistsmkdirr rL exit_coder logexcLOGr,) r3r:r;r<r=beforetmp_dirtmpd growpart_tmpmy_enves r*r>zResizeGrowPart.resizeUsj'2&,,002   Gt < 677<<j9L!\:F77>>,/u- ( gw?% 6 :w8VL- 66"-..#-- (;;!#KK@  029''' 6 6 (-- 6 C!97GL+A.A5 6/ 6 6sTAFC'6E 'E::E4E5FEF F (FF  FFNr%r&r'r?r8r>r(r)r*rBrBHs  !/r)rBc"eZdZdZdefdZdZy) ResizeGrowFSa 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``. rcPtjjdxr|dgk(S)z'growfs only works on the root partitionz/etc/rc.d/growfsr)rVrWisfiler7s r*r8zResizeGrowFS.availables"ww~~01Fg#6FFr)ct||} |jjdd|t||fS#tj$r+}t j tdt||d}~wwxYw)Nonestartgrowfs)actionservicezFailed: service growfs onestart) rSr2manage_servicer rLr r\r]r,)r3r:r;r<r=r^rcs r*r>zResizeGrowFS.resizesr'2& 2 LL ' 'z8 ' L "-.. )) 2 KK> ?'* 1 2s9A7 &A22A7N)r%r&r'__doc__r?r8r>r(r)r*rfrfys GG/r)rfceZdZdefdZdZy) ResizeGpartrc tjddgddiddgj}tjd|ry y #tj$rYy wxYw) NgparthelprErFrrR)rHrcszgpart recover TF)r stderrrJrKrL)r3rerrs r*r8zResizeGpart.availablesl ))&!vsm!Qf yy*C01 ))   s>AAAc tjdd|gt||} tjddd||g|t||fS#tj$r@}|jdk7r'tjt d|t ||Yd}~d}~wwxYw#tj$r-}tjt d||t ||d}~wwxYw) a9 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. rsrecoverrzFailed: gpart recover %sNr>z-izFailed: gpart resize -i %s %s)r rLr[r r\r]r,rS)r3r:r;r<r=rcr^s r*r>zResizeGpart.resizes 6 IIw 73 4 '2& 2 IIw$A B "-..)) 6{{a C!;WE+A.A5  6)) 2 KKB6B62B33B66Cc|jdd} tjdddd|g\}}t |j S#tj$r!}tj d||Yd}~yd}~wwxYw)Nrrzpoolgetz -HpovaluesizezFailed: zpool get size %s: %s)splitr rLr]debugintstrip)datasetrr_rcs r*rrsv MM# q !E))We[&%HIa tzz|   % % 15!<sA BA;;Bcp|jdr|dfStj|}|s td|d}|d}tj}|dk(rY|sWtj tj }|.tjj|r|dfStd||fS)N/dev/z,Could not determine device of '%s' % dev_entrrRz /dev/rootz!Unable to find device '/dev/root') startswithr get_mount_infor| is_containerrootdev_from_cmdline get_cmdlinerVrWrY)deventresultdevr= containers r* devent2devrs !t|   (F GHH )C B!!#I k)''(8(8(:; ;ww~~c"Dy @A A 7Nr)ctjdstjdy tjdd|gttj5tjdd |gtjd | dddy #tj$rP}|j dk(rtjd|n tj d|j Yd}~yd}~wwxYw#1swYyxYw) 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 partitionsFstatusz#Determined that %s is not encryptedzZReceived unexpected exit code %s from cryptsetup status. Assuming no encrypted partitions.NisLukszDetermined that %s is encryptedT)r whichr]rrLr[warningr)blockdev partitionrcs r* is_encryptedr s ::l # JK  <845 $,, - <956 3X>  % %  ;;!  II;X F KKG     s$B0C=C:*AC55C:=Dcddd|g}tj|d}|jdstd| d|jdd jd dS#t$r}td |d |d |d}~wwxYw)Ndmsetupdepsz--options=devnamerz1 dependz5Expecting '1 dependencies' from 'dmsetup'. Received: rz: (rR)zRan `z$`, but received unexpected stdout: ``)r r RuntimeErrorr IndexError)rcommanddeprcs r*get_underlying_partitionr$s&"5x@Gyy!!$C >>* %CC5 I  syy'*005a89:: G9@Q G  s(A(( B 1BB c xtjstjdfS t j dt5tj 5}tj|}ddddddd}tj|}|d} tjddd d |g|  tjdd d |t|g tj%tj*d|dfS#1swYxYw#1swYxYw#t$r}td|d}~wwxYw#tj$r }t j#d|Yd}~d}~wwxYw#t$rt'j(t dYwxYw# tjdd d |t|gn6#tj$r }t j#d|Yd}~nd}~wwxYw tj%w#t$rt'j(t dYwwxYwxYw)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} zNo encryption keyfile foundzReading NkeyslotzZCould not load encryption key. This is expected if the volume has been previously resized.rz --key-file-r>)data luksKillSlotz --batch-modez>    |n %  #     #"#iilG # #en&&s+ v <h A   II ""I       !  1(1= S # # # #  6  ,))  KKN     KKO  #  II ""I  ))  KKN         !  KKO  sD"DD /D7'D"F<#D? E5 D DDD"" D<+ D77D<?E2E--E25#FFH9 #GH9G7G2-H92G77H9;HH9#H63H95H66H9c g} |j||||\}}||k(r+|j|tjd|d|df|S||9d} | | d|d|d} nd|z} |j|tj| f|Sd} ||d|d|d|d |} n d|d|d |} |j|tj| f |S#t $r6} |j|tj d |d |d | fYd} ~ |Sd} ~ wwxYw) Nzno change necessary (z, rz changed (z) size, new size is unknownz&changed (%s) size, new size is unknownz) from z to zfailed to resize: disk=z, ptnum=z: )r>appendr r#r"r,r$) rrdiskptnumrr=infooldnewmsgrcs r* _call_resizerrns; D( >>$x<S #: KKOO6:EB L K?[CKCEM ?I KK5 6, K)CEM 7?SI KK5 6 K !   =A5!L    K s%AC ;C AC D +DD rc tj|}g}|r|jd}d}d} t|\}}tjd||dk(r$t|tr|t||||||z }f tj|} tj| j sEtj"| j s&|j |t j d|zf|j%|} | r t'|} t)| | r_| |D cgc]} | d c} vr&|j+d||j+d| Ft-|| \}}|j |||fn&|j |t j d|d f |j3|\}}|t||||||z }|r|S#t$r0} |j |t j d| zfYd} ~ d} ~ wwxYw#t$r3} |j |t j d|d| fYd} ~ 3d} ~ wwxYwcc} w#t.$r2} |j |t j0d |d | fYd} ~ d} ~ wwxYw#t4tf$r3} |j |t j d |d | fYd} ~ d} ~ wwxYw) Nrzunable to convert to device: %szgrowpart found fs=%srz stat of 'z ' failed: zdevice '%s' not a block devicezResizing mapped device (z!) skipped as it is not encrypted.zResizing encrypted device (z ) failed: zdevice_part_info()copypoprr|rr r!r]r isinstancerfrrVstatOSErrorS_ISBLKst_modeS_ISCHRget_mapped_devicerrinsertrrr$device_part_infor})rrr/rrrrrr=rcstatretunderlying_blockdevrxrmessages r*resize_devicesrsii G D Q %f-LHb ("- ;:g|< M'64"M MD  ggh'G||GOO,T\\ OO6  KKNN4x?  $66x@ % 4X>  3Y? t(>2 3 IIH I II> ? &&ui#?G w< /0!$u||WM   - .A '5<<@A%9vs V^^ # HH' 4 IImUFC 8 9  " @$J 6>G  AAs$'HH=H:H55H:=IrDrkrs)BrorrrloggingrVos.pathrJrabcrr contextlibrpathlibrtypingrr cloudinitr r r r r cloudinit.cloudrcloudinit.configrcloudinit.config.schemarcloudinit.distrosrrcloudinit.settingsrrr__annotations__rrr getLoggerr%r]rr,r.rBrfrqrr?rrrSrrr@rrrrrrr{r(r)r*r s   #"DD!#.1)  }! j u % *+ g! I 9c9./W./b/7/8#/'#/L#v< hsm Xc]06"6U38_6r+\qGqfqh0909609%09t0909h  | k r)