
"T`=                 @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z 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 d Z d Z d	 g Z Gd
 d   d e
 j  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z d d   Z d d   Z d d d d d d  Z d d d  Z d d   Z e Z e e
 j  f f g Z! d d   Z" d S)    N)log)net)sources)subp)utilziid-dsopennebulaZnobodyz
context.shc               @   sm   e  Z d  Z d Z d d   Z d d   Z d d   Z d d	   Z e d
 d    Z	 d d d d d  Z
 d S)DataSourceOpenNebulaZ
OpenNebulac             C   sA   t  j j |  | | |  d  |  _ t j j | j d  |  _ d  S)NZ
opennebula)r   
DataSource__init__seedospathjoinseed_dir)selfZsys_cfgdistropaths r   H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr	   (   s    	zDataSourceOpenNebula.__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DataSourceOpenNebula.__str__c       
      C   s  d t  i } d  } d  } t } d |  j k r? |  j j d  } |  j g } | j t    x| D] } ys t j j	 |  j  r t
 | |  j d | } n? | j d  r t j t
 d | d |  j } t j | |  } Wnc t k
 r wb YnO t k
 r} z |  WYd  d  } ~ Xn% t j k
 r@t j d |  Yn X| rb | } t j d |  Pqb W| sld S| d	 }	 t j |	 | g  }	 |  j | j d
  |  j j d  g  |  _ |  j t j k rd S| |  _ | j d  |  _ |	 |  _ | j d  |  _ d S)Nzinstance-id	parseuserasuserz/devr   z%s was not mountablezfound datasource in %sFmetadataZDSMODEr   znetwork-interfacesuserdataT) DEFAULT_IIDDEFAULT_PARSEUSERZds_cfggetr   extendfind_candidate_devsr   r   isdirread_context_disk_dirr   
startswith	functoolspartialr   Zmount_cbNonContextDiskDirBrokenContextDiskDirZMountFailedErrorLOGwarningdebugZmergemanydictZ_determine_dsmoder   r   ZDSMODE_DISABLEDr
   networkr   Zuserdata_raw)
r   Zdefaultsresultsr
   r   Z
candidatesZcdevZpartially_applied_funcexcZmdr   r   r   	_get_data1   sT    
'		zDataSourceOpenNebula._get_datac             C   s2   |  j  |  j k r d } n d } d | |  j f S)z/Return the subplatform metadata source details.zseed-dirzconfig-diskz%s (%s))r   r
   )r   Zsubplatform_typer   r   r   _get_subplatformm   s    	z%DataSourceOpenNebula._get_subplatformc             C   s   |  j  d  k	 r |  j  Sd  Sd  S)N)r*   )r   r   r   r   network_configu   s    z#DataSourceOpenNebula.network_configFc             C   sC   | d  k r- |  j  t j k r' d } n d } t j j |  | |  S)NTF)r   r   ZDSMODE_NETWORKr   get_hostname)r   ZfqdnZ
resolve_ipZmetadata_onlyr   r   r   r0   |   s
    	z!DataSourceOpenNebula.get_hostnameN)__name__
__module____qualname__Zdsnamer	   r   r-   r.   propertyr/   r0   r   r   r   r   r   $   s   <r   c               @   s   e  Z d  Z d S)r%   N)r1   r2   r3   r   r   r   r   r%      s   r%   c               @   s   e  Z d  Z d S)r&   N)r1   r2   r3   r   r   r   r   r&      s   r&   c               @   s   e  Z d  Z d d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d d  Z d d   Z d S)OpenNebulaNetworkNc             C   s   | |  _  | d  k r! t |  } t j d d   t | j   d d d   D  |  _ i  |  _ xN | j   D]@ \ } } t j	 d |  } | rn | j
 d  |  j | j   <qn Wd  S)Nc             S   s   g  |  ] } |  q Sr   r   ).0kr   r   r   
<listcomp>   s   	 z.OpenNebulaNetwork.__init__.<locals>.<listcomp>keyc             S   s   t  j |  d  S)N   )r   Znatural_sort_key)r7   r   r   r   <lambda>   s    z,OpenNebulaNetwork.__init__.<locals>.<lambda>z
^(.+)_MAC$r:   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r   r<   r   Zsystem_nics_by_macr7   vmr   r   r   r	      s    		zOpenNebulaNetwork.__init__c             C   s-   d j  d d   | j d  d d   D  S)N.c             S   s%   g  |  ] } t  t | d     q S)   )strint)r6   cr   r   r   r8      s   	 z,OpenNebulaNetwork.mac2ip.<locals>.<listcomp>:   )r   split)r   macr   r   r   mac2ip   s    zOpenNebulaNetwork.mac2ipc             C   s   |  j  |  j d  d d S)NrJ   r   z.0)rS   
rpartition)r   rR   r   r   r   mac2network   s    zOpenNebulaNetwork.mac2networkc             C   s   i  } |  j  | d d  j   } | j |  j j d d  j    | rS | | d <|  j  | d d  j   } | r~ | | d <| S)Ndns ZDNS	addressessearch_domainsearch)	get_fieldrQ   r   r<   r   )r   devnameserversrV   rY   r   r   r   get_nameservers   s    "

z!OpenNebulaNetwork.get_nameserversc             C   s   |  j  | d  S)Nmtu)r[   )r   r\   r   r   r   get_mtu   s    zOpenNebulaNetwork.get_mtuc             C   s   |  j  | d |  j |   S)NZip)r[   rS   )r   r\   rR   r   r   r   get_ip   s    zOpenNebulaNetwork.get_ipc             C   sT   g  } |  j  | d  } | r+ | j |  |  j  | d  } | rP | j |  | S)Nip6ip6_ula)r[   append)r   r\   
addresses6rb   rc   r   r   r   get_ip6   s    zOpenNebulaNetwork.get_ip6c             C   s   |  j  | d d  S)NZip6_prefix_lengthZ64)r[   )r   r\   r   r   r   get_ip6_prefix   s    z OpenNebulaNetwork.get_ip6_prefixc             C   s   |  j  | d  S)Ngateway)r[   )r   r\   r   r   r   get_gateway   s    zOpenNebulaNetwork.get_gatewayc             C   s   |  j  | d  S)Ngateway6)r[   )r   r\   r   r   r   get_gateway6   s    zOpenNebulaNetwork.get_gateway6c             C   s   |  j  | d d  S)Nmaskz255.255.255.0)r[   )r   r\   r   r   r   get_mask   s    zOpenNebulaNetwork.get_maskc             C   s   |  j  | d |  j |   S)Nr*   )r[   rU   )r   r\   rR   r   r   r   get_network   s    zOpenNebulaNetwork.get_networkc             C   s;   |  j  j d j | | f  j    } | d k r7 | S| S)zreturn the field name in context for device dev.

        context stores <dev>_<NAME> (example: eth0_DOMAIN).
        an empty string for value will return default._NrW   )NrW   )r<   r   r   upper)r   r\   namedefaultvalr   r   r   r[      s    'zOpenNebulaNetwork.get_fieldc                s  i  } d | d <i  | d <i  } xu|  j  j   D]d\ } } | j   } |  j j | |  } i  } d | i | d <g  | d <|  j |  } t t j |   } | d j	 |  j
 | |  d |  |  j |  }	 |	 r|  j |    | d j   f d d	   |	 D  |  j |  }
 |
 r-|
 | d
 <|  j |  } | rL| | d <|  j |  } | rk| | d <|  j |  } | r| | d <| | | <q0 W| | d <| S)NrP   version	ethernetsZ
macaddressrE   rX   /c                s   g  |  ] } | d     q S)rv   r   )r6   i)prefix6r   r   r8      s   	 z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>Zgateway4rj   r]   r_   )rB   rA   rG   rC   r   rm   rL   r   Zmask_to_net_prefixrd   ra   rf   rg   r   ri   rk   r^   r`   )r   Znetconfru   rR   r\   Zc_devZdevconfrl   prefixre   rh   rj   r]   r_   r   )rx   r   gen_conf   sD    









zOpenNebulaNetwork.gen_conf)r1   r2   r3   r	   rS   rU   r^   r`   ra   rf   rg   ri   rk   rm   rn   r[   rz   r   r   r   r   r5      s   
	r5   c              C   s^   g  }  xQ d D]I } t  j |  } | j   x' | D] } | |  k r3 |  j |  q3 Wq W|  S)zE
    Return a list of devices that may contain the context disk.
    LABEL=CONTEXTLABEL=CDROMTYPE=iso9660)r{   r|   r}   )r   Zfind_devs_withsortrd   )Zcombinedfdevsdr   r   r   r     s    
r   c             C   s   d d |  g S)NZsudoz-ur   )userr   r   r   switch_user_cmd   s    r   c             C   s	  t  | t  r | g } n | d  k r3 d d g } | d  k rE t } d d   t j d D } | } | d  k r} | } g  } d j d  } d	 d
   } d | | |  d |  d | |  d }	 g  }
 | d  k	 r | |  }
 |
 j |  t j |
 d |	 \ } } d } i  } i  } d  } | d d  } x | j d  D] } yl | j d d  \ } } | | k r~| | | <n7 | | k r| | k s| j	 |  | k r| | | <WqDt
 k
 r | d k r  | d  k r| } n | | k r| } YqDXqDW| S)Nbashz-ec             S   s   g  |  ] } d  |  q S)z${!%s*}r   )r6   xr   r   r   r8   1  s   	 z&parse_shell_config.<locals>.<listcomp>ro   
__v="";rW   c             S   s)   d j  d d d j  |   d d d f  S)Nr   zprintf "%s\0" _start_zfor __v in %s; do z%   printf "%s=%s\0" "$__v" "${!__v}";donerW   )r   )Zvlistr   r   r   
varprinter:  s    z&parse_shell_config.<locals>.varprinterz
unset IFS
z{
%s

:
} > /dev/null
dataEPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDSSRANDOM__vr   r:    =Z_start_)r   rW   )r   r   r   r   r   ro   r   r   )
isinstancerL   r   stringZascii_lettersr   r   r   rQ   r   
ValueError)contentZkeylistr   r   Zswitch_user_cbZallvarsZ
keylist_inZsetupr   ZbcmdcmdoutputZ_errorZexcludedZpresetZrettargetliner9   rs   r   r   r   parse_shell_config$  sR    . !	r   c          '   C   s0  i  } x? t  D]7 } t j j |  |  } t j j |  r | | | <q W| sd t d |  d f   i  } d d d i  i } d | k r| d k	 r y t j |  Wn@ t k
 r } z  t	 d j
 d |   |  WYd d } ~ Xn Xy: t j j |  d  }	 t j |	  }
 t |
 d	 | } Wqt j k
 r_} z t	 d
 |  |  WYd d } ~ Xqt k
 r} z t d |  |  WYd d } ~ XqXn t d   | s| S| | d <d } d | k rd } n d | k rd } | r| j |  j   } d d   | D | d d <x- d D]% } | | k r$| | | d d <Pq$Wd | k rj| d | d <n d | k r| d | d <d | k r| j d | j d   } | d k ry t j | d  | d <Wn t k
 rt j d  Yn Xd d   | D } | r,t | |  } | j   | d <| S) z
    read_context_disk_dir(source_dir):
    read source_dir and return a tuple with metadata dict and user-data
    string populated.  If not a valid dir, raise a NonContextDiskDir
    z%s: %szno files foundr   Nr   z
context.shz'configured user '{user}' does not existr   r   zError processing context.sh: %szError reading context.sh: %szMissing context.shZSSH_KEYZSSH_PUBLIC_KEYc             S   s2   g  |  ]( } t  |  r | j d   r |  q S)#)lenr"   )r6   r   r   r   r   r8     s   	 z)read_context_disk_dir.<locals>.<listcomp>zpublic-keysHOSTNAME	PUBLIC_IP	IP_PUBLICETH0_IPzlocal-hostnameZ	USER_DATAZUSERDATAZUSERDATA_ENCODINGZUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdatac             S   s(   g  |  ] } t  j d  |  r |  q S)z^ETH\d+_IP.*$)rD   rE   )r6   r7   r   r   r   r8     s   	 znetwork-interfaces)r   r   r   r   )CONTEXT_DISK_FILESr   r   r   isfiler%   pwdgetpwnamKeyErrorr&   formatr   Z	load_filer   r   ZProcessExecutionErrorIOErrorr   
splitlinesZb64d	TypeErrorr'   r(   r5   rz   )Z
source_dirr   r   foundZaffnr<   r+   er   r   Zssh_key_varlinesr7   encodingZipaddr_keysZonetr   r   r   r!   }  s~    		


		r!   c                s/   t  j   } t   f d d   | j   D  S)Nc                s4   g  |  ]* \ } }   j  j |  r | | f  q Sr   )Z
networkingZis_physical)r6   rI   n)r   r   r   r8     s   	 z,get_physical_nics_by_mac.<locals>.<listcomp>)r   Zget_interfaces_by_macdictrA   )r   r   r   )r   r   r=     s    r=   c             C   s   t  j |  t  S)N)r   Zlist_from_dependsdatasources)Zdependsr   r   r   get_datasource_list  s    r   )#r>   r#   r   r   rD   r   Z	cloudinitr   Zloggingr   r   r   r   Z	getLoggerr1   r'   r   r   r   r   r   	Exceptionr%   r&   objectr5   r   r   r   r!   r=   ZDataSourceOpenNebulaNetZDEP_FILESYSTEMr   r   r   r   r   r   <module>   s6   	a	X^