o
    m[h³?  ã                   @   s:  d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 d dl
mZ e e¡ZG dd„ dejƒZddd„Zdd	d
„Zddd„Zdd„ ZG dd„ deƒZeejffeejejffgZdd„ Zedkr›d dlmZ ejejd� ed Ze	 e¡\Z Z!Z"Z#e$de › �ƒ e$de!› �ƒ e$de"› �ƒ e$de#› �ƒ dS dS )é    N)Úpartial)ÚdmiÚ	lifecycleÚsourcesÚutil)Úenic                       sv   e Zd ZdZdd„ Z‡ fdd„Zdd„ Zdd	„ Zed
d„ ƒZ	de
fdd„Zdd„ Zdd„ Zdd„ Zedd„ ƒZ‡  ZS )ÚDataSourceNoCloudÚNoCloudc                 C   sV   t j | |||¡ d | _tj |jd¡tj |jd¡g| _d | _d| _	d | _
d | _d S )NÚnocloudúnocloud-net)ú/úfile://)r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚ	seed_dirsÚsupported_seed_startsÚ_network_configÚ_network_eni©ÚselfÚsys_cfgÚdistroÚpaths© r   úE/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceNoCloud.pyr      s   þ
zDataSourceNoCloud.__init__c                    sF   t ƒ  ¡ d | jrd| j› d�nd | jtjkr d| j› d� S d S )z@append seed and dsmode info when they contain non-default valuesú z[seed=ú]Ú z[dsmode=)ÚsuperÚ__str__r   Údsmoder   ÚDSMODE_NETWORK©r   ©Ú	__class__r   r   r$   &   s   ÿþÿüÿúÿzDataSourceNoCloud.__str__c                 C   s|   t  d¡}| t  d¡¡ t  d| ¡  ¡}| t  d| ¡  ¡¡ | t  d| ¡¡ tt|ƒt|ƒ@ ƒ}|jdd� |S )Nz	TYPE=vfatzTYPE=iso9660zLABEL=%szLABEL_FATBOOT=%sT)Úreverse)r   Úfind_devs_withÚextendÚupperÚlowerÚlistÚsetÚsort)r   ÚlabelÚfslistÚ
label_listÚdevlistr   r   r   Ú_get_devices3   s   
zDataSourceNoCloud._get_devicesc                 C   sÜ  d| j dœ}g }i ddd dœ}zi }t d¡}|r*t||ƒr*| d¡ t|d|iƒ}W n ty;   t t	d¡ Y d	S w zi }t|ƒrO| d
¡ t|d|iƒ}W n ty`   t t	d¡ Y d	S w ddgddgdœ}| j
D ]'}ztj|fi |¤Ž}| |¡ t	 d|¡ t||ƒ}W  n	 ty”   Y qmw | j d¡r©| d¡ | jd |d d< d| jv r¾d| jv r¾t|| jƒ}| d¡ dd„ }	| j dd¡}
|
d u�rE|
 ¡ dkrÜtjdddd� |  |
¡D ]c}z5t	 d|¡ z	t ||	|¡}W n t�y   t	 d||
¡ Y W qáw t||ƒ}t	 d|¡ | |¡ W  n, t�y3 } z|jtjk�r)‚ W Y d }~qád }~w tj�yD   t t	d|¡ Y qáw |�sJd	S d|d v �r¢|d d }d	}| jD ]}| |¡�rh|} n�q\|�st|  |¡ d	S t |¡}tj|d d �\}}}}t	 d!|¡ t |d |g¡|d< ||d< ||d< | |¡ t |d |g¡|d< |   |d  d"¡g¡| _ | j t!j"k�rÊt	 d#| | j ¡ d	S d$ #|¡| _$|d | _%|d | _&|d | _'|d | _(|d  d%¡| _)d&S )'Nr
   )úinstance-idr%   r"   )ú	meta-dataú	user-dataúvendor-dataúnetwork-configúsystem-serial-numberr   r8   zUnable to parse dmi dataFÚcmdlinez!Unable to parse command line datar9   r:   r;   )ÚrequiredÚoptionalzUsing seeded data from %sÚseedfromÚds_config_seedfromÚ	ds_configc                 S   s   t j| fi |¤ŽS ©N)r   Úpathprefix2dict)ÚmpÚdatar   r   r   Ú_pp2d_callback€   s   z3DataSourceNoCloud._get_data.<locals>._pp2d_callbackÚfs_labelÚcidatazCustom fs_label keysú24.3z(This key isn't supported by ds-identify.©Ú
deprecatedÚdeprecated_versionÚextra_messagezAttempting to use data from %sz)device %s with label=%s not a valid seed.zUsing data from %sz(Failed to mount %s when looking for data)ÚtimeoutzUsing seeded cache data from %sr%   z&%s: not claiming datasource, dsmode=%sú,znetwork-interfacesT)*r%   r   Úread_dmi_dataÚload_cmdline_dataÚappendÚ_merge_new_seedÚ	Exceptionr   ÚlogexcÚLOGr   rD   ÚdebugÚ
ValueErrorÚds_cfgÚgetr.   r   Ú	deprecater6   Úmount_cbÚwarningÚOSErrorÚerrnoÚENOENTÚMountFailedErrorr   Ú
startswithÚ_log_unusable_seedfromÚsub_dmi_varsÚread_seededÚmergemanydictÚ_determine_dsmoder   ÚDSMODE_DISABLEDr   r   ÚmetadataÚuserdata_rawÚvendordata_rawr   r   )r   ÚdefaultsÚfoundÚmydataÚmdÚserialÚpp2d_kwargsr   ÚseededrG   r2   ÚdevÚer@   Ú	seedfoundÚprotoÚmd_seedÚudÚvdÚ_r   r   r   Ú	_get_data?   sþ   þü

€þ
€þþ


ÿ


ýÿýú

ÿ€ÿÿ
þ


ÿ

ÿÿÿ



zDataSourceNoCloud._get_datac                 C   s   | j st ¡ r	dnd| _ | j S )NÚlxdr
   )Ú_platform_typer   Úis_lxdr'   r   r   r   Úplatform_typeã   s   zDataSourceNoCloud.platform_typer@   c                 C   ó   t  d| | j|¡ dS )ú!Stage-specific level and message.zN%s only uses seeds starting with %s - will try to use %s in the network stage.N)rW   Úinfor   ©r   r@   r   r   r   rd   é   s   ûz(DataSourceNoCloud._log_unusable_seedfromc                 C   s   t jS )z=Return unknown when 'cloud-name' key is absent from metadata.)r   ÚMETADATA_UNKNOWNr'   r   r   r   Ú_get_cloud_nameó   s   z!DataSourceNoCloud._get_cloud_namec                 C   s$   | j  d¡r	d}nd}d|| j f S )z/Return the subplatform metadata source details.z/devzconfig-diskzseed-dirz%s (%s))r   rc   )r   Úsubplatform_typer   r   r   Ú_get_subplatform÷   s   z"DataSourceNoCloud._get_subplatformc                 C   s:   |   ¡ }|sd S t| d| jgƒ}t|d�}|sd S ||kS )Nr   )Údirs)Úget_instance_idÚgetattrr   Ú_quick_read_instance_id)r   r   Úcurrentr‰   Úquick_idr   r   r   Úcheck_instance_idÿ   s   
z#DataSourceNoCloud.check_instance_idc                 C   s8   | j d u r| jd urtjdddd� t | j¡| _ | j S )Nz$Eni network configuration in NoCloudrJ   z,You can use network v1 or network v2 insteadrK   )r   r   r   r\   r   Úconvert_eni_datar'   r   r   r   Únetwork_config  s   

üz DataSourceNoCloud.network_config)Ú__name__Ú
__module__Ú__qualname__Údsnamer   r$   r6   r|   Úpropertyr€   Ústrrd   r†   rˆ   r�   r‘   Ú__classcell__r   r   r(   r   r      s     %

r   c              	   C   s’   | d u rg } d}i }t |ƒr||v r|| S | D ].}|d u rqztj|dgd�}t |d ¡}|r<||v r<|| W   S W q tyF   Y qw d S )Nr7   r8   )r>   )rR   r   rD   Ú	load_yamlrY   )r‰   Úiid_keyÚfillÚdrF   rp   r   r   r   rŒ     s&   €ÿrŒ   c                 C   s�   dt jfdt jfg}|D ]9\}}t|| |ƒsqd| v r dS |  d¡}|r?| d¡r2t j| d<  dS | d¡r<t j| d<  dS || d<  dS dS )	Nz
ds=nocloudzds=nocloud-netr%   Tr@   ©zhttp://zhttps://zftp://zftps://)r   r   F)r   ÚDSMODE_LOCALr&   Úparse_cmdline_datar[   rc   )r›   r=   ÚpairsÚidstrr%   r@   r   r   r   rR   4  s*   þ
ÿ

û
þrR   c              	   C   sô   |d u rt  ¡ }d| }d|  |v sd|  |v sdS d}| ¡ D ]}| | ¡r-| dd¡}q |d  d¡}t|ƒdkrB|dd … }nd}d	d
ddœ}|D ]+}|dkrSqLz
| dd¡\}	}
W n tyj   |}	d }
Y nw |	|v rs||	 }	|
||	< qLdS )Nz %s z %s;Fr"   ú=é   ú;r   zlocal-hostnamer7   r@   )ÚhÚiÚsT)r   Úget_cmdlineÚsplitrc   ÚlenrU   )Úds_idr›   r=   ÚarglineÚtokÚtmpÚkvpairsÚs2lÚitemÚkÚvr   r   r   rŸ   U  s8   
€þ
rŸ   c                 C   s�   |   ¡ }| di ¡}t|d tƒst |d ¡}t | d |g¡|d< | d¡r2t | d¡¡|d< d|v r<|d |d< d|v rF|d |d< |S )Nr8   r;   r9   r:   )Úcopyr[   Ú
isinstanceÚdictr   r™   rg   )Úcurrs   ÚretÚnewmdr   r   r   rT   }  s   
rT   c                   @   s*   e Zd Zdd„ Zdefdd„Zdd„ ZdS )	ÚDataSourceNoCloudNetc                 C   s   t  | |||¡ d| _d S )Nr�   )r   r   r   r   r   r   r   r   �  s   
zDataSourceNoCloudNet.__init__r@   c                 C   r�   )r‚   z6%s only uses seeds starting with %s - %s is not valid.N)rW   r^   r   r„   r   r   r   rd   ™  s   üz+DataSourceNoCloudNet._log_unusable_seedfromc                 C   s    t tjdddd�}dt ¡ kr|ƒ  dS t t d¡pd¡ ¡ }|| j	 ¡ dfv r8t
 d	| ¡ |dkr6|ƒ  dS | j d
i ¡ di ¡ d¡rNt
 d| ¡ dS dS )zùCheck dmi and kernel command line for dsname

        NoCloud historically used "nocloud-net" as its dsname
        for network timeframe (DEP_NETWORK), which supports http(s) urls.
        For backwards compatiblity, check for that dsname.
        z!The 'nocloud-net' datasource namez24.1zgUse 'nocloud' instead, which uses the seedfrom protocolscheme (http// or file://) to decide how to run.rK   r   Tr<   r"   zJMachine is configured by dmi serial number to run on single datasource %s.Ú
datasourcer	   r@   zMMachine is configured by system configuration to run on single datasource %s.F)r   r   r\   r   Úparse_cmdlineÚparse_cmdline_or_dmir   rQ   r.   r•   rW   rX   r   r[   )r   Úlog_deprecatedrq   r   r   r   Ú	ds_detect¢  s@   û
ÿþýýýzDataSourceNoCloudNet.ds_detectN)r’   r“   r”   r   r—   rd   r¿   r   r   r   r   rº   �  s    		rº   c                 C   s   t  | t¡S rC   )r   Úlist_from_dependsÚdatasources)Údependsr   r   r   Úget_datasource_listÚ  s   rÃ   Ú__main__)Úargv)Úlevelr£   zseeded: zud: zvd: z	network: rC   )%r`   Úloggingr   Ú	functoolsr   Ú	cloudinitr   r   r   r   Úcloudinit.netr   Ú	getLoggerr’   rW   r   r   rŒ   rR   rŸ   rT   rº   ÚDEP_FILESYSTEMÚDEP_NETWORKrÁ   rÃ   ÚsysrÅ   ÚbasicConfigÚDEBUGr@   rf   rx   ry   rz   ÚnetworkÚprintr   r   r   r   Ú<module>   s:   

  
	

!(
Eþ÷