
    }f>                     R   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j                  e      ZdZdZdgZd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 ZddZddZd Z eZ!eejD                  ffgZ#d Z$y)    N)atomic_helpernetsourcessubputilziid-dsopennebulanobody
context.sh)EPOCHREALTIMEEPOCHSECONDSRANDOMLINENOSECONDS_SRANDOM__vc                   @    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      | _        d | _        y )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   zDataSourceOpenNebula.__init__/   sD    ##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__5   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   r   r.   userdata_raw)
r   defaultsresultsr   r+   
candidatescdevpartially_applied_funcexcmds
             r#   	_get_datazDataSourceOpenNebula._get_data9   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_subplatformv   s-    ==DII%),,dii88r$   c                 4    | j                   | j                   S y N)r   )r   s    r#   network_configz#DataSourceOpenNebula.network_config~   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#   rY   z!DataSourceOpenNebula.get_hostname   s?    {{g444!
"
!!..tT:FFr$   N)FFF)__name__
__module____qualname__dsnamer   r'   rO   rS   propertyrV   rY    r$   r#   r   r   +   s7    FJ;z9  Gr$   r   c                       e Zd Zy)r>   Nr]   r^   r_   rb   r$   r#   r>   r>          r$   r>   c                       e Zd Zy)r?   Nrd   rb   r$   r#   r?   r?      re   r$   r?   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$rk   )contextget_physical_nics_by_maccollectionsOrderedDictsorteditemsifacescontext_devnamerematchgrouplower)r   rp   r!   system_nics_by_macrm   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   r6   rp   r5   )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.r   )Nr   )rp   r5   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 )Nr   version	ethernets
macaddressry   r   /gateway4r   r   r   )rv   ru   r{   rw   r5   r   r   r   ipv4_mask_to_net_prefixr   r   r   r   r6   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>
rU   )r]   r^   r_   r   r   r   r   r   r   r   r   r   r   r   r   rb   r$   r#   rh   rh      s?    =,G	*;>.
<5 7r$   rh   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#   r7   r7   &  s[     H= #""1%		 	#A "	## Or$   c                     dd| gS )Nsudoz-urb   users    r#   switch_user_cmdr   5  s    D$r$   c                  ,    t        j                  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dedentrb   r$   r#   
varprinterr   9  s    ??	 r$   c                    d| j                         v rt        j                  d       t               d| z  z   t               z   dz   }g }|t	        |      }|j                  ddg       t        j                  ||      j                  }i }|j                  d	      d
d }|d   |d   }}t        d t        j                  |      D              }	t        d t        j                  |      D              }
t        |	j                               j                  t        |
j                                     D ]9  }|t        v r|
j                  |      }| ||	j                  |      k7  s5|||<   ; |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_ rk   r   r   c              3   B   K   | ]  }|j                  d d        yw=rk   )maxsplitNr   .0variables     r#   	<genexpr>z%parse_shell_config.<locals>.<genexpr>}  s"      ,4sQ'   c              3   B   K   | ]  }|j                  d d        ywr   r   r   s     r#   r   z%parse_shell_config.<locals>.<genexpr>  s"      ,4sQ'r   )encoderA   rB   r   r   r6   r   stdoutr   dictshlexsetkeysunionEXCLUDED_VARSr5   )contentr-   bcmdcmdoutputretsectionsbeforeafterpre_envpost_envro   values                r#   parse_shell_configr   F  sr    ))-	
$ 	
''
1	2
,	 	 	 Cf%JJd|YYs&--F C ||M*12.H
 QK!EF 8=F8K G  8=E8J H 7<<>"((X]]_)=> -S!'++c*:!:CH Jr$   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)r1   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_DATAr1   USERDATAUSERDATA_ENCODINGUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdataz^ETH\d+_IP.*$r0   )CONTEXT_DISK_FILESr   r   r   isfiler>   pwdgetpwnamKeyErrorr?   formatr   load_text_filer   r   ProcessExecutionErrorIOErrorr5   
splitlineslenr:   r   b64d	TypeErrorrA   rB   rx   ry   rh   r   )
source_dirr!   r-   foundaffnrp   rI   er   r   ssh_key_varlineslinerm   encodingipaddr_keysonets                     r#   r9   r9     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 rU   )r   get_interfaces_by_macr   ru   
networkingis_physical)r!   r   r~   ns       r#   rq   rq     sO    $$&D JJLMDAqF,=,=,I,I!,L!QM Ms   #A
A
c                 6    t        j                  | t              S rU   )r   list_from_dependsdatasources)dependss    r#   get_datasource_listr&    s    $$Wk::r$   rU   )%rr   r;   loggingr   r  rx   r   r   	cloudinitr   r   r   r   r   	getLoggerr]   rA   r2   r3   r  r   r   r   	Exceptionr>   r?   rh   r7   r   r   r   r9   rq   DataSourceOpenNebulaNetDEP_FILESYSTEMr$  r&  rb   r$   r#   <module>r-     s       	 
 	   = =g!  "^ 	`G7-- `GF		 		9 	M M` 
DN]@ /  G2245;r$   