+
    ˜qgjc;  ã                   ó˜  € ^ 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   € Ü×Ñ×#Ñ# D°6Ô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ð   € Ø�{‰{ˆð	Ø�N‰N˜4Ÿ=™=Ô*<¸T¿]¹]Ó*KÔLÙøÜô 	ÙÜ#ô 	Ü�K‰KÐ.°·±¸sÔCØûð	úð
 �h‰h�~ tÓ,ˆßÙð	ð
 ×1Ñ1°#×6Ò6Ùà�N‰NØÜ"ØØ%)×%6Ñ%6×%>Ñ%>ØŸ*™*Øô	ôñ øÜô 	Ü�KŠKœÐCÀSÔ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Ã   € Ø×(Ñ(Ó*ˆ
Ø×&Ñ&¨!Ô+Ùä—N’NÓ$ˆ	Ø�j‰j˜‹oˆÛ58¿*ÐEˆ	Øˆ{ˆØ×*Ñ*×7Ñ7ØØ×0Ñ0Ø×.Ñ.ð 8ó 
‰ˆ÷ Ü�I‰IÐ3°SÕ9ä�L‰LØ:ØÜ”D—N’NÓ$ yÕ0Ó1ôô �C‹yÐr   c                óš   € V P                   f   R# \        P                  ! VRV P                  3/ 4      pV P                   \	        V4      8H  # )zúlocally 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   € ð �<‰<ÒÙÜ×#Ò# G¨l¸D¿K¹KÐ-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ô �I‰IÐ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 )zšReturn 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Ó1©D q�s—w‘w˜q“z“?©DÑ1Ó2€FÜ×$Ò$Ñ. 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Ø�I‰I±&Ó9±&¨Q—z‘z ! 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]   € Ø×Ñ˜×#Ò#Ø˜•ˆÜ�7‰7�=‰=˜× Ò ¬¯
ª
°6×(:Ò(:ÜÐ3Ó4Ð4ô ˜k¨FÕ2¸DÔAÐAr   c                óÂ  € Vf   \         P                  pV P                  R4      '       d   V RR p / p\         Fµ  w  rxršVf   V : RV: 2pMV : RV: RV: 2p \        P
                  ! V4      pV! WµW,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Ðà×Ñ˜×ÒØ˜C˜R�=ˆà	€Bß-6Ñ)ˆ˜ØŠ?Û%¢tÐ,‰Cã («'²4Ð8ˆCð	Ü×0Ò0°Ó7ˆKÙ#Ø¨gôˆDð �w‰w�yŠyßØ#Ÿ}™}�B“Hä#×1Ò1°$·-±-Ó@�B“Hä—‘ØJØØ—I‘Iöñ! .7ô: ˜rÓ,Ð,øô ×"Ñ"ô 	Ø�v‰v˜Œ}§XÝ*Û15²qÐ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  r‰p
W‚9  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W¼J d   \	        R4      hVP                  R4      VP                  R	4      V3# )
z«Validate 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Ô%Ùà�%Œ<ØŸ™¨Ó,‰IˆC�AØŒ~Ø�‘Ø!�.ˆC�H�Q‹Kà �ˆC‹Jñ ,5÷ ÜÐ7¸$Õ>Ó?Ð?çÜ"»TÂ7Ð#KÓLÐLà€GØ
‡w�wˆ}×ÒÜ‹hˆÜ—.’.Ø�G‰G�MÓ"¨C¼&ô
ˆð ‹>Ü&Ð'NÓOÐOà�7‰7�;Ó §¡¨Ó!5°wÐ>Ð>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   € Ü×$Ò$ W¬kÓ:Ð: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       W¸n        K‘  	  VP                  '       d�   \*        P,                  ! VP                  4      pR(V9   d   VR(,          R),          pV	P/                  4        F!  pWÜ9   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   ø€ Ý£c©6°#«;×+=Ñ+=Ö+?Ð@Ö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× Ò Ù" 3›K×.Ñ.Ó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ˆó
‰JˆDð
 ×"Ñ" 4Ð"Ó3ˆAØ�N‰NØÐ0¸ÀTð ö ñ
ð × Ñ Ó"ˆð ˜DŸI™IØ˜Ÿ™Ø˜DŸI™IØ˜tŸy™yð	
ˆð �;‰;ÒÛB�Ø1°EÕ9¸FÕB�Ü—7‘7—>‘> %×(Ô(¬R¯YªY°u¼b¿g¹g×-FÔ-FØ—J‘J×$Ñ$Ð%;¸eÕ%CÔDØ"'–Kñ	 Cð �;�;ˆ;Ü—.’. §¡Ó-ˆCØ˜sÔ"Ø˜,Õ'¨Õ/�Ø—z‘z–|�Ø–: %¥*Ô"4Ø!$¥�E“Jñ $ð �x‰xÒ N°cÔ$9Ø˜~Õ.�”à�8‰8ÒØ�J‰J×ÑÐIÔJØ�H‰H�QŒKä'¨Ó.ˆõ	Aõ	B÷	ð �;‰;˜,Õ&Ø�J‰J×ÑÐ4°t·x±xÕ?Ô@Ø"×*Ñ*ˆGØ�x‰x˜�{˜cÔ! T§X¡X×%8Ñ%8¸×%CÒ%CÜ+=¸d¿h¹hÓ+GÑ(�˜8¡Rä+=Ø—H‘HØ ŸK™KØ%,Øô	,Ñ(�˜8 Rô Ð%Ô&Ü˜8Ò+‘%°·±Ó1BÔCÜÐ%Ô&Ø�M‰M˜(Ô#ÜÐ'Ô(Ø�M‰M 2¢:™%°2Ö6à�[‰[˜EÔ!Ù�T—X‘XÖà�[‰[˜GÔ#Ø—8‘8×$Ñ$ S×)Ò)Ø  4§8¡8Õ+�”Ù�$—(‘(Ž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à×Ò˜Ó!€Ø€
ò€	ô~8�W×'Ñ'ô ~8ôB#˜.ô #ò$/òEòBð ØØØ
Øô7-òt$?ôN	�iô 	ô	˜9ô 	ð ˜7×1Ñ1Ð3Ð4Ø�g×,Ñ,¨g×.AÑ.AÐBÐCð€ò;ð ˆzÔòHñT 	†FñY r   