o
    3'f?                     @   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rd 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 rd| jv rt|| j}|d dd }	| jdd}
|
d urE|
 dkrtjdddd | |
D ]c}z5t	d| z	t||	|}W n ty   t	d||
 Y W qw t||}t	d| || W  n, ty3 } z|jtjkr) W Y d }~qd }~w tjyD   tt	d| Y qw t|d krNd	S d|d v r|d d }d	}| jD ]}||rl|} nq`|sx| | 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rt	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 datar   )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MountFailedErrorlenr   
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   re      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   rd   )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   strre   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   rq   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[   rd   )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splitrd   rc   rU   )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   rh   )currt   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   re     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 )zCheck 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[   key)r   log_deprecatedrr   r   r   r   	ds_detect  s@   
zDataSourceNoCloudNet.ds_detectN)r   r   r   r   r   re   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@   rg   ry   rz   r{   networkprintr   r   r   r   <module>   s:   

  
	

!(
E