%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python3/dist-packages/cloudinit/config/__pycache__/
Upload File :
Create Path :
Current File : //lib/python3/dist-packages/cloudinit/config/__pycache__/cc_disk_setup.cpython-312.pyc

�

���f�w�
��UdZddlZddlZddlZddlmZddlmZmZddl	m
Z
ddlmZddl
mZddlmZdd	lmZd
diZej(e�Zdeged
dgd�Zeed<dedede
deddf
d�Zd�Zd�Zd1d�Zd2d�Zd�Z d2d�Z!d�Z"d�Z#					d3d�Z$d �Z%d!�Z&d"�Z'd#�Z(d$�Z)d%�Z*d&�Z+d'�Z,d(�Z-d)�Z.d*�Z/d+�Z0d,�Z1d-�Z2d.�Z3d/�Z4d0�Z5y)4z1Disk Setup: Configure partitions and filesystems.�N)�Path)�subp�util)�Cloud)�Config)�
MetaSchema)�ALL_DISTROS)�PER_INSTANCE�LANG�C�
cc_disk_setup�
disk_setup�fs_setup)�id�distros�	frequency�activate_by_schema_keys�meta�name�cfg�cloud�args�returnc�J���|jdi����fd�}|jd�}t|t�r�t||�tjdt
|��|j�D]r\}}t|t�stjd|��-	tjd�tjtj
d|zt||f���t|jd�}	t|	t�r�tjdt
|	��t|	|�|	D]}t|t�stjd
|��*	tjd�|jd�}
tjtj
d|
zt |f����y
y
#t$r(}tjtd	|z�Yd
}~��sd
}~wwxYw#t$r'}tjtd|z�Yd
}~��d
}~wwxYw)z[
    See doc/examples/cloud-config-disk-setup.txt for documentation on the
    format.
    �device_aliasesc�X���j|�}�j|xs|�xs|S�N)�get�device_name_to_device)�candrrrs  ���@/usr/lib/python3/dist-packages/cloudinit/config/cc_disk_setup.py�alias_to_devicezhandle.<locals>.alias_to_device(s-����!�!�$�'���*�*�4�<�4�8�@�D�@�rzPartitioning disks: %szInvalid disk definition for %sz!Creating new partition table/diskzCreating partition on %s)�logfunc�msg�funcrz Failed partitioning operation
%sNrzsetting up filesystems: %sz"Invalid file system definition: %szCreating new filesystem.�devicezCreating fs for %sz%Failed during filesystem operation
%s)r�
isinstance�dict�update_disk_setup_devices�LOG�debug�str�items�warningr�log_time�mkpart�	Exception�logexc�list�update_fs_setup_devices�mkfs)rrrrr"r�disk�
definition�err'rs  `        @r!�handler:!s����
�W�W�-�r�2�N�A�����&�J��*�d�#�!�*�o�>��	�	�*�C�
�O�<� *� 0� 0� 2�	J��D�*��j�$�/����<�d�C��	
J��	�	�=�>��
�
��I�I�2�T�9���
�+�	�	J� �w�w�z�"�H��(�D�!��	�	�.��H�
�>���/�:�"�	O�J��j�$�/����@�*�M��

O��	�	�4�5�#����1���
�
��I�I�,�v�5��$��	�	O�"��	�
J����C�!D�q�!H�I�I��
J��*�
O����C�!I�A�!M�N�N��
O�s2�%AF>�%AG2�>	G/�G*�*G/�2	H"�;H�H"c��t|�D]m}||�}|�||k(r�||vrtjd||�||=||||<t||t�r|||d<||=tjd||��oy)Nz0Replacing %s in disk_setup for translation of %s�	_orignamez,updated disk_setup device entry '%s' to '%s')r4r+�infor(r)r,)r�tformer�origname�transformeds    r!r*r*Vs�����$�
���h�'����+��"9���*�$��H�H�B���
�
�;�'�",�X�"6�
�;���j��-�t�4�3;�J�{�#�K�0��x� ��	�	�:���	
�!
r#c�l�|D]�}t|t�stjd|��*|j	d�}|��>tj|�\}}||�}|�$|}tjd|||�||d<||d<|s��d|vr tjd|||�|d|d<||d<��y)Nz"entry in disk_setup not a dict: %sr'z%s is mapped to disk=%s part=%sr<�	partitionzKPartition '%s' from dotted device name '%s' overrides 'partition' key in %s�
_partition)r(r)r+r/rr�expand_dotted_devnamer,)rr>r8r?�dev�part�tformeds       r!r5r5ps���!� +�
��*�d�+��K�K�<�j�I���>�>�(�+������0�0��:���d��#�,�����C��I�I�1�8�W�d�
�'/�J�{�#�#*�J�x� ���j�(����6�����,6�k�+B�
�<�(�&*�J�{�#�A +r#c#�K�tj|�}|r||d}|D�cgc]}|jd���c}D]\}}||f���
ycc}w�w)zd
    Returns the key/value pairs of output sent as string
    like:  FOO='BAR' HOME='127.0.0.1'
    N�=)�shlex�split)�values�start�_values�x�key�values      r!�value_splitterrR�sW����
�k�k�&�!�G���%�&�/��-4�5��q�w�w�s�|�5��
��U��5�j����5�s�!A�A
�Ac#��K�dddd|g}|r|jd�d}	tj|�\}}|j	�j�D�cgc]!}t
|j��d	kDs� |��#}}|D]3}ddddd
�}	t|�D]\}
}||	|
j�<�|	���5y#t$r}td|�d|���|�d}~wwxYwcc}w�w)a�
    Enumerate the elements of a child device.

    Parameters:
        device: the kernel device name
        nodeps <BOOL>: don't enumerate children devices

    Return a dict describing the disk:
        type: the entry type, i.e disk or part
        fstype: the filesystem type, if it exists
        label: file system label, if it exists
        name: the device name, i.e. sda
    �lsblkz--pairsz--outputzNAME,TYPE,FSTYPE,LABELz--nodepsN�Failed during disk check for �
r)r�type�fstype�label)
�appendrr2�RuntimeError�strip�
splitlines�lenrKrR�lower)r'�nodeps�	lsblk_cmdr=�_errr9rO�partsrF�drPrQs            r!�enumerate_diskre�s���� 	��� ���I������$��D���Y�Y�y�)�
��d�����1�1�3�J�1�s�1�7�7�9�~��7I�Q�J�E�J��������	
��)��.�	#�J�C��"�A�c�i�i�k�N�	#��������5;�Q�?�
��	����

K�s9�C!�B9� C!�!C�:C�>;C!�9	C�C�C�C!c�Z�t|d��D]}d|vs�|dj�cSy)z@
    Return the device type of the device by calling lsblk.
    T)r`rWN)rer_)r'rds  r!�device_typerg�s7��
�F�4�
0�%���Q�;��V�9�?�?�$�$�%�r#c��d}	t|�}|r|dk(ry|s|dk(ryy#t$rtjd|�YywxYw)z0
    Check if the device is a valid device.
    �zQuery against device %s failedFrFTr7)rgr2r+r/)rrB�d_types   r!�is_device_validrk�sZ���F���T�"��
�V�v�%��
�6�V�+���������4�d�;���s� �A�Ac��d\}}}}ddd|g}	tj|ddg��\}}|rst|j	��dk(rWt|d��D]G\}}	|j
�d
k(r|	}�|j
�dk(r|	}�2|j
�dk(s�F|	}�I|||fS#t$r}td|�d	|���|�d
}~wwxYw)z�
    Check if the device has a filesystem on it

    Output of blkid is generally something like:
    /dev/sda: LABEL="Backup500G" UUID="..." TYPE="ext4"

    Return values are device, label, type, uuid
    )NNNN�blkidz-cz	/dev/nullr�)�rcsrUrVN�)rMrYrW�uuid)rr2r[r^r]rRr_)
r'�outrY�fs_typerq�	blkid_cmdrbr9rPrQs
          r!�check_fsru�s���!7��C�����$��V�4�I���I�I�i�a��V�4�	��T���s�~�~�� �A�%�,�S��:�
!�
��U��9�9�;�'�)�!�E��Y�Y�[�F�*�#�G��Y�Y�[�F�*� �D�

!��'�4�������5;�Q�?�
��	���s�B%�%	C�.C�Cc�$�t|�\}}}|S)z7
    Returns true if the device has a file system.
    )ru)r'�_rss   r!�
is_filesystemrxs���V�$�M�A�w���Nr#c�D�|�d}|sddg}d}t|�D]k}|d|k(r|durd|dzdfcS|d|k(r|r|d|k(s|sd|dzd	fcS|d
|vs�C|d
dk7s|drd	}|d
dk(r�[|dr�ad|dzdfcS|s|dfStjd�y)
a
    Find a device that is either matches the spec, or the first

    The return is value is (<device>, <bool>) where the device is the
    device to use and the bool is whether the device matches the
    fs_type and label.

    Note: This works with GPT partition tables!
    rir7rFFrX�/dev/%srrYTrWz5Failed to find device during available device search.)NF)rer+r/)r'rsrY�
valid_targets�label_match�
replace_fs�raw_device_usedrds        r!�find_device_noders���$
�}������(�
��O�
�F�
#�6���X�;�*�$���)=���&�	�)�5�1�1��X�;�'�!�
�Q�w�Z�5�0����&�	�)�4�0�0��V�9�
�%���y�F�"�a��k�"&����y�F�"���x�[�!�A�f�I�-�u�5�5�-6�0������K�K�G�H�r#c�j�ttt|���dkDryt|�\}}}|ryy)z�
    Check if the device is currently used. Returns true if the device
    has either a file system or a partition entry
    is no filesystem found on the disk.
    rpTF)r^r4reru)r'rw�check_fstypes   r!�is_disk_usedr�Rs:���4��v�&�'�(�1�,��"�&�)��A�|�Q���r#c���	tjdd|g�\}}tjdd|g�\}}t|�t|�zS#t$r}td|�d|���|�d}~wwxYw)N�blockdevz--getsize64z--getsszFailed to get z size
)rr2r[�int)r'�
size_in_bytesrw�sector_sizer9s     r!�get_hdd_sizer�fsx��M��9�9�j�-��%H�I��
�q����J�	�6�#B�C���Q��}���K� 0�0�0���M��&�!�D�E�1�L��M�s�6A�	A/�A*�*A/c	��t|�dd|g}	tj|d|z��\}}g}|j	�D]�}|j�}t
|�dk(r�"||dvs�*|d	j�d
vr�@d}	ttdt
|��d�
�D]%}
||
j�s�||
dk7s� ||
}	n|j|	���|S#t$r}td|�d|���|�d}~wwxYw)z�
    Returns true if the partition layout matches the one on the disk

    Layout should be a list of values. At this time, this only
    verifies that the number of partitions and their labels is correct.
    �sfdiskz-l�%s
��data�#Error running partition command on rVNr���)�extended�emptyrpT)�reverse�/)�read_parttblrr2r[r]rKr^r_�sorted�range�isdigitrZ)r'�layout�prt_cmdrrrbr9�found_layout�line�_line�
type_labelrOs           r!�check_partition_mbr_layoutr�ps�������v�&�G���I�I�g�F�V�O�<�	��T��L���� �,���
�
����u�:��?���U�1�X���R�y��� �$9�9���J��E�!�S��Z�0�$�?�
����8�#�#�%�%��(�c�/�!&�q��J��
�

���
�+�#,�$���1���;A�1�E�
��	���s�C � 	D�)C;�;Dc��dd|g}	tj|t��\}}t	|j��}|D]#}|j
�jd�s�#n|D�cgc]#}|j
�j�d��%}}g}	|D]7}
t|
�dk(r|
jd	�r|
d
d}
|	j|
��9|	S#t$r}td|�d|���|�d}~wwxYwcc}w)N�sgdiskz-p)�
update_envr�rV�Number���00rrn)r�
LANG_C_ENVr2r[�iterr]r\�
startswithrKr^�endswithrZ)r'r�r�rrrbr9�	out_linesr��codes�cleaned�codes           r!�check_partition_gpt_layoutr��s����v�&�G���I�I�g�*�=�	��T��S�^�^�%�&�I�"����:�:�<�"�"�8�,���2;�;��T�Z�Z�\�
�
�
!�!�
$�;�E�;��G�����t�9��>�d�m�m�D�1���!�9�D����t����N��E���;A�1�E�
��	����4
<s�C�*(C7�	C4�C/�/C4c��d|k(r
t||�}nd|k(r
t||�}ntd��tj	d||||�t|t�r|rt|�dk\ryyt|�t|�k(r{|D�cgc](}t|ttf�rt|d�nd��*}}tj	d	||�t||�D]!\}}|��	t|�t|�k7s�!yyycc}w)
z�
    See if the partition lay out matches.

    This is future a future proofing function. In order
    to add support for other disk layout schemes, add a
    function called check_partition_%s_layout
    �gpt�mbr�Unable to determine table typez6called check_partition_%s_layout(%s, %s), returned: %srpTFNzLayout types=%s. Found types=%s)r�r�r[r+r,r(�boolr^�tupler4r-�zip)�
table_typer'r�r�rO�layout_types�itype�ftypes        r!�check_partition_layoutr��s��
�
��1�&�&�A��	�*�	�1�&�&�A���;�<�<��I�I�@�������&�$���c�,�'�1�,���	�\�	�c�&�k�	)�JP�
�DE��A��t�}�5�C��!��I�4�?�
��
�	�	�	�-�|�\�	
� ��l�;�	�L�E�5�� �S��Z�3�u�:�%=��	����
s�-C>c�|�t|t�st|t�ryt|�dk(rt|t�st|t�st	d��t|�}|dkDrt	d��g}d}|D]�}d}|}|dz
}t|t�r!t|�dk7rt	d	|z��|\}}tt
|�t
|�d
zz�}||k(r|jd|z��z|jd|�d|�����d
j|�}	t|�dkDrt	d|	z��|	S)a@
    Calculate the layout of the partition table. Partition sizes
    are defined as percentage values or a tuple of percentage and
    partition type.

    For example:
        [ 33, [66: 82] ]

    Defines the first partition to be a size of 1/3 the disk,
    while the remaining 2/3's will be of type Linux Swap.
    z,,83rzPartition layout is invalidr�z$Only simply partitioning is allowed.�Srprn�%Partition was incorrectly defined: %s�dz,,%s�,rVz-Calculated partition definition is too big
%s)	r(r4r�r^r[r��floatrZ�join)
�sizer��
last_part_num�part_definition�part_numrF�	part_type�percent�	part_size�sfdisk_definitions
          r!�get_partition_mbr_layoutr��sR���f�d�#�
�6�4�(@���F��q��Z���5�j���?��8�9�9���K�M��q���A�B�B��O��H��F���	����A�
���d�D�!��4�y�A�~�"�;�d�B���"&��G�Y���d��u�W�~��';�<�=�	��}�$��"�"�6�I�#5�6��"�"�y�)�#D�E�#F�&�	�	�/�2��
�?��a���<��
 �
�	
�
�r#c�V�t|t�rdddgfgSg}|D]}t|t�r"t|�dk7rt	d|z��|\}}n|}d}tt
|�t
|�dzz�}|j|ddj|�gf���d|ddd<|S)Nrrnr�r�z+{}r�)	r(r�r4r^r[r�r�rZ�format)r�r��partition_specsrBr��partition_typer�s       r!�get_partition_gpt_layoutr�(s����&�$����1�v�����O��O�	��i��&��9�~��"�"�;�i�G���'0�#�G�^��G�!�N���d��u�W�~��';�<�=�	������E�L�L��4K�0L�M�N�O�#$�O�B����B���r#c��d}d}d}t|d�5}|j||z�|j|tj�|j||z�|j�ddd�t
|�y#1swY�xYw)N�izrb+)�open�write�seek�os�SEEK_END�flushr�)r'�null�	start_len�end_len�fps     r!�purge_disk_ptabler�@s|���D��I��G�	
�f�e�	���
�����#�$�
�����"�+�+�&�
������ �
���
�	����
��s�AB�B
c��t|�D]D}|ddvs�ddd|dzg}	tjd|d�tj|��Ft
|�y	#t$r}td|dz�|�d	}~wwxYw)
z(
    Remove partition table entries
    rW)r7�crypt�wipefsz--allrzrzPurging filesystem on /dev/%szFailed FS purge of /dev/%sN)rer+r=rr2r[r�)r'rd�
wipefs_cmdr9s    r!�
purge_diskr�Os����F�
#�	���V�9�-�-�"�G�Y��6��-B�C�J�
����8�!�F�)�D��	�	�*�%�	��f����
�"�0�1�V�9�<�����
�s�.A�	A?�(A:�:A?c�\�d|k(rt||�Sd|k(rt||�Std��)z�
    Call the appropriate function for creating the table
    definition. Returns the table definition

    This is a future proofing function. To add support for
    other layouts, simply add a "get_partition_%s_layout"
    function.
    r�r�r�)r�r�r[)r�r�r�s   r!�get_partition_layoutr�cs:��
�
��'��f�5�5�	�*�	�'��f�5�5�
�7�
8�8r#c�(�d}tj|�r||g}ndd|g}tj�	tj|�tj�y#t$r'}tj
td|z�Yd}~�@d}~wwxYw)zq
    `Partprobe` is preferred over `blkdev` since it is more reliably
    able to probe the partition table.
    �	partprober�z
--rereadptz%Failed reading the partition table %sN)r�whichr�udevadm_settler2r3r+)r'r��	probe_cmdr9s    r!r�r�ss���
�I��z�z�)����'�	���v�6�	�����F��	�	�)��	������F����C�@�1�D�E�E��F�s�A!�!	B�*B�Bc��dd|g}	tj|d|z��t|�y#t$r}td|�d|���|�d}~wwxYw)zV
    Break out of mbr partition to allow for future partition
    types, i.e. gpt
    r�z--forcer�r�zFailed to partition device rVN)rr2r[r�)r'r�r�r9s    r!�exec_mkpart_mbrr��s[����F�+�G���	�	�'����0��������39�1�=�
��	���s�-�	A
�A�A
c
��	tjdd|g�t|�D]�\}\}\}}|dz
}tjdddj|||�|g�|��>t|�j	dd�}tjddd	j||�|g���	t|�y#t
$rtjd
|��wxYw)Nr�z-Zrpz-nz{}:{}:{}r��0z-tz{}:{}zFailed to partition device %s)	r�	enumerater�r-�ljustr2r+r/r�)r'r��indexr�rM�end�pinputs       r!�exec_mkpart_gptr��s�����	�	�8�T�6�*�+�5>�v�5F�	�1�E�1�N�L�U�C��Q�J�E��I�I����%�%�e�U�C�8��	�
��)��^�,�2�2�1�c�:���	�	��t�W�^�^�E�6�%B�F�K��	�*����	�����3�V�<�
��s�A B6�#AB6�6!Cc���tjj|�sAtj�tjj|�std|z��tj�y)z?Assert that device exists and settle so it is fully recognized.zBDevice %s did not exist and was not created with a udevadm settle.N)r��path�existsrr�r[�r's r!�assert_and_settle_devicer��sV��
�7�7�>�>�&�!������w�w�~�~�f�%��)�+1�2��
�	���r#c���t|�tjj|�}tjd|�|j
dd�}|j
dd�}|j
dd�}tjd�t|t�r|r|stjd�y	tjd
|�t|�stdj|����t|t�r4|j�d
k(r!tjd�t|�y	tjd�t|||�rtjd�ytjd�|s-t!|�st#|�rtjd|�y	tjd|�t%|�}tjd�t'|||�}tjd|�tjd|�d|k(r
t)||�nd|k(r
t+||�ntd��tjd|�y	)a�
    Creates the partition table.

    Parameters:
        definition: dictionary describing how to create the partition.

            The following are supported values in the dict:
                overwrite: Should the partition table be created regardless
                            of any pre-existing data?
                layout: the layout of the partition table
                table_type: Which partition table to use, defaults to MBR
                device: the device to work on.
    z!Checking values for %s definition�	overwriteFr�r�r�z Checking against default devicesz)Device is not to be partitioned, skippingNz'Checking if device %s is a valid devicez%Device {device} is not a disk device!r��removez,Instructed to remove partition table entriesz!Checking if device layout matchesz"Device partitioning layout matchesTz'Checking if device is safe to partitionz-Skipping partitioning on configured device %szChecking for device size of %szCalculating partition layoutz   Layout is: %szCreating partition table on %sr�r�zPartition table created for %s)r�r�r��realpathr+r,rr(r�rkr[r�r-r_r�r�r�rxr�r�r�r�)r'r8r�r�r��device_sizer�s       r!r1r1�s����V�$�
�W�W�
�
�f�
%�F��I�I�1�6�:����{�E�2�I�
�^�^�H�e�
,�F�����e�4�J��I�I�0�1��6�4� ����	�	�=�>���I�I�7��@��6�"��3�:�:�&�:�I�
�	
�
�&�#��6�<�<�>�X�#=��	�	�@�A��6����I�I�1�2��j�&�&�9��	�	�6�7���I�I�7�8��,�v�.�-��2G��	�	�A�6�J���I�I�.��7��v�&�K��I�I�,�-�*�:�{�F�K�O��I�I� �/�2��I�I�.��7��
�����0�	�*�	����0��;�<�<��I�I�.��7r#c��dddddd�}d|j�vrd}|j�|vr||Stjd|�y)z9
    A force flag might be -F or -F, this look it up
    z-Fz-f)�ext�btrfs�xfs�reiserfs�swapr�zForce flag for %s is unknown.ri)r_r+r/)�fs�flagss  r!�lookup_force_flagr	sY��
�����
�E�
����
��
��	�x�x�z�U���R�y���K�K�/��4�
r#c�	�|jd�}|jd�}t|jdd��}|jd�}|jdg�}|jdg�}|jdd	�}|jd
d	�}t|�tjj|�}tjd|�|r|j��r|j�rd|dj�r|�d
�}|�|��}t|�j�stjd�ytjd||�tjd|�t|�\}	}
}tjd||	|
�|	|k(rL|
|k(rGtjd|�|stjd|�ytjd|��n&tjd|��n|r�t|�j�dvr�|}tjd|�d}
|j�dk(rd	}
t||||
|��\}}tjd||�|rtjd�y|s|r|rtjd|�|sbtjd|�y|rt|�j�dk(rtjd |�ntjd!�ytjd"|||�|stjd#|�y|s|std$j!|�%���d	}|r?|d|||d&�z}d}|rtjd'|�|r�tjd(|�n�t#j$d)|z�}|st#j$d*|z�}|stjd+||�y|g}|r|j'd,|g�|st)|�d-k(rt+|�}|r|j-|�|r|j'|�|j-|�tjd.||�tjd/t|��	t#j"||�0�y#t.$r}td1|�d2|���|�d}~wwxYw)3a�
    Create a file system on the device.

        label: defines the label to use on the device
        fs_cfg: defines how the filesystem is to look
            The following values are required generally:
                device: which device or cloud defined default_device
                filesystem: which file system type
                overwrite: indiscriminately create the file system
                partition: when device does not define a partition,
                            setting this to a number will mean
                            device + partition. When set to 'auto', the
                            first free device or the first device which
                            matches both label and type will be used.

                            'any' means the first filesystem that matches
                            on the device.

            When 'cmd' is provided then no other parameter is required.
    rYr'rB�any�
filesystem�cmd�
extra_optsr}Fr�z#Checking %s against default devicesr��pz/Path %s does not exist or is not a block deviceNz%Manual request of partition %s for %szChecking device %sz0Device '%s' has check_label='%s' check_fstype=%sz Existing file system found at %sz"Device %s has required file systemzDestroying filesystem on %sz#Device %s is cleared for formatting)�autorz-Identifying device to create %s filesystem onT)rsrYr|r}z(Automatic device for %s identified as %sz,Found filesystem match, skipping formatting.z*Replacing file system on %s as instructed.zENo device available that matches request. Skipping fs creation for %s�nonez.Using the raw device to place filesystem %s onz(Error in device identification handling.z;File system type '%s' with label '%s' will be created on %szDevice is not known: %szENo way to create filesystem '{label}'. fs_type or fs_cmd must be set.)rY)rYrr'z8fs_setup:overwrite ignored because cmd was specified: %sz9fs_setup:extra_opts ignored because cmd was specified: %szmkfs.%szmk%sz.Cannot create fstype '%s'.  No mkfs.%s commandz-Lr7zCreating file system %s on %sz     Using cmd: %s)�shellzFailed to exec of 'z':
)rr-r�r�r�r�r+r,r�r�is_block_devicer/rur_rr[r�rr��extendrgrrZr2)�fs_cfgrYr'rBrs�fs_cmd�fs_opts�
fs_replacer��check_labelr�rw�odevicer|�reuser�mkfs_cmd�
force_flagr9s                   r!r6r6sZ��*
�J�J�w��E�
�Z�Z��
!�F��F�J�J�{�E�2�3�I��j�j��&�G�
�Z�Z��r�
"�F��j�j��r�*�G����L�%�0�J��
�
�;��.�I��V�$�
�W�W�
�
�f�
%�F��I�I�3�V�<��	�)�)�+������b�z�!�!�#�"�8�1���%�y�1�F���<�/�/�1����M�N���I�I�7��F�
�
	�	�	�&��/�'/��'7�$��\�1��	�	�>����		
��%��L�G�$;��I�I�8�&�A���	�	�>��G���	�	�7��@�
�I�I�;�V�D�	�s�9�~�+�+�-��@����	�	�A�5�I����?�?���%��K�(����#�!�
�
���	�	�	�<�g�v�N���I�I�D�E������I�I�B�F�K���I�I�.��
�

�
�#�i�.�.�.�0�F�:��	�	�B�E�J�	�	�	�<�=���I�I�E��
��	�����-�v�6��
�v��
�!�6��6�.�
�	
�
�E�
�����!��"
�
��
����K�K�J��
���K�K�K��
��:�:�i�'�1�2����z�z�&�7�"2�3�H���K�K�@���
�

������M�M�4��-�(���F�+�v�5�*�7�3�J���
�
�j�)���M�M�'�"��
�
�f���I�I�-�u�f�=��I�I�"�C��K�0�O��	�	�&��&���O��F�A�F�G�Q�N��O�s�R*�*	S
�3S�S
r)F)NNNTN)6�__doc__�loggingr�rJ�pathlibr�	cloudinitrr�cloudinit.cloudr�cloudinit.configr�cloudinit.config.schemar�cloudinit.distrosr	�cloudinit.settingsr
r��	getLogger�__name__r+r�__annotations__r-r4r:r*r5rRrergrkrurxrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r1rr6�r#r!�<module>r's4��8��	��� �!�#�.�)�+��c�]�
��g����!����}�� ,�j�9�	��j��2O��2O�6�2O�%�2O�t�2O��2O�j
�4#+�L
�/�d��$ �@�
�
����
5�p�(1�%�P&�R+�\6�r�0��(
9� �&�"�6
� D8�N�,Or#

Zerion Mini Shell 1.0