U
    0h?                     @   s8  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r4d 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 )    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	e
d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_cfgZdistropaths r   E/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceNoCloud.pyr      s    zDataSourceNoCloud.__init__c                    sD   t   d | jr d| j dnd | jtjkr>d| j dn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   Zfind_devs_withextendupperlowerlistsetsort)r   labelZfslistZ
label_listZdevlistr   r   r   _get_devices3   s    
zDataSourceNoCloud._get_devicesc                 C   s  d| j d}g }i ddd d}z8i }td}|rTt||rT|d t|d|i}W n" tk
rx   tt	d Y d	S X z(i }t|r|d
 t|d|i}W n" tk
r   tt	d Y d	S X ddgddgd}| j
D ]V}z:tj|f|}|| t	d| t||}W  q6W q tk
r2   Y qX q| jdr`|d | jd |d d< d| jkrd| jkrt|| j}|d dd }	| jdd}
|
d k	r|
 dkrtjdddd | |
D ]}zxt	d| zt||	|}W n, tk
r&   t	d||
 Y W qY nX t||}t	d| || W  qW nX tk
r } z|jtjkrv W 5 d }~X Y n& tjk
r   tt	d| Y nX qt|d krd	S d|d krt|d d }d	}| jD ]}||r|} qq|s| | 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   r3   zUnable to parse dmi dataFcmdlinez!Unable to parse command line datar4   r5   r6   )requiredZoptionalzUsing seeded data from %sseedfromZds_config_seedfromZ	ds_configc                 S   s   t j| f|S N)r   pathprefix2dict)Zmpdatar   r   r   _pp2d_callback   s    z3DataSourceNoCloud._get_data.<locals>._pp2d_callbackZfs_labelZcidatazCustom fs_label keys24.3z(This key isn't supported by ds-identify.Z
deprecatedZdeprecated_versionZ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   )Z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   ZlogexcLOGr   r<   debug
ValueErrorZds_cfggetr,   r   	deprecater1   Zmount_cbwarningOSErrorerrnoZENOENTZMountFailedErrorlenr   
startswith_log_unusable_seedfromZsub_dmi_varsread_seededmergemanydictZ_determine_dsmoder   ZDSMODE_DISABLEDr   r   ZmetadataZuserdata_rawZvendordata_rawr   r   )r   defaultsfoundZmydatamdserialZpp2d_kwargsr   seededr>   r0   Zdever:   Z	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 )NZlxdr
   )Z_platform_typer   Zis_lxdr&   r   r   r   platform_type   s    zDataSourceNoCloud.platform_typer:   c                 C   s   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)rG   infor   r   r:   r   r   r   rQ      s    z(DataSourceNoCloud._log_unusable_seedfromc                 C   s   t jS )z=Return unknown when 'cloud-name' key is absent from metadata.)r   Z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   rP   )r   Zsubplatform_typer   r   r   _get_subplatform   s    z"DataSourceNoCloud._get_subplatformc                 C   s:   |   }|sd S t| d| jg}t|d}|s2d S ||kS )Nr   )dirs)Zget_instance_idgetattrr   _quick_read_instance_id)r   r   Zcurrentrg   Zquick_idr   r   r   check_instance_id   s    
z#DataSourceNoCloud.check_instance_idc                 C   s8   | j d kr2| jd k	r2tjdddd t| j| _ | j S )Nz$Eni network configuration in NoCloudr?   z,You can use network v1 or network v2 insteadr@   )r   r   r   rK   r   Zconvert_eni_datar&   r   r   r   network_config  s    

z DataSourceNoCloud.network_config)__name__
__module____qualname__dsnamer   r#   r1   r_   propertyr`   strrQ   re   rf   rj   rk   __classcell__r   r   r'   r   r      s    %

r   c              	   C   s   | d krg } d}i }t |r,||kr,|| S | D ]`}|d kr>q0z<tj|dgd}t|d }|rx||krx|| W   S W q0 tk
r   Y q0X q0d S )Nr2   r3   )r9   )rC   r   r<   	load_yamlrI   )rg   Ziid_keyfilldr=   rV   r   r   r   ri     s"    ri   c                 C   s   dt jfdt jfg}|D ]j\}}t|| |s.qd| kr< dS | d}|rv|dr`t j| d< q~|dr~t j| d< n|| d<  dS dS )	Nz
ds=nocloudzds=nocloud-netr$   Tr:   zhttp://zhttps://zftp://zftps://)r   r   F)r   ZDSMODE_LOCALr%   parse_cmdline_datarJ   rP   )rt   r8   ZpairsZidstrr$   r:   r   r   r   rC   4  s&    

rC   c              	   C   s   |d krt  }d| }d|  |ks4d|  |ks4dS d}| D ]}|| r@|dd}q@|d d}t|dkr|dd  }nd}d	d
dd}|D ]X}|dkrqz|dd\}	}
W n tk
r   |}	d }
Y nX |	|kr||	 }	|
||	< qdS )Nz %s z %s;Fr!   =   ;r   zlocal-hostnamer2   r:   )hisT)r   Zget_cmdlinesplitrP   rO   rF   )Zds_idrt   r8   ZarglinetokZtmpZkvpairsZs2litemkvr   r   r   rw   U  s4    


rw   c                 C   s   |   }|di }t|d ts0t|d }t| d |g|d< |drdt|d|d< d|krx|d |d< d|kr|d |d< |S )Nr3   r6   r4   r5   )copyrJ   
isinstancedictr   rs   rS   )ZcurrX   ZretZnewmdr   r   r   rE   }  s    
rE   c                   @   s*   e Zd Zdd ZedddZdd ZdS )	DataSourceNoCloudNetc                 C   s   t | ||| d| _d S )Nrv   )r   r   r   r   r   r   r   r     s    zDataSourceNoCloudNet.__init__ra   c                 C   s   t d| | j| dS )rb   z6%s only uses seeds starting with %s - %s is not valid.N)rG   rL   r   rd   r   r   r   rQ     s    z+DataSourceNoCloudNet._log_unusable_seedfromc                 C   s   t tjdddd}dt kr(|  dS ttdp8d }|| j	 dfkrpt
d	|  |dkrl|  dS | jd
i di drt
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   Tr7   r!   zJMachine is configured by dmi serial number to run on single datasource %s.Z
datasourcer	   r:   zMMachine is configured by system configuration to run on single datasource %s.F)r   r   rK   r   Zparse_cmdlineZparse_cmdline_or_dmir   rB   r,   ro   rG   rH   r   rJ   )r   Zlog_deprecatedrW   r   r   r   	ds_detect  sB    
 zDataSourceNoCloudNet.ds_detectN)rl   rm   rn   r   rq   rQ   r   r   r   r   r   r     s   		r   c                 C   s   t | tS r;   )r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list  s    r   __main__)argv)levelry   zseeded: zud: zvd: z	network: )N)N)N)%rN   Zloggingr   	functoolsr   Z	cloudinitr   r   r   r   Zcloudinit.netr   Z	getLoggerrl   rG   r   r   ri   rC   rw   rE   r   ZDEP_FILESYSTEMZDEP_NETWORKr   r   sysr   ZbasicConfigDEBUGr:   rR   r[   r\   r]   Znetworkprintr   r   r   r   <module>   s6   
  	

!
(E

