U
    ¯Ad„1  ã                   @   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 )ÚDataSourceNoCloudZNoCloudc                 C   sJ   t j | |||¡ d | _tj |jd¡tj |jd¡g| _d | _d| _	d S )NÚnocloudznocloud-net)ú/zfile://)
r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚ	seed_dirsÚsupported_seed_starts©ÚselfÚsys_cfgZ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   Zfind_devs_withÚextendÚupperÚlowerÚlistÚsetÚsort)r   ÚlabelZfslistZ
label_listZdevlistr   r   r   Ú_get_devices(   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 qÞX qÞ| j d¡r`| d¡ | jd |d d< d| jkrŽd| jkrŽt|| jƒ}| d¡ dd„ }	| j dd¡}
|
d k	r’|  |
¡D ]Ø}zxt	 d|¡ zt ||	|¡}W n, tk
r   t	 d||
¡ Y W q¸Y nX t||ƒ}t	 d|¡ | |¡ W  q’W nX tk
rh } z|jtjkrX‚ W 5 d }~X Y n& tjk
rŒ   t t	d|¡ Y nX q¸t|ƒdkr¤d	S d|d krX|d d }d	}| jD ]}| |¡rÈ|} qæqÈ|sþt	 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r¨t	 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 datar(   r)   r*   )Ú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_callbacku   s    z3DataSourceNoCloud._get_data.<locals>._pp2d_callbackZfs_labelZ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)ZtimeoutzUsing seeded cache data from %sr   z&%s: not claiming datasource, dsmode=%sú,znetwork-interfacesT)'r   r   Zread_dmi_dataÚload_cmdline_dataÚappendÚ_merge_new_seedÚ	Exceptionr   ZlogexcÚLOGr   r/   ÚdebugÚ
ValueErrorZds_cfgÚgetr$   Zmount_cbZwarningÚOSErrorÚerrnoZENOENTZMountFailedErrorÚlenr   Ú
startswithZsub_dmi_varsZread_seededÚmergemanydictZ_determine_dsmoder   ZDSMODE_DISABLEDr   r   ZmetadataZuserdata_rawZvendordata_rawÚ_network_configÚ_network_eni)r   ÚdefaultsÚfoundZmydataÚmdÚserialZpp2d_kwargsr   Úseededr1   r#   ZdevÚer-   Z	seedfoundÚprotoZmd_seedZudZ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_typeZlxdr   )ÚhasattrrJ   r   Z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   ZMETADATA_UNKNOWNrL   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   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currentrP   Zquick_idr   r   r   Úcheck_instance_idç   s    
z#DataSourceNoCloud.check_instance_idc                 C   s(   | j d kr"| jd k	r"t | j¡| _ | j S r.   )r@   rA   r   Zconvert_eni_datarL   r   r   r   Únetwork_configö   s    

z DataSourceNoCloud.network_configN)Ú__name__Ú
__module__Ú__qualname__Zdsnamer   r   r$   rI   ÚpropertyrM   rN   rO   rS   rT   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 )Nr%   r'   )r,   )r3   r   r/   Ú	load_yamlr9   )rP   Ziid_keyÚfillÚdr0   rD   r   r   r   rR   þ   s"    rR   c                 C   sH   dt jfdt jfg}|D ]*\}}t|| |ƒrd| kr<|| d<  dS qdS )Nz
ds=nocloudzds=nocloud-netr   TF)r   ZDSMODE_LOCALZDSMODE_NETWORKÚparse_cmdline_data)rZ   r+   ZpairsZidstrr   r   r   r   r3     s    þr3   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r¦q˜z| dd¡\}	}
W n tk
rÖ   |}	d }
Y nX |	|krè||	 }	|
||	< q˜dS )Nz %s z %s;Fr&   ú=é   ú;r   zlocal-hostnamer%   r-   )ÚhÚiÚsT)r   Zget_cmdlineÚsplitr>   r=   r6   )Zds_idrZ   r+   ZarglineÚtokZtmpZkvpairsZs2lÚitemÚkÚvr   r   r   r\   )  s4    


r\   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 )Nr'   r*   r(   r)   )Úcopyr:   Ú
isinstanceÚdictr   rY   r?   )ZcurrF   ZretZnewmdr   r   r   r5   Q  s    
r5   c                   @   s   e Zd Zdd„ ZdS )ÚDataSourceNoCloudNetc                 C   s   t  | |||¡ d| _d S )N)zhttp://zhttps://)r   r   r   r   r   r   r   r   d  s    zDataSourceNoCloudNet.__init__N)rU   rV   rW   r   r   r   r   r   rk   c  s   rk   c                 C   s   t  | t¡S r.   )r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_listq  s    rm   )N)N)N)r<   r   Z	cloudinitr   r   Zloggingr   r   Zcloudinit.netr   Z	getLoggerrU   r7   r
   r   rR   r3   r\   r5   rk   ZDEP_FILESYSTEMZDEP_NETWORKrl   rm   r   r   r   r   Ú<module>   s"   
 i


(
þ