o
    w7eQ?                     @   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
mZmZmZ e	eZdZdZdgZG dd	 d	ejZG d
d deZG dd deZG dd dZdd Zdd Z	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)atomic_helper)log)netsourcessubputilziid-dsopennebulanobody
context.shc                   @   sF   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Z
dS )DataSourceOpenNebula
OpenNebulac                 C   s.   t j| ||| d | _tj|jd| _d S )N
opennebula)r   
DataSource__init__seedospathjoinseed_dir)selfsys_cfgdistropaths r   H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr   %   s   zDataSourceOpenNebula.__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DataSourceOpenNebula.__str__c           
      C   sl  dt i}d }d }t}d| jv r| jd}| jg}|t  |D ]Z}z&tj	| jr4t
|| j|d}n|drHtjt
|| jd}t||}W n% tyR   Y q! ty_ } z|d }~w tjyn   td| Y nw |r{|}td|  nq!|sdS |d	 }	t|	|g}	| |d
| jdg| _| jtjkrdS || _|d| _|	| _|d| _dS )Nzinstance-id	parseuserasuserz/dev)r   r   z%s was not mountablezfound datasource in %sFmetadataDSMODEr   network-interfacesuserdataT) DEFAULT_IIDDEFAULT_PARSEUSERds_cfggetr   extendfind_candidate_devsr   r   isdirread_context_disk_dirr   
startswith	functoolspartialr   mount_cbNonContextDiskDirBrokenContextDiskDirMountFailedErrorLOGwarningdebugmergemanydict_determine_dsmoder   r   DSMODE_DISABLEDr   networkr    userdata_raw)
r   defaultsresultsr   r   
candidatescdevpartially_applied_funcexcmdr   r   r   	_get_data.   sb   

zDataSourceOpenNebula._get_datac                 C   s$   | j | jv 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   subplatform_typer   r   r   _get_subplatformk   s   z%DataSourceOpenNebula._get_subplatformc                 C   s   | j d ur| j S d S N)r9   )r   r   r   r   network_configs   s   
z#DataSourceOpenNebula.network_configFc                 C   s.   |d u r| j tjkrd}nd}tj| ||S )NTF)r   r   DSMODE_NETWORKr   get_hostname)r   fqdn
resolve_ipmetadata_onlyr   r   r   rH   z   s
   z!DataSourceOpenNebula.get_hostnameN)FFF)__name__
__module____qualname__dsnamer   r   rB   rD   propertyrF   rH   r   r   r   r   r
   !   s    =
r
   c                   @      e Zd ZdS )r0   NrL   rM   rN   r   r   r   r   r0          r0   c                   @   rQ   )r1   NrR   r   r   r   r   r1      rS   r1   c                   @   sp   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dZdd ZdS )OpenNebulaNetworkNc                 C   s|   || _ |d u rt|}tdd t| dd dD | _i | _| D ]\}}t	d|}|r;|
d| j| < q%d S )Nc                 S   s   g | ]}|qS r   r   .0kr   r   r   
<listcomp>   s    z.OpenNebulaNetwork.__init__.<locals>.<listcomp>c                 S   s   t | d S )N   )r   natural_sort_key)rW   r   r   r   <lambda>   s    z,OpenNebulaNetwork.__init__.<locals>.<lambda>)keyz
^(.+)_MAC$rY   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r   r]   r   system_nics_by_macrW   vmr   r   r   r      s$   zOpenNebulaNetwork.__init__c                 C   s"   d dd |ddd  D S )N.c                 S   s   g | ]	}t t|d qS )   )strint)rV   cr   r   r   rX      s    z,OpenNebulaNetwork.mac2ip.<locals>.<listcomp>:   )r   split)r   macr   r   r   mac2ip   s   "zOpenNebulaNetwork.mac2ipc                 C   s\   i }|  |dd }|| jdd  |r||d< |  |dd }|r,||d< |S )Ndns DNS	addressessearch_domainsearch)	get_fieldrs   r(   r]   r'   )r   devnameserversrv   rz   r   r   r   get_nameservers   s   z!OpenNebulaNetwork.get_nameserversc                 C      |  |dS )Nmtur|   r   r}   r   r   r   get_mtu      zOpenNebulaNetwork.get_mtuc                 C   s   |  |d| |S )Nip)r|   ru   )r   r}   rt   r   r   r   get_ip   s   zOpenNebulaNetwork.get_ipc                 C   s<   g }|  |d}|r|| |  |d}|r|| |S )Nip6ip6_ula)r|   append)r   r}   
addresses6r   r   r   r   r   get_ip6   s   

zOpenNebulaNetwork.get_ip6c                 C      |  |ddS )Nip6_prefix_length64r   r   r   r   r   get_ip6_prefix      z OpenNebulaNetwork.get_ip6_prefixc                 C   r   )Ngatewayr   r   r   r   r   get_gateway   r   zOpenNebulaNetwork.get_gatewayc                 C   s   |  |d|  |dS )Nip6_gatewaygateway6r   r   r   r   r   get_gateway6   s   zOpenNebulaNetwork.get_gateway6c                 C   r   )Nmaskz255.255.255.0r   r   r   r   r   get_mask   r   zOpenNebulaNetwork.get_maskc                 C   s*   | j d||f }|dv r|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   )r]   r'   r   upper)r   r}   namedefaultvalr   r   r   r|      s   	zOpenNebulaNetwork.get_fieldc                    s0  i }d|d< i |d< i }| j  D ]\}}| }| j||}i }d|i|d< g |d< | |}tt|}|d 	| 
||d |  | |}	|	ra| | |d  fdd	|	D  | |}
|
rl|
|d
< | |}|rw||d< | |}|r||d< | |}|r||d< |||< q||d< |S )Nrr   version	ethernets
macaddressrf   ry   /c                    s   g | ]}|d    qS )r   r   )rV   iprefix6r   r   rX      s    z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>gateway4r   r~   r   )rc   rb   rh   rd   r'   r   rn   r   ipv4_mask_to_net_prefixr   r   r   r   r(   r   r   r   r   )r   netconfr   rt   r}   c_devdevconfr   prefixr   r   r   r~   r   r   r   r   gen_conf   sD   







zOpenNebulaNetwork.gen_confrE   )rL   rM   rN   r   ru   r   r   r   r   r   r   r   r   r|   r   r   r   r   r   rT      s    


rT   c                  C   s@   g } dD ]}t |}|  |D ]}|| vr| | qq| S )zE
    Return a list of devices that may contain the context disk.
    )zLABEL=CONTEXTzLABEL=CDROMzTYPE=iso9660)r   find_devs_withsortr   )combinedfdevsdr   r   r   r)     s   

r)   c                 C   s
   dd| gS )Nsudoz-ur   userr   r   r   switch_user_cmd*  s   
r   c              	   C   sr  t |tr	|g}n|d u rddg}|d u rt}dd tjd D }|}|d u r+|}g }dd}dd	 }d
| || d|   d
 || d }	g }
|d urR||}
|
| tj|
|	d\}}d}i }i }d }|dd }|dD ]C}z&|dd\}}||u r|||< n||vr||v s|	||kr|||< W qs t
y   |dkr |d u r|}n||u r|}Y qsw |S )Nbashz-ec                 S   s   g | ]}d | qS )z${!%s*}r   )rV   xr   r   r   rX   <  s    z&parse_shell_config.<locals>.<listcomp>r   
)z__v="";rw   c                 S   s   d ddd |  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   )vlistr   r   r   
varprinterJ  s   z&parse_shell_config.<locals>.varprinterz
unset IFS
z{
%s

:
} > /dev/null
)data)EPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDSr   SRANDOM__vr    =rY   _start_)
isinstancern   r   stringascii_lettersr   r(   r   rs   r'   
ValueError)contentkeylistr   r   switch_user_cballvars
keylist_insetupr   bcmdcmdoutput_errorexcludedpresetrettargetliner\   r   r   r   r   parse_shell_config.  st   




r   c              
   C   sJ  i }t D ]}tj| |}tj|r|||< q|s"td| df i }di d}d|v r|durNzt| W n tyM } z	t	dj
|d|d}~ww ztj| d}	t|	}
t|
|d}W n* tjyv } zt	d	| |d}~w ty } ztd
| |d}~ww td|s|S ||d< d}d|v rd}nd|v rd}|r|| }dd |D |d d< dD ]}||v r|| |d d<  nqd|v r|d |d< n
d|v r|d |d< d|v r|d|d}|dkrzt|d |d< W n ty   td Y nw dd |D }|r#t||}| |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 foundN)r#   r    r	   z'configured user '{user}' does not existr   r   zError processing context.sh: %szError reading context.sh: %szMissing context.shr    SSH_KEYSSH_PUBLIC_KEYc                 S   s"   g | ]}t |r|d s|qS )#)lenr,   )rV   r   r   r   r   rX     s    z)read_context_disk_dir.<locals>.<listcomp>zpublic-keys)SET_HOSTNAMEHOSTNAME	PUBLIC_IP	IP_PUBLICETH0_IPzlocal-hostname	USER_DATAr#   USERDATAUSERDATA_ENCODINGUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdatac                 S   s   g | ]
}t d |r|qS )z^ETH\d+_IP.*$)re   rf   rU   r   r   r   rX     s    r"   )CONTEXT_DISK_FILESr   r   r   isfiler0   pwdgetpwnamKeyErrorr1   formatr   	load_filer   r   ProcessExecutionErrorIOErrorr'   
splitlinesr   b64d	TypeErrorr3   r4   rT   r   )
source_dirr   r   foundaffnr]   r<   er   r   ssh_key_varlinesrW   encodingipaddr_keysonetr   r   r   r+     s   





r+   c                    s"   t  }t fdd| D S )Nc                    s$   g | ]\}} j |r||fqS r   )
networkingis_physical)rV   rk   nr   r   r   rX     s   $ z,get_physical_nics_by_mac.<locals>.<listcomp>)r   get_interfaces_by_macdictrb   )r   r   r   r  r   r^     s   r^   c                 C   s   t | tS rE   )r   list_from_dependsdatasources)dependsr   r   r   get_datasource_list
  r   r
  )NNNNrE   )#r_   r-   r   r   re   r   	cloudinitr   r   loggingr   r   r   r   	getLoggerrL   r3   r$   r%   r   r   r
   	Exceptionr0   r1   rT   r)   r   r   r+   r^   DataSourceOpenNebulaNetDEP_FILESYSTEMr  r
  r   r   r   r   <module>   s8   
b 

k`
