o
    Mi>                     @   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r6| |
D ]b}z4t	d| z	t||	|}W n ty   t	d||
 Y W qw t||}t	d| || W  n, ty$ } z|jtjkr W Y d }~qd }~w tjy5   tt	d| Y qw |s;d	S d|d v r|d d }d	}| jD ]}||rY|} nqM|se| | 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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getr6   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)rR   infor   r   r@   r   r   r   r^      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   r]   )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 NoCloudz24.3z,You can use network v1 or network v2 instead
deprecateddeprecated_versionextra_message)r   r   r   	deprecater   convert_eni_datar'   r   r   r   network_config  s   

z DataSourceNoCloud.network_config)__name__
__module____qualname__dsnamer   r$   r6   rv   propertyrz   strr^   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>   )rM   r   rD   	load_yamlrT   )r   iid_keyfilldrF   rj   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_datarV   r]   )r   r=   pairsidstrr%   r@   r   r   r   rM   .  s*   



rM   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splitr]   lenrP   )ds_idr   r=   arglinetoktmpkvpairss2litemkvr   r   r   r   O  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:   )copyrV   
isinstancedictr   r   ra   )currm   retnewmdr   r   r   rO   w  s   
rO   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)rR   rX   r   r~   r   r   r   r^     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.r   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   rL   r.   r   rR   rS   r   rV   )r   log_deprecatedrk   r   r   r   	ds_detect  s@   
zDataSourceNoCloudNet.ds_detectN)r   r   r   r   r   r^   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   )%rZ   loggingr   	functoolsr   	cloudinitr   r   r   r   cloudinit.netr   	getLoggerr   rR   r   r   r   rM   r   rO   r   DEP_FILESYSTEMDEP_NETWORKr   r   sysr   basicConfigDEBUGr@   r`   rr   rs   rt   networkprintr   r   r   r   <module>   s:   

  


!(
E