
    x[h>                     V   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	J
r
JrJrJr  \R                  " \5      rSrSrS/rSr " S S\R*                  5      r " S	 S
\5      r " S S\5      r " S S5      rS rS rS rSS jrSS jrS r \r!\\RD                  44/r#S r$g)    N)atomic_helpernetsourcessubputilziid-dsopennebulanobody
context.sh)EPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDS_SRANDOM__vc                   J    \ rS rSrSrS rS rS rS r\	S 5       r
SS jrS	rg
)DataSourceOpenNebula+   
OpenNebulac                     [         R                  R                  XX#5        S U l        [        R
                  R                  UR                  S5      U l        S U l        g )N
opennebula)	r   
DataSource__init__seedospathjoinseed_dirnetwork)selfsys_cfgdistropathss       H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr   DataSourceOpenNebula.__init__/   s@    ##D6A	U^^\B    c                     [         R                  R                  U 5      nU< SU R                  < SU R                  < S3$ )Nz [seed=z	][dsmode=])r   r   __str__r   dsmode)r    roots     r$   r)   DataSourceOpenNebula.__str__5   s-    !!))$/,0$))T[[IIr&   c                 V   S[         0nS nS n[        nSU R                  ;   a  U R                  R                  S5      nU R                  /nUR                  [        5       5        U H  n [        R                  R                  U R                  5      (       a  [        X`R                  US9nOPUR                  S5      (       a:  [        R                  " [        UU R                  S9n[        R                   " Xg5      nU(       d  M  Un[(        R-                  SU5          O   U(       d  gUS	   n	[        R.                  " X/5      n	U R1                  UR                  S
5      U R                  R                  S5      /5      U l        U R2                  [4        R6                  :X  a  gX0l        UR                  S5      U l        Xl        UR                  S5      U l        g! ["         a     GM  [$         a  nUeS nAf[        R&                   a    [(        R+                  SU5         GN*f = f)Nzinstance-id	parseuserasuserz/dev)r0   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   r1   userdata_raw)
r    defaultsresultsr   r.   
candidatescdevpartially_applied_funcexcmds
             r$   	_get_dataDataSourceOpenNebula._get_data9   s   !;/ &	$++%4Imm_
-/0D:77==//3kk)G __V,, .7->->-(#{{.*
 #mmDIG w		2D95 8  Z / ,,[["DKKOOH$=>
 ;;'111	{{#78#KK
3? % ' 	(( :2D9:s,   *AG-AG
H(,	H(5G77-H('H(c                 h    U R                   U R                  ;   a  SnOSnU< SU R                  < S3$ )z/Return the subplatform metadata source details.zseed-dirzconfig-diskz ())r   r   )r    subplatform_types     r$   _get_subplatform%DataSourceOpenNebula._get_subplatformv   s-    ==DII%),,dii88r&   c                 6    U R                   b  U R                   $ g N)r   )r    s    r$   network_config#DataSourceOpenNebula.network_config~   s    <<#<<r&   c                     Uc#  U R                   [        R                  :X  a  SnOSn[        R                  R	                  XU5      $ )NTF)r*   r   DSMODE_NETWORKr   get_hostname)r    fqdn
resolve_ipmetadata_onlys       r$   r_   !DataSourceOpenNebula.get_hostname   s=    {{g444!
"
!!..t:FFr&   )r*   r1   r   r   r   rJ   N)FFF)__name__
__module____qualname____firstlineno__dsnamer   r)   rR   rW   propertyr[   r_   __static_attributes__ r&   r$   r   r   +   s7    FJ;z9  Gr&   r   c                       \ rS rSrSrg)rA      rk   Nrd   re   rf   rg   rj   rk   r&   r$   rA   rA          r&   rA   c                       \ rS rSrSrg)rB      rk   Nrn   rk   r&   r$   rB   rB      ro   r&   rB   c                   d    \ rS rSrSS jrS rS rS rS rS r	S	 r
S
 rS rS rSS jrS rSrg)OpenNebulaNetwork   Nc                    Xl         Uc  [        U5      n[        R                  " [	        UR                  5       S S9 Vs/ s H  nUPM     sn5      U l        0 U l        UR                  5        HQ  u  pE[        R                  " SU5      nU(       d  M%  UR                  S5      U R                  UR                  5       '   MS     g s  snf )Nc                 4    [         R                  " U S   5      $ )N   )r   natural_sort_key)ks    r$   <lambda>,OpenNebulaNetwork.__init__.<locals>.<lambda>   s    #"6"6qt"<r&   )keyz
^(.+)_MAC$rw   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r    r}   r"   system_nics_by_macry   vms          r$   r   OpenNebulaNetwork.__init__   s    %!9&!A!--  &,,.<A 
  "MMODA*Aq23''!*$$QWWY/ $s    Cc                     SR                  UR                  S5      SS   Vs/ s H  n[        [        US5      5      PM     sn5      $ s  snf )N.:      )r   splitstrint)r    maccs      r$   mac2ipOpenNebulaNetwork.mac2ip   s>    xx#))C.2DE2DQSBZ2DEFFEs   Ac                 ,   0 nU R                  USS5      R                  5       nUR                  U R                  R	                  SS5      R                  5       5        U(       a  X2S'   U R                  USS5      R                  5       nU(       a  XBS'   U$ )Ndns DNS	addressessearch_domainsearch)	get_fieldr   r9   r}   r8   )r    devnameserversr   r   s        r$   get_nameservers!OpenNebulaNetwork.get_nameservers   s    nnS%,224

4<<##E2.4467'*$sOR@FFH$1!r&   c                 &    U R                  US5      $ )Nmtur   r    r   s     r$   get_mtuOpenNebulaNetwork.get_mtu   s    ~~c5))r&   c                 F    U R                  USU R                  U5      5      $ )Nip)r   r   )r    r   r   s      r$   get_ipOpenNebulaNetwork.get_ip   s    ~~c4S)9::r&   c                     / nU R                  US5      nU(       a  UR                  U5        U R                  US5      nU(       a  UR                  U5        U$ )Nip6ip6_ula)r   append)r    r   
addresses6r   r   s        r$   get_ip6OpenNebulaNetwork.get_ip6   sO    
nnS%(c"..i0g&r&   c                 (    U R                  USS5      $ )Nip6_prefix_length64r   r   s     r$   get_ip6_prefix OpenNebulaNetwork.get_ip6_prefix   s    ~~c#6==r&   c                 &    U R                  US5      $ )Ngatewayr   r   s     r$   get_gatewayOpenNebulaNetwork.get_gateway   s    ~~c9--r&   c                 H    U R                  USU R                  US5      5      $ )Nip6_gatewaygateway6r   r   s     r$   get_gateway6OpenNebulaNetwork.get_gateway6   s'     ~~sJ ?
 	
r&   c                 (    U R                  USS5      $ )Nmaskz255.255.255.0r   r   s     r$   get_maskOpenNebulaNetwork.get_mask   s    ~~c6?;;r&   c                     U R                   R                  SR                  UU45      R                  5       5      nUS;   a  U$ U$ )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   )r}   r8   r   upper)r    r   namedefaultvals        r$   r   OpenNebulaNetwork.get_field   sL    
 llHH
 eg
 +w44r&   c                 0   0 nSUS'   0 US'   0 nU R                   R                  5        GH_  u  p4UR                  5       nU R                  R	                  X45      n0 nSU0US'   / US'   U R                  U5      n[        [        R                  " U5      5      nUS   R                  U R                  XS5      S-   U-   5        U R                  U5      n	U	(       a;  U R                  U5      n
US   R                  U	 Vs/ s H
  oS-   U
-   PM     sn5        U R                  U5      nU(       a  XS'   U R                  U5      nU(       a  XS	'   U R!                  U5      nU(       a  XS
'   U R#                  U5      nU(       a  XS'   XbU'   GMb     X!S'   U$ s  snf )Nr   version	ethernets
macaddressr   r   /gateway4r   r   r   )r   r   r   r   r8   r   r   r   ipv4_mask_to_net_prefixr   r   r   r   r9   r   r   r   r   )r    netconfr   r   r   c_devdevconfr   prefixr   prefix6ir   r   r   r   s                   r$   gen_confOpenNebulaNetwork.gen_conf   s   	!	))+HC))+C ((,,S6EG !-c2GG $&GK =='D44T:;FK ''E(?#(E(NO e,J--e4$++0:;
1Ww&
;
 &&u-G&-
# ((/H&.
# ..u5K)4& ,,u%C!$$cN] ,`  )5 <s   <F
)r}   r   r   rZ   )rd   re   rf   rg   r   r   r   r   r   r   r   r   r   r   r   r   rj   rk   r&   r$   rs   rs      s?    =,G	*;>.
<5 7r&   rs   c                      / n S HJ  n[         R                  " U5      nUR                  5         U H  nX0;  d  M
  U R                  U5        M     ML     U $ )z=
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:   &  sO     H=""1%		A "  > Or&   c                     SSU /$ )Nsudoz-urk   users    r$   switch_user_cmdr   5  s    D$r&   c                  .    [         R                  " S5      $ )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dedentrk   r&   r$   
varprinterr   9  s    ??	 r&   c                    SU R                  5       ;   a  [        R                  S5        [        5       SU -  -   [        5       -   S-   n/ nUb  [	        U5      nUR                  SS/5        [        R                  " X2S9R                  n0 nUR                  S	5      S
S nUS   US   p[        S [        R                  " U5       5       5      n	[        S [        R                  " U5       5       5      n
[        U	R                  5       5      R                  [        U
R                  5       5      5       H?  nU[        ;   a  M  U
R                  U5      nUc  M%  XR                  U5      :w  d  M;  XU'   MA     U$ )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_ rw   r   r   c              3   @   #    U  H  oR                  S SS9v   M     g7f=rw   )maxsplitNr   .0variables     r$   	<genexpr>%parse_shell_config.<locals>.<genexpr>}  s      8KHsQ'8K   c              3   @   #    U  H  oR                  S SS9v   M     g7fr   r   r   s     r$   r   r     s      8JHsQ'8Jr   )encoderD   rE   r   r   r9   r   stdoutr   dictshlexsetkeysunionEXCLUDED_VARSr8   )contentr0   bcmdcmdoutputretsectionsbeforeafterpre_envpost_envr|   values                r$   parse_shell_configr  F  se    ))-	
$ 	
''
1	2
,	 	 	 Cf%JJd|YYs&--F C ||M*12.H
 QK!E 8=F8K G  8=E8J H 7<<>"((X]]_)=>-S!++c*:!:H ? Jr&   c                    0 n[          HL  n[        R                  R                  X5      n[        R                  R	                  U5      (       d  MH  XSU'   MN     U(       d  [        U < SS< 35      e0 nS0 S.nSU;   a[  Ub   [        R                  " U5         [        R                  R                  U S5      n	[        R                  " U	5      n
[        XS9nO[        S5      eU(       d  U$ XgS'   SnSU;   a  SnOSU;   a  SnU(       ab  UR#                  U5      R%                  5       nU Vs/ s H/  n['        U5      (       d  M  UR)                  S5      (       a  M-  UPM1     snUS   S'   S H  nX;   d  M
  Xn   US   S'     O   SU;   a	  US   US'   OSU;   a  US   US'   SU;   aD  UR#                  SUR#                  S5      5      nUS:X  a   [*        R,                  " US   5      US'   U Vs/ s H#  n[4        R6                  " SU5      (       d  M!  UPM%     nnU(       a  [9        Xa5      nUR;                  5       US'   U$ ! [         a  n[        SR                  US95      UeSnAff = f! [        R                   a  n[        S	U-  5      UeSnAf[          a  n[        S
U-  5      UeSnAff = fs  snf ! [.         a    [0        R3                  S5         Nf = fs  snf )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)r4   r1   r	   z'configured user '{user}' does not existr   r/   zError processing context.sh: %szError reading context.sh: %szMissing context.shr1   SSH_KEYSSH_PUBLIC_KEY#zpublic-keys)SET_HOSTNAMEHOSTNAME	PUBLIC_IP	IP_PUBLICETH0_IPzlocal-hostname	USER_DATAr4   USERDATAUSERDATA_ENCODINGUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdataz^ETH\d+_IP.*$r3   )CONTEXT_DISK_FILESr   r   r   isfilerA   pwdgetpwnamKeyErrorrB   formatr   load_text_filer  r   ProcessExecutionErrorIOErrorr8   
splitlineslenr=   r   b64d	TypeErrorrD   rE   r   r   rs   r   )
source_dirr"   r0   foundaffnr}   rL   er   r  ssh_key_varlineslinery   encodingipaddr_keysonets                     r$   r<   r<     s    E WW\\*)77>>""I !
 J8H IJJGR0GuV$	77<<
L9D))$/G(@G   455!J KG	W	$&K(335".
"Tc$iD8LDU.

M* O<4;JGJ 01 O g%k2
	w	%j1
 W;;-A!B
 xB&3&8&89L&M
# &Gg2BA)F1gKG 1(,$%NO  *=DD# E  	 )) 	&1Q7  	#.!4	*.
2  B@AB Hsl   I ?I1 /J8J8J8J= 3 K"K"
I.I))I.1J5JJ5!J00J5=KKc           	          [         R                  " 5       n[        UR                  5        VVs/ s H*  u  p#U R                  R                  U5      (       d  M'  X#4PM,     snn5      $ s  snnf rZ   )r   get_interfaces_by_macr   r   
networkingis_physical)r"   r   r   ns       r$   r~   r~     sQ    $$&D JJLMLDAF,=,=,I,I!,L!LM Ms   &A'
A'
c                 8    [         R                  " U [        5      $ rZ   )r   list_from_dependsdatasources)dependss    r$   get_datasource_listr@    s    $$Wk::r&   rZ   )%r   r>   loggingr   r!  r   r   r   	cloudinitr   r   r   r   r   	getLoggerrd   rD   r5   r6   r  r  r   r   	ExceptionrA   rB   rs   r:   r   r   r  r<   r~   DataSourceOpenNebulaNetDEP_FILESYSTEMr>  r@  rk   r&   r$   <module>rG     s       	 
 	   = =!  "^ 	`G7-- `GF		 		9 	M M` 
DN]@ /  G2245;r&   