HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/cloudinit/config/__pycache__/cc_growpart.cpython-38.pyc
U

ӇgyI�@s(UdZddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
mZddlm
Z
ddlmZddlmZmZddlmZmZmZmZmZddlmZdd	lmZdd
lmZddlm Z m!Z!ddl"m#Z#e#Z$d
e ge$gd�Z%ee&d<ddgdd�Z'ed�Z(Gdd�d�Z)e�*e+�Z,Gdd�de-�Z.Gdd�de
�Z/Gdd�de/�Z0Gdd�de/�Z1Gdd �d e/�Z2e3e!e4e/d!�d"d#�Z5ee6d$�d%d&�Z7ee6d$�d'd(�Z8d)d*�Z9e:d$�d+d,�Z;d-d.�Z<ee3e3fd$�d/d0�Z=d1d2�Z>e/e!d3�d4d5�Z?e3eee4dd6�d7d8�Z@d9e0fd:e1fd;e2ffZAdS)<zGrowpart: Grow partitions�N)�ABC�abstractmethod)�suppress)�Path)�Optional�Tuple)�	lifecycle�performance�subp�
temp_utils�util)�Cloud)�Config)�
MetaSchema)�ALL_DISTROS�Distro)�
PER_ALWAYSZcc_growpart)�idZdistros�	frequencyZactivate_by_schema_keys�meta�auto�/F)�mode�devices�ignore_growroot_disabledz/cc_growpart_keydatac@seZdZdZdZdZdZdS)�RESIZE�SKIPPED�CHANGED�NOCHANGE�FAILEDN)�__name__�
__module__�__qualname__rrrr�r#r#�>/usr/lib/python3/dist-packages/cloudinit/config/cc_growpart.pyr/src@seZdZdS)�ResizeFailedExceptionN)r r!r"r#r#r#r$r%9sr%c@s:eZdZed�dd�Zeeed�dd��Zedd��Z	d	S)
�Resizer)�distrocCs
||_dS�N)�_distro)�selfr'r#r#r$�__init__>szResizer.__init__)r�returncCsdSr(r#�r*rr#r#r$�	availableAszResizer.availablecCsdSr(r#)r*�diskdev�partnum�partdev�fsr#r#r$�resizeDszResizer.resizeN)
r r!r"rr+r�list�boolr.r3r#r#r#r$r&=s
r&c@s"eZdZed�dd�Zdd�ZdS)�ResizeGrowPart�rcCsJz.tjddgddid�j}t�d|�r,WdSWntjk
rDYnXdS)	N�growpartz--help�LANG�C��
update_envz--update\s+TF)r
�stdout�re�search�ProcessExecutionError)r*r�outr#r#r$r.Is�
zResizeGrowPart.availablecCsDt||�}|j��}tj|dd���}tj�|d�}d|d�}	tj�|�sVt�	|d�zt
j
dd||g|	d�Wn`t
jk
r�}
z@|
jd	kr�t
�td
||�t|
�|
�||fWY�W5QR�Sd}
~
XYnXzt
j
d||g|	d�Wn@t
jk
�r*}
zt
�td||�t|
�|
�W5d}
~
XYnXW5QRX|t||�fS)NT)�dirZ	needs_exer8r:)r9ZTMPDIRi�z	--dry-runr;�z&Failed growpart --dry-run for (%s, %s)zFailed: growpart %s %s)�get_sizer)Zget_tmp_exec_pathrZtempdir�os�path�join�exists�mkdirr
r@�	exit_coder�logexc�LOGr%)r*r/r0r1r2�beforeZtmp_dirZtmpdZgrowpart_tmpZmy_env�er#r#r$r3Us8



�

�
*&zResizeGrowPart.resizeN�r r!r"r4r.r3r#r#r#r$r6Hsr6c@s&eZdZdZed�dd�Zdd�ZdS)�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``.
    r7cCstj�d�o|dgkS)z'growfs only works on the root partitionz/etc/rc.d/growfsr)rErF�isfiler-r#r#r$r.�szResizeGrowFS.availablec
Csht||�}z|jjddd�Wn:tjk
rX}zt�td�t|�|�W5d}~XYnX|t||�fS)NZonestart�growfs)�action�servicezFailed: service growfs onestart)	rDr)Zmanage_servicer
r@rrKrLr%)r*r/r0r1r2rMrNr#r#r$r3�s
zResizeGrowFS.resizeN)r r!r"�__doc__r4r.r3r#r#r#r$rPysrPc@s"eZdZed�dd�Zdd�ZdS)�ResizeGpartr7cCsPz4tjddgddiddgd�j}t�d|�r2Wd	SWntjk
rJYnXd
S)N�gpart�helpr9r:rrC)r<Zrcszgpart recover TF)r
�stderrr>r?r@)r*r�errr#r#r$r.�s�
zResizeGpart.availablec
Cs�zt�dd|g�WnFtjk
rZ}z&|jdkrJt�td|�t|�|�W5d}~XYnXt||�}zt�ddd||g�Wn>tjk
r�}zt�td||�t|�|�W5d}~XYnX|t||�fS)	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.
        rWZrecoverrzFailed: gpart recover %sNr3z-izFailed: gpart resize -i %s %s)r
r@rJrrKrLr%rD)r*r/r0r1r2rNrMr#r#r$r3�s

zResizeGpart.resizeNrOr#r#r#r$rV�srV)rr'rr,cCs�d}|dkrDtD]$\}}||�}|j|d�r|}q6q|s�td��nZi}tD]\}}	|	||<qL||krrtd|��|||�}
|
j|d�r�|
}|s�td|��|S)Nrr7zNo resizers availablezunknown resize mode %szmode %s not available)�RESIZERSr.�
ValueError�	TypeError)rr'rZresize_class�_name�resizerZcurZmmap�k�vZmclassr#r#r$�resizer_factory�s(

rb)r,c	Csvd}z\z$t�|tj�}t�|dtj�WW�8Stk
r\|dkrRt|�YW�SYW�
dSXW5|rpt�|�XdS)Nr�zfs)rE�close�open�O_RDONLY�lseek�SEEK_END�FileNotFoundError�get_zfs_size)�filenamer2�fdr#r#r$rD�srDc
Csp|�d�d}zt�dddd|g�\}}Wn8tjk
rb}zt�d||�WY�dSd}~XYnXt|���S)Nrr�zpool�getz	-Hpovalue�sizezFailed: zpool get size %s: %s)�splitr
r@rL�debug�int�strip)Zdatasetrmro�_rNr#r#r$rj�srjcCs�|�d�r|dfSt�|�}|s(td��|d}|d}t��}|dkr~|s~t�t���}|dkr~tj�	|�rv|dfStd��||fS)N�/dev/z,Could not determine device of '%s' % dev_entrrCz	/dev/rootz!Unable to find device '/dev/root')
�
startswithrZget_mount_infor\Zis_containerZrootdev_from_cmdlineZget_cmdlinerErFrH)�devent�resultZdevr2Z	containerr#r#r$�
devent2dev�s

ryc
Cs�t�d�st�d�dSzt�dd|g�WnPtjk
r|}z0|jdkrXt�d|�nt�d|j�WY�dSd}~XYnXttj��,t�dd	|g�t�d
|�W5QR�dSQRXdS)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.NZisLukszDetermined that %s is encryptedT)r
ZwhichrLrqr@rJ�warningr)�blockdev�	partitionrNr#r#r$�is_encrypted	s$


�r�c
Cs�ddd|g}t�|�d}|�d�s2td|����z d|�d�d	�d
�d��WStk
r�}ztd|�d|�d
��|�W5d}~XYnXdS)NZdmsetupZdepsz--options=devnamerz1 dependz5Expecting '1 dependencies' from 'dmsetup'. Received: ruz: (rC�)zRan `z$`, but received unexpected stdout: `�`)r
rv�RuntimeErrorrp�
IndexError)r~ZcommandZdeprNr#r#r$�get_underlying_partition$s
� ��r�cCsJt��stjdfSzXt�dt����$t���}t�|�}W5QRXW5QRX|d}t	�
|�}|d}Wn,tk
r�}ztd�|�W5d}~XYnXzt
j
ddd
d|g|d�W5zt
�
ddd	|t|�g�Wn2t
jk
�r}zt�d
|�W5d}~XYnXzt��Wn"tk
�r4t�td�YnXXtjd|�d�fS)z�Use '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 �key�slotzZCould not load encryption key. This is expected if the volume has been previously resized.NrzZluksKillSlotz--batch-modez<Failed to kill luks slot after resizing encrypted volume: %sz8Failed to remove keyfile after resizing encrypted volumez
--key-file�-r3)�dataz'Successfully resized encrypted volume '�')�KEYDATA_PATHrHrrr	�Timedre�json�load�base64Z	b64decode�	Exceptionr�r
�strr@rLr}�unlinkrrKr)r~r�fZkeydatar�Zdecoded_keyr�rNr#r#r$�resize_encrypted5s`
��
���
��	��
�r�cCsg}z�|�||||�\}}||kr>|�|tjd||ff�n�|dksN|dkr�d}	|dk	rp|dkrpd||f}	nd|}	|�|tj|	f�nFd}	|dk	r�|dkr�d||||f}	nd|||f}	|�|tj|	f�Wn@tk
�r}
z |�|tjd|||
ff�W5d}
~
XYnX|S)Nzno change necessary (%s, %s)�z*changed (%s, %s) size, new size is unknownz&changed (%s) size, new size is unknownzchanged (%s, %s) from %s to %szchanged (%s) from %s to %sz'failed to resize: disk=%s, ptnum=%s: %s)r3�appendrrrr%r)r_rw�disk�ptnumr~r2�info�old�new�msgrNr#r#r$�
_call_resizernsJ
������r�)r_r'cCs�t�|�}g}|�r�|�d�}d}d}zt|�\}}Wn@tk
rv}	z"|�|tjd|	f�WY�qW5d}	~	XYnXt�d|�|dkr�t	|t
�r�|t||||||�7}qzt�
|�}
WnFtk
�r}	z&|�|tjd||	ff�WY�qW5d}	~	XYnXt
�|
j��s8t
�|
j��s8|�|tjd|f�q|�|�}|�rz�t|�}t||��r�|dd�|D�k�r�|�d|�|�d|�Wqt||�\}
}|�||
|f�n|�|tjd	|�d
�f�Wqtk
�r}	z"|�|tjd|�d|	��f�W5d}	~	XYqXqz|�|�\}}WnJttfk
�rl}	z&|�|tjd
||	ff�WY�qW5d}	~	XYnX|t||||||�7}q|S)Nrzunable to convert to device: %szgrowpart found fs=%srczstat of '%s' failed: %szdevice '%s' not a block devicecSsg|]}|d�qS)rr#)�.0�xr#r#r$�
<listcomp>�sz"resize_devices.<locals>.<listcomp>zResizing mapped device (z!) skipped as it is not encrypted.zResizing encrypted device (z
) failed: zdevice_part_info(%s) failed: %s)�copy�popryr\r�rrrLrq�
isinstancerPr�rE�stat�OSError�S_ISBLK�st_mode�S_ISCHRZget_mapped_devicer�r��insertr�r�rZdevice_part_infor])r_rr'r�rwr�r�r~r2rNZstatretZunderlying_blockdevrr{�messager#r#r$�resize_devices�s�

��
�����
��
����	
��r�)�name�cfg�cloud�argsr,c

Cs�d|krt�dt�t|d<|�d�}t|t�s>t�d�dS|�dd�}t�|�r�|dkrtt	j
d|�d�d	d
d�t�d|�dSt�|�d
d��r�tj�
d�r�t�d�t�d�dSt�|ddg�}t|�s�t�d�dSzt||j|d�}WnJttfk
�r>}z&t�d||�|dk�r(|�WY�dSd}~XYnXt�d��t|||j�}	W5QRX|	D]8\}
}}|tjk�r�t�d|
|�nt�d|
||��qhdS)Nr8z.No 'growpart' entry in cfg.  Using default: %sz#'growpart' in config was not a dictrrZoffz"Growpart's 'mode' key with value 'r�z22.2zUse 'off' instead.)Z
deprecatedZdeprecated_versionZ
extra_messagezgrowpart disabled: mode=%srFz/etc/growroot-disabledz0growpart disabled: /etc/growroot-disabled existsz&use ignore_growroot_disabled to ignorerrzgrowpart: empty device list)r'rz,growpart unable to find resizer for '%s': %szResizing devicesz'%s' resized: %sz'%s' %s: %s)rLrq�DEFAULT_CONFIGrnr��dictr}rZis_falserZ	deprecaterErFrQZget_cfg_option_list�lenrbr'r\r]r	r�r�rrr�)
r�r�r�r�Zmycfgrrr_rNZresized�entryrSr�r#r#r$�handlesT�




�



r�r8rRrW)BrUr�r�r�ZloggingrE�os.pathr>r��abcrr�
contextlibr�pathlibr�typingrrZ	cloudinitrr	r
rrZcloudinit.cloudr
Zcloudinit.configrZcloudinit.config.schemarZcloudinit.distrosrrZcloudinit.settingsrrr�__annotations__r�r�rZ	getLoggerr rLr�r%r&r6rPrVr�r4rbrrrDrjryr5r�r�r�r�r�r�r[r#r#r#r$�<module>sd��
1&
9.t4�