+
    ic;                        ^ RI t ^ RIt^ RIt^ RIt^ RIHtHtHt ^ RIH	t	 ^ RI
Ht ]P                  ! ]4      tRt. ROt ! R R]P"                  4      t ! R R	]4      tR
 tR tR tRR]RR3R ltR t ! R R]4      t ! R R]4      t]]P8                  33]]P8                  ]P:                  33.tR t]R8X  d   R t ] ! 4        R# R# )    N)sources
url_helperutil)KlibcNetworkConfigSource)NetworkConfigSourcez
2012-03-01c                   r   a  ] tR t^t o RtRtRtRt^xt^2t	R t
]R 4       tR tR tR tR	 tR
 tR tRtV tR# )DataSourceMAASz
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
MAASNc                    \         P                  P                  WW#4       R V n        \        P
                  P                  VP                  R4      V n        \        V P                  4      V n
        R # )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                r    V P                   '       g   \        V P                  4      V n         V P                   # N)_oauth_helperget_oauth_helperr   r   s   &r   oauth_helperDataSourceMAAS.oauth_helper8   s+    !!!!1$++!>D!!!r   c                h    \         P                  P                  V 4      pV: R V P                  : R2# )z [])r   r   __str__r   )r   roots   & r   r'   DataSourceMAAS.__str__>   s'    !!))$/ $--00r   c           
     F   V P                   p V P                  V P                  \        V P                  4      4       R #   \         d     M4\
         d(   p\        P                  RT P                  T4       h Rp?ii ; iTP                  RR4      pT'       g   R#  T P                  T4      '       g   R# T P                  T\        TT P                  P                  T P                  ^R7      4       R #   \         d!    \        P                   ! \        RT4        R# i ; i)Tz%s was malformed: %sN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	s9   /? A=A=A="A88A=C5 6=C5 5'D D c                    Wn         Vw  r4pW0n        W@n        V'       d    \        P                  ! V4      V n        R# R#   \         d)   p\        P                  R T4       RT n         Rp?R# Rp?ii ; i)z"Invalid content in vendor-data: %sN)	r   userdata_rawmetadatar   convert_vendordatavendordata_raw
ValueErrorr2   r3   )r   r<   dataudmdvdes   &&&    r   r.   DataSourceMAAS._set_datai   sg    
+&-&@&@&D#   +@!D&*##+s   A   A3A..A3c                (    RV P                   ,          # )z/Return the subplatform metadata source details.zseed-dir (%s))r   r"   s   &r   _get_subplatformDataSourceMAAS._get_subplatformv   s    ..r   c                   V P                  4       pVP                  ^ 8X  d   R# \        P                  ! 4       pVP	                  R4      pV: R\
        : R2pV.pV P                  P                  VVP                  VP                  R7      w  rV'       d   \        P                  RV4       M:\        P                  RV\        \        P                  ! 4       V,
          4      4       \        V4      # )r   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_secondsr2   debugcriticalintbool)r   r<   
url_params	starttime	check_urlrP   	_responses   &&     r   r5   (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                    V P                   f   R# \        P                  ! VRV P                  3/ 4      pV P                   \	        V4      8H  # )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   rA   r   r@   rC   )__name__
__module____qualname____firstlineno____doc__rg   r   r    url_max_waiturl_timeoutr   propertyr#   r'   r=   r.   rL   r5   ri   __static_attributes____classdictcell__)__classdict__s   @r   r	   r	      sd      FGM LK7 " "
1%N+/4	8 	8r   r	   c                      a a ] tR t^t o]P
                  ]P                  ]P                  ]P                  3t	V 3R lt
RtVtV ;t# )DataSourceMAASLocalc                   < \        4       P                  4       '       g   \        P                  R 4       R# \        P                  R4       \        SV `  4       # )zNo initramfs applicable configFz!Found initramfs applicable config)r   is_applicabler2   r[   superr=   )r   	__class__s   &r   r=   DataSourceMAASLocal._get_data   sB    ')7799 II67		56w ""r    )rk   rl   rm   rn   r   CMD_LINE
SYSTEM_CFGDS	INITRAMFSnetwork_config_sourcesr=   rs   rt   __classcell__)r{   ru   s   @@r   rw   rw      s;     $$&&%%	# #r   rw   c           	         Rp\        V Uu. uF  q"V P                  V4      3NK  	  up4      p\        P                  ! R/ VB # u upi )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}   )dictr4   r   OauthUrlHelper)cfgkeysrkwargss   &   r   r!   r!      sF    
 LDD1Dqswwqz?D12F$$.v.. 2s   Ac           	         RpRP                  V Uu. uF  q P                  VR4      NK  	  up4      pR\        P                  ! VP	                  R4      4      P                  4       ,           # u upi )z;Given a config, generate a unique identifier for this node.  zv1:zutf-8)r   r   r   )r   r4   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                    V P                  R 4      '       d
   V R,          p \        P                  P                  V 4      '       d   \        P                  ! V 4      '       g   \        R4      h\        RV ,          RR7      # )file://:   NNz%s: not a directoryz	file://%sN)version)
startswithr   r   isdirlistdirr0   r6   )seed_ds   &r   r/   r/      s]    ##77==  

6(:(:344 kF2DAAr   c                   Vf   \         P                  pV P                  R4      '       d   V RR p / p\         F  w  rxrVf   V : RV: 2pMV : RV: RV: 2p \        P
                  ! V4      pV! WW,R7      pVP                  4       '       d=   V	'       d   VP                  Wg&   Kp  \        P                  ! VP                  4      Wg&   K  \        P                  RVVP                  4       K  	  \        W`4      #   \         P                   dM   pTP                  R8X  d   T
'       g   \        RT: RT: 24      ThTP                  R8w  d   Th Rp?EK   Rp?ii ; i)	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.
NrO   )r-   rR   ssl_detailsz4Fetching from %s resulted in an invalid http code %si  zMissing required z: )r   r,   endswith	DS_FIELDSr   fetch_ssl_detailsokcontentsdecode_binaryr2   r3   codeUrlErrorr1   check_seed_contents)seed_urlr,   rR   r   r   r-   rG   r   	_dictnamebinaryoptionalr<   r   resprI   s   &&&&&&         r   r6   r6      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 	s0   =C=C=)"C=!C==EE+'EEc                \   / p. p\          Fi  w  rErgW@9  d   V'       g   VP                  V4       K'  RV9   d2   VP                  R4      w  rp
W9  d   / W(&   W,          W(,          V
&   K_  W,          W%&   Kk  	  V'       g   \        RV,          4      hV'       d   \	        V: RV: 24      hRpVP                  R4      '       dG   \        4       p\        P                  ! VP                  R4      V\        R7      pWJ d   \	        R4      hVP                  R4      VP                  R	4      V3# )
zValidate if dictionary content valid as a return for a datasource.
Either return a (userdata, metadata, vendordata) tuple or
Raise MAASSeedDirMalformed or MAASSeedDirNone
rO   z%s: no data files foundz: missing files Nvendor-data)defaultallowedz%vendor-data was not loadable as yaml.	user-data	meta-data)	r   append	partitionr0   r1   r4   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                       ] tR tRtRtR# )r0   i0  r}   Nrk   rl   rm   rn   rs   r}   r   r   r0   r0   0      r   r0   c                       ] tR tRtRtR# )r1   i4  r}   Nr   r}   r   r   r1   r1   4  r   r   r1   c                 8    \         P                  ! V \        4      # r   )r   list_from_dependsdatasources)dependss   &r   get_datasource_listr   @  s    $$Wk::r   __main__c                   aaaa ^ RI p ^ RIp^ RIpV P                  RR7      pVP	                  RRRRR7       VP	                  RR	R
RR7       VP	                  RR	RRR7       VP	                  RRRRR7       VP	                  RRRRR7       VP	                  RRR\
        R7       VP                  RRR7      pR8 F,  w  rVVP                  WVR7      pVP	                  RRRRR 7       K.  	  VP                  4       pR!VP                  R"VP                  R#VP                  R$VP                  /p	VP                  f   R9 F  p
R%V
,           R&,           p\        P                  P!                  V4      '       g   K:  \        P"                  ! V\        P$                  4      '       g   Kg  VP&                  P)                  R'V,          4       Wn        K  	  VP                  '       d   \*        P,                  ! VP                  4      pR(V9   d   VR(,          R),          pV	P/                  4        F!  pW9   g   K  W,          e   K  W,          W&   K#  	  VP0                  f   R*V9   d   VR*,          Vn        VP0                  f-   VP&                  P)                  R+4       VP3                  ^4       \5        V	4      oV3R, loV3R- loVVV3R. loVP6                  R8X  Ed   VP&                  P)                  R/VP0                  ,          4       SP8                  pVP0                  ^ ,          R08X  g"   VP0                  P;                  R14      '       d   \=        VP0                  4      w  pppM'\?        VP0                  VP@                  V^R27      w  ppp\C        R34       \C        Vf   R4MVPE                  4       4       \C        R54       VP                  V4       \C        R64       TP                  Vf   R4MT4       R# VP6                  R8X  d   S! VP0                  4       R# VP6                  R8X  dN   VP0                  PG                  R04      '       g   R7VP0                  ,          Vn        S! VP0                  4       R# R# ):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
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crawlr4   
check-seed)r   r<   zthe datasource url?)r   nargsr   r   r   r   r   z/etc/cloud/cloud.cfg.d/z.cfgzUsed config in %s.
re   r
   r+   z)Must provide a url or a config with url.
c                 >   < SP                  V ^R7      P                  # )   )r-   )r7   r   )r<   r#   s   &r   geturlmain.<locals>.geturl  s    ''Q'7@@@r   c                 X   < \        R V : RS! V 4      P                  4       : R24       R# )z== z ==

N)printdecode)r<   r   s   &r   printurlmain.<locals>.printurl  s    c6#;+=+=+?@Ar   c                 8  < V P                  R 4      '       dz   S! V 4      P                  4       P                  4        FO  pVP                  R 4      '       d   S! V : V: 24       K*  VR8X  d   S! V : R: 24       KA  S! V : V: 24       KQ  	  R# S! V 4       R# )rO   r   z
meta-data/N)r   r   
splitlines)r<   liner   r   r   s   & r   r   main.<locals>.crawl  sy    ||C  "3K..0;;=D}}S))T23,\:; 3!56 > r   zChecking seed at %s
rO   r   )r   r,   r-   z=== user-data ===zN/Az=== meta-data ===z=== vendor-data ===z%s/))r   zcrawl the datasource)r4   zdo a single GET of provided url)r   zread and verify seed at url)91_kernel_cmdline_url90_dpkg_maas)$argparsepprintsysArgumentParseradd_argumentrX   add_subparsers
add_parser
parse_argsckeytkeytseccsecconfigr   r   existsaccessR_OKstderrwriter   	read_confr   r<   exitr!   r   r7   r   r/   r6   apiverr   r   r   )r   r   r   parsersubcmdsnamer   r   argscredsfnamefpathr   r   r7   userdatarA   rH   r   r   r#   r   s                     @@@@r   mainr  F  s    	((5L(M)	 	 	
 	0	 	 	
 	-	 	 	
 	2	 	 	
 	0	 	 	
 	3	 	 	
 ''m('K
JD
 ""4"3ANN0T  
   " DIIDIItyy	
 ;;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   ))meta-data/instance-idr  FF)meta-data/local-hostnamer  FF)meta-data/public-keysr  FT)zmeta-data/vendor-datar   TT)r   r   TT)!r   loggingr   rU   	cloudinitr   r   r   cloudinit.net.cmdliner   cloudinit.sourcesr   	getLoggerrk   r2   rX   r   r   r	   rw   r!   r   r/   r6   r   r8   r0   r1   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   