Ë
    x[hê,  ã                   óF  — d dl Z d dlZd dlmZmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ  e j                   e«      ZdZdeiZd	Zd
ZdZ ed„ eD «       «      Z G d„ dej4                  ej6                  «      Zd„ Zd„ Zdd„Zd„ Z dd„Z!eZ"eejF                  ffgZ$d„ Z%y)é    N)Ú	lifecycleÚsourcesÚsubpÚutil)Ú
EventScopeÚ	EventType)Úeni)Úget_ibm_platform)Ú	openstackziid-dsconfigdriveúinstance-id)ÚvfatÚiso9660)zconfig-2zCONFIG-2)ÚsrÚcdc              #   óJ   K  — | ]  }t        d «      D ]  }d|›|›�–— Œ Œ y­w)é   z/dev/N)Úrange)Ú.0ÚzÚis      úI/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceConfigDrive.pyú	<genexpr>r      s&   è ø€ ÒE˜a¼EÀ!»HÒE±q‘A‘qÔÐEÐÑEùs   ‚!#c                   óÎ   ‡ — e Zd ZdZej
                  ej                  ej                  ej                  ej                  hiZˆ fd„Zd„ Zd„ Zd„ Zed„ «       Zed„ «       Zd„ Zˆ xZS )	ÚDataSourceConfigDriveÚConfigDrivec                 ó  •— t         t        | �  |||«       d | _        t        j
                  j                  |j                  d«      | _        d | _        d | _	        d | _
        t        j                  | _        d | _        d | _        i | _        y )NÚconfig_drive)Úsuperr   Ú__init__ÚsourceÚosÚpathÚjoinÚseed_dirÚversionÚec2_metadataÚ_network_configr   ÚUNSETÚnetwork_jsonÚnetwork_eniÚ
known_macsÚfiles)ÚselfÚsys_cfgÚdistroÚpathsÚ	__class__s       €r   r   zDataSourceConfigDrive.__init__.   sq   ø€ ÜÔ# TÑ3°G¸VÀUÔKØˆŒÜŸ™Ÿ™ U§^¡^°^ÓDˆŒØˆŒØ ˆÔØ#ˆÔÜ#ŸM™MˆÔØˆÔØˆŒØˆ�
ó    c                 ó¦   — t         j                  j                  | «      }|›d| j                  ›d| j                  ›d�}|d| j
                  z  z  }|S )Nz [z,ver=ú]z[source=%s])r   Ú
DataSourceÚ__str__Údsmoder%   r    )r-   ÚrootÚmstrs      r   r6   zDataSourceConfigDrive.__str__:   sD   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÚ#'¨¯«°d·l³lÐCˆØ� §¡Ñ-Ñ-ˆØˆr2   c                 óÖ  — d }i }i }| j                   dfD ]1  }t        j                  j                  |«      sŒ#	 t	        |«      }|} n |sx| j                  j                  d«      }t        |¬«      D ]N  }d }t        j                  «       r|j                  d«      rd}	 t        j                  |t        |¬«      }|}|sŒN n |sy	|j                  d
i «      }t        j$                  |t&        g«      }| j)                  |j                  d«      | j*                  j                  d«      |d   dk(  rt,        j.                  nd g«      | _        | j0                  t,        j2                  k(  ry	t5        | j6                  «      }|d   }	||	k7  r3t9        || j:                  | j0                  t,        j.                  k(  ¬«       | j0                  t,        j.                  k(  r"t        j=                  d| | j0                  «       y	|| _        || _         |j                  d«      | _!        |j                  d«      | _"        |d   | _#        | jH                  jK                  |j                  di «      «       |j                  d«      }
	 t-        jL                  |
«      | _'        |j                  d«      }	 t-        jL                  |«      | _*        |j                  d«      | _+        |j                  d«      | _,        y# t
        j                  $ r t        j                  t        d|«       Y �Œw xY w# t
        j                  $ r Y �Œ}t        j                   $ r Y �Œ’t
        j"                  $ r t        j                  t        d|«       Y �ŒÂw xY w# tP        $ r(}t        jS                  d|«       d | _'        Y d }~�Œd }~ww xY w# tP        $ r(}t        jS                  d|«       d | _*        Y d }~�Œ!d }~ww xY w)Nz/config-drivez#Failed reading config drive from %sÚdatasource_list)Údslistz/dev/cdÚcd9660)ÚmtypezBroken config drive: %sFÚmetadatar7   r%   é   r   )r/   Únetworkz&%s: not claiming datasource, dsmode=%szec2-metadataÚuserdatar,   Ú
vendordataz"Invalid content in vendor-data: %sÚvendordata2z#Invalid content in vendor-data2: %sÚnetwork_configÚnetworkdataT)-r$   r!   r"   ÚisdirÚread_config_driver   ÚNonReadabler   ÚlogexcÚLOGr.   ÚgetÚfind_candidate_devsÚis_BSDÚ
startswithÚmount_cbÚMountFailedErrorÚBrokenMetadataÚmergemanydictÚDEFAULT_METADATAÚ_determine_dsmodeÚds_cfgr   ÚDSMODE_PASSr7   ÚDSMODE_DISABLEDÚget_previous_iidr0   Úon_first_bootr/   Údebugr    r?   r&   Úuserdata_rawr%   r,   ÚupdateÚconvert_vendordataÚvendordata_rawÚ
ValueErrorÚwarningÚvendordata2_rawr*   r)   )r-   ÚfoundÚmdÚresultsÚsdirr<   Údevr>   Úprev_iidÚcur_iidÚvdÚeÚvd2s                r   Ú	_get_datazDataSourceConfigDrive._get_data@   so  € ØˆØˆØˆØ—]‘] OÐ4ò 	NˆDÜ—7‘7—=‘= Ô&ØðNÜ+¨DÓ1�Ø�Ùð	Nñ Ø—\‘\×%Ñ%Ð&7Ó8ˆFÜ*°&Ô9ò �Ø�Ü—;‘;”=Ø—~‘~ iÔ0Ø (˜ð
EÜ"Ÿm™mØÔ.°eô�Gð  �Eò Ùð#ñ$ Øà�[‰[˜ RÓ(ˆÜ×Ñ Ô%5Ð 6Ó7ˆà×,Ñ,à—‘˜HÓ%Ø—‘—‘ Ó)Ø'.¨yÑ'9¸QÒ'>”×#Ò#ÀDðó
ˆŒð �;‰;œ'×1Ñ1Ò1Øä# D§J¡JÓ/ˆØ�]Ñ#ˆØ�wÒô
 ØØ—{‘{ØŸ™¤w×':Ñ':Ñ:õð �;‰;œ'×-Ñ-Ò-Ü�I‰IØ8¸$ÀÇÁôð àˆŒØˆŒØ#ŸK™K¨Ó7ˆÔØ#ŸK™K¨
Ó3ˆÔØ˜yÑ)ˆŒØ�
‰
×Ñ˜'Ÿ+™+ g¨rÓ2Ô3à�[‰[˜Ó&ˆð	'Ü")×"<Ñ"<¸RÓ"@ˆDÔð
 �k‰k˜-Ó(ˆð	(Ü#*×#=Ñ#=¸cÓ#BˆDÔ ð #Ÿ;™;Ð'7Ó8ˆÔØ#ŸK™K¨Ó6ˆÔØøôo ×(Ñ(ò NÜ—‘œCÐ!FÈ×MðNûô !×,Ñ,ò ÚÜ×,Ñ,ò ÚÜ ×/Ñ/ò EÜ—K‘K¤Ð%>À×DðEûôh ò 	'Ü�K‰KÐ<¸aÔ@Ø"&ˆD×Òûð	'ûô ò 	(Ü�K‰KÐ=¸qÔAØ#'ˆD× Ò ûð	(ús_   ¹K/ÂL$É<N Ê(N7 Ë/.L!Ì L!Ì$N Ì:N Í-N Í?N Î	N4ÎN/Î/N4Î7	O(Ï O#Ï#O(c                 óH   — t        j                  | j                  «       «      S ©N)r   Úinstance_id_matches_system_uuidÚget_instance_id)r-   r.   s     r   Úcheck_instance_idz'DataSourceConfigDrive.check_instance_id¤   s   € ä×6Ñ6°t×7KÑ7KÓ7MÓNÐNr2   c                 ó  — | j                   €í| j                  d t        j                  fvrQt        j                  d«       t        j                  | j                  | j                  ¬«      | _         | j                   S | j                  �]t        j                  | j                  «      | _         t        j                  d«       t        j                  ddd¬«       | j                   S t        j                  d«       | j                   S )	Nz(network config provided via network_json)r+   z.network config provided via converted eni dataz(Eni network configuration in ConfigDrivez24.3z<You can use openstack's network configuration format instead)Ú
deprecatedÚdeprecated_versionÚextra_messagez"no network configuration available)r'   r)   r   r(   rK   r[   r   Úconvert_net_jsonr+   r*   r	   Úconvert_eni_datar   Ú	deprecate©r-   s    r   rE   z$DataSourceConfigDrive.network_config¨   sØ   € à×ÑÐ'Ø× Ñ ¨¬w¯}©}Ð(=Ñ=Ü—	‘	ÐDÔEÜ'0×'AÑ'AØ×%Ñ%°$·/±/ô(�Ô$ð  ×#Ñ#Ð#ð ×!Ñ!Ð-Ü'*×';Ñ';¸D×<LÑ<LÓ'M�Ô$Ü—	‘	ÐJÔKÜ×#Ñ#ØIØ'-ð7õ	ð ×#Ñ#Ð#ô —	‘	Ð>Ô?Ø×#Ñ#Ð#r2   c                  ó   — y)Nr   © rz   s    r   ÚplatformzDataSourceConfigDrive.platform¿   s   € àr2   c                 óf   — | j                   j                  d«      rd}nd}|›d| j                   ›d�S )z/Return the subplatform metadata source details.z/devzconfig-diskzseed-dirz (ú))r    rO   )r-   Úsubplatform_types     r   Ú_get_subplatformz&DataSourceConfigDrive._get_subplatformÃ   s/   € à�;‰;×!Ñ! &Ô)Ø,Ñà)ÐÚ,¨d¯k«kÐ:Ð:r2   )Ú__name__Ú
__module__Ú__qualname__Údsnamer   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚHOTPLUGÚsupported_update_eventsr   r6   rm   rr   ÚpropertyrE   r}   r�   Ú__classcell__)r1   s   @r   r   r   !   s†   ø„ à€Fð 	×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!Ø×Ñð	
ðÐô
òòbòHOð ñ$ó ð$ð, ñó ðö;r2   r   c                 ó  — t        j                  | «      }|j                  g i f|j                  g i fg}g }|D ]  \  }}}	  ||i |¤Žc S  |d   ‚# t         j                  $ r}|j                  |«       Y d }~ŒAd }~ww xY w)Néÿÿÿÿ)r   ÚConfigDriveReaderÚread_v2Úread_v1rI   Úappend)Ú
source_dirÚreaderÚfindersÚexcpsÚfunctorÚargsÚkwargsrk   s           r   rH   rH   Ì   s—   € Ü×(Ñ(¨Ó4€Fà	�‰˜˜RÐ Ø	�‰˜˜RÐ ð€Gð €EØ!(ò Ñˆ��vð	Ù˜DÐ+ FÑ+Ò+ðð
 �‰)€Oøô ×$Ñ$ò 	Ø�L‰L˜�O‰Oûð	ús   Á AÁA>Á#A9Á9A>c                 óÈ   — t         j                  j                  | j                  d«      d«      }	 t	        j
                  |«      j                  d«      S # t        $ r Y y w xY w)NÚdatar   ú
)r!   r"   r#   Ú	get_cpathr   Úload_text_fileÚrstripÚIOError)r0   Úfnames     r   rY   rY   Û   sT   € ô �G‰G�L‰L˜Ÿ™¨Ó0°-Ó@€EðÜ×"Ñ" 5Ó)×0Ñ0°Ó6Ð6øÜò Ùðús   ±#A Á	A!Á A!c                 ó(  — t        | t        «      st        dt        | «      z  «      ‚|rO| j	                  dd«      }|r;|r9t
        j                  d«       |j                  t        j                  |«      «       t        | j	                  d«      «       y)zDPerforms any first-boot actions using data read from a config-drive.z/Config-drive data expected to be a dict; not %srE   Ú z-Updating network interfaces from config driver,   N)Ú
isinstanceÚdictÚ	TypeErrorÚtyperL   rK   ra   Úapply_network_configr	   rx   Úwrite_injected_files)rœ   r/   rA   Únet_confs       r   rZ   rZ   æ   sw   € ä�dœDÔ!ÜØ=ÄÀdÃÑLó
ð 	
ñ Ø—8‘8Ð,¨bÓ1ˆÙ™Ü�K‰KÐGÔHØ×'Ñ'¬×(<Ñ(<¸XÓ(FÔGÜ˜Ÿ™ 'Ó*Õ+r2   c                 ób  — | rƒt         j                  dt        | «      «       | j                  «       D ]P  \  }}|j	                  t
        j                  «      st
        j                  |z   }	 t        j                  ||d¬«       ŒR y y # t        $ r t        j                  t         d|«       Y Œ{w xY w)NzWriting %s injected filesi°  )ÚmodezFailed writing file: %s)rK   r[   ÚlenÚitemsrO   r!   Úsepr   Ú
write_filer¡   rJ   )r,   ÚfilenameÚcontents      r   rª   rª   ô   s“   € ÙÜ�	‰	Ð-¬s°5«zÔ:Ø!&§¡£ò 	FÑˆH�gØ×&Ñ&¤r§v¡vÔ.ÜŸ6™6 HÑ,�ðFÜ—‘ ¨'¸Ö>ñ		Fð øô ò FÜ—‘œCÐ!:¸HÖEðFús   Á+BÂ$B.Â-B.c                 óä  — |€g }| r"t         D ]  }	 t        j                  |¬«       Œ g }t
        D ])  }|j                  t        j                  d|z  «      «       Œ+ g }t        D ])  }|j                  t        j                  d|z  «      «       Œ+ |j                  d¬«       |j                  d¬«       ||D �cg c]	  }||vsŒ|‘Œ c}z   }|D �cg c]  }||v st        j                  |«      rŒ|‘Œ  }	}t        j                  d|	|«       |	r=d|v r9t        «       \  }
}||	v r(|	j                  |«       t        j                  d||
«       |	S # t        j                  $ r Y �ŒWw xY wc c}w c c}w )	a  Return a list of devices that may contain the config drive.

    The returned list is sorted by search order where the first item has
    should be searched first (highest priority)

    config drive v1:
       Per documentation, this is "associated as the last available disk on the
       instance", and should be VFAT.
       Currently, we do not restrict search list to "last available disk"

    config drive v2:
       Disk should be:
        * either vfat or iso9660 formatted
        * labeled with 'config-2' or 'CONFIG-2'
    )r"   zTYPE=%szLABEL=%sT)Úreversezdevices=%s dslist=%sÚIBMCloudz5IBMCloud device '%s' (%s) removed from candidate list)ÚOPTICAL_DEVICESr   Úfind_devs_withr   ÚProcessExecutionErrorÚFS_TYPESÚextendÚLABEL_TYPESÚsortÚis_partitionrK   r[   r
   Úremove)Úprobe_opticalr<   ÚdeviceÚ	by_fstypeÚfs_typeÚby_labelÚlabelÚdÚ
candidatesÚdevicesÚibm_platformÚibm_paths               r   rM   rM      s‰  € ð  €~Øˆñ Ü%ò 	ˆFðÜ×#Ñ#¨Ö0ð	ð €IÜò EˆØ×Ñœ×,Ñ,¨Y¸'Ñ-BÓCÕDðEð €HÜò CˆØ�‰œ×+Ñ+¨J¸%Ñ,@ÓAÕBðCð
 ‡N�N˜4€NÔ Ø‡M�M˜$€MÔð ¨	ÖG 1°Q¸hÒ5FšQÒGÑG€Jð
 öØ  h¡´d×6GÑ6GÈÕ6JŠð€Gð ô ‡I�IÐ$ g¨vÔ6Ù�: Ñ'ä!1Ó!3Ñˆ�hØ�wÑØ�N‰N˜8Ô$Ü�I‰IØGØØôð €NøôM ×-Ñ-ò Úðüò$ Hùòs)   ‘EÂ:	E(ÃE(ÃE-Ã0E-ÅE%Å$E%c                 ó6   — t        j                  | t        «      S ro   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listrÏ   K  s   € Ü×$Ñ$ W¬kÓ:Ð:r2   )NT)TN)&Úloggingr!   Ú	cloudinitr   r   r   r   Úcloudinit.eventr   r   Úcloudinit.netr	   Ú$cloudinit.sources.DataSourceIBMCloudr
   Úcloudinit.sources.helpersr   Ú	getLoggerr‚   rK   ÚDEFAULT_IIDrT   rº   r¼   ÚPOSSIBLE_MOUNTSÚtupler·   ÚSourceMixinr5   r   rH   rY   rZ   rª   rM   ÚDataSourceConfigDriveNetÚDEP_FILESYSTEMrÍ   rÏ   r|   r2   r   ú<module>rÝ      sÇ   ðó Û 	ç 4Ó 4ß 1Ý Ý AÝ /à€g×Ñ˜Ó!€ð "€à�;ðÐ ð €Ø&€Ø€ÙÙE ?ÔEó€ô
h;˜I×1Ñ1°7×3EÑ3Eô h;òVòó,ò	Fó>ðD 1Ð ð ˜W×3Ñ3Ð5Ð6ð€ó;r2   