o
    f>                     @   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Zd dlZd dlm	Z	m
Z
mZmZmZ eeZdZdZdgZd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 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netsourcessubputilziid-dsopennebulanobody
context.sh)EPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDS_SRANDOM__vc                   @   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   s4   t j| ||| d | _tj|jd| _d | _d S )N
opennebula)	r   
DataSource__init__seedospathjoinseed_dirnetwork)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"   5   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   r   r(   userdata_raw)
r   defaultsresultsr   r%   
candidatescdevpartially_applied_funcexcmdr    r    r!   	_get_data9   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_subplatformv   s   z%DataSourceOpenNebula._get_subplatformc                 C   s   | j d ur| j S d S N)r   )r   r    r    r!   network_config~   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!   rO      s
   z!DataSourceOpenNebula.get_hostnameN)FFF)__name__
__module____qualname__dsnamer   r"   rI   rK   propertyrM   rO   r    r    r    r!   r   +   s    =
r   c                   @      e Zd ZdS )r8   NrS   rT   rU   r    r    r    r!   r8          r8   c                   @   rX   )r9   NrY   r    r    r    r!   r9      rZ   r9   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)r^   r    r    r!   <lambda>   s    z,OpenNebulaNetwork.__init__.<locals>.<lambda>)keyz
^(.+)_MAC$r`   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r   rd   r   system_nics_by_macr^   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)r]   cr    r    r!   r_      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_fieldrz   r0   rd   r/   )r   devnameserversr}   r   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   r|   )r   r   r{   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.r   )Nr~   )rd   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 )Nry   version	ethernets
macaddressrm   r   /c                    s   g | ]}|d    qS )r   r    )r]   iprefix6r    r!   r_   	  s    z.OpenNebulaNetwork.gen_conf.<locals>.<listcomp>gateway4r   r   r   )rj   ri   ro   rk   r/   r   ru   r   ipv4_mask_to_net_prefixr   r   r   r   r0   r   r   r   r   )r   netconfr   r{   r   c_devdevconfr   prefixr   r   r   r   r   r    r   r!   gen_conf   sD   







zOpenNebulaNetwork.gen_confrL   )rS   rT   rU   r   r|   r   r   r   r   r   r   r   r   r   r   r    r    r    r!   r[      s    


r[   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!   r1   &  s   

r1   c                 C   s
   dd| gS )Nsudoz-ur    userr    r    r!   switch_user_cmd5  s   
r   c                   C   s
   t dS )zDprint the shell environment variables within delimiters to be parsedz
        printf "%s\0" _start_
        [ $0 != 'sh' ] && set -o posix
        set
        [ $0 != 'sh' ] && set +o posix
        printf "%s\0" _start_
        )textwrapdedentr    r    r    r!   
varprinter9  s   r   c                 C   s  d|   v rtd t d|   t  d }g }|dur!t|}|ddg tj||dj}i }|d	d
d }|d |d }}t	dd t
|D }	t	dd t
|D }
t|	 t|
 D ]}|tv rpqi|
|}|dur||	|kr|||< qi|S )a<  run content and return environment variables which changed

    WARNING: the special variable _start_ is used to delimit content

    a context.sh that defines this variable might break in unexpected
    ways

    compatible with posix shells such as dash and ash and any shell
    which supports `set -o posix`
    s   _start_ zYUser defined _start_ variable in context.sh, this may breakcloud-init in unexpected ways.z{
%s

:
} > /dev/null

Nshz-e)dataz_start_ r`   r   ry   c                 s       | ]
}|j d ddV  qdS =r`   )maxsplitNrz   r]   variabler    r    r!   	<genexpr>}      
z%parse_shell_config.<locals>.<genexpr>c                 s   r   r   r   r   r    r    r!   r     r   )encoder;   r<   r   r   r0   r   stdoutrz   dictshlexsetkeysunionEXCLUDED_VARSr/   )contentr'   bcmdcmdoutputretsectionsbeforeafterpre_envpost_envrc   valuer    r    r!   parse_shell_configF  sD   
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 )#)lenr4   )r]   liner    r    r!   r_     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.*$)rl   rm   r\   r    r    r!   r_     s    r*   )CONTEXT_DISK_FILESr   r   r   isfiler8   pwdgetpwnamKeyErrorr9   formatr   load_text_filer   r   ProcessExecutionErrorIOErrorr/   
splitlinesr   b64d	TypeErrorr;   r<   r[   r   )
source_dirr   r'   foundaffnrd   rC   er   r   ssh_key_varlinesr^   encodingipaddr_keysonetr    r    r!   r3     s   





r3   c                    s"   t  }t fdd| D S )Nc                    s$   g | ]\}} j |r||fqS r    )
networkingis_physical)r]   rr   nr   r    r!   r_     s   $ z,get_physical_nics_by_mac.<locals>.<listcomp>)r   get_interfaces_by_macr   ri   )r   r   r    r  r!   re     s   re   c                 C   s   t | tS rL   )r   list_from_dependsdatasources)dependsr    r    r!   get_datasource_list  r   r  rL   )%rf   r5   loggingr   r   rl   r   r   	cloudinitr   r   r   r   r   	getLoggerrS   r;   r,   r-   r   r   r   r   	Exceptionr8   r9   r[   r1   r   r   r   r3   re   DataSourceOpenNebulaNetDEP_FILESYSTEMr
  r  r    r    r    r!   <module>   s:   
c 

G`
