o
    w7e'4                     @   s   d dl Z d dlZd dlmZ d dlmZ d dl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dS )    N)dmi)log)sourcesutil)enic                   @   s`   e Zd ZdZdd Zdd Zdd Zdd	 Zed
d Z	dd Z
dd Zdd Zedd ZdS )DataSourceNoCloudNoCloudc                 C   sJ   t j| ||| d | _tj|jdtj|jdg| _d | _d| _	d S )Nnocloudnocloud-net)/file://)
r   
DataSource__init__seedospathjoinseed_dir	seed_dirssupported_seed_startsselfsys_cfgdistropaths r   E/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceNoCloud.pyr      s   
zDataSourceNoCloud.__init__c                 C   s   t j| }d|| j| jf S )Nz%s [seed=%s][dsmode=%s])r   r   __str__r   dsmode)r   rootr   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_devices(   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 t|dkr?d	S d|d v r|d d }d	}| jD ]}||r]|} nqQ|skt	d||  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    )	meta-data	user-datavendor-datanetwork-configzsystem-serial-numberr   r/   zUnable to parse dmi dataFcmdlinez!Unable to parse command line datar0   r1   r2   )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_callbacku   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 datar   z Seed from %s not supported by %s)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   r:   debug
ValueErrords_cfggetr,   mount_cbwarningOSErrorerrnoENOENTMountFailedErrorlenr   
startswithsub_dmi_varsread_seededmergemanydict_determine_dsmoder   DSMODE_DISABLEDr   r   metadatauserdata_rawvendordata_raw_network_config_network_eni)r   defaultsfoundmydatamdserialpp2d_kwargsr   seededr=   r(   dever6   	seedfoundprotomd_seedudvdr   r   r   	_get_data4   s   



















zDataSourceNoCloud._get_datac                 C   s.   t | dsd | _| jst rdnd| _| jS )N_platform_typelxdr	   )hasattrrn   r   is_lxdr   r   r   r   platform_type   s
   
zDataSourceNoCloud.platform_typec                 C   s   t jS )z=Return unknown when 'cloud-name' key is absent from metadata.)r   METADATA_UNKNOWNrr   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   rT   )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   currentrx   quick_idr   r   r   check_instance_id   s   
z#DataSourceNoCloud.check_instance_idc                 C   s(   | j d u r| jd urt| j| _ | j S r9   )r]   r^   r   convert_eni_datarr   r   r   r   network_config   s   

z DataSourceNoCloud.network_configN)__name__
__module____qualname__dsnamer   r   r,   rm   propertyrs   ru   rw   r~   r   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 )Nr-   r/   )r4   )rC   r   r:   	load_yamlrJ   )rx   iid_keyfilldr<   rb   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   Tr6   zhttp://zhttps://)r   r   F)r   DSMODE_LOCALDSMODE_NETWORKparse_cmdline_datarL   rT   )r   r3   pairsidstrr   r6   r   r   r   rC     s&   




rC   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-hostnamer-   r6   )hisT)r   get_cmdlinesplitrT   rS   rF   )ds_idr   r3   arglinetoktmpkvpairss2litemkvr   r   r   r   4  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 )Nr/   r2   r0   r1   )copyrL   
isinstancedictr   r   rW   )curre   retnewmdr   r   r   rE   \  s   
rE   c                   @   s   e Zd Zdd Zdd ZdS )DataSourceNoCloudNetc                 C   s   t | ||| d| _d S )Nr   )r   r   r   r   r   r   r   r   o  s   
zDataSourceNoCloudNet.__init__c                 C   s   dt  kS )a  NoCloud requires "nocloud-net" as the way to specify
        seeding from an http(s) address. This diverges from all other
        datasources in that it does a kernel commandline match on something
        other than the datasource dsname for only DEP_NETWORK.
        r
   )r   parse_cmdlinerr   r   r   r   	ds_detects  s   zDataSourceNoCloudNet.ds_detectN)r   r   r   r   r   r   r   r   r   r   n  s    r   c                 C   s   t | tS r9   )r   list_from_dependsdatasources)dependsr   r   r   get_datasource_list  s   r   r9   )rP   r   	cloudinitr   r   loggingr   r   cloudinit.netr   	getLoggerr   rH   r   r   r{   rC   r   rE   r   DEP_FILESYSTEMDEP_NETWORKr   r   r   r   r   r   <module>   s$   

 
i

(
