
"T`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 d  d l m Z d  d l m	 Z	 e j
 e  Z Gd d   d e j  Z d d	 d
  Z d d d  Z d d d  Z d d   Z d d   Z Gd 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)eni)sources)utilc               @   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   sk   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   E/usr/lib/python3/dist-packages/cloudinit/sources/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=%sreverseT)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 d d |  j  i } g  } d i  d d d d d d  i } yP i  } t j d	  } | r t | |  r | j d
  t | d | i  } Wn& t k
 r t j t	 d  d SYn Xy8 i  } t |  r | j d  t | d | i  } Wn& t k
 rt j t	 d  d SYn Xd d d g d d d g i } xi |  j
 D]^ } yC t j | |  } | j |  t	 j d |  t | |  } PWq;t k
 rYq;Xq;W|  j j d  r| j d  |  j d | d d <d |  j k rd |  j k rt | |  j  } | j d  d d   }	 |  j j d d  }
 |
 d  k	 r>x |  j |
  D] } y t	 j d |  y t j | |	 |  } Wn( t k
 rt	 j d | |
  wKYn Xt | |  } t	 j d |  | j |  PWqKt k
 r} z | j t j k r   WYd  d  } ~ XqKt j k
 r9t j t	 d |  YqKXqKWt |  d k rTd Sd | d k r+| d d } d } x' |  j D] } | j |  r| } PqW| st	 j d | |   d St 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 rt	 j d! |  |  j   d Sd" j |  |  _  | d |  _! | d |  _" | d |  _# | d |  _$ | d j d#  |  _% d$ S)%Nzinstance-idr   r   z	meta-dataz	user-data zvendor-dataznetwork-configzsystem-serial-numberr   zUnable to parse dmi dataFcmdlinez!Unable to parse command line datarequiredZoptionalzUsing seeded data from %sseedfromZds_config_seedfromZ	ds_configc             S   s   t  j |  |  S)N)r   pathprefix2dict)Zmpdatar   r   r   _pp2d_callbackn   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 %sZtimeoutzUsing seeded cache data from %sz&%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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   sC   t  |  d  s d  |  _ |  j s< t j   r3 d n d |  _ |  j S)N_platform_typeZlxdr   )hasattrrE   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   s2   |  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   r:   )r   Zsubplatform_typer   r   r   _get_subplatform   s    	z"DataSourceNoCloud._get_subplatformc             C   sQ   |  j    } | s d  St |  d |  j g  } t d |  } | sG d  S| | k S)Nr   dirs)Zget_instance_idgetattrr   _quick_read_instance_id)r   r   ZcurrentrJ   Zquick_idr   r   r   check_instance_id   s    z#DataSourceNoCloud.check_instance_idc             C   s:   |  j  d  k r3 |  j d  k	 r3 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%   rD   propertyrG   rH   rI   rM   rN   r   r   r   r   r      s   	r   c             C   s   |  d  k r g  }  d } i  } t  |  r> | | k r> | | Sxu |  D]m } | d  k rZ qE yC t j | d d g } t j | d  } | | k r | | SWqE t k
 r YqE XqE Wd  S)Nzinstance-idr(   z	meta-data)r.   r   r*   	load_yamlr4   )rJ   Ziid_keyfilldr+   r?   r   r   r   rL      s"    	rL   c             C   se   d t  j f d t  j f g } x@ | D]8 \ } } t | |  |  r% d |  k rY | |  d <d Sq% Wd S)Nz
ds=nocloudzds=nocloud-netr   TF)r   ZDSMODE_LOCALZDSMODE_NETWORKparse_cmdline_data)rT   r'   ZpairsZidstrr   r   r   r   r.     s    
r.   c             C   s[  | d  k r t  j   } d | } d |  | k p? d |  | k sF d Sd } x5 | j   D]' } | j |   rY | j d d  } qY W| d j d  } t |  d k r | d d   } n f  } d d	 d
 d d d i } xz | D]r } | d k r q y | j d d  \ }	 }
 Wn t k
 r2| }	 d  }
 Yn X|	 | k rI| |	 }	 |
 | |	 <q Wd S)Nz %s z %s;Fr&   =   ;hzlocal-hostnameizinstance-idsr)   T)r   Zget_cmdlinesplitr:   r9   r1   )Zds_idrT   r'   ZarglinetokZtmpZkvpairsZs2litemkvr   r   r   rV     s4    
 
rV   c             C   s  t    } |  j d |  } | | k r+ |  Sd } t | t  sW t j | d |   |  St t |  j     d k r t j | d |   |  S| j d  d k r t j | d |   n5 t	 d | k d	 | k f  s t j | d
 |   |  St j | d |   | S)aM  If network-config contains top level 'network' key, then remove it.

    Some providers of network configuration may provide a top level
    'network' key (LP: #1798117) even though it is not necessary.

    Be friendly and remove it if it really seems so.

    Return the original value if no change or the updated value if changed.Znetworkz.Top level network key in network-config %s: %szwas not a dictrX   zhad multiple top level keysconfigZdisabledzwas config/disabledversionz!but missing 'config' or 'version'z#fixed by removing shifting network.)
objectr5   
isinstancedictr2   r3   r9   r!   keysall)ZcfgZnullvalZnetwork_valZbmsgr   r   r   _maybe_remove_top_network<  s$    		ri   c             C   s   |  j    } | j d i   } t | d t  sD t j | d  } t j |  d | g  | d <| j d  r t t j | j d    | d <d | k r | d | d <d | k r | d | d <| S)Nz	meta-dataznetwork-configz	user-datazvendor-data)copyr5   re   rf   r   rS   r;   ri   )ZcurrA   ZretZnewmdr   r   r   r0   Y  s    r0   c               @   s   e  Z d  Z d d   Z d S)DataSourceNoCloudNetc             C   s#   t  j |  | | |  d |  _ d  S)Nhttp://https://)rl   rm   )r   r   r   )r   r   r   r   r   r   r   r   m  s    zDataSourceNoCloudNet.__init__N)rO   rP   rQ   r   r   r   r   r   rk   l  s   rk   c             C   s   t  j |  t  S)N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_listz  s    ro   )r7   r   Z	cloudinitr   r   ZloggingZcloudinit.netr   r   r   Z	getLoggerrO   r2   r   r   rL   r.   rV   ri   r0   rk   ZDEP_FILESYSTEMZDEP_NETWORKrn   ro   r   r   r   r   <module>   s"   (