Ë
    [hNH  ã                   óà  — U d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ d	d
geg dœZeed<   dZdZdZdZdZdZ ej@                  e!«      Z"d„ Z#d„ Z$d„ Z%d7d„Z&d7d„Z'de(de	e(   dee(e(f   de)fd„Z*d8d„Z+de(de(ddfd „Z,d9d!„Z-d"„ Z.de
ee(   ee(e(f   ee(   f   fd#„Z/d$ee	ee	e(            dee(e(f   d%ee(e(f   d&ee	e(      d'edeee(      fd(„Z0d$eee(      deee(      fd)„Z1d$eee(      d*e(dee(e(f   d%ee(e(f   d'edeee(      fd+„Z2d,eee(      deee(      fd-„Z3d,eee(      ddfd.„Z4d/e)d0e)d1ee(   ddfd2„Z5d3e(d4ed'ed5e6ddf
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/fstabzcomment=cloudconfigé   i   @c                 ól   — | dv rydD ]*  }| j                  |«      sŒ| j                  d«      dk(  sŒ* y y)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                 ó:   — t        j                  t        | «      ryy)NTF)ÚreÚmatchÚNETWORK_NAME_FILTER)r!   s    r#   Úis_network_devicer*   8   s   € ä	‡x�xÔ# TÔ*ØØr%   c                 óŒ   — t        |«      d|›�d|›�g}|D ]+  }| ›|›�}t        j                  j                  |«      sŒ)|c S  y )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                 ó„  — t         j                  j                  | «      j                  d«      d   }t         j                  j	                  d|«      }|�Ot         j                  j	                  |t         j                  j                  |«      j                  d«      d   «      }t         j                  j                  |«      S )Nú/r   z/sys/block/)r.   r/   ÚrealpathÚsplitÚjoinr0   )r1   Úpartition_pathÚdevice_nameÚsys_paths       r#   Ú_is_block_devicer?   L   s‹   € Ü—'‘'×"Ñ" ;Ó/×5Ñ5°cÓ:¸2Ñ>€KÜ�w‰w�|‰|˜M¨;Ó7€HØÐ!Ü—7‘7—<‘<Ø”b—g‘g×&Ñ& ~Ó6×<Ñ<¸SÓAÀ"ÑEó
ˆô �7‰7�>‰>˜(Ó#Ð#r%   c                 óD  — t         j                  d| «       | }|dk(  rd}t         j                  d«       t        | «      r| S t        j                  |«      \  }}|}|r.|j                  ||«      }||k7  rt         j                  d||«       t        |«      r9 ||«      }|sy |j                  d«      sd|›�}t         j                  d||«       nt        j                  t        | «      rd|›�}d }|€t        |d	«      }nt        ||«      }|€y t        ||«      r|�|S |S y )
Nz+Attempting to determine the real name of %sr   Ú
ephemeral0z2Adjusted mount option from ephemeral to ephemeral0zMapped device alias %s to %sr8   z/dev/zMapped metadata name %s to %sé   )ÚLOGÚdebugr*   r
   Úexpand_dotted_devnameÚgetr$   r   r'   r(   ÚDEVICE_NAME_FILTERr6   r?   )Ú	startnameÚtransformerÚaliasesÚdevnamer1   r2   Úorigr<   s           r#   Úsanitize_devnamerM   V   s.  € Ü‡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                 ó¬   — || k7  rt         j                  d| |«       |€t         j                  d| «       y||v rt         j                  d|||   «       yy)z*Get if the sanitized device name is valid.zchanged %s => %sz+Ignoring nonexistent default named mount %sFz&Device %s already defined in fstab: %sT)rC   rD   )rN   rO   rP   s      r#   Úsanitized_devname_is_validrS   ‡   s_   € ð �HÒÜ�	‰	Ð$ h°	Ô:ØÐÜ�	‰	Ð?ÀÔJØØ	�jÑ	 Ü�	‰	Ø4ØØ�yÑ!ô	
ð
 Ør%   c           	      óÐ  — | €t        j                  «       d   } | dz  }d|| dœ}|€|€|}nk|ret        j                  |«      }|j                  |j
                  z  }||d<   |€t        t        |dz  «      |«      }n||dz  kD  rt        |dz  «      }n|€|}||d<   | dt        z  k  r| }nB| d	t        z  k  r
dt        z  }n,t        t        j                  | t        z  «      «      t        z  }t        ||«      }||d
<   i }	|j                  «       D ]*  \  }
}t        |t        «      rd|t        z  z  |	|
<   Œ&||	|
<   Œ, t        j!                  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]'rZ   rY   )r
   Úread_meminfor.   ÚstatvfsÚf_frsizeÚf_bfreeÚminÚintÚGBÚroundÚmathÚsqrtÚitemsÚ
isinstanceÚMBrC   rD   )Ú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Šˆˆfd„}t         j                  j                  | «      }t        j                  |«       t        j
                  |«      d   Š‰dk(  r1t        j                  ddd| g«       t        j                  dd	| g«       ‰d
k(  r"t        j                  «       dk  r || |d«       n	  || |d«       t         j                  j                  | «      rt        j                  | d«       	 t        j                  d| g«       y# t        j                  $ r" t        j                  d«        || |d«       Y Œ‚w xY w# t        j                  $ r t        j                  | «       ‚ w xY w)zSize is in MiB.z6Failed to create swapfile '%s' of size %sMB via %s: %sc                 óh  •— t         j                  d| ‰|«       |dk(  r
ddd|z  | g}n(|dk(  rddd| z  dd	|z  g}nt        j                  d
«      ‚	 t        j                  |d¬«       y # t        j                  $ r4}t         j	                  ‰| |||«       t        j                  | «       ‚ d }~ww xY w)Nz3Creating swapfile in '%s' on fstype '%s' using '%s'Ú	fallocatez-lz%sMÚddzif=/dev/zerozof=%szbs=1Mzcount=%sz:Missing dependency: 'dd' and 'fallocate' are not availableT)Úcapture)rC   rD   r	   ÚProcessExecutionErrorrp   r
   Údel_file)rv   r^   Ú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,Â,B1rB   ÚbtrfsÚtruncatez-sÚ0Úchattrz+CÚxfs)r[   é   rz   ry   z4fallocate swap creation failed, will attempt with ddi€  ÚmkswapN)r.   r/   Údirnamer
   Ú
ensure_dirÚget_mount_infor	   Úkernel_versionr|   rC   rp   r0   Úchmodr}   )rv   r^   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 Ã5E Ä2EÅEÅ*E/c                 ó  — t         j                  j                  | «      }t        |«      j	                  «       dk(  r;	 t        j                  «       d   }t        j                  |«       t        |||¬«      }t        t        |dz  «      «      }|st        j                  d«       yt        j                  d«      5  t        | |«       ddd«       | S # t        $ r t        j                  d«       Y yw xY w# 1 sw Y   | S xY w)	z�
    fname: full path string of filename to setup
    size: the size to create. set to "auto" for recommended
    maxsize: the maximum size
    ÚautorU   z)Not creating swap: failed to read meminfoN)rn   rm   rl   r   z'Not creating swap: suggested size was 0zSetting up swap file)r.   r/   r‹   r-   Úlowerr
   r_   ÚIOErrorrC   rD   rŒ   ru   rd   r   ÚTimedr‘   )rv   r^   rm   r�   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Ã2C3Ã6D c                 óÖ  — t        | t        «      st        j                  d«       y| j	                  dd«      }| j	                  dd«      }| j	                  dd«      }|r|st        j                  d«       yt        j                  j                  |«      r¤t        j                  j                  d	«      st        j                  d
|«       |S 	 t        j                  d	«      j                  «       D ]0  }|j                  |dz   «      sŒt        j                  d|«       |c S  t        j                  d|«       	 t        |t        «      r|dk7  rt        j                  |«      }t        |t        «      rt        j                  |«      }t!        |||¬«      S # t        $ r t        j                  d|«       |cY S w xY w# t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)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^   r   rm   zno need to setup swapz/proc/swapsz:swap file %s exists, but no /proc/swaps exists, being safeú zswap file %s already in usez+swap file %s exists, but not in /proc/swapsz.swap file %s exists. Error reading /proc/swapsr“   )rv   r^   rm   zfailed to setup swap: %s)rj   ÚdictrC   ÚwarningrF   rD   r.   r/   r0   r
   Úload_text_fileÚ
splitlinesr   Ú	Exceptionr-   Úhuman2bytesr˜   )Úswapcfgrv   r^   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 Ä;AF? Æ!F<Æ;F<Æ?	G(ÇG#Ç#G(c                  óB  — g } i }g }t         j                  j                  t        «      rrt	        j
                  t        «      j                  «       D ]H  }t        |v r|j                  |«       Œ|j                  «       }|sŒ0|||d   <   | j                  |«       ŒJ | ||fS )as  Parse /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        «      st        j                  d|«       Œ*t	        |d   «      }t        ||j                  |¬«      }t        |||«      r
|g|dd z   }	n|}	t        |	«      D ]!  \  }
}|€	||
   |	|
<   Œt	        |	|
   «      |	|
<   Œ# |	|t        |	«      d z  }	|j                  |	«       Œ» |S )a  Sanitize 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   ©rJ   rB   N)rj   ÚlistrC   r�   r-   rM   Údevice_name_to_devicerS   Ú	enumerateÚlenr¨   )r­   rP   r®   r¯   r°   Úupdated_linesr£   ÚstartÚsanitized_devnameÚupdated_lineÚindexÚtokens               r#   Úsanitize_mounts_configurationr½   y  sñ   € ð €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 }| ddd…   D ]M  }|d   �|d   |v r.t         j                  d|d   «       |j                  |d   «       Œ=|j                  |«       ŒO |ddd…   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.
    Nr   rB   r   z$Skipping nonexistent device named %s)rC   rD   r¨   )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  ‡	— t        j                  | «      }ddd|ddgg d¢fD ]~  Š	‰	d   }t        ||j                  |¬«      }t	        |||«      sŒ.t        t        |«      ‰	d<   t        ˆ	fd	„| D «       «      }|rt        j                  d
|«       Œn|j                  ‰	«       Œ€ |S )zAdd default mounts to the user provided mount configuration.

    Add them only if no other entry has the same device name
    rA   z/mntr“   r†   Ú2)r   Únoner   Úswr†   r†   r   r²   c              3   ó4   •K  — | ]  }|d    ‰d    k(  –— Œ y­w)r   N© )Ú.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ÚdeepcopyrM   r´   rS   r   r-   ÚanyrC   rD   r¨   )
r­   rÂ   rP   r®   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 �cg c]  }|dd |d   › dt         › �gz   |dd z   ‘Œ c}S c c}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   — t        d„ | D «       «      rt        j                  ddg«       yy)z1Call 'swapon -a' if any entry has a swap fs type.c              3   ó,   K  — | ]  }|d    dk(  –— Œ y­w)rV   r   NrÈ   )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}|rd}nYt        j                  «       j                  «       D �ch c]  }d|v r|d   ’Œ }}t        t	        |«      j                  |«      «      }|r2t        j                  ddg«       | rt        j                  ddg«       yyyc c}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   ¬Br!   ÚcfgÚargsc                 óX  — |j                   j                  «       }|rdnd}ddd|ddg}|j                  d|«      }|j                  dg «      }t        j	                  d	|«       t        «       \  }	}
}|j                  d
i «      }t        ||
|||«      }t        |||
||«      }t        |«      }t        |«      }t        |j                  di «      «      }|r|j                  |dddddg«       |st        j	                  d«       y|D �cg c]  }dj                  |«      ‘Œ }}|D �cg c]  }|d   j                  d«      sŒ|d   ‘Œ }}|D ]  }	 t        j                  |«       Œ |D �cg c]  }|j%                  dd«      ‘Œ }}|D �cg c]  }|j%                  dd«      ‘Œ }}|D �cg c]  }||vsŒd|› �‘Œ c}|D �cg c]  }||vsŒd|› �‘Œ c}z   }|	j'                  |«       ddj                  |	«      z  }t        j(                  t*        |«       |rt        j	                  d|«       nt        j	                  d«       t-        |«       t/        |t1        |«      |«       yc c}w c c}w # t         $ r t        j"                  t        d|«       Y �ŒJw xY wc c}w c c}w c c}w c c}w )z Handle the mounts configuration.z:defaults,nofail,x-systemd.after=cloud-init.service,_netdevzdefaults,nobootwaitNr“   r†   rÄ   Úmount_default_fieldsr­   zmounts configuration is %sr®   r   rÅ   rÆ   z No modifications to fstab neededú	rB   r8   z Failed to make '%s' config-mountr›   z- z+ z%s
ú
zChanges to fstab: %szNo changes to /etc/fstab made.)ÚdistrorÝ   rF   rC   rD   r¬   r½   rÒ   rÁ   r×   r¤   r¨   r;   r   r
   rŒ   r    ÚlogexcÚreplaceÚextendÚ
write_filer¦   rÜ   rë   rå   )r!   rì   r°   rí   rÝ   rÂ   Úhardcoded_defaultsr¯   r­   r©   rP   rª   r®   Úupdated_cfgÚswapfilerÖ   Ú	cfg_linesÚdrß   ÚnÚsaddsÚsdropsÚdropÚaddÚsopsÚcontentss                             r#   Úhandler    s©  € ð —<‘<×,Ñ,Ó.€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ùÚ:ùâ@ùò DsH   ÄI#Ä%I(Ä?I(ÅI-Å)JÆJÆ'	J"Æ1J"Æ>	J'ÇJ'É-$JÊJ)N)NNN)NN)8Ú__doc__rÍ   Úloggingrg   r.   r'   Útypingr   r   r   r   r   Ú	cloudinitr   r	   r
   Úcloudinit.cloudr   Úcloudinit.configr   Úcloudinit.config.schemar   Úcloudinit.settingsr   r   Ú__annotations__rG   r)   r¦   r§   rk   re   Ú	getLoggerÚ__name__rC   r$   r*   r6   r?   rM   r-   rå   rS   ru   r‘   r˜   r¤   r¬   r½   rÁ   rÒ   r×   rÜ   rë   r³   r  rÈ   r%   r#   ú<module>r     s¬  ðò 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ð2E4�ð E4˜6ð E4¨%ð E4°tð E4Àô E4r%   