
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
\me3                 @   s   d dl Z d dlZd dlZd dlmZmZmZ d dlmZ ej	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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j| ||| d | _tjj|jdtjj|jdg| _d | _d| _	d S )Nnocloudznocloud-net/file://)r   r	   )
r   
DataSource__init__seedospathjoinseed_dir	seed_dirssupported_seed_starts)selfsys_cfgdistropaths r   '/usr/lib/python3.6/DataSourceNoCloud.pyr      s    zDataSourceNoCloud.__init__c             C   s   t j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 jd}|jt jd t jd|j  }|jt jd|j   |jt j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}y8i }tjd}|rTt||rT|jd t|d|i}W n  tk
rv   tjt	d d	S X y(i }t|r|jd
 t|d|i}W n  tk
r   tjt	d d	S X ddgddgd}xZ| j
D ]P}y4tj|f|}|j| t	jd| t||}P W q tk
r*   Y qX qW | jjdrZ|jd | jd |d d< d| jkrd| jkrt|| j}|jd dd }	| jjdd}
|
d k	rx| j|
D ]}ynt	jd| ytj||	|}W n( tk
r    t	jd||
 wY nX t||}t	jd| |j| P W nX tk
rZ } z|jtjkrJ W Y d d }~X n& tjk
r~   tjt	d| Y nX qW t|dkrd	S d|d krL|d d }d	}x"| jD ]}|j|r|}P qW |st	jd||  d	S tj|}tj|d d\}}}t	jd| tj|d |g|d< ||d< ||d< |j| tj|d |g|d< | j|d jd g| _ | j tjkrt	jd!| | j  d	S d"j || _!|d | _"|d | _#|d | _$|d | _%|d jd#| _&d$S )%Nr   )zinstance-idr    )z	meta-dataz	user-datazvendor-dataznetwork-configzsystem-serial-numberr   z	meta-datazUnable to parse dmi dataFcmdlinez!Unable to parse command line dataz	user-datazvendor-dataznetwork-config)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_callbackt   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errno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   ZdefaultsfoundZmydatamdserialZpp2d_kwargsr   seededr+   r#   Zdever(   Z	seedfoundprotoZmd_seedZudZvdr   r   r   	_get_data3   s    


















zDataSourceNoCloud._get_datac             C   s.   t | dsd | _| js(tj r"dnd| _| jS )N_platform_typeZlxdr   )hasattrrD   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_UNKNOWN)r   r   r   r   _get_cloud_name   s    z!DataSourceNoCloud._get_cloud_namec             C   s$   | j 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   r9   )r   Zsubplatform_typer   r   r   _get_subplatform   s    z"DataSourceNoCloud._get_subplatformc             C   s:   | j  }|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currentrI   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| _ | j S )N)r;   r<   r   Zconvert_eni_data)r   r   r   r   network_config   s    

z DataSourceNoCloud.network_configN)__name__
__module____qualname__Zdsnamer   r   r$   rC   propertyrF   rG   rH   rL   rM   r   r   r   r   r      s   
 	r   c             C   s   | d krg } d}i }t |r,||kr,|| S xb| D ]Z}|d kr@q2y6tj|dgd}tj|d }|rt||krt|| S W q2 tk
r   Y q2X q2W d S )Nzinstance-idz	meta-data)r'   )r-   r   r)   	load_yamlr3   )rI   Ziid_keyfilldr*   r>   r   r   r   rK      s"    

rK   c             C   s   dt jfdt jfg}xn|D ]f\}}t|| |s0qd| kr<dS | jd}|rv|jdr`t j| d< q~|jdr~t j| d< n|| d< dS W d
S )Nz
ds=nocloudzds=nocloud-netr   Tr(   http://https://file://r   F)rU   rV   )rW   r   )r   ZDSMODE_LOCALZDSMODE_NETWORKparse_cmdline_datar4   r9   )rS   r&   ZpairsZidstrr   r(   r   r   r   r-     s     


r-   c             C   s   |d krt j }d| }d|  |kp.d|  |ks4dS d}x&|j D ]}|j| rB|jdd}qBW |d jd}t|dkr|dd  }nf }dd	d
d}x`|D ]X}|dkrqy|jdd\}	}
W n tk
r   |}	d }
Y nX |	|kr||	 }	|
||	< qW dS )Nz %s z %s;Fr%   =   ;zlocal-hostnamezinstance-idr(   )hisT)r   Zget_cmdlinesplitr9   r8   r0   )Zds_idrS   r&   ZarglinetokZtmpZkvpairsZs2litemkvr   r   r   rX   3  s4    


rX   c             C   s   | j  }|jdi }t|d ts0tj|d }tj| d |g|d< |jdrdtj|jd|d< d|krx|d |d< d|kr|d |d< |S )Nz	meta-dataznetwork-configz	user-datazvendor-data)copyr4   
isinstancedictr   rR   r:   )Zcurr@   retZnewmdr   r   r   r/   [  s    
r/   c               @   s   e Zd Zdd Zdd ZdS )DataSourceNoCloudNetc             C   s   t j| ||| d| _d S )Nhttp://https://)ri   rj   )r   r   r   )r   r   r   r   r   r   r   r   n  s    zDataSourceNoCloudNet.__init__c             C   s   dt j 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.
        znocloud-net)r   Zparse_cmdline)r   r   r   r   	ds_detectr  s    zDataSourceNoCloudNet.ds_detectN)rN   rO   rP   r   rk   r   r   r   r   rh   m  s   rh   c             C   s   t j| tS )N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list  s    rm   )N)N)N)r6   Zloggingr   Z	cloudinitr   r   r   Zcloudinit.netr   Z	getLoggerrN   r1   r
   r   rK   r-   rX   r/   rh   ZDEP_FILESYSTEMZDEP_NETWORKrl   rm   r   r   r   r   <module>   s   
 i


(
