U
    L¬÷d'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 )ÚDataSourceNoCloudZ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_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   r1   Ú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   Úseededr3   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   )ÚhasattrrL   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_UNKNOWNrN   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currentrR   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 r0   )rB   rC   r   Zconvert_eni_datarN   r   r   r   Únetwork_configö   s    

z DataSourceNoCloud.network_configN)Ú__name__Ú
__module__Ú__qualname__Zdsnamer   r   r&   rK   ÚpropertyrO   rP   rQ   rU   rV   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.   )r5   r   r1   Ú	load_yamlr;   )rR   Ziid_keyÚfillÚdr2   rF   r   r   r   rT   þ   s"    rT   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://)r   r
   F)r   ZDSMODE_LOCALZDSMODE_NETWORKÚparse_cmdline_datar<   r@   )r\   r-   ZpairsZidstrr   r/   r   r   r   r5     s"    þ


r5   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?   r8   )Zds_idr\   r-   ZarglineÚtokZtmpZkvpairsZs2lÚitemÚkÚvr   r   r   r_   4  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   r[   rA   )ZcurrH   ZretZnewmdr   r   r   r7   \  s    
r7   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   Zparse_cmdlinerN   r   r   r   Ú	ds_detects  s    zDataSourceNoCloudNet.ds_detectN)rW   rX   rY   r   ro   r   r   r   r   rn   n  s   rn   c                 C   s   t  | t¡S r0   )r   Zlist_from_dependsÚdatasources)Zdependsr   r   r   Úget_datasource_list„  s    rq   )N)N)N)r>   r   Z	cloudinitr   r   Zloggingr   r   Zcloudinit.netr   Z	getLoggerrW   r9   r   r   rT   r5   r_   r7   rn   ZDEP_FILESYSTEMZDEP_NETWORKrp   rq   r   r   r   r   Ú<module>   s"   
 i


(
þ