Current File : //usr/lib/python3/dist-packages/cloudinit/config/__pycache__/cc_mounts.cpython-312.pyc
�

[hNH����UdZddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZddlm
Z
mZmZddlmZddlmZddlmZddlmZd	d
gegd�Zeed<d
ZdZdZdZdZdZej@e!�Z"d�Z#d�Z$d�Z%d7d�Z&d7d�Z'de(de	e(dee(e(fde)fd�Z*d8d�Z+de(de(ddfd �Z,d9d!�Z-d"�Z.de
ee(ee(e(fee(ffd#�Z/d$ee	ee	e(dee(e(fd%ee(e(fd&ee	e(d'edeee(fd(�Z0d$eee(deee(fd)�Z1d$eee(d*e(dee(e(fd%ee(e(fd'edeee(fd+�Z2d,eee(deee(fd-�Z3d,eee(ddfd.�Z4d/e)d0e)d1ee(ddfd2�Z5d3e(d4ed'ed5e6ddf
d6�Z7y):z-Mounts: Configure mount points and swap files�N)�Dict�List�Optional�Tuple�cast)�performance�subp�util)�Cloud)�Config)�
MetaSchema)�PER_INSTANCE�	cc_mounts�all)�id�distros�	frequency�activate_by_schema_keys�metaz&^([x]{0,1}[shv]d[a-z][0-9]*|sr[0-9]+)$z^.+:.*z
/etc/fstabzcomment=cloudconfig�i@c�l�|dvrydD]*}|j|�s�|jd�dk(s�*yy)N)�ami�root�swapT)�	ephemeral�ebs�:���F)�
startswith�find)�name�enumnames  �</usr/lib/python3/dist-packages/cloudinit/config/cc_mounts.py�is_meta_device_namer$,sB���&�&��)����?�?�8�$����3��2�)=����c�:�tjt|�ryy)NTF)�re�match�NETWORK_NAME_FILTER)r!s r#�is_network_devicer*8s��	�x�x�#�T�*��r%c��t|�d|��d|��g}|D]+}|�|��}tjj|�s�)|cSy)N�pz-part)�str�os�path�exists)�device_path�partition_number�potential_suffixes�suffix�potential_partition_devices     r#�_get_nth_partition_for_devicer6?sW�����!�#�%�'���
%�.��/:�F�%C�"�
�7�7�>�>�4�5�-�-�.�r%c��tjj|�jd�d}tjj	d|�}|�Otjj	|tjj|�jd�d�}tjj|�S)N�/rz/sys/block/)r.r/�realpath�split�joinr0)r1�partition_path�device_name�sys_paths    r#�_is_block_devicer?Ls����'�'�"�"�;�/�5�5�c�:�2�>�K��w�w�|�|�M�;�7�H��!��7�7�<�<��b�g�g�&�&�~�6�<�<�S�A�"�E�
���7�7�>�>�(�#�#r%c�D�tjd|�|}|dk(rd}tjd�t|�r|Stj|�\}}|}|r.|j||�}||k7rtjd||�t
|�r9||�}|sy|jd�sd|��}tjd||�ntjt|�rd|��}d}|�
t|d	�}nt||�}|�yt||�r|�|S|Sy)
Nz+Attempting to determine the real name of %sr�
ephemeral0z2Adjusted mount option from ephemeral to ephemeral0zMapped device alias %s to %sr8z/dev/zMapped metadata name %s to %s�)
�LOG�debugr*r
�expand_dotted_devname�getr$rr'r(�DEVICE_NAME_FILTERr6r?)�	startname�transformer�aliases�devnamer1r2�origr<s        r#�sanitize_devnamerMVs.���I�I�;�Y�G��G��+�����	�	�F�G���#���$(�$>�$>�w�$G�!�K�!��D���k�k�+�{�;���;���I�I�4�d�K�H��;�'�!�+�.�����%�%�c�*�'2�4�K��	�	�1�4��E�
�8�8�&�	�2�'2�4�K��N���6�{�A�F��6��)�
���!����^�4��%�!�!���r%�original�	sanitized�
fstab_devs�returnc��||k7rtjd||�|�tjd|�y||vrtjd|||�yy)z*Get if the sanitized device name is valid.zchanged %s => %sz+Ignoring nonexistent default named mount %sFz&Device %s already defined in fstab: %sT)rCrD)rNrOrPs   r#�sanitized_devname_is_validrS�s_���H���	�	�$�h�	�:����	�	�?��J��	�j�	 ��	�	�4���y�!�	
�
�r%c	���|�tj�d}|dz}d||d�}|�|�|}nk|retj|�}|j|j
z}||d<|�t
t|dz�|�}n||dzkDrt|dz�}n|�|}||d<|dtzkr|}nB|d	tzkr
dtz}n,ttj|tz��tz}t
||�}||d
<i}	|j�D]*\}
}t|t�rd|tzz|	|
<�&||	|
<�,tj!d|	d
|	d
|	d|	d|	d�|S)N�total��na)�avail�max_in�memrX�g�������?�max��sizez%s MBzCsuggest %s swap for %s memory with '%s' disk given max=%s [max=%s]'rZrY)r
�read_meminfor.�statvfs�f_frsize�f_bfree�min�int�GB�round�math�sqrt�items�
isinstance�MBrCrD)�memsize�maxsize�fsys�sugg_max�infor`rX�minsizer^�pinfo�k�vs            r#�suggested_swapsizeru�s������#�#�%�g�.����{�H��W�W�=�D��|�����	
��*�*�T�"��� � �7�?�?�2����W�
��?��#�e�a�i�.�(�3�G�
����
&��%�#�+�&�G�	�����D��K���R�����	�2��7�	��b�&����	�	�'�B�,�/�0�2�5���w�� �D��D��L��E��
�
�����1��a����!�b�&�)�E�!�H��E�!�H�	��I�I�M�
�f�
�
�e��
�g��
�h��
�e��
��Kr%�fnamer^c�����d���fd�}tjj|�}tj|�tj
|�d��dk(r1t
jddd|g�t
jdd	|g��d
k(r"tj�dkr|||d�n	|||d
�tjj|�rtj|d�	t
jd|g�y#tj$r"tjd�|||d�Y��wxYw#tj$rtj|��wxYw)zSize is in MiB.z6Failed to create swapfile '%s' of size %sMB via %s: %sc�h��tjd|�|�|dk(r
ddd|z|g}n(|dk(rddd|zdd	|zg}ntjd
��	tj|d��y#tj$r4}tj	�||||�tj|��d}~wwxYw)
Nz3Creating swapfile in '%s' on fstype '%s' using '%s'�	fallocatez-lz%sM�ddzif=/dev/zerozof=%szbs=1Mzcount=%sz:Missing dependency: 'dd' and 'fallocate' are not availableT)�capture)rCrDr	�ProcessExecutionErrorrpr
�del_file)rvr^�method�cmd�e�errmsg�fstypes     ��r#�create_swapz$create_swapfile.<locals>.create_swap�s�����	�	�A����		
��[� ���e�d�l�E�:�C�
�t�^����%����T�!��C��,�,�L��
�	��I�I�c�4�(���)�)�	��H�H�V�U�D�&�!�4��M�M�%� ���	�s�A*�*B1�=/B,�,B1rB�btrfs�truncatez-s�0�chattrz+C�xfs)r[�rzryz4fallocate swap creation failed, will attempt with ddi��mkswapN)r.r/�dirnamer
�
ensure_dir�get_mount_infor	�kernel_versionr|rCrpr0�chmodr})rvr^r��swap_dirr�r�s    @@r#�create_swapfiler��s4���F�F��<�w�w���u�%�H��O�O�H��
�
 �
 ��
*�1�
-�F�
����	�	�:�t�S�%�0�1��	�	�8�T�5�)�*�
���4�.�.�0�7�:��E�4��&�	+���t�[�1�

�w�w�~�~�e���
�
�5�%� ���	�	�8�U�#�$���)�)�	+��H�H�K�L���t�T�*�	+���%�%���
�
�e��
��s�5
D
�5E�
2E�E�*E/c��tjj|�}t|�j	�dk(r;	tj�d}tj|�t|||��}tt|dz��}|stjd�ytjd�5t||�ddd�|S#t$rtjd�YywxYw#1swY|SxYw)	z�
    fname: full path string of filename to setup
    size: the size to create. set to "auto" for recommended
    maxsize: the maximum size
    �autorUz)Not creating swap: failed to read meminfoN)rnrmrlrz'Not creating swap: suggested size was 0zSetting up swap file)r.r/r�r-�lowerr
r_�IOErrorrCrDr�rurdr�Timedr�)rvr^rmr�rl�mibsizes      r#�setup_swapfiler�s����w�w���u�%�H�
�4�y����F�"�	��'�'�)�'�2�G�
	
����!�!��7�G�
���#�d�e�n�%�&�G���	�	�;�<��	�	�	�1�	2�(���w�'�(��L��#�	��I�I�A�B��	��(��L�s�C�;
C6�C3�2C3�6Dc���t|t�stjd�y|j	dd�}|j	dd�}|j	dd�}|r|stjd�ytjj|�r�tjjd	�stjd
|�|S	tjd	�j�D]0}|j|dz�s�tjd|�|cStjd
|�	t|t�r|dk7rtj|�}t|t�rtj|�}t!|||��S#t$rtjd|�|cYSwxYw#t$r }tjd|�Yd}~yd}~wwxYw)zahandle the swap config, calling setup_swap if necessary.
    return None or (filename, size)
    z%input for swap config was not a dict.N�filenamez	/swap.imgr^rrmzno need to setup swapz/proc/swapsz:swap file %s exists, but no /proc/swaps exists, being safe� zswap file %s already in usez+swap file %s exists, but not in /proc/swapsz.swap file %s exists. Error reading /proc/swapsr�)rvr^rmzfailed to setup swap: %s)rj�dictrC�warningrFrDr.r/r0r
�load_text_file�
splitlinesr�	Exceptionr-�human2bytesr�)�swapcfgrvr^rm�liner�s      r#�handle_swapcfgr�/s����g�t�$����;�<���K�K�
�K�0�E��;�;�v�q�!�D��k�k�)�T�*�G��U��	�	�)�*��	�w�w�~�~�e���w�w�~�~�m�,��I�I�L��
��L�
	��+�+�M�:�E�E�G�
!���?�?�5�3�;�/��I�I�;�U�C� �L�
!�
�I�I�C�U�K�3��d�C� �T�V�^��#�#�D�)�D��g�s�#��&�&�w�/�G��E��g�F�F���	��K�K�@�%�
��L�		���3����.��2�2���3�s7�:F�	F�#F�;AF?�!F<�;F<�?	G(�G#�#G(c�B�g}i}g}tjjt�rrt	j
t�j
�D]H}t|vr|j|��|j�}|s�0|||d<|j|��J|||fS)asParse /etc/fstab.

    Parse fstab, ignoring any lines containing "comment=cloudconfig".
    :return: A 3-tuple containing:
        - A list of lines exactly as they appear in fstab
        - A dictionary with key being the first token in the line
          and value being the entire line
        - A list of any lines that were ignored due to "comment=cloudconfig"
    r)
r.r/r0�
FSTAB_PATHr
r�r��MNT_COMMENT�appendr:)�fstab_linesrP�
fstab_removedr��tokss     r#�parse_fstabr�_s����K��J��M�	�w�w�~�~�j�!��'�'�
�3�>�>�@�	)�D��d�"��$�$�T�*���:�:�<�D��&*�
�4��7�#��"�"�4�(�	)��
�M�1�1r%�mounts�device_aliases�default_fields�cloudc��g}|D]�}t|t�stjd|��*t	|d�}t||j|��}t|||�r
|g|ddz}	n|}	t|	�D]!\}
}|�	||
|	|
<�t	|	|
�|	|
<�#|	|t|	�dz
}	|j|	���|S)aSanitize mounts to ensure we can work with devices in config.

    Specifically:
     - Ensure the mounts configuration is a list of lists
     - Transform and sanitize device names
     - Ensure all tokens are strings
     - Add default options to any lines without options
    z%Mount option not a list, ignoring: %sr�rJrBN)rj�listrCr�r-rM�device_name_to_devicerS�	enumerate�lenr�)r�rPr�r�r��
updated_linesr��start�sanitized_devname�updated_line�index�tokens            r#�sanitize_mounts_configurationr�ys����M��+���$��%��K�K�?��F���D��G���,��5�.�.��
��&�e�->�
�K�-�.��a�b��9�L��L�&�l�3�	?�L�E�5��}�&4�U�&;��U�#�&)�,�u�*=�&>��U�#�		?�	��s�<�'8�':�;�;�����\�*�5+�6�r%c���g}g}|ddd�D]M}|d�|d|vr.tjd|d�|j|d��=|j|��O|ddd�S)z�Remove any entries that have a device name that doesn't exist.

    If the second field of a mount line is None (not the string, the value),
    we skip it along with any other entries that came before it that share
    the same device name.
    NrrBrz$Skipping nonexistent device named %s)rCrDr�)r��actlist�dev_denylistr�s    r#�remove_nonexistent_devicesr��sz���G��L��t��t��!����7�?�d�1�g��5��I�I�<�d�1�g�F�����Q��(��N�N�4� �!��4�R�4�=�r%�default_mount_optionsc�L�	�tj|�}ddd|ddggd�fD]~�	�	d}t||j|��}t	|||�s�.tt|��	d<t�	fd	�|D��}|rtjd
|��n|j�	���|S)zAdd default mounts to the user provided mount configuration.

    Add them only if no other entry has the same device name
    rAz/mntr�r��2)r�noner�swr�r�rr�c3�4�K�|]}|d�dk(���y�w)rN�)�.0�cfgm�
default_mounts  �r#�	<genexpr>z,add_default_mounts_to_cfg.<locals>.<genexpr>�s$�����%
�,0�D��G�}�Q�'�'�%
�s�z-Not including %s, already previously included)�copy�deepcopyrMr�rSrr-�anyrCrDr�)
r�r�rPr�r��
new_mountsr�rO�default_already_existsr�s
         @r#�add_default_mounts_to_cfgr��s�������v�&�J�	�v�v�'<�c�3�G�0��)�
��a� ��$��5�.�.��
�	�*�%��J�G�� ��Y�/�
�a��!$�%
�4:�%
�"
��"��I�I�E�u�M�����-�(�))�*�r%r�c�^�|D�cgc]}|dd|d�dt��gz|ddz��c}Scc}w)z=Add "comment=cloudconfig" to the mount options of each entry.N��,r[)r�)r��entrys  r#�add_commentr��sL�����	�b�q�	��a��z��;�-�0�1�1�E�!�"�I�=����s�"*c�X�td�|D��rtjddg�yy)z1Call 'swapon -a' if any entry has a swap fs type.c3�,K�|]}|ddk(���y�w)rVrNr�)r�r�s  r#r�z*activate_swap_if_needed.<locals>.<genexpr>�s����
3�%�5��8�v��
3�s��swapon�-aN)r�r	)r�s r#�activate_swap_if_neededr��s&��
�
3�7�
3�3��	�	�8�T�"�#�4r%�uses_systemd�changes_made�dirsc�6�d}|rd}nYtj�j�D�chc]}d|vr|d��
}}tt	|�j|��}|r2t
jddg�|rt
jddg�yyycc}w)	z�Call 'mount -a' if needed.

    If changes were made, always call 'mount -a'. Otherwise, call 'mount -a'
    if any of the directories in the mount list are not already mounted.
    FT�
mountpoint�mountr��	systemctlz
daemon-reloadN)r
r��values�bool�set�
differencer	)r�r�r��do_mount�val�mount_pointss      r#�mount_if_neededr��s����H�����{�{�}�+�+�-�
���s�"�
���
��
�
��D�	�,�,�\�:�;����	�	�7�D�/�"���I�I�{�O�4�5����
s�Br!�cfg�argsc�X�|jj�}|rdnd}ddd|ddg}|jd|�}|jdg�}tj	d	|�t�\}	}
}|jd
i�}t
||
|||�}
t|
||
||�}
t|
�}
t|
�}
t|jdi��}|r|
j|ddd
ddg�|
stj	d�y|
D�cgc]}dj|���}}|
D�cgc]}|djd�s�|d��}}|D]}	tj|��|D�cgc]}|j%dd���}}|D�cgc]}|j%dd���}}|D�cgc]}||vs�d|����c}|D�cgc]}||vs�d|����c}z}|	j'|�ddj|	�z}tj(t*|�|rtj	d|�ntj	d�t-|
�t/|t1|�|�ycc}wcc}w#t $rtj"td|�Y��JwxYwcc}wcc}wcc}wcc}w)z Handle the mounts configuration.z:defaults,nofail,x-systemd.after=cloud-init.service,_netdevzdefaults,nobootwaitNr�r�r��mount_default_fieldsr�zmounts configuration is %sr�rr�r�z No modifications to fstab needed�	rBr8z Failed to make '%s' config-mountr�z- z+ z%s
�
zChanges to fstab: %szNo changes to /etc/fstab made.)�distror�rFrCrDr�r�r�r�r�r�r�r;rr
r�r��logexc�replace�extend�
write_filer�r�r�r�)r!r�r�r�r�r��hardcoded_defaultsr�r�r�rPr�r��updated_cfg�swapfiler��	cfg_lines�dr��n�sadds�sdrops�drop�add�sops�contentss                          r#�handlers����<�<�,�,�.�L��	E�
"����f�.C�S�#�N��*-�'�'�� 2�+�N�36�'�'�(�B�2G�F��I�I�*�F�3�-8�]�*�K��]��W�W�-�r�2�N�/��
�N�N�E��K�,��*�J����K�-�[�9�K��k�*�K��c�g�g�f�b�1�2�H�����H�f�f�d�C��E�F��
	�	�	�4�5��/:�;�e����5�!�;�I�;�%�>�Q��1�����)=�A�a�D�>�D�>�
�D��	D��O�O�A��D�,5�5�a�Q�Y�Y�t�S�
!�5�E�5�,9�
:�q�a�i�i��c�"�
:�F�
:�$*�@�D�d�%�.?�b���K�@�#�D��s�&�'8�"�S�E�
�D��D����y�!���	�	�+�.�.�H��O�O�J��)���	�	�(�$�/��	�	�2�3��K�(��L�$�t�*�d�3��7<��>��
�	D��K�K��?��C�	D��
6��
:��@��DsH�I#�%I(�?I(�I-�)J�J�'	J"�1J"�>	J'�J'�-$J�J)N)NNN)NN)8�__doc__r��loggingrgr.r'�typingrrrrr�	cloudinitrr	r
�cloudinit.cloudr�cloudinit.configr�cloudinit.config.schemar
�cloudinit.settingsrr�__annotations__rGr)r�r�rkre�	getLogger�__name__rCr$r*r6r?rMr-r�rSrur�r�r�r�r�r�r�r�r�r�r�rr�r%r#�<module>rs���4����	�	�4�4�-�-�!�#�.�+���w��!�	��j��?����
�
�#��
��
���g����!��	��
�$�.�b���&�s�m��9=�c�3�h���	��&6�r;�3�;�c�;�d�;�|�<-�`2�U�4��9�d�3��8�n�d�3�i�?�@�2�4+���$�x��}�-�.�/�+��S�#�X��+���c��N�+���#��'�	+�
�+�
�$�s�)�_�
+�\�t�D��I���4��S�	�?��&!���c��O�!��!��S�#�X��!���c��N�	!�
�!�
�$�s�)�_�
!�H��d�3�i���T�$�s�)�_��$�T�$�s�)�_�$��$�6��6�&*�6�26�s�)�6�	�6�2E4��E4�6�E4�%�E4�t�E4��E4r%