
    f?                     B   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j                  e      ZdZdZdgZ G d de
j&                        Z G d d	e      Z G d
 de      Z G d d      Zd Zd Z	 ddZddZd ZeZee
j>                  ffgZ d Z!y)    N)atomic_helpernetsourcessubputilziid-dsopennebulanobody
context.shc                   @    e Zd ZdZd Zd Zd Zd Zed        Z	d	dZ
y)
DataSourceOpenNebula
OpenNebulac                     t         j                  j                  | |||       d | _        t        j
                  j                  |j                  d      | _        y )N
opennebula)r   
DataSource__init__seedospathjoinseed_dir)selfsys_cfgdistropathss       H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr   zDataSourceOpenNebula.__init__$   s=    ##D'65A	U^^\B    c                 ~    t         j                  j                  |       }|d| j                  d| j                  dS )Nz [seed=z	][dsmode=])r   r   __str__r   dsmode)r   roots     r   r   zDataSourceOpenNebula.__str__)   s-    !!))$/,0$))T[[IIr   c                 ,   dt         i}d }d }t        }d| j                  v r| j                  j                  d      }| j                  g}|j                  t                      |D ]  }	 t        j                  j                  | j                        rt        || j                  |      }nM|j                  d      r<t        j                  t        || j                        }t        j                   ||      }|s|}t(        j-                  d|        n |sy|d	   }	t        j.                  |	|g      }	| j1                  |j                  d
      | j                  j                  d      g      | _        | j2                  t4        j6                  k(  ry|| _        |j                  d      | _        |	| _        |j                  d      | _        y# t"        $ r Y ut$        $ r}|d }~wt        j&                  $ r t(        j+                  d|       Y w xY w)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mds
             r   	_get_datazDataSourceOpenNebula._get_data-   s   !;/ &	$++%4Imm_
-/0 	D:77==/3dkk)G __V, .7->->-(#{{.*
 #mmD2HIG 		2D95	8  Z X/ ,,[["DKKOOH$=>
 ;;'111	{{#78#KK
3? % ' 	(( :2D9:s%   (BG	HH!G##,HHc                 `    | j                   | j                  v rd}nd}|d| j                  dS )z/Return the subplatform metadata source details.zseed-dirzconfig-diskz ())r   r   )r   subplatform_types     r   _get_subplatformz%DataSourceOpenNebula._get_subplatformj   s-    ==DII%),,dii88r   c                 4    | j                   | j                   S y N)r>   )r   s    r   network_configz#DataSourceOpenNebula.network_configr   s    <<#<<r   c                     |"| j                   t        j                  k(  rd}nd}t        j                  j	                  | ||      S )NTF)r   r   DSMODE_NETWORKr   get_hostname)r   fqdn
resolve_ipmetadata_onlys       r   rQ   z!DataSourceOpenNebula.get_hostnamey   s?    {{g444!
"
!!..tT:FFr   N)FFF)__name__
__module____qualname__dsnamer   r   rG   rK   propertyrN   rQ    r   r   r   r       s8    FC
J;z9  Gr   r   c                       e Zd Zy)r5   NrU   rV   rW   rZ   r   r   r5   r5          r   r5   c                       e Zd Zy)r6   Nr\   rZ   r   r   r6   r6      r]   r   r6   c                   X    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd ZddZd Zy)OpenNebulaNetworkNc                    || _         |t        |      }t        j                  t	        |j                         d       D cg c]  }| c}      | _        i | _        |j                         D ]J  \  }}t        j                  d|      }|s|j                  d      | j                  |j                         <   L y c c}w )Nc                 2    t        j                  | d         S )N   )r   natural_sort_key)ks    r   <lambda>z,OpenNebulaNetwork.__init__.<locals>.<lambda>   s    #"6"6qt"< r   )keyz
^(.+)_MAC$rc   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r   rh   r   system_nics_by_macre   vms          r   r   zOpenNebulaNetwork.__init__   s    %!9&!A!--  &,,.< 
  "MMO 	=DAq*A23''!*$$QWWY/	=s   	B<c                     dj                  |j                  d      dd  D cg c]  }t        t        |d             c}      S c c}w )N.:      )r   splitstrint)r   maccs      r   mac2ipzOpenNebulaNetwork.mac2ip   s8    xx#))C.2DEQSBZEFFEs   Ac                    i }| j                  |dd      j                         }|j                  | j                  j	                  dd      j                                |r||d<   | j                  |dd      j                         }|r||d<   |S )Ndns DNS	addressessearch_domainsearch)	get_fieldr|   r-   rh   r,   )r   devnameserversr   r   s        r   get_nameserversz!OpenNebulaNetwork.get_nameservers   s    nnS%,224

4<<##E2.4467'*K$sOR@FFH$1K!r   c                 &    | j                  |d      S )Nmtur   r   r   s     r   get_mtuzOpenNebulaNetwork.get_mtu   s    ~~c5))r   c                 F    | j                  |d| j                  |            S )Nip)r   r   )r   r   r   s      r   get_ipzOpenNebulaNetwork.get_ip   s    ~~c4S)9::r   c                     g }| j                  |d      }|r|j                  |       | j                  |d      }|r|j                  |       |S )Nip6ip6_ula)r   append)r   r   
addresses6r   r   s        r   get_ip6zOpenNebulaNetwork.get_ip6   sO    
nnS%(c"..i0g&r   c                 (    | j                  |dd      S )Nip6_prefix_length64r   r   s     r   get_ip6_prefixz OpenNebulaNetwork.get_ip6_prefix   s    ~~c#6==r   c                 &    | j                  |d      S )Ngatewayr   r   s     r   get_gatewayzOpenNebulaNetwork.get_gateway   s    ~~c9--r   c                 H    | j                  |d| j                  |d            S )Nip6_gatewaygateway6r   r   s     r   get_gateway6zOpenNebulaNetwork.get_gateway6   s'     ~~sJ ?
 	
r   c                 (    | j                  |dd      S )Nmaskz255.255.255.0r   r   s     r   get_maskzOpenNebulaNetwork.get_mask   s    ~~c6?;;r   c                     | j                   j                  dj                  ||f      j                               }|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._)Nr   )rh   r,   r   upper)r   r   namedefaultvals        r   r   zOpenNebulaNetwork.get_field   sL    
 llHH
 eg
 +w44r   c                    i }d|d<   i |d<   i }| j                   j                         D ]J  \  }}|j                         }| j                  j	                  ||      }i }d|i|d<   g |d<   | j                  |      }t        t        j                  |            }|d   j                  | j                  ||      dz   |z          | j                  |      }	|	r9| j                  |      }
|d   j                  |	D cg c]
  }|dz   |
z    c}       | j                  |      }|r||d<   | j                  |      }|r||d	<   | j!                  |      }|r||d
<   | j#                  |      }|r||d<   |||<   M ||d<   |S c c}w )Nrz   version	ethernets
macaddressrq   r   /gateway4r   r   r   )rn   rm   rs   ro   r,   r   r}   r   ipv4_mask_to_net_prefixr   r   r   r   r-   r   r   r   r   )r   netconfr   r   r   c_devdevconfr   prefixr   prefix6ir   r   r   r   s                   r   gen_confzOpenNebulaNetwork.gen_conf   s   	!	))+ .	%HC))+C ((,,S#6EG !-c2GG $&GK =='D44T:;FK ''E3(?#(E(NO e,J--e4$++0:;1QWw&;
 &&u-G&-
# ((/H&.
# ..u5K)4& ,,u%C!$$IcN].	%`  )5 <s   9E>
rM   )rU   rV   rW   r   r   r   r   r   r   r   r   r   r   r   r   rZ   r   r   r`   r`      s?    =,G	*;>.
<5 7r   r`   c                      g } dD ]D  }t        j                  |      }|j                          |D ]  }|| vs| j                  |        F | 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ds       r   r.   r.     s[     H= #""1%		 	#A "	## Or   c                     dd| gS )Nsudoz-urZ   users    r   switch_user_cmdr   )  s    D$r   c                    t        |t              r|g}n|ddg}|t        }t        j                  dz   D cg c]  }d|z  	 }}|}||}g }dj                  d      }d }	d|z    |	|      z   d	| z  z   dz    |	|      z   dz   }
g }| ||      }|j                  |       t        j                  ||

      \  }}d}i }i }d }|dd }|j                  d      D ]C  }	 |j                  dd      \  }}||u r|||<   n!||vr||v s|j                  |      |k7  r|||<   E |S c c}w # t        $ r |dk7  r ||}n||u r|}Y iw xY w)Nbashz-er   z${!%s*}
)z__v="";r   c                 R    dj                  dddj                  |       z  dddf      S )Nr   zprintf "%s\0" _start_zfor __v in %s; do z%   printf "%s=%s\0" "$__v" "${!__v}";doner   )r   )vlists    r   
varprinterz&parse_shell_config.<locals>.varprinterI  s4    yy(#chhuo58
 	
r   z
unset IFS
z{
%s

:
} > /dev/null
)data)EPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDSr   SRANDOM__vr    =rc   _start_)
isinstancer}   r   stringascii_lettersr   r-   r   r|   r,   
ValueError)contentkeylistr   r$   switch_user_cbxallvars
keylist_insetupr   bcmdcmdoutput_errorexcludedpresetrettargetlinerg   r   s                        r   parse_shell_configr   -  s    $v	~( '-&:&:S&@Ay1}AGAJ
II	
E

0 	
	
W
	 ('
1	2 		
 W
	 	 	 CV$JJtyy40VV	H F
CFAb\F V$ 	C+JS#!sH$z!VZZ_%;C" Ju Bd  	y ~6!	s   D"A D''EEc                 H   i }t         D ]G  }t        j                  j                  | |      }t        j                  j	                  |      sC|||<   I |st        | dd      i }di d}d|v r\|	 t        j                  |       	 t        j                  j                  | d      }	t        j                  |	      }
t        |
|      }nt        d      |s|S ||d<   d}d|v rd}nd|v rd}|rS|j#                  |      j%                         }|D cg c]"  }t'        |      s|j)                  d      r!|$ c}|d   d<   dD ]  }||v s||   |d   d<    n d|v r	|d   |d<   nd|v r|d   |d<   d|v rB|j#                  d|j#                  d            }|dk(  r	 t+        j,                  |d         |d<   |D cg c]  }t5        j6                  d|      s| }}|rt9        ||      }|j;                         |d<   |S # t        $ r!}t        dj                  |            |d}~ww xY w# t        j                  $ r}t        d	|z        |d}~wt         $ r}t        d
|z        |d}~ww xY wc c}w # t.        $ r t0        j3                  d       Y w xY wc c}w )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: z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_KEY#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 userdataz^ETH\d+_IP.*$r'   )CONTEXT_DISK_FILESr   r   r   isfiler5   pwdgetpwnamKeyErrorr6   formatr   load_text_filer   r   ProcessExecutionErrorIOErrorr,   
splitlineslenr1   r   b64d	TypeErrorr8   r9   rp   rq   r`   r   )
source_dirr   r$   foundaffnrh   rA   er   r   ssh_key_varlinesr   re   encodingipaddr_keysonets                     r   r0   r0     s    E  WW\\*b)77>>"E"I
 J8H IJJGR0GuV$	77<<
L9D))$/G(@G   455!GJ KG	W	$&K(335".
c$i8LD.

M* O <4;AJGJ 01 g%k2
	w	%j1
 W;;-A!B
 xB&3&8&89L&M
# &G2BA)F1GKG &1(,$%NO  *=DD# E  	 )) 	&1Q7  	#.!4	*.
2  B@AB Hsm   3H 	AH1 I6%I67I6 I; ?JJ	H.H))H.1I3II3I..I3;JJc           	          t        j                         }t        |j                         D cg c]%  \  }}| j                  j                  |      s"||f' c}}      S c c}}w rM   )r   get_interfaces_by_macdictrm   
networkingis_physical)r   r   rv   ns       r   ri   ri     sO    $$&D JJLMDAqF,=,=,I,I!,L!QM Ms   #A
A
c                 6    t        j                  | t              S rM   )r   list_from_dependsdatasources)dependss    r   get_datasource_listr!  	  s    $$Wk::r   )NNNNrM   )"rj   r2   loggingr   r  rp   r   	cloudinitr   r   r   r   r   	getLoggerrU   r8   r)   r*   r   r   r   	Exceptionr5   r6   r`   r.   r   r   r0   ri   DataSourceOpenNebulaNetDEP_FILESYSTEMr  r!  rZ   r   r   <module>r(     s       	 
 	  = =g!  "^ _G7-- _GD		 		9 	M M` 
 CGhV]@ /  G2245;r   