
    x[h];                        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  S SKJ	r	  S SK
Jr  \R                  " \5      rSr/ SQr " S S\R"                  5      r " S	 S
\5      rS rS rS rSS\SS4S jrS r " S S\5      r " S S\5      r\\R8                  44\\R8                  \R:                  44/rS r\S:X  a  S r \ " 5         gg)    N)sources
url_helperutil)KlibcNetworkConfigSource)NetworkConfigSourcez
2012-03-01))meta-data/instance-idr   FF)meta-data/local-hostnamer	   FF)meta-data/public-keysr
   FT)zmeta-data/vendor-datavendor-dataTT)	user-datar   TTc                   f    \ rS rSrSrSrSrSrSrSr	S r
\S 5       rS	 rS
 rS rS rS rS rSrg)DataSourceMAAS   z
DataSourceMAAS reads instance information from MAAS.
Given a config metadata_url, and oauth tokens, it expects to find
files under the root named:
  instance-id
  user-data
  hostname
  vendor-data
MAASNx   2   c                     [         R                  R                  XX#5        S U l        [        R
                  R                  UR                  S5      U l        [        U R                  5      U l
        g )Nmaas)r   
DataSource__init__base_urlospathjoinseed_dirget_id_from_ds_cfgds_cfgid_hash)selfsys_cfgdistropathss       B/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceMAAS.pyr   DataSourceMAAS.__init__2   sI    ##D6AU^^V<)$++6    c                 p    U R                   (       d  [        U R                  5      U l         U R                   $ N)_oauth_helperget_oauth_helperr   r   s    r#   oauth_helperDataSourceMAAS.oauth_helper8   s(    !!!1$++!>D!!!r%   c                 h    [         R                  R                  U 5      nU< SU R                  < S3$ )Nz [])r   r   __str__r   )r   roots     r#   r/   DataSourceMAAS.__str__>   s'    !!))$/ $--00r%   c           
      ,   U R                   n U R                  U R                  [        U R                  5      5        g! [         a     O3[
         a'  n[        R                  SU R                  U5        e S nAff = fUR                  SS 5      nU(       d  g U R                  U5      (       d  gU R                  U[        UU R                  R                  U R                  SS95        g! [         a    [        R                   " [        SU5         gf = f)NTz%s was malformed: %smetadata_urlF   )read_file_or_urlr"   retriesz$Failed fetching metadata from url %s)r   	_set_datar   read_maas_seed_dirMAASSeedDirNoneMAASSeedDirMalformedLOGwarninggetwait_for_metadata_serviceread_maas_seed_urlr+   readurlr"   	Exceptionr   logexc)r   mcfgexcurls       r#   	_get_dataDataSourceMAAS._get_dataB   s    {{	NN4==*<T]]*KL 	# 	KK.sC	
 hh~t,	
 11#66NN"%)%6%6%>%>**	  	KKCSI	s3   /> 
A:
	A:"A55A:C* /:C* *&DDc                     Xl         Uu  p4nX0l        X@l        U(       a   [        R                  " U5      U l        g g ! [         a'  n[        R                  SU5        S U l         S nAg S nAff = f)Nz"Invalid content in vendor-data: %s)	r   userdata_rawmetadatar   convert_vendordatavendordata_raw
ValueErrorr;   r<   )r   rE   dataudmdvdes          r#   r7   DataSourceMAAS._set_datai   sg    
+&-&@&@&D#   +@!D&*##+s   = 
A.A))A.c                      SU R                   -  $ )z/Return the subplatform metadata source details.zseed-dir (%s))r   r*   s    r#   _get_subplatformDataSourceMAAS._get_subplatformv   s    ..r%   c                    U R                  5       nUR                  S:X  a  g[        R                  " 5       nUR	                  S5      nU< S[
        < S3nU/nU R                  R                  UUR                  UR                  S9u  pU(       a  [        R                  SU5        O6[        R                  SU[        [        R                  " 5       U-
  5      5        [        U5      $ )Nr   F/z/meta-data/instance-id)urlsmax_waittimeoutzUsing metadata source: '%s'z(Giving up on md from %s after %i seconds)get_url_paramsmax_wait_secondstime	monotonicrstrip
MD_VERSIONr+   wait_for_urltimeout_secondsr;   debugcriticalintbool)r   rE   
url_params	starttime	check_urlrY   	_responses          r#   r>   (DataSourceMAAS.wait_for_metadata_servicez   s    ((*
&&!+NN$	jjo58*E	{**7700.. 8 
 II3S9LL:DNN$y01 Cyr%   c                     U R                   c  g[        R                  " USU R                  40 5      nU R                   [	        U5      :H  $ )zlocally check if the current system is the same instance.

MAAS doesn't provide a real instance-id, and if it did, it is
still only available over the network.  We need to check based
only on local resources.  So compute a hash based on Oauth tokens.F
datasource)r   r   get_cfg_by_pathdsnamer   )r   r    ncfgs      r#   check_instance_id DataSourceMAAS.check_instance_id   sC     <<##GlDKK-H"M||1$777r%   )r(   r   r   rJ   r   rI   rL   )__name__
__module____qualname____firstlineno____doc__rp   r   r(   url_max_waiturl_timeoutr   propertyr+   r/   rF   r7   rU   r>   rr   __static_attributes__ r%   r#   r   r      s\     FGM LK7 " "
1%N+/4	8r%   r   c                      ^  \ rS rSr\R
                  \R                  \R                  \R                  4r	U 4S jr
SrU =r$ )DataSourceMAASLocal   c                    > [        5       R                  5       (       d  [        R                  S5        g[        R                  S5        [        TU ]  5       $ )NzNo initramfs applicable configFz!Found initramfs applicable config)r   is_applicabler;   rd   superrF   )r   	__class__s    r#   rF   DataSourceMAASLocal._get_data   sB    ')7799 II67		56w ""r%   r}   )rt   ru   rv   rw   r   CMD_LINE
SYSTEM_CFGDS	INITRAMFSnetwork_config_sourcesrF   r|   __classcell__)r   s   @r#   r   r      s9    $$&&%%	# #r%   r   c           	          Sn[        U Vs/ s H  o"U R                  U5      4PM     sn5      n[        R                  " S0 UD6$ s  snf )zReturn an oauth helper instance for values in cfg.

@raises ValueError from OauthUrlHelper if some required fields have
true-ish values but others do not.)consumer_keyconsumer_secret	token_keytoken_secretr}   )dictr=   r   OauthUrlHelper)cfgkeysrkwargss       r#   r)   r)      sF    
 LDD1Dqswwqz?D12F$$.v.. 2s   Ac           	          SnSR                  U Vs/ s H  o R                  US5      PM     sn5      nS[        R                  " UR	                  S5      5      R                  5       -   $ s  snf )z;Given a config, generate a unique identifier for this node.)r   r   r     zv1:zutf-8)r   r=   hashlibsha256encode	hexdigest)r   fieldsfidstrs       r#   r   r      sZ    :FII&9&Qzz!R(&9:E 7>>%,,w"78BBDDD :s   A*c                     U R                  S5      (       a  U SS  n [        R                  R                  U 5      (       a  [        R                  " U 5      (       d  [        S5      e[        SU -  S S9$ )Nfile://   z%s: not a directoryz	file://%s)version)
startswithr   r   isdirlistdirr9   r?   )seed_ds    r#   r8   r8      s_    ##77==  

6(:(:344 kF2DAAr%   c                    Uc  [         R                  nU R                  S5      (       a  U SS n 0 n[         H  u  pxpUc
  U < SU< 3nOU < SU< SU< 3n [        R
                  " U5      nU" XX,S9nUR                  5       (       a;  U	(       a  UR                  Xg'   Mj  [        R                  " UR                  5      Xg'   M  [        R                  SUUR                  5        M     [        X`5      $ ! [         R                   aI  nUR                  S:X  a  U
(       d  [        SU< SU< 35      UeUR                  S:w  a  Ue SnAGM  SnAff = f)	aw  
Read the maas datasource at seed_url.
  read_file_or_url is a method that should provide an interface
  like util.read_file_or_url

Expected format of seed_url is are the following files:
  * <seed_url>/<version>/meta-data/instance-id
  * <seed_url>/<version>/meta-data/local-hostname
  * <seed_url>/<version>/user-data
If version is None, then <version>/ will not be used.
NrX   )r6   r[   ssl_detailsz4Fetching from %s resulted in an invalid http code %si  zMissing required z: )r   r5   endswith	DS_FIELDSr   fetch_ssl_detailsokcontentsdecode_binaryr;   r<   codeUrlErrorr:   check_seed_contents)seed_urlr5   r[   r   r"   r6   rP   r   	_dictnamebinaryoptionalrE   r   resprR   s                  r#   r?   r?      s0   & %66CR=	B-6)?%t,C ('48C	007K#gD wwyy#}}BH#11$--@BHJII! .7: r,, "" 	vv}X*15q9 3 	s%   AC5!"C5!C55E	=EEc                 &   0 n/ n[          HY  u  pEpgX@;  a  U(       d  UR                  U5        M%  SU;   a(  UR                  S5      u  pn
X;  a  0 X('   X   X(   U
'   MS  X   X%'   M[     U(       d  [        SU-  5      eU(       a  [	        U< SU< 35      eSnUR                  S5      (       aB  [        5       n[        R                  " UR                  S5      U[        S9nXL a  [	        S5      eUR                  S5      UR                  S	5      U4$ )
zValidate if dictionary content valid as a return for a datasource.
Either return a (userdata, metadata, vendordata) tuple or
Raise MAASSeedDirMalformed or MAASSeedDirNone
rX   z%s: no data files foundz: missing files Nr   )defaultallowedz%vendor-data was not loadable as yaml.r   	meta-data)	r   append	partitionr9   r:   r=   objectr   	load_yaml)contentseedretmissingspathdpath_binaryr   top_pvd_dataerrs                r#   r   r   	  s   
 CG+4'gu%%<,ICA~!.CHQK CJ ,5 7$>??"T7#KLLG
ww}h..GGM"C&
 >&'NOO77;!5w>>r%   c                       \ rS rSrSrg)r9   i0  r}   Nrt   ru   rv   rw   r|   r}   r%   r#   r9   r9   0      r%   r9   c                       \ rS rSrSrg)r:   i4  r}   Nr   r}   r%   r#   r:   r:   4  r   r%   r:   c                 8    [         R                  " U [        5      $ r'   )r   list_from_dependsdatasources)dependss    r#   get_datasource_listr   @  s    $$Wk::r%   __main__c                  ,  ^^^^ SSK n SSKnSSKnU R                  SS9nUR	                  SSSSS9  UR	                  S	S
SSS9  UR	                  SS
SSS9  UR	                  SSSSS9  UR	                  SSSSS9  UR	                  SSS[
        S9  UR                  SSS9nS H&  u  pVUR                  XVS9nUR	                  SSSSS9  M(     UR                  5       nUR                  UR                  UR                  UR                  S .n	UR                  c  S! H  n
S"U
-   S#-   n[        R                  R!                  U5      (       d  M1  [        R"                  " U[        R$                  5      (       d  M]  UR&                  R)                  S$U-  5        Xl        M     UR                  (       av  [*        R,                  " UR                  5      nS%U;   a  US%   S&   nU	R/                  5        H  nX;   d  M
  X   b  M  X   X'   M     UR0                  c  S'U;   a
  US'   Ul        UR0                  c,  UR&                  R)                  S(5        UR3                  S)5        [5        U	5      mU4S* jmU4S+ jmUUU4S, jmUR6                  S-:X  Ga  UR&                  R)                  S.UR0                  -  5        TR8                  nUR0                  S   S/:X  d   UR0                  R;                  S05      (       a  [=        UR0                  5      u  nnnO$[?        UR0                  UR@                  US1S29u  nnn[C        S35        [C        Uc  S4OURE                  5       5        [C        S55        UR                  U5        [C        S65        UR                  Uc  S4OU5        gUR6                  S7:X  a  T" UR0                  5        gUR6                  S8:X  aG  UR0                  RG                  S/5      (       d  S9UR0                  -  Ul        T" UR0                  5        gg):z
Call with single argument of directory or http or https url.
If url is given additional arguments are allowed, which will be
interpreted as consumer_key, token_key, token_secret, consumer_secret
r   NzInteract with MAAS DS)descriptionz--configfilezspecify DS config file)metavarhelpr   z--ckeykeyzthe consumer key to auth withz--tkeyzthe token key to auth withz--csecsecretzthe consumer secret (likely '')r   z--tseczthe token secret to auth withz--apiverr   z the apiver to use ( can be used)subcommandssubcmd)titledest))crawlzcrawl the datasource)r=   zdo a single GET of provided url)
check-seedzread and verify seed at url)r   rE   zthe datasource url?)r   nargsr   )r   r   r   r   )91_kernel_cmdline_url90_dpkg_maasz/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s.
rn   r   r3   z)Must provide a url or a config with url.
r4   c                 8   > TR                  U SS9R                  $ )Nr4   )r6   )r@   r   )rE   r+   s    r#   geturlmain.<locals>.geturl  s    ''Q'7@@@r%   c                 V   > [        SU < ST" U 5      R                  5       < S35        g )Nz== z ==

)printdecode)rE   r   s    r#   printurlmain.<locals>.printurl  s    c6#;+=+=+?@Ar%   c                 .  > U R                  S5      (       av  T" U 5      R                  5       R                  5        HM  nUR                  S5      (       a  T" U < U< 35        M)  US:X  a  T" U < S< 35        M?  T" U < U< 35        MO     g T" U 5        g )NrX   r   z
meta-data/)r   r   
splitlines)rE   liner   r   r   s     r#   r   main.<locals>.crawl  sy    ||C  "3K..0;;=D}}S))T23,\:; 3!56 > r%   r   zChecking seed at %s
rX   r      )r   r5   r6   z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===r=   r   z%s/)$argparsepprintsysArgumentParseradd_argumentra   add_subparsers
add_parser
parse_argsckeytkeytseccsecconfigr   r   existsaccessR_OKstderrwriter   	read_confr   rE   exitr)   r   r@   r   r8   r?   apiverr   r   r   )r   r   r   parsersubcmdsnamer   r   argscredsfnamefpathr   r   r@   userdatarJ   rQ   r   r   r+   r   s                     @@@@r#   mainr  F  s    	((5L(M)	 	 	
 	0	 	 	
 	-	 	 	
 	2	 	 	
 	0	 	 	
 	3	 	 	
 ''m('K
JD
 ""4"3ANN0T  
   " !II II#yy	
 ;;B1E9FB77>>%((RYYubgg-F-FJJ$$%;e%CD"'K	 C ;;..-Cs",'/zz|:%*"4!$EJ $ xxNc$9~.88JJIJHHQK'.	A	B	 ;;,&JJ4txx?@"**Gxx{c!TXX%8%8%C%C+=dhh+G(8R+=HH KK%,	,(8R %&8+%1BC%&MM(#'(MM2:%26[[E!TXX[[G#88$$S)) 488+$((O $r%   )!r   loggingr   r^   	cloudinitr   r   r   cloudinit.net.cmdliner   cloudinit.sourcesr   	getLoggerrt   r;   ra   r   r   r   r   r)   r   r8   r?   r   rA   r9   r:   DEP_FILESYSTEMDEP_NETWORKr   r   r  r}   r%   r#   <module>r     s      	  / / : 1!
	~8W'' ~8B#. #$/EB 
7-t$?N	i 		9 	 71134g,,g.A.ABC; zHT 	FY r%   